ANAF e-Factura (Rumunia) przez API

Dla Rumunii: walidacja CIUS-RO, wysyłka do SPV, znormalizowany status, podpisana odpowiedź i skrzynka faktur od dostawców.

Dla Rumunii: walidacja CIUS-RO, wysyłka do SPV, znormalizowany status, podpisana odpowiedź i skrzynka faktur od dostawców.

← Powrót do dokumentacji API

Pierwsza faktura w 6 krokach

  1. Uruchom POST /v1/invoices/{id}/efactura/validate. Walidacja wstępna (CIUS-RO dla Rumunii) niczego nie wysyła do krajowego systemu e-fakturowania i mówi dokładnie, co zostałoby odrzucone.
  2. Złóż fakturę przez POST /v1/invoices/{id}/efactura/submit, zawsze z Idempotency-Key. Otrzymujesz submission_id i status.
  3. Odpytuj GET /v1/efactura/submissions/{id}, aż osiągnie accepted lub rejected.
  4. Wymuś nowe zapytanie do krajowego systemu e-fakturowania (w Rumunii: ANAF) przez POST /v1/efactura/submissions/{id}/refresh — liczy się do puli 10 na minutę.
  5. Pobierz archiwum z podpisaną odpowiedzią ANAF (Rumunia) przez GET /v1/efactura/submissions/{id}/download.

Wszystkie endpointy

MetodaEndpointScopeIdempotency-KeyŻądania / minutę
GET/invoices/{invoice_id}/xml
Pobierz XML UBL / CIUS-RO (Rumunia)
invoices:read—120
POST/invoices/{invoice_id}/efactura/validate
Wstępna walidacja (CIUS-RO dla Rumunii) — sprawdzenie bez wysyłki
efactura:read—120
POST/invoices/{invoice_id}/efactura/submit
Wyślij fakturę do ANAF (SPV, Rumunia)
efactura:submitwymagane10
GET/efactura/submissions
Wyświetl zgłoszenia do ANAF (Rumunia)
efactura:read—120
GET/efactura/submissions/{submission_id}
Pobierz jedno zgłoszenie
efactura:read—120
POST/efactura/submissions/{submission_id}/refresh
Zapytaj ANAF (Rumunia) o aktualny stan
efactura:read—10
GET/efactura/submissions/{submission_id}/download
Pobierz podpisane archiwum odpowiedzi
efactura:read—120
GET/efactura/inbox
Faktury od dostawców otrzymane przez SPV (Rumunia)
efactura:read—120
GET/efactura/inbox/{inbound_id}
Pobierz jedną otrzymaną fakturę
efactura:read—120
GET/efactura/inbox/{inbound_id}/download
Pobierz archiwum otrzymanej faktury
efactura:read—120
POST/efactura/inbox/sync
Pobierz nowe wiadomości SPV (Rumunia) do skrzynki
efactura:read—10

Czym jest 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,
# więc /inbox/sync wlicza się do limitu wysyłki 10/min. Uruchamiaj go z crona, nie odpytuj.

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

Krajowe e-fakturowanie (ANAF e-Factura, Rumunia)

not_sentvalidatingqueuedsentprocessingacceptedrejectederror

Błędy

StatusTypKod
422invalid_request_errorcius_ro_incomplete

Częste błędy

  • Znormalizowany cykl życia: not_sent → validating → queued → sent → processing → accepted | rejected | error.
  • accepted oznacza przekazanie ze skutkiem prawnym. rejected oznacza, że krajowy system e-fakturowania (w Rumunii: ANAF) ją odrzucił: popraw i wyślij ponownie. error to błąd transportu po naszej stronie i można go bezpiecznie ponowić.
  • Wysyłka jest nieodwracalna: drugiej kopii tej samej faktury nie da się już wycofać z krajowego systemu e-fakturowania. Dlatego Idempotency-Key jest obowiązkowy.
  • GET /v1/invoices/{id}/xml daje XML UBL / CIUS-RO (Rumunia) bez jakiejkolwiek wysyłki — do własnego archiwum lub audytu.
  • Skrzynka przychodząca: POST /v1/efactura/inbox/sync pobiera nowe wiadomości, GET /v1/efactura/inbox je listuje, a /download pobiera archiwum każdej faktury przychodzącej.
  • Endpointy e-Factura działają tylko dla rumuńskich tenantów; w pozostałych przypadkach otrzymasz 404.

Pytania i odpowiedzi dla programistów

Ile czasu zajmuje ANAF (Rumunia) akceptacja faktury?

To zależy: od sekund do godzin. Nie blokuj sprzedaży: wysyłaj asynchronicznie i traktuj accepted oraz rejected jako zdarzenia.

Czy mogę uzyskać XML CIUS-RO (Rumunia) bez wysyłania czegokolwiek do ANAF?

Tak. GET /v1/invoices/{id}/xml generuje dokument bez wysyłki, a /efactura/validate z include_xml=true zwraca go zakodowanego w base64.

Jak często mogę uruchamiać inbox/sync?

Najwyżej 10 wywołań na minutę, ale w praktyce ANAF w Rumunii pozwala na mniej więcej jedno wywołanie listy wiadomości na minutę na CIF. Uruchamiaj go z crona, co kilka minut.

Co zrobić, jeśli status pozostaje error?

error to błąd transportu lub uwierzytelniania po naszej stronie, więc można bezpiecznie ponowić. Jeśli się utrzymuje, prześlij request_id do wsparcia.