Nationell e-fakturering via API

Förhandskontroll (CIUS-RO för Rumänien), inlämning i det nationella e-fakturasystemet, normaliserad status, signerat svar och den inkommande leverantörsinkorgen.

Förhandskontroll (CIUS-RO för Rumänien), inlämning i det nationella e-fakturasystemet, normaliserad status, signerat svar och den inkommande leverantörsinkorgen.

← Tillbaka till API-dokumentationen

Din första faktura i 6 steg

  1. Kör POST /v1/invoices/{id}/efactura/validate. Förhandskontrollen (CIUS-RO för Rumänien) skickar inget till det nationella e-fakturasystemet och säger exakt vad som skulle avvisas.
  2. Lämna in med POST /v1/invoices/{id}/efactura/submit, alltid med en Idempotency-Key. Du får ett submission_id och en status.
  3. Polla GET /v1/efactura/submissions/{id} tills den når accepted eller rejected.
  4. Tvinga fram en ny förfrågan till det nationella e-fakturasystemet med POST /v1/efactura/submissions/{id}/refresh — den räknas mot gruppen på 10 per minut.
  5. Ladda ned arkivet med det nationella e-fakturasystemets signerade svar (i Rumänien: ANAF) via GET /v1/efactura/submissions/{id}/download.

Alla endpoints

MetodEndpointScopeIdempotency-KeyFörfrågningar / minut
GET/invoices/{invoice_id}/xml
Ladda ned UBL-XML (CIUS-RO för Rumänien)
invoices:read—120
POST/invoices/{invoice_id}/efactura/validate
Förhandskontroll (CIUS-RO för Rumänien) — validera utan att skicka
efactura:read—120
POST/invoices/{invoice_id}/efactura/submit
Lämna in fakturan till det nationella e-fakturasystemet (i Rumänien: SPV)
efactura:submitkrävs10
GET/efactura/submissions
Lista inlämningar till det nationella e-fakturasystemet
efactura:read—120
GET/efactura/submissions/{submission_id}
Hämta en inlämning
efactura:read—120
POST/efactura/submissions/{submission_id}/refresh
Fråga det nationella e-fakturasystemet om det aktuella läget
efactura:read—10
GET/efactura/submissions/{submission_id}/download
Ladda ned arkivet med det signerade svaret
efactura:read—120
GET/efactura/inbox
Leverantörsfakturor mottagna via det nationella e-fakturasystemet
efactura:read—120
GET/efactura/inbox/{inbound_id}
Hämta en inkommande faktura
efactura:read—120
GET/efactura/inbox/{inbound_id}/download
Ladda ned arkivet för den inkommande fakturan
efactura:read—120
POST/efactura/inbox/sync
Hämta nya meddelanden från det nationella e-fakturasystemet till inkorgen
efactura:read—10

Vad 4invoices API är

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 räknas mot gruppen för inlämning på 10/min. Kör det via cron, polla inte.

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

Flödet mot det nationella e-fakturasystemet

not_sentvalidatingqueuedsentprocessingacceptedrejectederror

Fel

StatusTypKod
422invalid_request_errorcius_ro_incomplete

Vanliga misstag

  • Normaliserad livscykel: not_sent → validating → queued → sent → processing → accepted | rejected | error.
  • accepted betyder lagligen överförd. rejected betyder att det nationella e-fakturasystemet avvisade den: rätta och lämna in igen. error är ett transportfel på vår sida och det är säkert att försöka igen.
  • Inlämningen är oåterkallelig: en andra kopia av samma faktura kan inte dras tillbaka från det nationella e-fakturasystemet. Därför är Idempotency-Key obligatorisk.
  • GET /v1/invoices/{id}/xml ger dig UBL-XML (CIUS-RO för Rumänien) utan någon inlämning alls — för ditt eget arkiv eller en granskning.
  • Inkorg: POST /v1/efactura/inbox/sync hämtar nya meddelanden, GET /v1/efactura/inbox listar dem, och /download hämtar arkivet för varje inkommande faktura.
  • e-Factura-endpointarna fungerar bara för rumänska tenants; annars får du ett 404.

Frågor och svar för utvecklare

Hur lång tid tar det för det nationella e-fakturasystemet att godkänna en faktura?

Det varierar från sekunder till timmar. Blockera inte försäljningen: lämna in asynkront och behandla accepted och rejected som händelser.

Kan jag få XML-filen (CIUS-RO för Rumänien) utan att skicka något till det nationella e-fakturasystemet?

Ja. GET /v1/invoices/{id}/xml genererar dokumentet utan inlämning, och /efactura/validate med include_xml=true returnerar det base64-kodat.

Hur ofta kan jag köra inbox/sync?

Högst 10 anrop per minut, men i praktiken tillåter ANAF i Rumänien ungefär ett anrop för meddelandelistan per minut per CIF. Kör den från cron, var några minuter.

Vad gör jag om statusen fortsätter vara error?

error är ett transport- eller autentiseringsfel på vår sida, så det är säkert att försöka igen. Om det kvarstår, skicka request_id till supporten.