API üzerinden ulusal e-fatura sistemi

Ön kontrol (Romanya'da: CIUS-RO), ulusal sisteme gönderim (Romanya'da: SPV), normalleştirilmiş durum, imzalı yanıt ve gelen tedarikçi faturaları.

Ön kontrol (Romanya'da: CIUS-RO), ulusal sisteme gönderim (Romanya'da: SPV), normalleştirilmiş durum, imzalı yanıt ve gelen tedarikçi faturaları.

← API dokümantasyonuna dön

6 adımda ilk fatura

  1. POST /v1/invoices/{id}/efactura/validate çalıştırın. Ön kontrol (Romanya’da: CIUS-RO) ulusal e-fatura sistemine hiçbir şey göndermez ve neyin reddedileceğini tam olarak söyler.
  2. Faturayı her zaman bir Idempotency-Key ile POST /v1/invoices/{id}/efactura/submit üzerinden gönderin. Bir submission_id ve bir durum alırsınız.
  3. Durum accepted veya rejected olana kadar GET /v1/efactura/submissions/{id} sorgulayın.
  4. POST /v1/efactura/submissions/{id}/refresh ile ulusal e-fatura sistemine yeni bir sorguyu zorlayın — dakikada 10’luk kovadan düşülür.
  5. Ulusal sistemin (Romanya’da: ANAF) imzalı yanıt arşivini GET /v1/efactura/submissions/{id}/download ile indirin.

Tüm uç noktalar

MetotUç noktaScopeIdempotency-Keyİstek / dakika
GET/invoices/{invoice_id}/xml
UBL XML'ini indir (Romanya'da: CIUS-RO)
invoices:read—120
POST/invoices/{invoice_id}/efactura/validate
Ön kontrol (Romanya'da: CIUS-RO) — göndermeden doğrula
efactura:read—120
POST/invoices/{invoice_id}/efactura/submit
Faturayı ulusal e-fatura sistemine gönder (Romanya'da: ANAF/SPV)
efactura:submitzorunlu10
GET/efactura/submissions
Ulusal e-fatura sistemine yapılan gönderimleri listele
efactura:read—120
GET/efactura/submissions/{submission_id}
Bir gönderimi getir
efactura:read—120
POST/efactura/submissions/{submission_id}/refresh
Ulusal e-fatura sistemine güncel durumu sor
efactura:read—10
GET/efactura/submissions/{submission_id}/download
İmzalı yanıt arşivini indir
efactura:read—120
GET/efactura/inbox
Ulusal e-fatura sistemi üzerinden alınan tedarikçi faturaları
efactura:read—120
GET/efactura/inbox/{inbound_id}
Bir gelen faturayı getir
efactura:read—120
GET/efactura/inbox/{inbound_id}/download
Gelen faturanın arşivini indir
efactura:read—120
POST/efactura/inbox/sync
Ulusal e-fatura sisteminden yeni mesajları gelen kutusuna çek
efactura:read—10

4invoices API'si nedir

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,
# bu nedenle /inbox/sync 10/dk gönderim kotasından sayılır. Cron ile çalıştırın, sorgulamayın.

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

Ulusal e-fatura sistemi süreci

not_sentvalidatingqueuedsentprocessingacceptedrejectederror

Hatalar

DurumTipKod
422invalid_request_errorcius_ro_incomplete

Sık yapılan hatalar

  • Normalleştirilmiş yaşam döngüsü: not_sent → validating → queued → sent → processing → accepted | rejected | error.
  • accepted yasal olarak iletildi demektir. rejected, ulusal e-fatura sisteminin reddettiği anlamına gelir: düzeltip yeniden gönderin. error bizim tarafımızdaki bir aktarım hatasıdır ve yeniden denemek güvenlidir.
  • Gönderim geri alınamaz: aynı faturanın ikinci bir kopyası ulusal e-fatura sisteminden geri çekilemez. Idempotency-Key’in zorunlu olmasının nedeni budur.
  • GET /v1/invoices/{id}/xml size hiçbir gönderim yapmadan UBL XML’ini (Romanya’da: CIUS-RO) verir — kendi arşiviniz veya bir denetim için.
  • Gelen kutusu: POST /v1/efactura/inbox/sync yeni mesajları çeker, GET /v1/efactura/inbox bunları listeler ve /download her gelen faturanın arşivini indirir.
  • e-Factura endpoint’leri yalnızca Romen tenant’lar için çalışır; aksi takdirde 404 alırsınız.

Geliştiriciler için soru ve cevaplar

Ulusal e-fatura sisteminin bir faturayı kabul etmesi ne kadar sürer?

Değişir; saniyelerden saatlere kadar. Satışı bloklamayın: eşzamansız gönderin ve accepted ile rejected’ı olay olarak ele alın.

Ulusal e-fatura sistemine hiçbir şey göndermeden XML’i (Romanya’da: CIUS-RO) alabilir miyim?

Evet. GET /v1/invoices/{id}/xml belgeyi gönderim yapmadan üretir; include_xml=true ile /efactura/validate ise onu base64 kodlu olarak döndürür.

inbox/sync’i ne sıklıkla çalıştırabilirim?

Dakikada en fazla 10 çağrı, ancak pratikte Romanya’da ANAF, CIF başına dakikada yaklaşık bir mesaj listesi çağrısına izin verir. Birkaç dakikada bir cron ile çalıştırın.

Durum error olarak kalırsa ne yapmalıyım?

error bizim tarafımızdaki bir aktarım veya kimlik doğrulama hatasıdır, bu yüzden yeniden denemek güvenlidir. Devam ederse request_id’yi desteğe gönderin.