Faktur elektronik nasional melalui API

Pemeriksaan awal (CIUS-RO untuk Rumania), pengajuan ke sistem nasional, status ternormalisasi, respons bertanda tangan, dan kotak masuk faktur pemasok.

Pemeriksaan awal (CIUS-RO untuk Rumania), pengajuan ke sistem nasional, status ternormalisasi, respons bertanda tangan, dan kotak masuk faktur pemasok.

← Kembali ke dokumentasi API

Faktur pertama Anda dalam 6 langkah

  1. Jalankan POST /v1/invoices/{id}/efactura/validate. Pemeriksaan awal (CIUS-RO untuk Rumania) tidak mengirim apa pun ke sistem nasional dan memberi tahu Anda tepatnya apa yang akan ditolak.
  2. Ajukan dengan POST /v1/invoices/{id}/efactura/submit, selalu dengan Idempotency-Key. Anda mendapat submission_id dan status.
  3. Pantau GET /v1/efactura/submissions/{id} hingga mencapai accepted atau rejected.
  4. Paksa permintaan status baru ke sistem faktur elektronik nasional dengan POST /v1/efactura/submissions/{id}/refresh — ini dihitung dalam ember 10 per menit.
  5. Unduh arsip respons bertanda tangan dari sistem nasional dengan GET /v1/efactura/submissions/{id}/download.

Semua endpoint

MetodeEndpointScopeIdempotency-KeyPermintaan / menit
GET/invoices/{invoice_id}/xml
Unduh XML UBL (CIUS-RO untuk Rumania)
invoices:read—120
POST/invoices/{invoice_id}/efactura/validate
Pemeriksaan awal — validasi tanpa mengirim
efactura:read—120
POST/invoices/{invoice_id}/efactura/submit
Ajukan faktur ke sistem faktur elektronik nasional
efactura:submitwajib10
GET/efactura/submissions
Daftar pengajuan ke sistem nasional
efactura:read—120
GET/efactura/submissions/{submission_id}
Ambil satu pengajuan
efactura:read—120
POST/efactura/submissions/{submission_id}/refresh
Minta status terkini dari sistem nasional
efactura:read—10
GET/efactura/submissions/{submission_id}/download
Unduh arsip respons bertanda tangan
efactura:read—120
GET/efactura/inbox
Faktur pemasok yang diterima melalui sistem nasional
efactura:read—120
GET/efactura/inbox/{inbound_id}
Ambil satu faktur masuk
efactura:read—120
GET/efactura/inbox/{inbound_id}/download
Unduh arsip faktur masuk
efactura:read—120
POST/efactura/inbox/sync
Tarik pesan baru dari sistem nasional ke kotak masuk
efactura:read—10

Apa itu API 4invoices

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,
# sehingga /inbox/sync dihitung dalam ember pengajuan 10/menit. Jadwalkan dengan cron, jangan di-polling.

https://api.4invoices.net/v1 · https://api.4invoices.net/v1/openapi.json

Alur faktur elektronik nasional

not_sentvalidatingqueuedsentprocessingacceptedrejectederror

Error

StatusTipeKode
422invalid_request_errorcius_ro_incomplete

Kesalahan umum

  • Siklus hidup ternormalisasi: not_sent → validating → queued → sent → processing → accepted | rejected | error.
  • accepted berarti telah dikirim secara sah. rejected berarti sistem faktur elektronik nasional menolaknya: perbaiki dan ajukan lagi. error adalah kegagalan transportasi di pihak kami dan aman untuk dicoba ulang.
  • Pengajuan tidak dapat dibatalkan: salinan kedua dari faktur yang sama tidak dapat ditarik dari sistem nasional. Itulah sebabnya Idempotency-Key wajib.
  • GET /v1/invoices/{id}/xml memberi Anda XML UBL (CIUS-RO untuk Rumania) tanpa pengajuan sama sekali — untuk arsip atau audit Anda sendiri.
  • Kotak masuk: POST /v1/efactura/inbox/sync menarik pesan baru, GET /v1/efactura/inbox mendaftarkannya, dan /download mengambil arsip setiap faktur masuk.
  • Endpoint e-Factura hanya berfungsi untuk tenant Rumania; selain itu Anda mendapat 404.

Tanya jawab untuk pengembang

Berapa lama sistem faktur elektronik nasional menerima faktur?

Bervariasi, dari detik hingga jam. Jangan menghalangi penjualan: ajukan secara asinkron dan perlakukan accepted serta rejected sebagai peristiwa.

Bisakah saya mendapatkan XML faktur tanpa mengirim apa pun ke sistem nasional?

Bisa. GET /v1/invoices/{id}/xml menghasilkan dokumen tanpa pengajuan, dan /efactura/validate dengan include_xml=true mengembalikannya dalam format base64.

Seberapa sering saya bisa menjalankan inbox/sync?

Paling banyak 10 panggilan per menit, tetapi dalam praktiknya di Rumania ANAF mengizinkan sekitar satu panggilan daftar pesan per menit per CIF. Jalankan dari cron, setiap beberapa menit.

Apa yang harus saya lakukan jika statusnya tetap error?

error adalah kegagalan transportasi atau autentikasi di pihak kami, sehingga aman untuk dicoba ulang. Jika terus berlanjut, kirim request_id ke dukungan.