Kiểm tra sơ bộ (CIUS-RO cho Romania), nộp lên hệ thống hóa đơn điện tử quốc gia, trạng thái đã chuẩn hóa, phản hồi có chữ ký và hộp thư hóa đơn đến từ nhà cung cấp.
Hóa đơn đầu tiên trong 6 bước
- Chạy POST /v1/invoices/{id}/efactura/validate. Kiểm tra sơ bộ (CIUS-RO cho Romania) không gửi gì lên hệ thống hóa đơn điện tử quốc gia và cho bạn biết chính xác điều gì sẽ bị từ chối.
- Nộp bằng POST /v1/invoices/{id}/efactura/submit, luôn kèm Idempotency-Key. Bạn nhận được submission_id và một trạng thái.
- Theo dõi GET /v1/efactura/submissions/{id} cho đến khi đạt accepted hoặc rejected.
- Buộc truy vấn mới lên hệ thống hóa đơn điện tử quốc gia bằng POST /v1/efactura/submissions/{id}/refresh — lệnh này được tính vào nhóm 10 lượt mỗi phút.
- Tải kho lưu trữ phản hồi có chữ ký của hệ thống hóa đơn điện tử quốc gia (tại Romania: ANAF) bằng GET /v1/efactura/submissions/{id}/download.
Mọi endpoint
| Phương thức | Endpoint | Scope | Idempotency-Key | Yêu cầu / phút |
|---|---|---|---|---|
| GET | /invoices/{invoice_id}/xml Tải XML UBL (CIUS-RO cho Romania) | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/validate Kiểm tra sơ bộ (CIUS-RO cho Romania) — xác thực mà không gửi | efactura:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/submit Nộp hóa đơn lên hệ thống hóa đơn điện tử quốc gia (tại Romania: SPV) | efactura:submit | bắt buộc | 10 |
| GET | /efactura/submissions Liệt kê các lần nộp lên hệ thống hóa đơn điện tử quốc gia | efactura:read | — | 120 |
| GET | /efactura/submissions/{submission_id} Lấy một lần nộp | efactura:read | — | 120 |
| POST | /efactura/submissions/{submission_id}/refresh Hỏi hệ thống hóa đơn điện tử quốc gia về trạng thái hiện tại | efactura:read | — | 10 |
| GET | /efactura/submissions/{submission_id}/download Tải kho lưu trữ phản hồi có chữ ký | efactura:read | — | 120 |
| GET | /efactura/inbox Hóa đơn nhà cung cấp nhận qua hệ thống hóa đơn điện tử quốc gia | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id} Lấy một hóa đơn đến | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id}/download Tải kho lưu trữ hóa đơn đến | efactura:read | — | 120 |
| POST | /efactura/inbox/sync Kéo thông điệp mới từ hệ thống hóa đơn điện tử quốc gia vào hộp thư đến | efactura:read | — | 10 |
API 4invoices là gì
bash
# CIUS-RO preflight. Sends NOTHING to ANAF.
curl -sS -X POST "https://api.4invoices.net/v1/invoices/inv_01J7ABC/efactura/validate?include_xml=true" \
-H "Authorization: Bearer $ACCESS_TOKEN"
# → {"invoice_id":"inv_01J7ABC","valid":false,
# "errors":["buyer.county is required for RO buyers"],
# "xml_base64":"PD94bWwg..."}bash
curl -sS -X POST https://api.4invoices.net/v1/invoices/inv_01J7ABC/efactura/submit \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Idempotency-Key: efactura-inv_01J7ABC-1'
# → {"submission_id":"sub_01J7XYZ","status":"queued"}python
import time, requests
BASE = "https://api.4invoices.net/v1"
TERMINAL = {"accepted", "rejected"}
H = {"Authorization": f"Bearer {token}"}
def wait_for_anaf(submission_id, timeout=900):
deadline = time.time() + timeout
delay = 15
while time.time() < deadline:
r = requests.get(f"{BASE}/efactura/submissions/{submission_id}", headers=H, timeout=30)
r.raise_for_status()
status = r.json()["status"]
if status in TERMINAL:
return r.json()
# /refresh asks ANAF directly and shares the 10/min submit bucket.
requests.post(f"{BASE}/efactura/submissions/{submission_id}/refresh", headers=H, timeout=30)
time.sleep(delay)
delay = min(delay * 2, 120)
raise TimeoutError(submission_id)bash
# Pull new SPV messages, then read the inbound supplier invoices.
curl -sS -X POST https://api.4invoices.net/v1/efactura/inbox/sync \
-H "Authorization: Bearer $ACCESS_TOKEN"
curl -sS "https://api.4invoices.net/v1/efactura/inbox?limit=50" \
-H "Authorization: Bearer $ACCESS_TOKEN"
# ANAF allows roughly ONE message-list call per minute per CIF,
# nên /inbox/sync được tính vào nhóm nộp 10/phút. Hãy chạy bằng cron, đừng polling.https://api.4invoices.net/v1 · https://api.4invoices.net/v1/openapi.json
Chu trình hóa đơn điện tử quốc gia
Lỗi
| Trạng thái | Loại | Mã |
|---|---|---|
| 422 | invalid_request_error | cius_ro_incomplete |
Lỗi thường gặp
- Vòng đời đã chuẩn hóa: not_sent → validating → queued → sent → processing → accepted | rejected | error.
- accepted nghĩa là đã truyền hợp lệ về mặt pháp lý. rejected nghĩa là hệ thống hóa đơn điện tử quốc gia đã từ chối: hãy sửa và nộp lại. error là lỗi truyền tải phía chúng tôi và an toàn để thử lại.
- Việc nộp không thể hoàn tác: một bản sao thứ hai của cùng hóa đơn không thể rút khỏi hệ thống hóa đơn điện tử quốc gia. Đó là lý do Idempotency-Key là bắt buộc.
- GET /v1/invoices/{id}/xml cho bạn XML UBL (CIUS-RO cho Romania) mà hoàn toàn không cần nộp — để lưu trữ hoặc kiểm toán của riêng bạn.
- Hộp thư đến: POST /v1/efactura/inbox/sync kéo các thông điệp mới về, GET /v1/efactura/inbox liệt kê chúng, và /download tải kho lưu trữ của từng hóa đơn đến.
- Các endpoint e-Factura chỉ hoạt động với tenant tại Romania; nếu không bạn sẽ nhận 404.
Câu hỏi và trả lời cho nhà phát triển
Hệ thống hóa đơn điện tử quốc gia mất bao lâu để chấp nhận một hóa đơn?
Thời gian thay đổi, từ vài giây đến vài giờ. Đừng chặn việc bán hàng: hãy nộp bất đồng bộ và coi accepted và rejected là các sự kiện.
Có thể lấy XML (CIUS-RO cho Romania) mà không gửi gì lên hệ thống hóa đơn điện tử quốc gia không?
Có. GET /v1/invoices/{id}/xml tạo chứng từ mà không cần nộp, và /efactura/validate với include_xml=true trả về XML được mã hóa base64.
Tôi có thể chạy inbox/sync bao nhiêu lần?
Tối đa 10 lệnh gọi mỗi phút, nhưng trên thực tế, tại Romania, ANAF chỉ cho phép khoảng một lệnh gọi danh sách thông điệp mỗi phút trên mỗi CIF. Hãy chạy bằng cron, vài phút một lần.
Tôi phải làm gì nếu trạng thái cứ ở error?
error là lỗi truyền tải hoặc xác thực phía chúng tôi, nên an toàn để thử lại. Nếu tình trạng kéo dài, hãy gửi request_id cho bộ phận hỗ trợ.