ANAF e-Factura (Rumunjska) preko API-ja

Za Rumunjsku: CIUS-RO provjera, predaja u SPV, normalizirani status, potpisani odgovor i pristigle fakture.

Za Rumunjsku: CIUS-RO provjera, predaja u SPV, normalizirani status, potpisani odgovor i pristigle fakture.

← Natrag na API dokumentaciju

Prva faktura u 6 koraka

  1. Pokrenite POST /v1/invoices/{id}/efactura/validate. Provjera (CIUS-RO za Rumunjsku) ništa ne šalje nacionalnom sustavu e-računa i točno vam kaže što bi bilo odbijeno.
  2. Predajte fakturu s POST /v1/invoices/{id}/efactura/submit, uvijek s Idempotency-Key. Dobivate submission_id i status.
  3. Provjeravajte GET /v1/efactura/submissions/{id} dok ne dođe do accepted ili rejected.
  4. Novi upit prema nacionalnom sustavu e-računa (u Rumunjskoj: ANAF) iznudite s POST /v1/efactura/submissions/{id}/refresh — računa se u bucket od 10 u minuti.
  5. Arhivu s potpisanim odgovorom ANAF-a (Rumunjska) preuzmite preko GET /v1/efactura/submissions/{id}/download.

Svi endpointi

MetodaEndpointScopeIdempotency-KeyZahtjeva / minutu
GET/invoices/{invoice_id}/xml
Preuzimanje UBL / CIUS-RO XML-a (Rumunjska)
invoices:read—120
POST/invoices/{invoice_id}/efactura/validate
Predprovjera (CIUS-RO za Rumunjsku) — validacija bez slanja
efactura:read—120
POST/invoices/{invoice_id}/efactura/submit
Slanje fakture ANAF-u (SPV, Rumunjska)
efactura:submitobavezno10
GET/efactura/submissions
Popis podnesaka ANAF-u (Rumunjska)
efactura:read—120
GET/efactura/submissions/{submission_id}
Dohvat jednog podneska
efactura:read—120
POST/efactura/submissions/{submission_id}/refresh
Upit ANAF-u (Rumunjska) o trenutačnom stanju
efactura:read—10
GET/efactura/submissions/{submission_id}/download
Preuzimanje arhive potpisanog odgovora
efactura:read—120
GET/efactura/inbox
Ulazne fakture dobavljača primljene putem SPV-a (Rumunjska)
efactura:read—120
GET/efactura/inbox/{inbound_id}
Dohvat jedne primljene fakture
efactura:read—120
GET/efactura/inbox/{inbound_id}/download
Preuzimanje arhive primljene fakture
efactura:read—120
POST/efactura/inbox/sync
Preuzimanje novih SPV poruka (Rumunjska) u sandučić
efactura:read—10

Što je 4invoices API

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 kvotu slanja od 10/min. Pokreći ga cronom, nemoj ga prozivati.

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

Nacionalni e-računi (ANAF e-Factura, Rumunjska)

not_sentvalidatingqueuedsentprocessingacceptedrejectederror

Pogreške

StatusTipKod
422invalid_request_errorcius_ro_incomplete

Česte pogreške

  • Normalizirani životni ciklus: not_sent → validating → queued → sent → processing → accepted | rejected | error.
  • accepted znači da je faktura pravno prenesena. rejected znači da ju je nacionalni sustav e-računa (u Rumunjskoj: ANAF) odbio: ispravite je i predajte ponovno. error je greška prijenosa na našoj strani i ponovni pokušaj je siguran.
  • Predaja je nepovratna: drugi primjerak iste fakture više se ne može povući iz nacionalnog sustava e-računa. Zato je Idempotency-Key obavezan.
  • GET /v1/invoices/{id}/xml daje vam UBL / CIUS-RO XML (Rumunjska) bez ikakve predaje — za vlastitu arhivu ili reviziju.
  • Sandučić: POST /v1/efactura/inbox/sync povlači nove poruke, GET /v1/efactura/inbox ih ispisuje, a /download preuzima arhivu svake ulazne fakture.
  • Endpointi za e-Factura rade samo za rumunjske tenante; u suprotnom dobivate 404.

Pitanja i odgovori za razvijatelje

Koliko ANAF-u (Rumunjska) treba da prihvati fakturu?

Različito, od nekoliko sekundi do nekoliko sati. Nemojte blokirati prodaju: predajte asinkrono i accepted i rejected tretirajte kao događaje.

Mogu li dobiti CIUS-RO XML (Rumunjska) bez slanja ičega ANAF-u?

Da. GET /v1/invoices/{id}/xml generira dokument bez predaje, a /efactura/validate s include_xml=true vraća ga kodiranog u base64.

Koliko često smijem pokretati inbox/sync?

Najviše 10 poziva u minuti, ali u praksi u Rumunjskoj ANAF dopušta otprilike jedan poziv za popis poruka u minuti po CIF-u. Pokrećite ga iz crona, svakih nekoliko minuta.

Što učiniti ako status ostane error?

error je greška prijenosa ili autentikacije na našoj strani, pa je ponovni pokušaj siguran. Ako se ponavlja, pošaljite request_id podršci.