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
- 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.
- Dien de factuur in met POST /v1/invoices/{id}/efactura/submit, altijd met een Idempotency-Key. U krijgt een submission_id en een status.
- Poll GET /v1/efactura/submissions/{id} tot de status accepted of rejected bereikt.
- 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.
- Download het archief met het ondertekende antwoord van ANAF (Roemenië) via GET /v1/efactura/submissions/{id}/download.
Alle endpoints
| Methode | Endpoint | Scope | Idempotency-Key | Verzoeken / 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:submit | verplicht | 10 |
| 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ë)
Fouten
| Status | Type | Code |
|---|---|---|
| 422 | invalid_request_error | cius_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.