За Румунију: CIUS-RO провера, предаја у SPV, нормализовани статус, потписани одговор и пристигле фактуре.
Прва фактура у 6 корака
- Покрените POST /v1/invoices/{id}/efactura/validate. Провера (CIUS-RO за Румунију) ништа не шаље националном систему е-фактурисања и тачно вам каже шта би било одбијено.
- Предајте фактуру са POST /v1/invoices/{id}/efactura/submit, увек са Idempotency-Key. Добијате submission_id и статус.
- Проверавајте GET /v1/efactura/submissions/{id} док не стигне до accepted или rejected.
- Нови упит ка националном систему е-фактурисања (у Румунији: ANAF) изнудите са POST /v1/efactura/submissions/{id}/refresh — рачуна се у корпу од 10 у минуту.
- Архиву са потписаним одговором ANAF-а (Румунија) преузмите преко GET /v1/efactura/submissions/{id}/download.
Сви endpoint-и
| Метода | Endpoint | Scope | Idempotency-Key | Захтева / минут |
|---|---|---|---|---|
| GET | /invoices/{invoice_id}/xml Преузми UBL / CIUS-RO XML (Румунија) | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/validate Предпровера (CIUS-RO за Румунију) — валидација без слања | efactura:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/submit Пошаљи фактуру ANAF-у (SPV, Румунија) | efactura:submit | обавезно | 10 |
| GET | /efactura/submissions Листа слања ANAF-у (Румунија) | efactura:read | — | 120 |
| GET | /efactura/submissions/{submission_id} Преузми једно слање | efactura:read | — | 120 |
| POST | /efactura/submissions/{submission_id}/refresh Упит ANAF-у (Румунија) о тренутном стању | efactura:read | — | 10 |
| GET | /efactura/submissions/{submission_id}/download Преузми архиву потписаног одговора | efactura:read | — | 120 |
| GET | /efactura/inbox Фактуре добављача примљене преко SPV-а (Румунија) | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id} Преузми једну улазну фактуру | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id}/download Преузми архиву примљене фактуре | efactura:read | — | 120 |
| POST | /efactura/inbox/sync Преузми нове SPV поруке (Румунија) у сандуче | efactura:read | — | 10 |
Шта је 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,
# па се /inbox/sync рачуна у квоту слања од 10/мин. Покрећите га преко cron-а, не прозивајте га.https://api.4invoices.net/v1 · https://api.4invoices.net/v1/openapi.json
Национално е-фактурисање (ANAF e-Factura, Румунија)
Грешке
| Статус | Тип | Код |
|---|---|---|
| 422 | invalid_request_error | cius_ro_incomplete |
Честе грешке
- Нормализован животни циклус: not_sent → валидиране → в опашка → изпратен → обработка → accepted | rejected | грешка.
- accepted значи да је фактура правно пренета. rejected значи да ју је национални систем е-фактурисања (у Румунији: ANAF) одбио: исправите је и поново предајте. error је грешка преноса на нашој страни и поновни покушај је безбедан.
- Предаја је неповратна: други примерак исте фактуре више се не може повући из националног система е-фактурисања. Зато је Idempotency-Key обавезан.
- GET /v1/invoices/{id}/xml вам даје UBL / CIUS-RO XML (Румунија) без икакве предаје — за сопствену архиву или ревизију.
- Сандуче: POST /v1/efactura/inbox/sync повлачи нове поруке, GET /v1/efactura/inbox их приказује, а /download преузима архиву сваке улазне фактуре.
- Endpoint-и за e-Factura раде само за румунске tenant-е; у супротном добијате 404.
Питања и одговори за програмере
Колико је ANAF-у (Румунија) потребно да прихвати фактуру?
Различито, од неколико секунди до неколико сати. Немојте блокирати продају: предајте асинхроно и accepted и rejected третирајте као догађаје.
Могу ли да добијем CIUS-RO XML (Румунија) без слања било чега ANAF-у?
Да. GET /v1/invoices/{id}/xml генерише документ без предаје, а /efactura/validate са include_xml=true враћа га кодираног у base64.
Колико често смем да покрећем inbox/sync?
Највише 10 позива у минуту, али у пракси у Румунији ANAF дозвољава отприлике један позив за листу порука у минуту по CIF-у. Покрећите га из cron-а, на сваких неколико минута.
Шта да радим ако статус остане грешка?
грешка је грешка преноса или аутентикације на нашој страни, па је поновни покушај безбедан. Ако се понавља, пошаљите request_id подршци.