Hóa đơn điện tử quốc gia qua API

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.

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.

← Quay lại tài liệu API

Hóa đơn đầu tiên trong 6 bước

  1. 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.
  2. 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.
  3. Theo dõi GET /v1/efactura/submissions/{id} cho đến khi đạt accepted hoặc rejected.
  4. 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.
  5. 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ứcEndpointScopeIdempotency-KeyYê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:submitbắt buộc10
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

not_sentvalidatingqueuedsentprocessingacceptedrejectederror

Lỗi

Trạng tháiLoạiMã
422invalid_request_errorcius_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ợ.