Veřejné API 4invoices přenáší fakturační data z vašeho systému do 4invoices a dovede fakturu až do národního systému elektronické fakturace (v Rumunsku SPV ANAF). Jeden produkční host, jeden tok client_credentials, idempotentní fiskální zápisy a jednotná obálka chyb na každé trase.
https://api.4invoices.net/v1 · Specifikace OpenAPI (klíč není potřeba)
Co je API 4invoices
- Veřejné API 4invoices je REST přes HTTPS, JSON na vstupu i na výstupu.
- Jeden produkční host: https://api.4invoices.net/v1. Samostatný sandbox host neexistuje.
- Specifikace OpenAPI 3.1 je veřejná a bez klíče — importujte ji rovnou do Postmanu nebo generátoru klientů.
- Každá odpověď nese hlavičku X-Request-Id; při žádosti o podporu ji uveďte.
- Každý fiskální zápis je idempotentní: opakování po timeoutu nikdy nevystaví druhý doklad.
- Celý cyklus ANAF e-Factura (Rumunsko) přes API: předběžná kontrola, podání, sledování, podepsaná odpověď a příchozí schránka. Žádný rumunský konkurent to nenabízí.
- SmartBill nemá žádný koncový bod pro podání do národního systému elektronické fakturace (v Rumunsku ANAF) — odesílání je nastavení jen v uživatelském rozhraní — a vůbec žádný koncový bod pro výpis faktur.
- Oblio umí vytvářet klienty a produkty jen jako vedlejší efekt vystavení dokladu, ne jako samostatné zdroje.
- Generování XML UBL (CIUS-RO pro Rumunsko) bez odeslání: legální doklad dostanete jako soubor, aniž se dotknete národního systému elektronické fakturace.
- Idempotence fiskálních zápisů: opakování po timeoutu nevytvoří druhou fakturu ani nespotřebuje druhé číslo.
- Programově čitelná schránka faktur od dodavatelů — základ automatizovaného párování.
První faktura v 6 krocích
- V panelu v sekci Fakturace → Nastavení → Přístup k API vytvořte přihlašovací údaje a zkopírujte client_secret — zobrazí se jen jednou.
- Doplňte profil firmy a aktivujte alespoň jednu řadu typu fiscale, jinak vystavení vrátí issuer_profile_incomplete nebo no_series_configured.
- V panelu v sekci Fakturace → Nastavení → Přístup k API vytvořte přihlašovací údaje a zkopírujte client_secret — zobrazí se jen jednou.
- Doplňte profil firmy a aktivujte alespoň jednu řadu typu fiscale, jinak vystavení vrátí issuer_profile_incomplete nebo no_series_configured.
- Vyměňte přihlašovací údaje za token: POST /v1/auth/token s grant_type client_credentials. Token platí jednu hodinu — ukládejte ho do cache, nevyžadujte nový u každého požadavku.
- Vystavte fakturu: POST /v1/invoices s hlavičkou Idempotency-Key a vat_rate jako procento (21, ne 0.21).
- Proveďte předběžnou kontrolu (CIUS-RO pro Rumunsko) pomocí POST /v1/invoices/{id}/efactura/validate a poté fakturu odešlete do národního systému elektronické fakturace pomocí POST /v1/invoices/{id}/efactura/submit.
- Sledujte stav pomocí GET /v1/efactura/submissions/{id}, dokud nedosáhne stavu accepted nebo rejected.
bash
# 1 — token (1 hodina, ukládat do cache)
ACCESS_TOKEN=$(curl -sS -X POST https://api.4invoices.net/v1/auth/token \
-H 'Content-Type: application/json' \
-d '{"grant_type":"client_credentials","client_id":"cli_XXX","client_secret":"sec_XXX"}' \
| python3 -c 'import sys,json; print(json.load(sys.stdin)["access_token"])')
# 2 — vystavit fakturu (Idempotency-Key je POVINNÁ)
curl -sS -X POST https://api.4invoices.net/v1/invoices \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: order-10457-invoice' \
-d '{"buyer":{"name":"Exemplu Comert SRL","tax_id":"RO12345678","county":"Cluj","city":"Cluj-Napoca","country":"RO"},
"lines":[{"description":"Abonament SaaS","quantity":1,"unit_price":400,"vat_rate":21}]}'
# 3 — preflight CIUS-RO, then send to ANAF
curl -sS -X POST https://api.4invoices.net/v1/invoices/inv_01J7ABC/efactura/validate \
-H "Authorization: Bearer $ACCESS_TOKEN"
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'javascript
const BASE = "https://api.4invoices.net/v1";
const token = await fetch(`${BASE}/auth/token`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
grant_type: "client_credentials",
client_id: process.env.FOURINVOICES_CLIENT_ID,
client_secret: process.env.FOURINVOICES_CLIENT_SECRET,
}),
}).then((r) => r.json()).then((d) => d.access_token);
const invoice = await fetch(`${BASE}/invoices`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
"Idempotency-Key": `order-${orderId}-invoice`,
},
body: JSON.stringify({
buyer: { name: "Exemplu Comert SRL", tax_id: "RO12345678", county: "Cluj", city: "Cluj-Napoca", country: "RO" },
lines: [{ description: "Abonament SaaS", quantity: 1, unit_price: 400, vat_rate: 21 }],
currency: "RON",
metadata: { order_id: String(orderId) },
}),
}).then((r) => r.json());
console.log(invoice.number, invoice.totals); // "FCT-000123" { net, vat, gross }python
import os, uuid, requests
BASE = "https://api.4invoices.net/v1"
token = requests.post(f"{BASE}/auth/token", json={
"grant_type": "client_credentials",
"client_id": os.environ["FOURINVOICES_CLIENT_ID"],
"client_secret": os.environ["FOURINVOICES_CLIENT_SECRET"],
}, timeout=30).json()["access_token"]
headers = {
"Authorization": f"Bearer {token}",
# Jeden klíč na LOGICKOU operaci — při opakování ho znovu použijte, nikdy negenerujte nový.
"Idempotency-Key": f"order-{order_id}-invoice",
}
invoice = requests.post(f"{BASE}/invoices", headers=headers, json={
"buyer": {"name": "Exemplu Comert SRL", "tax_id": "RO12345678",
"county": "Cluj", "city": "Cluj-Napoca", "country": "RO"},
"lines": [{"description": "Abonament SaaS", "quantity": 1,
"unit_price": 400, "vat_rate": 21}], # procento, ne 0.21
"currency": "RON",
}, timeout=60).json()
print(invoice["number"], invoice["totals"])Autentizace
- Tok je client_credentials: výměnou client_id + client_secret získáte Bearer access_token.
- Token vyprší za 3600 sekund. Obnovujte ho před vypršením, ne při každém volání — POST /auth/token má vlastní limit podle IP.
- client_secret se ukládá pouze jako hash a nelze ho obnovit. Pokud ho ztratíte, vytvoříte nové přihlašovací údaje a staré zrušíte.
- Pouze server-to-server. CORS nepustí žádný původ z prohlížeče: ze stránkového JavaScriptu by tajný klíč unikl návštěvníkovi.
- Scope se udělují u každých přihlašovacích údajů. Vytvořte samostatné údaje pro každý systém a dejte jim minimum potřebných scope.
Fakturace → Nastavení → Přístup k API
bash
curl -sS -X POST https://api.4invoices.net/v1/auth/token \
-H 'Content-Type: application/json' \
-d '{
"grant_type": "client_credentials",
"client_id": "cli_XXXXXXXXXXXX",
"client_secret": "sec_XXXXXXXXXXXXXXXXXXXX"
}'
# → {"access_token":"eyJ...","token_type":"Bearer","expires_in":3600,
# "scope":"invoices:read invoices:write efactura:submit"}javascript
// Token ukládejte do cache; nevytvářejte nový u každého požadavku.
let cached = { token: "", expiresAt: 0 };
async function getToken() {
if (cached.token && Date.now() < cached.expiresAt - 60_000) return cached.token;
const res = await fetch("https://api.4invoices.net/v1/auth/token", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
grant_type: "client_credentials",
client_id: process.env.FOURINVOICES_CLIENT_ID,
client_secret: process.env.FOURINVOICES_CLIENT_SECRET,
}),
});
if (!res.ok) throw new Error(`token ${res.status}`);
const data = await res.json();
cached = { token: data.access_token, expiresAt: Date.now() + data.expires_in * 1000 };
return cached.token;
}Sazby DPH jsou procenta
vat_rate: 21 ✓ · vat_rate: 0.19 ✗ · vat_rate: 1 ✗- vat_rate je PROCENTO: 21 znamená 21 %.
- Hodnoty v intervalu (0, 1] jsou odmítnuty — 0,19 je zlomek a 1 je nejednoznačné mezi 1 % a 100 %.
- 0 je platné a znamená osvobozeno od DPH nebo přenesení daňové povinnosti; zákonnou poznámku uveďte do notes.
- unit_price je ČISTÁ jednotková cena, pokud je vystavitel plátcem DPH.
- Potřebujete součty dřív, než cokoli potvrdíte? POST /v1/invoices/preview-totals provede stejný výpočet bez spotřebování fiskálního čísla.
Idempotence fiskálních zápisů
- Hlavička Idempotency-Key je POVINNÁ u POST /invoices, POST /invoices/{id}/storno a POST /invoices/{id}/efactura/submit.
- Klíče si API pamatuje 24 hodin. Opakování se stejným klíčem a stejným tělem vrátí původní výsledek a nastaví Idempotency-Replayed: true.
- Stejný klíč s jiným tělem vrátí 409 idempotency_key_reuse — již vystavený fiskální doklad se nikdy nepřepíše.
- Jeden klíč na LOGICKOU operaci, ne na HTTP pokus: order-10457-invoice, ne nový UUID při každém opakování.
- Důvod je právní, ne technický: spotřebované fiskální číslo a faktura podaná do národního systému elektronické fakturace (v Rumunsku SPV) se nedají vzít zpět.
bash
curl -sS -X POST https://api.4invoices.net/v1/invoices \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: order-10457-invoice' \
-d '{
"buyer": {
"name": "Exemplu Comert SRL",
"tax_id": "RO12345678",
"address": "Str. Fabricii 12",
"city": "Cluj-Napoca",
"county": "Cluj",
"country": "RO",
"email": "[email protected]"
},
"lines": [
{ "description": "Abonament SaaS, iulie", "quantity": 1, "unit_price": 400, "vat_rate": 21, "unit": "buc" },
{ "description": "Implementare", "quantity": 6, "unit_price": 250, "vat_rate": 21, "unit": "ora" }
],
"currency": "RON",
"document_kind": "factura",
"due_date": "2026-08-15",
"metadata": { "order_id": "10457" }
}'Všechny endpointy
| Metoda | Endpoint | Scope | Idempotency-Key | Požadavků / minutu |
|---|---|---|---|---|
| POST | /auth/token Výměna přihlašovacích údajů za přístupový token | — | — | 120 |
| GET | /me Tenant, scope a aktuální limity | invoices:read | — | 120 |
| POST | /invoices Vystavit fakturu nebo proformu | invoices:write | povinné | 30 |
| GET | /invoices Výpis faktur (stránkování kurzorem) | invoices:read | — | 120 |
| POST | /invoices/preview-totals Spočítat součty bez vytvoření čehokoli | invoices:read | — | 120 |
| GET | /invoices/{invoice_id} Načíst jednu fakturu | invoices:read | — | 120 |
| GET | /invoices/{invoice_id}/pdf Stáhnout PDF faktury | invoices:read | — | 120 |
| GET | /invoices/{invoice_id}/xml Stáhnout XML UBL (CIUS-RO pro Rumunsko) | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/storno Vystavit dobropis, který tuto fakturu ruší | invoices:write | povinné | 30 |
| POST | /invoices/{invoice_id}/payments Označit fakturu jako zaplacenou | invoices:write | — | 30 |
| DELETE | /invoices/{invoice_id}/payments Označit fakturu jako nezaplacenou | invoices:write | — | 30 |
| GET | /clients Výpis klientů | clients:read | — | 120 |
| POST | /clients Vytvořit nebo aktualizovat klienta | clients:write | — | 30 |
| GET | /lookup/company/{tax_id} Ověřit CUI proti registru ANAF (Rumunsko) | clients:read | — | 120 |
| GET | /series Výpis číslovacích řad | 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:submit | povinné | 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 |
25 endpoints · https://api.4invoices.net/v1/openapi.json
Scope
- invoices:read
- invoices:write
- clients:read
- clients:write
- efactura:read
- efactura:submit
Cyklus s národním systémem elektronické fakturace
- Skutečný rozdíl: celý cyklus s národním systémem elektronické fakturace (v Rumunsku ANAF e-Factura) běží přes API, ne jen generování dokladu.
- POST /invoices/{id}/efactura/validate provede předběžnou kontrolu (CIUS-RO pro Rumunsko) a vrátí přesná pole, která by národní systém elektronické fakturace odmítl, aniž by cokoli odeslal.
- GET /invoices/{id}/xml vygeneruje XML UBL (CIUS-RO pro Rumunsko) bez odeslání — vhodné pro váš vlastní archiv nebo interní audit.
- POST /invoices/{id}/efactura/submit doklad podá do národního systému elektronické fakturace (v Rumunsku SPV). Je to nevratné: druhou kopii téhož dokladu nelze ze systému stáhnout.
- Životní cyklus je normalizovaný: not_sent → validating → queued → sent → processing → accepted | rejected | error. accepted znamená právně přenesený doklad; error je chyba přenosu na naší straně a je bezpečné ji opakovat.
- GET /efactura/submissions/{id}/download stáhne archiv s podepsanou odpovědí národního systému elektronické fakturace (v Rumunsku ANAF).
- Existuje i příchozí strana: POST /efactura/inbox/sync stáhne nové zprávy z národního systému elektronické fakturace (v Rumunsku SPV) a GET /efactura/inbox vypíše faktury, které vám poslali dodavatelé.
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)Chyby
- Každá odpověď 4xx a 5xx používá stejnou obálku: { "error": { type, code, message, param?, doc_url, request_id, errors? } }.
- type je hrubá třída, podle které se větvíte ("mohu to zopakovat?"), a code je stabilní důvod, který mapujete do svého systému.
- param je tečková cesta k chybnému poli, například lines.0.vat_rate.
- errors[] se objeví, pokud má jeden požadavek problémy u více polí.
- request_id se zaznamenává na naší straně. Uveďte ho v každém podpůrném tiketu — přesně určí daný požadavek.
- 404 se vrací i pro identifikátor patřící jinému tenantovi: nikdy nepotvrzujeme, že data někoho jiného existují.
json
{
"error": {
"type": "invalid_request_error",
"code": "validation_failed",
"message": "Datele trimise nu sunt valide.",
"param": "lines.0.vat_rate",
"doc_url": "https://4invoices.net/ro/api-dezvoltatori#errors",
"request_id": "req_8a893f2f33d4472da8d6e144",
"errors": [
{ "param": "lines.0.vat_rate", "message": "VAT rate must be a percent (21), not a fraction", "type": "value_error" }
]
}
}| Stav | Typ | Kód |
|---|---|---|
| 401 | authentication_error | missing_bearer_token |
| 401 | authentication_error | invalid_client |
| 401 | authentication_error | token_expired |
| 401 | authentication_error | invalid_token |
| 401 | authentication_error | unauthorized |
| 403 | permission_error | insufficient_scope |
| 403 | permission_error | forbidden |
| 404 | not_found_error | not_found |
| 409 | conflict_error | idempotency_key_reuse |
| 409 | conflict_error | idempotency_in_progress |
| 409 | conflict_error | no_series_configured |
| 422 | invalid_request_error | validation_failed |
| 422 | invalid_request_error | issuer_profile_incomplete |
| 422 | invalid_request_error | cius_ro_incomplete |
| 422 | invalid_request_error | cannot_storno_draft |
| 422 | invalid_request_error | nothing_to_storno |
| 422 | invalid_request_error | invalid_json_number |
| 429 | rate_limit_error | rate_limit_exceeded |
| 502 | upstream_error | upstream_error |
| 503 | service_unavailable_error | service_unavailable |
Limity požadavků
| Skupina limitů | Požadavků / minutu | Význam |
|---|---|---|
| read | 120 | GET *, POST /invoices/preview-totals, POST /invoices/{id}/efactura/validate |
| write | 30 | POST /invoices, POST /invoices/{id}/storno, POST|DELETE /invoices/{id}/payments, POST /clients |
| submit | 10 | POST /invoices/{id}/efactura/submit, POST /efactura/submissions/{id}/refresh, POST /efactura/inbox/sync |
- Limity jsou na přihlašovací údaje, za minutu: 120 pro čtení, 30 pro zápis, 10 pro operace s národním systémem elektronické fakturace (submit, refresh, inbox/sync).
- X-RateLimit-Limit, X-RateLimit-Remaining a X-RateLimit-Reset se objevují u KAŽDÉ odpovědi, včetně 429.
- 429 nese navíc Retry-After v sekundách. Respektujte ho; nezkoušejte znovu v těsné smyčce.
- Kvóta 10 za minutu existuje proto, že v Rumunsku ANAF sama povoluje zhruba jedno volání seznamu zpráv za minutu na jedno CIF.
- Spouštějte /efactura/inbox/sync cronem, ne agresivním dotazováním.
- Potřebujete vyšší stropy? Napište přes stránku Kontakt s očekávaným denním objemem.
X-RateLimit-Limit · X-RateLimit-Remaining · X-RateLimit-Reset · Retry-After
http
HTTP/2 429
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1785312000
Retry-After: 17
Content-Type: application/json
{"error":{"type":"rate_limit_error","code":"rate_limit_exceeded",
"message":"...","doc_url":"https://4invoices.net/ro/api-dezvoltatori#errors",
"request_id":"req_..."}}javascript
// Respektujte Retry-After; nikdy neopakujte 4xx jiné než 429.
async function call(url, init, attempt = 0) {
const res = await fetch(url, init);
if (res.status === 429 || res.status >= 500) {
if (attempt >= 5) return res;
const retryAfter = Number(res.headers.get("Retry-After")) || 2 ** attempt;
await new Promise((r) => setTimeout(r, retryAfter * 1000));
return call(url, init, attempt + 1);
}
return res;
}
// Opakování zápisu MUSÍ znovu použít STEJNÝ Idempotency-Key, jinak vystavíte
// druhý fiskální doklad.Příručky podle tématu
Každé téma má vlastní stránku s příslušnými endpointy, ukázkami a chybami.
- Autentizace v API 4invoicesVyměňte client_id a client_secret za Bearer token platný hodinu, pouze server-to-server.
- Vystavování faktur přes APIPOST /invoices s Idempotency-Key, DPH jako procenta, plus výpis, storno a označení jako zaplacené.
- Klienti a vyhledávání v registru ANAF (Rumunsko)Vložení nebo aktualizace (upsert) deduplikované podle tax_id a vyhledání v registru ANAF (Rumunsko), aby elektronická faktura nebyla odmítnuta.
- Národní elektronická fakturace přes APIPř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.
- Číslovací řady v APIBez aktivní řady typu fiscale vrací vystavení 409 no_series_configured.
- Kódy chyb a obálka chybyJednotný tvar na každé trase: type, code, message, param, doc_url, request_id a errors.
- Limity požadavků a opakování120 čtení, 30 zápisů a 10 operací s národním systémem elektronické fakturace za minutu na přihlašovací údaje, s hlavičkami X-RateLimit-*.
Časté chyby
- Posílání DPH jako zlomku (0.19) nebo jako 1. Obojí je odmítnuto; posílejte 19 nebo 21.
- Vytváření tokenu u každého požadavku. Token platí hodinu; ukládejte ho do cache, jinak narazíte na limit podle IP u endpointu tokenů.
- Generování nového idempotency klíče při každém opakování — přesně ten scénář, který vytváří duplicitní faktury.
- Volání z JavaScriptu v prohlížeči. CORS blokuje každý původ a tajný klíč by stejně unikl.
- Podání do národního systému elektronické fakturace bez předběžné kontroly (CIUS-RO pro Rumunsko). Špatné podání nelze vzít zpět.
- Dotazování /efactura/submissions/{id}/refresh více než 10krát za minutu — tato kvóta je sdílená s podáním.
- Vystavování dříve, než je profil firmy kompletní a existuje aktivní fiskální řada.
Otázky a odpovědi pro vývojáře
Jak získám přihlašovací údaje k API 4invoices?
V panelu v sekci Fakturace → Nastavení → Přístup k API. Dostanete client_id a client_secret; secret se zobrazí jen jednou a ukládá se pouze jako hash.
Jak dlouho je access_token platný?
3600 sekund, tedy jednu hodinu. Ukládejte ho do cache a obnovujte před vypršením — endpoint tokenů má vlastní limit podle IP.
Jak posílám sazbu DPH?
Jako procento: 21 pro 21 %. Hodnoty v intervalu (0, 1] jsou odmítnuty, takže 0,19 i 1 neprojdou validací.
Které volání vyžadují Idempotency-Key?
POST /invoices, POST /invoices/{id}/storno a POST /invoices/{id}/efactura/submit. Klíče si API pamatuje 24 hodin a opakování vrátí původní doklad s hlavičkou Idempotency-Replayed: true.
Mohu fakturu podat do národního systému elektronické fakturace přímo z API?
Ano. Spusťte předběžnou kontrolu (CIUS-RO pro Rumunsko) přes /efactura/validate, podejte přes /efactura/submit, sledujte normalizovaný stav na /efactura/submissions/{id} a stáhněte podepsanou odpověď systému (v Rumunsku ANAF).
Jaké jsou limity požadavků?
Na přihlašovací údaje, za minutu: 120 čtení, 30 zápisů a 10 operací s národním systémem elektronické fakturace. Každá odpověď nese hlavičky X-RateLimit-* a 429 přidává Retry-After.
Mohu volat API z frontendu?
Ne. Je určeno pouze pro komunikaci mezi servery: žádný původ z prohlížeče neprojde CORS a client_secret nepatří do kódu, který se dostane k návštěvníkovi.
Proč dostanu issuer_profile_incomplete u první faktury?
Profil firmy je neúplný nebo neexistuje aktivní řada typu fiscale. Doplňte obojí v panelu; API odmítne vytvořit neplatný fiskální doklad.