National e-fakturering via API

Forhåndskontrol (CIUS-RO for Rumænien), indsendelse i det nationale e-fakturasystem, normaliseret status, signeret svar og den indgående leverandørindbakke.

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

  1. 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.
  2. Indsend med POST /v1/invoices/{id}/efactura/submit, altid med en Idempotency-Key. Du får et submission_id og en status.
  3. Poll GET /v1/efactura/submissions/{id}, indtil den når accepted eller rejected.
  4. 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.
  5. Download arkivet med det nationale e-fakturasystems signerede svar (i Rumænien: ANAF) via GET /v1/efactura/submissions/{id}/download.

Alle endpoints

MetodeEndpointScopeIdempotency-KeyAnmodninger / 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:submitpåkrævet10
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

not_sentvalidatingqueuedsentprocessingacceptedrejectederror

Fejl

StatusTypeKode
422invalid_request_errorcius_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.