Išankstinis patikrinimas (Rumunijoje – CIUS-RO), pateikimas į sistemą, normalizuota būsena, pasirašytas atsakymas ir gaunamoji tiekėjų gautųjų dėžutė.
Pirmoji sąskaita per 6 žingsnius
- 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.
- Pateikite su POST /v1/invoices/{id}/efactura/submit visada su Idempotency-Key. Gausite submission_id ir būseną.
- Klausinėkite GET /v1/efactura/submissions/{id}, kol būsena taps accepted arba rejected.
- Priverskite naują užklausą nacionalinei e. sąskaitų faktūrų sistemai su POST /v1/efactura/submissions/{id}/refresh — ji naudoja 10 per minutę grupę.
- 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
| Metodas | Galinis taškas | Scope | Idempotency-Key | Už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:submit | privaloma | 10 |
| 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
Klaidos
| Būsena | Tipas | Kodas |
|---|---|---|
| 422 | invalid_request_error | cius_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.