Za Rumunjsku: CIUS-RO provjera, predaja u SPV, normalizirani status, potpisani odgovor i pristigle fakture.
Prva faktura u 6 koraka
- Pokrenite POST /v1/invoices/{id}/efactura/validate. Provjera (CIUS-RO za Rumunjsku) ništa ne šalje nacionalnom sustavu e-računa i točno vam kaže što bi bilo odbijeno.
- Predajte fakturu s POST /v1/invoices/{id}/efactura/submit, uvijek s Idempotency-Key. Dobivate submission_id i status.
- Provjeravajte GET /v1/efactura/submissions/{id} dok ne dođe do accepted ili rejected.
- Novi upit prema nacionalnom sustavu e-računa (u Rumunjskoj: ANAF) iznudite s POST /v1/efactura/submissions/{id}/refresh — računa se u bucket od 10 u minuti.
- Arhivu s potpisanim odgovorom ANAF-a (Rumunjska) preuzmite preko GET /v1/efactura/submissions/{id}/download.
Svi endpointi
| Metoda | Endpoint | Scope | Idempotency-Key | Zahtjeva / minutu |
|---|---|---|---|---|
| GET | /invoices/{invoice_id}/xml Preuzimanje UBL / CIUS-RO XML-a (Rumunjska) | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/validate Predprovjera (CIUS-RO za Rumunjsku) — validacija bez slanja | efactura:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/submit Slanje fakture ANAF-u (SPV, Rumunjska) | efactura:submit | obavezno | 10 |
| GET | /efactura/submissions Popis podnesaka ANAF-u (Rumunjska) | efactura:read | — | 120 |
| GET | /efactura/submissions/{submission_id} Dohvat jednog podneska | efactura:read | — | 120 |
| POST | /efactura/submissions/{submission_id}/refresh Upit ANAF-u (Rumunjska) o trenutačnom stanju | efactura:read | — | 10 |
| GET | /efactura/submissions/{submission_id}/download Preuzimanje arhive potpisanog odgovora | efactura:read | — | 120 |
| GET | /efactura/inbox Ulazne fakture dobavljača primljene putem SPV-a (Rumunjska) | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id} Dohvat jedne primljene fakture | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id}/download Preuzimanje arhive primljene fakture | efactura:read | — | 120 |
| POST | /efactura/inbox/sync Preuzimanje novih SPV poruka (Rumunjska) u sandučić | efactura:read | — | 10 |
Što je 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,
# pa se /inbox/sync računa u kvotu slanja od 10/min. Pokreći ga cronom, nemoj ga prozivati.https://api.4invoices.net/v1 · https://api.4invoices.net/v1/openapi.json
Nacionalni e-računi (ANAF e-Factura, Rumunjska)
Pogreške
| Status | Tip | Kod |
|---|---|---|
| 422 | invalid_request_error | cius_ro_incomplete |
Česte pogreške
- Normalizirani životni ciklus: not_sent → validating → queued → sent → processing → accepted | rejected | error.
- accepted znači da je faktura pravno prenesena. rejected znači da ju je nacionalni sustav e-računa (u Rumunjskoj: ANAF) odbio: ispravite je i predajte ponovno. error je greška prijenosa na našoj strani i ponovni pokušaj je siguran.
- Predaja je nepovratna: drugi primjerak iste fakture više se ne može povući iz nacionalnog sustava e-računa. Zato je Idempotency-Key obavezan.
- GET /v1/invoices/{id}/xml daje vam UBL / CIUS-RO XML (Rumunjska) bez ikakve predaje — za vlastitu arhivu ili reviziju.
- Sandučić: POST /v1/efactura/inbox/sync povlači nove poruke, GET /v1/efactura/inbox ih ispisuje, a /download preuzima arhivu svake ulazne fakture.
- Endpointi za e-Factura rade samo za rumunjske tenante; u suprotnom dobivate 404.
Pitanja i odgovori za razvijatelje
Koliko ANAF-u (Rumunjska) treba da prihvati fakturu?
Različito, od nekoliko sekundi do nekoliko sati. Nemojte blokirati prodaju: predajte asinkrono i accepted i rejected tretirajte kao događaje.
Mogu li dobiti CIUS-RO XML (Rumunjska) bez slanja ičega ANAF-u?
Da. GET /v1/invoices/{id}/xml generira dokument bez predaje, a /efactura/validate s include_xml=true vraća ga kodiranog u base64.
Koliko često smijem pokretati inbox/sync?
Najviše 10 poziva u minuti, ali u praksi u Rumunjskoj ANAF dopušta otprilike jedan poziv za popis poruka u minuti po CIF-u. Pokrećite ga iz crona, svakih nekoliko minuta.
Što učiniti ako status ostane error?
error je greška prijenosa ili autentikacije na našoj strani, pa je ponovni pokušaj siguran. Ako se ponavlja, pošaljite request_id podršci.