Prethodna provjera (CIUS-RO za Rumuniju), podnošenje u nacionalni sistem, normalizovani status, potpisani odgovor i ulazno sanduče dobavljača.
Vaša prva faktura u 6 koraka
- Pokrenite POST /v1/invoices/{id}/efactura/validate. Prethodna provjera (CIUS-RO za Rumuniju) ne šalje ništa nacionalnom sistemu i tačno vam kaže šta bi bilo odbijeno.
- Podnesite sa POST /v1/invoices/{id}/efactura/submit, uvijek sa Idempotency-Key. Dobijate submission_id i status.
- Pratite GET /v1/efactura/submissions/{id} dok ne dostigne accepted ili rejected.
- Forsirajte svježi upit ka nacionalnom sistemu e-fakturisanja sa POST /v1/efactura/submissions/{id}/refresh — računa se u grupu od 10 po minuti.
- Preuzmite arhivu potpisanog odgovora nacionalnog sistema preko GET /v1/efactura/submissions/{id}/download.
Sve krajnje tačke
| Metod | Krajnja tačka | Opseg | Idempotency-Key | Zahtjeva / minut |
|---|---|---|---|---|
| GET | /invoices/{invoice_id}/xml Preuzima UBL XML (CIUS-RO za Rumuniju) | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/validate Prethodna provjera — provjerava bez slanja | efactura:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/submit Podnosi fakturu u nacionalni sistem e-fakturisanja | efactura:submit | obavezno | 10 |
| GET | /efactura/submissions Listanje podnesaka u nacionalni sistem | efactura:read | — | 120 |
| GET | /efactura/submissions/{submission_id} Dohvata jedan podnesak | efactura:read | — | 120 |
| POST | /efactura/submissions/{submission_id}/refresh Traži trenutno stanje od nacionalnog sistema | efactura:read | — | 10 |
| GET | /efactura/submissions/{submission_id}/download Preuzima arhivu potpisanog odgovora | efactura:read | — | 120 |
| GET | /efactura/inbox Fakture dobavljača primljene preko nacionalnog sistema | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id} Dohvata jednu dolaznu fakturu | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id}/download Preuzima arhivu dolazne fakture | efactura:read | — | 120 |
| POST | /efactura/inbox/sync Povlači nove poruke nacionalnog sistema u ulazno sanduče | efactura:read | — | 10 |
Šta je 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,
# pa se /inbox/sync računa u grupu podnošenja od 10/min. Stavite ga na cron, ne ispitujte ga.https://api.4invoices.net/v1 · https://api.4invoices.net/v1/openapi.json
Ciklus nacionalnog e-fakturisanja
Greške
| Status | Tip | Kod |
|---|---|---|
| 422 | invalid_request_error | cius_ro_incomplete |
Česte greške
- Normalizovani životni ciklus: not_sent → validating → queued → sent → processing → accepted | rejected | error.
- accepted znači zakonski prenesena. rejected znači da ju je nacionalni sistem e-fakturisanja odbio: ispravite i ponovo podnesite. error je greška transporta na našoj strani i bezbjedno je ponoviti pokušaj.
- Podnošenje je nepovratno: druga kopija iste fakture ne može se povući iz nacionalnog sistema. Zato je Idempotency-Key obavezan.
- GET /v1/invoices/{id}/xml daje UBL XML (CIUS-RO za Rumuniju) bez ikakvog podnošenja — za vašu arhivu ili reviziju.
- Ulazno sanduče: POST /v1/efactura/inbox/sync povlači nove poruke, GET /v1/efactura/inbox ih prikazuje, a /download preuzima arhivu svake dolazne fakture.
- Krajnje tačke e-Factura rade samo za rumunske korisnike; u suprotnom dobijate 404.
Pitanja i odgovori za programere
Koliko nacionalnom sistemu e-fakturisanja treba da prihvati fakturu?
Varira, od sekundi do sati. Ne blokirajte prodaju: podnosite asinhrono i tretirajte accepted i rejected kao događaje.
Mogu li dobiti XML fakture bez slanja bilo čega nacionalnom sistemu?
Da. GET /v1/invoices/{id}/xml generiše dokument bez podnošenja, a /efactura/validate sa include_xml=true ga vraća kodiran u base64.
Koliko često mogu pokretati inbox/sync?
Najviše 10 poziva u minuti, ali u praksi, u Rumuniji, ANAF dozvoljava otprilike jedan poziv za listu poruka u minuti po CIF-u. Pokrećite ga sa crona, na nekoliko minuta.
Šta da radim ako status ostane error?
error je greška transporta ili autentifikacije na našoj strani, pa je bezbjedno ponoviti pokušaj. Ako potraje, pošaljite request_id podršci.