Verejné 4invoices API posiela fakturačné údaje z vášho systému do 4invoices a dovedie faktúru až do konca v národnom systéme elektronickej fakturácie (v Rumunsku: SPV ANAF). Jeden produkčný host, jeden client_credentials tok, idempotentné fiskálne zápisy a jedna chybová obálka na každej ceste.
https://api.4invoices.net/v1 · OpenAPI špecifikácia (bez kľúča)
Čo je 4invoices API
- Verejné API 4invoices je REST cez HTTPS: JSON na vstupe aj na výstupe.
- Jeden produkčný host: https://api.4invoices.net/v1. Samostatný testovací host neexistuje.
- Špecifikácia OpenAPI 3.1 je verejná a nevyžaduje kľúč — importujte ju priamo do Postmanu alebo generátora klientov.
- Každá odpoveď obsahuje hlavičku X-Request-Id; uveďte ju, keď sa obraciate na podporu.
- Každý fiškálny zápis je idempotentný: opakovanie po vypršaní časového limitu nikdy nevystaví druhý doklad.
- Úplný obeh národného systému elektronickej fakturácie cez API (v Rumunsku: ANAF e-Factura): predbežná kontrola, odoslanie, sledovanie, podpísaná odpoveď a prijímacia schránka. Žiadny rumunský konkurent toto neponúka.
- SmartBill nemá ani jeden endpoint na podanie do národného systému elektronickej fakturácie (ANAF, v Rumunsku) — odosielanie je nastavenie účtu dostupné iba v rozhraní — a nemá vôbec endpoint na výpis faktúr.
- Oblio dokáže vytvárať klientov a produkty iba ako vedľajší efekt vystavenia dokladu, nie ako plnohodnotné zdroje.
- Generovanie XML UBL / CIUS-RO (Rumunsko) bez odoslania: právny doklad dostanete ako súbor bez toho, aby ste sa dotkli národného systému elektronickej fakturácie.
- Idempotencia fiškálnych zápisov: opakovanie po vypršaní časového limitu nevytvorí druhú faktúru ani nespotrebuje druhé číslo.
- Programovo čitateľná schránka faktúr od dodávateľov — základ automatizovaného párovania.
Prvá faktúra v 6 krokoch
- Vygenerujte prihlasovacie údaje v paneli, v Fakturácia → Nastavenia → API prístup, a skopírujte client_secret — zobrazí sa iba raz.
- Doplňte profil firmy a aktivujte aspoň jeden číselný rad typu fiscale, inak vystavenie vráti issuer_profile_incomplete alebo no_series_configured.
- Vygenerujte prihlasovacie údaje v paneli, v Fakturácia → Nastavenia → API prístup, a skopírujte client_secret — zobrazí sa iba raz.
- Doplňte profil firmy a aktivujte aspoň jeden číselný rad typu fiscale, inak vystavenie vráti issuer_profile_incomplete alebo no_series_configured.
- Vymeňte prihlasovacie údaje za token: POST /v1/auth/token s grant_type client_credentials. Token platí jednu hodinu — uložte si ho, nežiadajte nový pri každom volaní.
- Vystavte faktúru: POST /v1/invoices s hlavičkou Idempotency-Key a vat_rate ako percentom (21, nie 0.21).
- Spustite predkontrolu (CIUS-RO pre Rumunsko) cez POST /v1/invoices/{id}/efactura/validate a potom odošlite do národného systému elektronickej fakturácie (v Rumunsku: ANAF) cez POST /v1/invoices/{id}/efactura/submit.
- Sledujte stav cez GET /v1/efactura/submissions/{id}, kým nedosiahne accepted alebo rejected.
bash
# 1 — token (1 hodina, uložte ho 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 — vystavte faktúru (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 kľúč na LOGICKÚ operáciu — pri opakovaní ho znovu použite, nikdy ho negenerujte nanovo.
"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}], # percento, nie 0.21
"currency": "RON",
}, timeout=60).json()
print(invoice["number"], invoice["totals"])Autentifikácia
- Tok je client_credentials: client_id + client_secret vymeníte za access_token typu Bearer.
- Token vyprší po 3600 sekundách. Obnovujte ho pred vypršaním, nie pri každom volaní — POST /auth/token má vlastný limit na IP adresu.
- client_secret sa ukladá iba ako hash a nedá sa obnoviť. Ak ho stratíte, vytvoríte nové prístupové údaje a staré zrušíte.
- Výhradne server–server. CORS nepovoľuje žiadny prehliadačový pôvod: v JavaScripte stránky by tajomstvo uniklo k návštevníkovi.
- Rozsahy (scopes) sa udeľujú pre každé prístupové údaje zvlášť. Pre každý systém vydajte samostatné prístupové údaje a každým dajte len minimálne rozsahy, ktoré potrebuje.
Fakturácia → Nastavenia → API prístup
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 uložte do cache; nevytvárajte nový pri každej požiadavke.
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;
}Sadzby DPH sú percentá
vat_rate: 21 ✓ · vat_rate: 0.19 ✗ · vat_rate: 1 ✗- vat_rate je PERCENTO: 21 znamená 21%.
- Hodnoty v intervale (0, 1] sa zamietajú — 0.19 je zlomok a 1 je nejednoznačné medzi 1% a 100%.
- 0 je platné a znamená oslobodenie alebo prenesenie daňovej povinnosti; zákonnú zmienku uveďte v notes.
- unit_price je jednotková cena BEZ DPH, ak je vystavovateľ platiteľom DPH.
- Potrebujete sumy ešte pred potvrdením? POST /v1/invoices/preview-totals vykoná rovnaký výpočet bez spotrebovania fiškálneho čísla.
Idempotencia fiskálnych zápisov
- Hlavička Idempotency-Key je POVINNÁ pri POST /invoices, POST /invoices/{id}/storno a POST /invoices/{id}/efactura/submit.
- Kľúče sa pamätajú 24 hodín. Opakované použitie toho istého kľúča s rovnakým telom vráti pôvodný výsledok a nastaví Idempotency-Replayed: true.
- Ten istý kľúč s iným telom vráti 409 idempotency_key_reuse — už vystavený fiškálny doklad sa nikdy neprepíše.
- Jeden kľúč na LOGICKÚ operáciu, nie na pokus HTTP: order-10457-invoice, nie nové UUID pri každom opakovaní.
- Dôvod je právny, nie technický: spotrebované fiškálne číslo ani faktúru podanú do národného systému elektronickej fakturácie nemožno stiahnuť.
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šetky endpointy
| Metóda | Endpoint | Scope | Idempotency-Key | Požiadaviek / minútu |
|---|---|---|---|---|
| POST | /auth/token Vymeniť prihlasovacie údaje za prístupový token | — | — | 120 |
| GET | /me Tenant, scopes a aktuálne limity | invoices:read | — | 120 |
| POST | /invoices Vystaviť faktúru alebo proformu | invoices:write | povinné | 30 |
| GET | /invoices Zoznam faktúr (stránkovanie kurzorom) | invoices:read | — | 120 |
| POST | /invoices/preview-totals Vypočítať súčty bez vytvorenia čohokoľvek | invoices:read | — | 120 |
| GET | /invoices/{invoice_id} Získať jednu faktúru | invoices:read | — | 120 |
| GET | /invoices/{invoice_id}/pdf Stiahnuť PDF faktúry | invoices:read | — | 120 |
| GET | /invoices/{invoice_id}/xml Stiahnuť XML UBL / CIUS-RO (Rumunsko) | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/storno Vystaviť dobropis, ktorý túto faktúru stornuje | invoices:write | povinné | 30 |
| POST | /invoices/{invoice_id}/payments Označiť faktúru ako uhradenú | invoices:write | — | 30 |
| DELETE | /invoices/{invoice_id}/payments Označiť faktúru ako neuhradenú | invoices:write | — | 30 |
| GET | /clients Zoznam klientov | clients:read | — | 120 |
| POST | /clients Vytvoriť alebo aktualizovať klienta | clients:write | — | 30 |
| GET | /lookup/company/{tax_id} Overiť CUI v registri ANAF (Rumunsko) | clients:read | — | 120 |
| GET | /series Zoznam číselných radov | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/validate Predkontrola (CIUS-RO pre Rumunsko) — overenie bez odoslania | efactura:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/submit Odoslať faktúru do ANAF (SPV, Rumunsko) | efactura:submit | povinné | 10 |
| GET | /efactura/submissions Zoznam podaní pre ANAF (Rumunsko) | efactura:read | — | 120 |
| GET | /efactura/submissions/{submission_id} Získať jedno podanie | efactura:read | — | 120 |
| POST | /efactura/submissions/{submission_id}/refresh Opýtať sa ANAF (Rumunsko) na aktuálny stav | efactura:read | — | 10 |
| GET | /efactura/submissions/{submission_id}/download Stiahnuť archív podpísanej odpovede | efactura:read | — | 120 |
| GET | /efactura/inbox Dodávateľské faktúry prijaté cez SPV (Rumunsko) | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id} Získať jednu prijatú faktúru | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id}/download Stiahnuť archív prijatej faktúry | efactura:read | — | 120 |
| POST | /efactura/inbox/sync Stiahnuť nové správy SPV (Rumunsko) do schránky | efactura:read | — | 10 |
25 endpoints · https://api.4invoices.net/v1/openapi.json
Scopes
- invoices:read
- invoices:write
- clients:read
- clients:write
- efactura:read
- efactura:submit
Národná elektronická fakturácia (ANAF e-Factura, Rumunsko)
- Skutočný rozdiel: celý obeh národného systému elektronickej fakturácie (v Rumunsku: ANAF e-Factura) prebieha cez API, nielen generovanie dokladu.
- POST /invoices/{id}/efactura/validate spustí predbežnú kontrolu (CIUS-RO pre Rumunsko) a vráti presne tie polia, ktoré by národný systém elektronickej fakturácie zamietol, bez toho, aby čokoľvek odoslal.
- GET /invoices/{id}/xml vygeneruje XML UBL / CIUS-RO (Rumunsko) bez odoslania — užitočné pre vlastný archív alebo interný audit.
- POST /invoices/{id}/efactura/submit faktúru podá do národného systému elektronickej fakturácie (v Rumunsku: SPV ANAF). Je to nevratné: druhú kópiu tej istej faktúry už nemožno stiahnuť.
- Životný cyklus je normalizovaný: not_sent → validating → queued → sent → processing → accepted | rejected | error. accepted znamená právne účinné odovzdanie; error je chyba prenosu na našej strane a dá sa bezpečne zopakovať.
- GET /efactura/submissions/{id}/download stiahne archív s podpísanou odpoveďou ANAF (Rumunsko).
- Existuje aj prijímacia strana: POST /efactura/inbox/sync načíta nové správy zo SPV (Rumunsko) a GET /efactura/inbox vypíše faktúry, ktoré vám poslali dodávatelia.
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á 4xx a 5xx používa rovnakú obálku: { "error": { type, code, message, param?, doc_url, request_id, errors? } }.
- type je hrubá trieda, podľa ktorej vetvíte logiku („môžem to zopakovať?“), a code je stabilný dôvod, ktorý mapujete do vlastného systému.
- param je bodkami oddelená cesta k chybnému poľu, napríklad lines.0.vat_rate.
- errors[] sa objaví, keď má jedna požiadavka problémy vo viac ako jednom poli.
- request_id sa loguje na našej strane. Uveďte ho v každom tikete podpory — presne identifikuje danú požiadavku.
- 404 sa vracia aj pre id, ktoré patrí inému tenantovi: nikdy nepotvrdzujeme, že cudzie údaje 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žiadaviek
| Bucket | Požiadaviek / minútu | 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 platia na prístupové údaje a minútu: 120 pre čítanie, 30 pre zápisy, 10 pre operácie elektronickej fakturácie (submit, refresh, inbox/sync).
- X-RateLimit-Limit, X-RateLimit-Remaining a X-RateLimit-Reset sú v KAŽDEJ odpovedi vrátane 429.
- 429 obsahuje aj Retry-After v sekundách. Rešpektujte ho; neopakujte v tesnej slučke.
- Kvóta 10/min existuje preto, lebo v Rumunsku samotný ANAF povoľuje zhruba jedno volanie zoznamu správ za minútu na CIF.
- Spúšťajte /efactura/inbox/sync z cronu, nie agresívnym dotazovaním.
- Potrebujete vyššie stropy? Napíšte cez stránku Kontakt a uveďte očakávaný denný objem.
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
// Rešpektujte Retry-After; nikdy neopakujte 4xx okrem 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;
}
// Opakovaný zápis MUSÍ použiť ROVNAKÝ Idempotency-Key, inak vystavíte
// druhý fiškálny doklad.Príručky podľa témy
Každá téma má vlastnú stránku s príslušnými endpointmi, príkladmi a chybami.
- Autentifikácia v 4invoices APIVymeníte client_id a client_secret za hodinový Bearer token, iba server-to-server.
- Vystavovanie faktúr cez APIPOST /invoices s Idempotency-Key, DPH v percentách, plus zoznam, storno a označenie zaplatené.
- Klienti a kontrola v registri ANAF (Rumunsko)Deduplikované vloženie alebo aktualizácia podľa tax_id a kontrola v registri ANAF (Rumunsko), aby elektronická faktúra nebola odmietnutá.
- ANAF e-Factura (Rumunsko) cez APIPre Rumunsko: CIUS-RO predkontrola, odoslanie do SPV, normalizovaný stav, podpísaná odpoveď a doručené faktúry.
- Číselné rady v APIBez aktívneho radu typu fiscale vystavenie vráti 409 no_series_configured.
- Chybové kódy a chybová obálkaJeden tvar na všetkých cestách: type, code, message, param, doc_url, request_id a errors.
- Limity požiadaviek a opakovania120 čítaní, 30 zápisov a 10 operácií elektronickej fakturácie za minútu na credential, s hlavičkami X-RateLimit-*.
Časté chyby
- Posielanie DPH ako zlomku (0.19) alebo ako 1. Obe sa zamietajú; pošlite 19 alebo 21.
- Generovanie tokenu pri každej požiadavke. Token platí hodinu; ukladajte ho do cache, inak narazíte na limit na IP endpointu tokenu.
- Generovanie nového kľúča idempotencie pri každom opakovaní — presne tento scenár vytvára duplicitné faktúry.
- Volanie z JavaScriptu v prehliadači. CORS blokuje každý pôvod a tajomstvo by bolo aj tak odhalené.
- Podanie do národného systému elektronickej fakturácie bez predbežnej kontroly (v Rumunsku: CIUS-RO). Chybné odoslanie nemožno stiahnuť.
- Dotazovanie /efactura/submissions/{id}/refresh viac ako 10-krát za minútu — táto kvóta sa zdieľa so submit.
- Vystavovanie skôr, než je profil firmy kompletný a existuje aktívny fiškálny rad.
Otázky a odpovede pre vývojárov
Ako získam prístupové údaje k 4invoices API?
V paneli, v Fakturácia → Nastavenia → API prístup. Dostanete client_id a client_secret; secret sa zobrazí raz a uchováva sa iba ako hash.
Ako dlho platí access_token?
3600 sekúnd, teda jednu hodinu. Uložte ho do cache a obnovte pred expiráciou — token endpoint má vlastný limit na IP.
Ako posielam sadzbu DPH?
Ako percento: 21 pre 21 %. Hodnoty v (0, 1] sú odmietnuté, takže 0.19 a 1 zlyhajú na validácii.
Ktoré volania vyžadujú Idempotency-Key?
POST /invoices, POST /invoices/{id}/storno a POST /invoices/{id}/efactura/submit. Kľúče sa pamätajú 24 hodín a opakovanie vráti originálny dokument s Idempotency-Replayed: true.
Môžem faktúru odoslať do ANAF e-Factura (Rumunsko) priamo cez API?
Áno, pre Rumunsko: CIUS-RO predkontrola cez /efactura/validate, odoslanie cez /efactura/submit, sledovanie normalizovaného stavu na /efactura/submissions/{id} a stiahnutie podpísanej odpovede ANAF.
Aké sú limity požiadaviek?
Na prihlasovacie údaje, za minútu: 120 čítaní, 30 zápisov a 10 operácií elektronickej fakturácie. Každá odpoveď nesie hlavičky X-RateLimit-* a 429 pridáva Retry-After.
Môžem API volať z frontendu?
Nie. Je výlučne server-to-server: žiadny origin prehliadača neprejde CORS a client_secret nepatrí do kódu, ktorý sa dostane k návštevníkovi.
Prečo dostávam issuer_profile_incomplete pri prvej faktúre?
Profil firmy je nekompletný alebo neexistuje aktívny číselný rad typu fiscale. Doplňte oboje v paneli; API odmietne vytvoriť neplatný fiskálny doklad.