Národní elektronická fakturace přes API

Předběžná kontrola (CIUS-RO pro Rumunsko), podání do národního systému elektronické fakturace, normalizovaný stav, podepsaná odpověď a příchozí schránka dodavatelských faktur.

Předběžná kontrola (CIUS-RO pro Rumunsko), podání do národního systému elektronické fakturace, normalizovaný stav, podepsaná odpověď a příchozí schránka dodavatelských faktur.

← Zpět na dokumentaci API

První faktura v 6 krocích

  1. Spusťte POST /v1/invoices/{id}/efactura/validate. Předběžná kontrola (CIUS-RO pro Rumunsko) nic neodesílá do národního systému elektronické fakturace a přesně vám řekne, co by bylo odmítnuto.
  2. Podejte pomocí POST /v1/invoices/{id}/efactura/submit, vždy s Idempotency-Key. Dostanete submission_id a stav.
  3. Dotazujte GET /v1/efactura/submissions/{id}, dokud nedosáhne stavu accepted nebo rejected.
  4. Vynuťte nový dotaz na národní systém elektronické fakturace pomocí POST /v1/efactura/submissions/{id}/refresh — počítá se do kvóty 10 za minutu.
  5. Stáhněte archiv s podepsanou odpovědí národního systému elektronické fakturace (v Rumunsku ANAF) pomocí GET /v1/efactura/submissions/{id}/download.

Všechny endpointy

MetodaEndpointScopeIdempotency-KeyPožadavků / minutu
GET/invoices/{invoice_id}/xml
Stáhnout XML UBL (CIUS-RO pro Rumunsko)
invoices:read—120
POST/invoices/{invoice_id}/efactura/validate
Předběžná kontrola (CIUS-RO pro Rumunsko) — ověřit bez odeslání
efactura:read—120
POST/invoices/{invoice_id}/efactura/submit
Odeslat fakturu do národního systému elektronické fakturace (v Rumunsku SPV)
efactura:submitpovinné10
GET/efactura/submissions
Výpis podání do národního systému elektronické fakturace
efactura:read—120
GET/efactura/submissions/{submission_id}
Načíst jedno podání
efactura:read—120
POST/efactura/submissions/{submission_id}/refresh
Dotázat se národního systému elektronické fakturace na aktuální stav
efactura:read—10
GET/efactura/submissions/{submission_id}/download
Stáhnout archiv podepsané odpovědi
efactura:read—120
GET/efactura/inbox
Faktury od dodavatelů přijaté přes národní systém elektronické fakturace
efactura:read—120
GET/efactura/inbox/{inbound_id}
Načíst jednu příchozí fakturu
efactura:read—120
GET/efactura/inbox/{inbound_id}/download
Stáhnout archiv příchozí faktury
efactura:read—120
POST/efactura/inbox/sync
Stáhnout nové zprávy z národního systému elektronické fakturace do schránky
efactura:read—10

Co je API 4invoices

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,
# takže /inbox/sync se počítá do kvóty podání 10/min. Spouštějte ho cronem, nedotazujte se na něj.

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

Cyklus s národním systémem elektronické fakturace

not_sentvalidatingqueuedsentprocessingacceptedrejectederror

Chyby

StavTypKód
422invalid_request_errorcius_ro_incomplete

Časté chyby

  • Normalizovaný životní cyklus: not_sent → validating → queued → sent → processing → accepted | rejected | error.
  • accepted znamená právně přenesený doklad. rejected znamená, že ho národní systém elektronické fakturace odmítl: opravte a podejte znovu. error je chyba přenosu na naší straně a je bezpečné ji opakovat.
  • Podání je nevratné: druhou kopii téhož dokladu nelze z národního systému elektronické fakturace stáhnout. Proto je Idempotency-Key povinná.
  • GET /v1/invoices/{id}/xml vrátí XML UBL (CIUS-RO pro Rumunsko) bez jakéhokoli podání — pro váš archiv nebo audit.
  • Schránka: POST /v1/efactura/inbox/sync stáhne nové zprávy, GET /v1/efactura/inbox je vypíše a /download stáhne archiv každé příchozí faktury.
  • Endpointy e-Factura fungují jen pro rumunské tenanty; jinak dostanete 404.

Otázky a odpovědi pro vývojáře

Jak dlouho trvá národnímu systému elektronické fakturace přijetí faktury?

Liší se od sekund po hodiny. Neblokujte prodej: podávejte asynchronně a stavy accepted a rejected berte jako události.

Mohu získat XML (CIUS-RO pro Rumunsko), aniž bych cokoli odeslal do národního systému elektronické fakturace?

Ano. GET /v1/invoices/{id}/xml vygeneruje doklad bez podání a /efactura/validate s include_xml=true ho vrátí zakódovaný v base64.

Jak často mohu spouštět inbox/sync?

Nejvýše 10 volání za minutu, ale v praxi v Rumunsku ANAF povoluje zhruba jedno volání seznamu zpráv za minutu na jedno CIF. Spouštějte z cronu každých několik minut.

Co dělat, když stav zůstane error?

error je na naší straně selhání přenosu nebo autentizace, takže je bezpečné ho opakovat. Pokud přetrvává, pošlete request_id podpoře.