Forhåndskontrol (CIUS-RO for Rumænien), indsendelse i det nationale e-fakturasystem, normaliseret status, signeret svar og den indgående leverandørindbakke.
← Tilbage til API-dokumentationen
Din første faktura i 6 trin
- Kør POST /v1/invoices/{id}/efactura/validate. Forhåndskontrollen (CIUS-RO for Rumænien) sender intet til det nationale e-fakturasystem og fortæller dig præcis, hvad der ville blive afvist.
- Indsend med POST /v1/invoices/{id}/efactura/submit, altid med en Idempotency-Key. Du får et submission_id og en status.
- Poll GET /v1/efactura/submissions/{id}, indtil den når accepted eller rejected.
- Gennemtving en frisk forespørgsel til det nationale e-fakturasystem med POST /v1/efactura/submissions/{id}/refresh — den tæller med i kvoten på 10 pr. minut.
- Download arkivet med det nationale e-fakturasystems signerede svar (i Rumænien: ANAF) via GET /v1/efactura/submissions/{id}/download.
Alle endpoints
| Metode | Endpoint | Scope | Idempotency-Key | Anmodninger / minut |
|---|---|---|---|---|
| GET | /invoices/{invoice_id}/xml Download UBL-XML (CIUS-RO for Rumænien) | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/validate Forhåndskontrol (CIUS-RO for Rumænien) — validér uden at sende | efactura:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/submit Indsend fakturaen til det nationale e-fakturasystem (i Rumænien: SPV) | efactura:submit | påkrævet | 10 |
| GET | /efactura/submissions List indsendelser til det nationale e-fakturasystem | efactura:read | — | 120 |
| GET | /efactura/submissions/{submission_id} Hent én indsendelse | efactura:read | — | 120 |
| POST | /efactura/submissions/{submission_id}/refresh Spørg det nationale e-fakturasystem om den aktuelle status | efactura:read | — | 10 |
| GET | /efactura/submissions/{submission_id}/download Download arkivet med det signerede svar | efactura:read | — | 120 |
| GET | /efactura/inbox Leverandørfakturaer modtaget via det nationale e-fakturasystem | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id} Hent én indgående faktura | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id}/download Download arkivet for den indgående faktura | efactura:read | — | 120 |
| POST | /efactura/inbox/sync Hent nye beskeder fra det nationale e-fakturasystem til indbakken | efactura:read | — | 10 |
Hvad 4invoices API'et er
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,
# så /inbox/sync tæller med i indsendelseskvoten på 10/min. Kør den fra cron, og poll den ikke.https://api.4invoices.net/v1 · https://api.4invoices.net/v1/openapi.json
Forløbet med det nationale e-fakturasystem
Fejl
| Status | Type | Kode |
|---|---|---|
| 422 | invalid_request_error | cius_ro_incomplete |
Almindelige fejl
- Normaliseret livscyklus: not_sent → validating → queued → sent → processing → accepted | rejected | error.
- accepted betyder lovligt transmitteret. rejected betyder, at det nationale e-fakturasystem afviste den: ret og indsend igen. error er en transportfejl på vores side, og den er sikker at forsøge igen.
- Indsendelse kan ikke gøres om: en anden kopi af samme faktura kan ikke trækkes tilbage fra det nationale e-fakturasystem. Derfor er Idempotency-Key obligatorisk.
- GET /v1/invoices/{id}/xml giver dig UBL-XML (CIUS-RO for Rumænien) uden nogen indsendelse overhovedet — til dit eget arkiv eller en revision.
- Indbakke: POST /v1/efactura/inbox/sync henter nye beskeder, GET /v1/efactura/inbox lister dem, og /download henter arkivet for hver indgående faktura.
- e-Factura-endpoints fungerer kun for rumænske tenants; ellers får du et 404.
Spørgsmål og svar for udviklere
Hvor lang tid går der, før det nationale e-fakturasystem accepterer en faktura?
Det varierer fra sekunder til timer. Bloker ikke salget: indsend asynkront, og behandl accepted og rejected som hændelser.
Kan jeg få XML'en (CIUS-RO for Rumænien) uden at sende noget til det nationale e-fakturasystem?
Ja. GET /v1/invoices/{id}/xml genererer dokumentet uden indsendelse, og /efactura/validate med include_xml=true returnerer det base64-kodet.
Hvor ofte kan jeg køre inbox/sync?
Højst 10 kald i minuttet, men i praksis tillader ANAF i Rumænien cirka ét kald til beskedlisten pr. minut pr. CIF. Kør den fra cron, hvert par minutter.
Hvad gør jeg, hvis status bliver ved med at være error?
error er en transport- eller godkendelsesfejl på vores side, så det er sikkert at forsøge igen. Hvis den vedvarer, så send request_id til kundeservice.