Nacionalinė e. sąskaitų faktūrų sistema per API

Išankstinis patikrinimas (Rumunijoje – CIUS-RO), pateikimas į sistemą, normalizuota būsena, pasirašytas atsakymas ir gaunamoji tiekėjų gautųjų dėžutė.

Išankstinis patikrinimas (Rumunijoje – CIUS-RO), pateikimas į sistemą, normalizuota būsena, pasirašytas atsakymas ir gaunamoji tiekėjų gautųjų dėžutė.

← Atgal į API dokumentaciją

Pirmoji sąskaita per 6 žingsnius

  1. Paleiskite POST /v1/invoices/{id}/efactura/validate. Išankstinis patikrinimas (Rumunijoje – CIUS-RO) nieko nesiunčia į nacionalinę e. sąskaitų faktūrų sistemą ir tiksliai parodo, kas būtų atmesta.
  2. Pateikite su POST /v1/invoices/{id}/efactura/submit visada su Idempotency-Key. Gausite submission_id ir būseną.
  3. Klausinėkite GET /v1/efactura/submissions/{id}, kol būsena taps accepted arba rejected.
  4. Priverskite naują užklausą nacionalinei e. sąskaitų faktūrų sistemai su POST /v1/efactura/submissions/{id}/refresh — ji naudoja 10 per minutę grupę.
  5. Atsisiųskite nacionalinės e. sąskaitų faktūrų sistemos pasirašyto atsakymo archyvą su GET /v1/efactura/submissions/{id}/download.

Visi galiniai taškai

MetodasGalinis taškasScopeIdempotency-KeyUžklausų / min.
GET/invoices/{invoice_id}/xml
Atsisiųsti UBL XML (Rumunijoje – CIUS-RO)
invoices:read—120
POST/invoices/{invoice_id}/efactura/validate
Išankstinis patikrinimas (Rumunijoje – CIUS-RO) — tikrinti nesiunčiant
efactura:read—120
POST/invoices/{invoice_id}/efactura/submit
Pateikti sąskaitą į nacionalinę e. sąskaitų faktūrų sistemą
efactura:submitprivaloma10
GET/efactura/submissions
Išvardyti pateikimus į e. sąskaitų faktūrų sistemą
efactura:read—120
GET/efactura/submissions/{submission_id}
Gauti vieną pateikimą
efactura:read—120
POST/efactura/submissions/{submission_id}/refresh
Paklausti nacionalinės e. sąskaitų faktūrų sistemos dabartinės būsenos
efactura:read—10
GET/efactura/submissions/{submission_id}/download
Atsisiųsti pasirašytų atsakymų archyvą
efactura:read—120
GET/efactura/inbox
Per nacionalinę e. sąskaitų faktūrų sistemą gautos tiekėjų sąskaitos
efactura:read—120
GET/efactura/inbox/{inbound_id}
Gauti vieną gautą sąskaitą
efactura:read—120
GET/efactura/inbox/{inbound_id}/download
Atsisiųsti gautos sąskaitos archyvą
efactura:read—120
POST/efactura/inbox/sync
Gauti naujas sistemos žinutes į gautųjų dėžutę
efactura:read—10

Kas yra 4invoices API

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,
# todėl /inbox/sync skaičiuojamas į 10 per minutę pateikimo grupę. Paleiskite per cron, nekelkite apklausos.

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

Nacionalinė e. sąskaitų faktūrų sistema

not_sentvalidatingqueuedsentprocessingacceptedrejectederror

Klaidos

BūsenaTipasKodas
422invalid_request_errorcius_ro_incomplete

Dažniausios klaidos

  • Normalizuotas ciklas: not_sent → validating → queued → sent → processing → accepted | rejected | error.
  • accepted reiškia teisiškai perduota. rejected reiškia, kad nacionalinė e. sąskaitų faktūrų sistema atmetė: ištaisykite ir pateikite iš naujo. error yra mūsų pusės perdavimo klaida ir ją saugu bandyti pakartoti.
  • Pateikimas neatšaukiamas: tos pačios sąskaitos antros kopijos iš nacionalinės e. sąskaitų faktūrų sistemos nebeįmanoma atsiimti. Todėl Idempotency-Key yra privalomas.
  • GET /v1/invoices/{id}/xml duoda UBL XML (Rumunijoje – CIUS-RO) be jokio pateikimo — savo archyvui ar auditui.
  • Gautųjų dėžutė: POST /v1/efactura/inbox/sync gauna naujas žinutes, GET /v1/efactura/inbox jas išvardija, o /download atsisiunčia kiekvienos gautos sąskaitos archyvą.
  • e-Factura galiniai taškai veikia tik rumuniškiems tenant; kitaip gausite 404.

Kūrėjų klausimai ir atsakymai

Kiek laiko nacionalinei e. sąskaitų faktūrų sistemai prireikia sąskaitai priimti?

Skiriasi — nuo sekundžių iki valandų. Nestabdykite pardavimo: pateikite asinchroniškai ir laikykite accepted bei rejected įvykiais.

Ar galiu gauti XML (Rumunijoje – CIUS-RO) nieko neišsiųsdami į nacionalinę e. sąskaitų faktūrų sistemą?

Taip. GET /v1/invoices/{id}/xml generuoja dokumentą be pateikimo, o /efactura/validate jį grąžina base64 koduotą, kai include_xml=true.

Kaip dažnai galiu paleisti inbox/sync?

Ne daugiau kaip 10 kvietimų per minutę, bet praktiškai Rumunijos ANAF leidžia maždaug vieną žinučių sąrašo užklausą per minutę vienam mokesčių mokėtojo kodui (CIF). Paleiskite per cron kas kelias minutes.

Ką daryti, jei būsena lieka error?

error yra mūsų pusės perdavimo arba autentifikavimo klaida, todėl ją saugu bandyti pakartoti. Jei ji išlieka, nusiųskite request_id palaikymui.