Національна система електронного виставлення рахунків через API

Передперевірка (у Румунії — CIUS-RO), подання до національної системи (у Румунії — SPV), нормалізований статус, підписана відповідь і вхідні рахунки постачальників.

Передперевірка (у Румунії — CIUS-RO), подання до національної системи (у Румунії — SPV), нормалізований статус, підписана відповідь і вхідні рахунки постачальників.

← Назад до документації API

Перший рахунок за 6 кроків

  1. Запустіть POST /v1/invoices/{id}/efactura/validate. Попередня перевірка (у Румунії — CIUS-RO) нічого не надсилає до національної системи електронного виставлення рахунків і точно показує, що було б відхилено.
  2. Подайте рахунок через POST /v1/invoices/{id}/efactura/submit, завжди з Idempotency-Key. Ви отримаєте submission_id і статус.
  3. Опитуйте GET /v1/efactura/submissions/{id}, доки статус не стане accepted або rejected.
  4. Примусово надішліть новий запит до національної системи електронного виставлення рахунків через POST /v1/efactura/submissions/{id}/refresh — він зараховується до кошика 10 на хвилину.
  5. Завантажте архів із підписаною відповіддю національної системи (у Румунії — ANAF) через GET /v1/efactura/submissions/{id}/download.

Усі ендпоїнти

МетодЕндпоїнтScopeIdempotency-KeyЗапитів / хвилину
GET/invoices/{invoice_id}/xml
Завантажити XML UBL (у Румунії — CIUS-RO)
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
Список подань до національної системи електронного виставлення рахунків
efactura:read—120
GET/efactura/submissions/{submission_id}
Отримати одне подання
efactura:read—120
POST/efactura/submissions/{submission_id}/refresh
Запит до національної системи електронного виставлення рахунків про поточний стан
efactura:read—10
GET/efactura/submissions/{submission_id}/download
Завантажити архів підписаної відповіді
efactura:read—120
GET/efactura/inbox
Вхідні рахунки постачальників, отримані через національну систему електронного виставлення рахунків
efactura:read—120
GET/efactura/inbox/{inbound_id}
Отримати один вхідний рахунок
efactura:read—120
GET/efactura/inbox/{inbound_id}/download
Завантажити архів вхідного рахунку
efactura:read—120
POST/efactura/inbox/sync
Отримати нові повідомлення національної системи електронного виставлення рахунків у вхідні
efactura:read—10

Що таке 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,
# тож /inbox/sync зараховується до квоти надсилання 10/хв. Запускайте за розкладом (cron), не опитуйте.

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

Шлях до національної системи електронного виставлення рахунків

not_sentvalidatingqueuedsentprocessingacceptedrejectederror

Помилки

СтатусТипКод
422invalid_request_errorcius_ro_incomplete

Типові помилки

  • Нормалізований життєвий цикл: not_sent → валідація → у черзі → надіслано → обробка → accepted | rejected | помилка.
  • accepted означає юридично передано. rejected означає, що національна система електронного виставлення рахунків відмовила: виправте й подайте знову. error — це збій транспорту на нашому боці, і повторна спроба безпечна.
  • Подання незворотне: другу копію того самого рахунку неможливо відкликати з національної системи електронного виставлення рахунків. Саме тому Idempotency-Key обов’язковий.
  • GET /v1/invoices/{id}/xml дає вам XML у форматі UBL (у Румунії — CIUS-RO) взагалі без подання — для власного архіву або аудиту.
  • Вхідна скринька: POST /v1/efactura/inbox/sync отримує нові повідомлення, GET /v1/efactura/inbox показує їх список, а /download завантажує архів кожного вхідного рахунку.
  • Endpoint-и e-Factura працюють лише для румунських тенанти; в іншому разі ви отримаєте 404.

Питання та відповіді для розробників

Скільки часу потрібно національній системі електронного виставлення рахунків, щоб прийняти рахунок?

По-різному — від секунд до годин. Не блокуйте продаж: подавайте асинхронно й обробляйте accepted і rejected як події.

Чи можна отримати XML (у Румунії — CIUS-RO), нічого не надсилаючи до національної системи електронного виставлення рахунків?

Так. GET /v1/invoices/{id}/xml генерує документ без подання, а /efactura/validate з include_xml=true повертає його в кодуванні base64.

Як часто можна запускати inbox/sync?

Не більше 10 викликів на хвилину, але на практиці в Румунії ANAF дозволяє приблизно один виклик списку повідомлень на хвилину для одного CIF. Запускайте його з cron кожні кілька хвилин.

Що робити, якщо статус залишається помилка?

помилка — це збій транспорту або автентифікації на нашому боці, тому повторна спроба безпечна. Якщо проблема не зникає, надішліть request_id до підтримки.