Ön kontrol (Romanya'da: CIUS-RO), ulusal sisteme gönderim (Romanya'da: SPV), normalleştirilmiş durum, imzalı yanıt ve gelen tedarikçi faturaları.
6 adımda ilk fatura
- 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.
- 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.
- Durum accepted veya rejected olana kadar GET /v1/efactura/submissions/{id} sorgulayın.
- POST /v1/efactura/submissions/{id}/refresh ile ulusal e-fatura sistemine yeni bir sorguyu zorlayın — dakikada 10’luk kovadan düşülür.
- Ulusal sistemin (Romanya’da: ANAF) imzalı yanıt arşivini GET /v1/efactura/submissions/{id}/download ile indirin.
Tüm uç noktalar
| Metot | Uç nokta | Scope | Idempotency-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:submit | zorunlu | 10 |
| 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
Hatalar
| Durum | Tip | Kod |
|---|---|---|
| 422 | invalid_request_error | cius_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.