ANAF e-Factura (Roemenië) via de API

Voor Roemenië: CIUS-RO-preflight, SPV-indiening, genormaliseerde status, ondertekend antwoord en inbox met leveranciersfacturen.

Voor Roemenië: CIUS-RO-preflight, SPV-indiening, genormaliseerde status, ondertekend antwoord en inbox met leveranciersfacturen.

← Terug naar de API-documentatie

Je eerste factuur in 6 stappen

  1. Voer POST /v1/invoices/{id}/efactura/validate uit. De precontrole (CIUS-RO voor Roemenië) verstuurt niets naar het nationale e-factureringssysteem en vertelt u precies wat zou worden geweigerd.
  2. Dien de factuur in met POST /v1/invoices/{id}/efactura/submit, altijd met een Idempotency-Key. U krijgt een submission_id en een status.
  3. Poll GET /v1/efactura/submissions/{id} tot de status accepted of rejected bereikt.
  4. Forceer een nieuwe query bij het nationale e-factureringssysteem (in Roemenië: ANAF) met POST /v1/efactura/submissions/{id}/refresh — dit telt mee voor de bucket van 10 per minuut.
  5. Download het archief met het ondertekende antwoord van ANAF (Roemenië) via GET /v1/efactura/submissions/{id}/download.

Alle endpoints

MethodeEndpointScopeIdempotency-KeyVerzoeken / minuut
GET/invoices/{invoice_id}/xml
De UBL / CIUS-RO-XML (Roemenië) downloaden
invoices:read—120
POST/invoices/{invoice_id}/efactura/validate
Precontrole (CIUS-RO voor Roemenië) — valideren zonder verzenden
efactura:read—120
POST/invoices/{invoice_id}/efactura/submit
De factuur naar ANAF (SPV, Roemenië) sturen
efactura:submitverplicht10
GET/efactura/submissions
Inzendingen bij ANAF (Roemenië) weergeven
efactura:read—120
GET/efactura/submissions/{submission_id}
Eén inzending ophalen
efactura:read—120
POST/efactura/submissions/{submission_id}/refresh
De huidige status opvragen bij ANAF (Roemenië)
efactura:read—10
GET/efactura/submissions/{submission_id}/download
Het archief van het ondertekende antwoord downloaden
efactura:read—120
GET/efactura/inbox
Via het SPV (Roemenië) ontvangen leveranciersfacturen
efactura:read—120
GET/efactura/inbox/{inbound_id}
Eén inkomende factuur ophalen
efactura:read—120
GET/efactura/inbox/{inbound_id}/download
Het archief van de inkomende factuur downloaden
efactura:read—120
POST/efactura/inbox/sync
Nieuwe berichten uit het SPV (Roemenië) naar de inbox halen
efactura:read—10

Wat de 4invoices-API is

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,
# dus /inbox/sync telt mee in het verzendbudget van 10/min. Plan het met cron, pol er niet naar.

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

Nationale e-facturering (ANAF e-Factura, Roemenië)

not_sentvalidatingqueuedsentprocessingacceptedrejectederror

Fouten

StatusTypeCode
422invalid_request_errorcius_ro_incomplete

Veelgemaakte fouten

  • Genormaliseerde levenscyclus: not_sent → validating → queued → sent → processing → accepted | rejected | error.
  • accepted betekent wettelijk verzonden. rejected betekent dat het nationale e-factureringssysteem (in Roemenië: ANAF) de factuur heeft geweigerd: corrigeer haar en dien haar opnieuw in. error is een transportfout aan onze kant en mag veilig opnieuw worden geprobeerd.
  • Indiening is onomkeerbaar: een tweede exemplaar van dezelfde factuur kan niet meer uit het nationale e-factureringssysteem worden ingetrokken. Daarom is de Idempotency-Key verplicht.
  • GET /v1/invoices/{id}/xml geeft u de UBL / CIUS-RO-XML (Roemenië) zonder enige indiening — voor uw eigen archief of een audit.
  • Inbox: POST /v1/efactura/inbox/sync haalt nieuwe berichten op, GET /v1/efactura/inbox toont ze en /download haalt het archief van elke inkomende factuur op.
  • De e-Factura-endpoints werken alleen voor Roemeense tenants; anders krijgt u een 404.

Vragen en antwoorden voor ontwikkelaars

Hoe lang duurt het voordat ANAF (Roemenië) een factuur accepteert?

Dat varieert, van seconden tot uren. Blokkeer de verkoop niet: dien asynchroon in en behandel accepted en rejected als events.

Kan ik de CIUS-RO-XML (Roemenië) krijgen zonder iets naar ANAF te sturen?

Ja. GET /v1/invoices/{id}/xml genereert het document zonder indiening, en /efactura/validate met include_xml=true geeft het base64-gecodeerd terug.

Hoe vaak mag ik inbox/sync uitvoeren?

Maximaal 10 aanroepen per minuut, maar in de praktijk staat ANAF in Roemenië ongeveer één aanroep voor het ophalen van de berichtenlijst per minuut per CIF toe. Voer het uit via een cron, om de paar minuten.

Wat doe ik als de status op error blijft staan?

error is een transport- of authenticatiefout aan onze kant, dus opnieuw proberen is veilig. Blijft het probleem bestaan, stuur dan het request_id naar support.