Nacionalno e-fakturisanje preko API-ja

Prethodna provjera (CIUS-RO za Rumuniju), podnošenje u nacionalni sistem, normalizovani status, potpisani odgovor i ulazno sanduče dobavljača.

Prethodna provjera (CIUS-RO za Rumuniju), podnošenje u nacionalni sistem, normalizovani status, potpisani odgovor i ulazno sanduče dobavljača.

← Nazad na API dokumentaciju

Vaša prva faktura u 6 koraka

  1. 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.
  2. Podnesite sa POST /v1/invoices/{id}/efactura/submit, uvijek sa Idempotency-Key. Dobijate submission_id i status.
  3. Pratite GET /v1/efactura/submissions/{id} dok ne dostigne accepted ili rejected.
  4. 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.
  5. Preuzmite arhivu potpisanog odgovora nacionalnog sistema preko GET /v1/efactura/submissions/{id}/download.

Sve krajnje tačke

MetodKrajnja tačkaOpsegIdempotency-KeyZahtjeva / 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:submitobavezno10
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

not_sentvalidatingqueuedsentprocessingacceptedrejectederror

Greške

StatusTipKod
422invalid_request_errorcius_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.