Javni 4invoices API šalje podatke o fakturiranju iz vašeg sustava u 4invoices i vodi fakturu do kraja u nacionalnom sustavu e-računa (u Rumunjskoj: ANAF-ov SPV). Jedan produkcijski host, jedan client_credentials tok, idempotentni fiskalni zapisi i jedan format pogreške na svim rutama.
https://api.4invoices.net/v1 · OpenAPI specifikacija (bez ključa)
Što je 4invoices API
- Javni 4invoices API je REST preko HTTPS-a: JSON na ulazu i JSON na izlazu.
- Postoji jedan produkcijski host: https://api.4invoices.net/v1. Zasebnog testnog hosta nema.
- Specifikacija OpenAPI 3.1 javna je i dostupna bez ključa — uvezite je izravno u Postman ili u generator klijenata.
- Svaki odgovor nosi zaglavlje X-Request-Id; navedite ga kad se obraćate podršci.
- Svaki fiskalni upis je idempotentan: ponovni pokušaj nakon isteka vremena nikad ne izdaje drugi dokument.
- Cijeli krug nacionalnog sustava e-računa preko API-ja (u Rumunjskoj: ANAF e-Factura): provjera, predaja, praćenje, potpisani odgovor i ulazni sandučić. Nijedan rumunjski konkurent to ne nudi.
- SmartBill nema nijedan endpoint za predaju u nacionalni sustav e-računa (ANAF, u Rumunjskoj) — slanje je samo postavka računa u sučelju — i nema uopće endpoint za popis faktura.
- Oblio može stvarati klijente i proizvode samo kao usputni učinak izdavanja dokumenta, a ne kao samostalne resurse.
- Generiranje UBL / CIUS-RO XML-a (Rumunjska) bez predaje: pravni dokument dobivate kao datoteku, a da ne dirate nacionalni sustav e-računa.
- Idempotentnost fiskalnih upisa: ponovni pokušaj nakon isteka vremena ne stvara drugu fakturu niti troši drugi broj.
- Sandučić ulaznih faktura dobavljača čitljiv programski — temelj za automatsko usklađivanje.
Prva faktura u 6 koraka
- Generirajte vjerodajnicu u panelu, pod Fakturiranje → Postavke → API pristup, i kopirajte client_secret — prikazuje se samo jednom.
- Dovršite profil tvrtke i aktivirajte barem jednu seriju vrste fiscale, inače izdavanje vraća issuer_profile_incomplete ili no_series_configured.
- Generirajte vjerodajnicu u panelu, pod Fakturiranje → Postavke → API pristup, i kopirajte client_secret — prikazuje se samo jednom.
- Dovršite profil tvrtke i aktivirajte barem jednu seriju vrste fiscale, inače izdavanje vraća issuer_profile_incomplete ili no_series_configured.
- Zamijenite vjerodajnicu za token: POST /v1/auth/token s grant_type client_credentials. Token traje jedan sat — spremite ga u cache, nemojte tražiti novi za svaki zahtjev.
- Izdajte fakturu: POST /v1/invoices sa zaglavljem Idempotency-Key i vat_rate kao postotkom (21, ne 0.21).
- Pokrenite provjeru (CIUS-RO za Rumunjsku) s POST /v1/invoices/{id}/efactura/validate, zatim pošaljite nacionalnom sustavu e-računa (u Rumunjskoj: ANAF) s POST /v1/invoices/{id}/efactura/submit.
- Pratite stanje s GET /v1/efactura/submissions/{id} dok ne dođe do accepted ili rejected.
bash
# 1 — token (1 sat, spremi ga u 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 — izdaj fakturu (Idempotency-Key je OBAVEZAN)
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}",
# Jedan ključ po LOGIČKOJ operaciji — ponovno ga koristite pri ponovnom pokušaju, nikad ga ne generirajte ponovno.
"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}], # postotak, ne 0.21
"currency": "RON",
}, timeout=60).json()
print(invoice["number"], invoice["totals"])Autentikacija
- Tok je client_credentials: client_id i client_secret mijenjate za Bearer access_token.
- Token istječe za 3600 sekundi. Obnovite ga prije isteka, a ne pri svakom pozivu — POST /auth/token ima vlastito ograničenje po IP adresi.
- client_secret pohranjuje se samo kao hash i ne može se vratiti. Ako ga izgubite, generirate novu vjerodajnicu i opozovete staru.
- Isključivo server-to-server. CORS ne propušta nijedno podrijetlo iz preglednika: iz JavaScripta na stranici tajna bi procurila posjetitelju.
- Scopeovi se dodjeljuju po vjerodajnici. Izdajte zasebnu vjerodajnicu za svaki sustav i svakoj dajte samo minimalne scopeove koji su joj potrebni.
Fakturiranje → Postavke → API pristup
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
// Spremite token u cache; ne izdavajte novi za svaki zahtjev.
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;
}Stope PDV-a su postoci
vat_rate: 21 ✓ · vat_rate: 0.19 ✗ · vat_rate: 1 ✗- vat_rate je POSTOTAK: 21 znači 21%.
- Vrijednosti u intervalu (0, 1] odbijaju se — 0.19 je razlomak, a 1 je dvosmislen između 1% i 100%.
- 0 je valjana vrijednost i znači oslobođenje ili prijenos porezne obveze; zakonsku napomenu upišite u notes.
- unit_price je NETO jedinična cijena kad je izdavatelj obveznik PDV-a.
- Trebate iznose prije konačnog upisa? POST /v1/invoices/preview-totals provodi isti izračun bez trošenja fiskalnog broja.
Idempotentnost pri fiskalnim zapisima
- Zaglavlje Idempotency-Key OBAVEZNO je na POST /invoices, POST /invoices/{id}/storno i POST /invoices/{id}/efactura/submit.
- Ključevi se pamte 24 sata. Ponovno slanje istog ključa s istim tijelom vraća izvorni rezultat i postavlja Idempotency-Replayed: true.
- Isti ključ s drugačijim tijelom vraća 409 idempotency_key_reuse — već izdani fiskalni dokument nikad se ne prepisuje.
- Jedan ključ po LOGIČKOJ operaciji, a ne po HTTP pokušaju: order-10457-invoice, a ne novi UUID pri svakom ponovnom pokušaju.
- Razlog je pravni, ne tehnički: potrošeni fiskalni broj i faktura predana u nacionalni sustav e-računa ne mogu se povući.
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" }
}'Svi endpointi
| Metoda | Endpoint | Scope | Idempotency-Key | Zahtjeva / minutu |
|---|---|---|---|---|
| POST | /auth/token Zamjena vjerodajnica za pristupni token | — | — | 120 |
| GET | /me Tenant, scopeovi i trenutačna ograničenja | invoices:read | — | 120 |
| POST | /invoices Izdavanje fakture ili predračuna | invoices:write | obavezno | 30 |
| GET | /invoices Popis faktura (paginacija kursorom) | invoices:read | — | 120 |
| POST | /invoices/preview-totals Izračun ukupnih iznosa bez stvaranja ičega | invoices:read | — | 120 |
| GET | /invoices/{invoice_id} Dohvat jedne fakture | invoices:read | — | 120 |
| GET | /invoices/{invoice_id}/pdf Preuzimanje PDF-a fakture | invoices:read | — | 120 |
| GET | /invoices/{invoice_id}/xml Preuzimanje UBL / CIUS-RO XML-a (Rumunjska) | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/storno Izdavanje kreditne bilješke kojom se poništava ova faktura | invoices:write | obavezno | 30 |
| POST | /invoices/{invoice_id}/payments Označi fakturu kao plaćenu | invoices:write | — | 30 |
| DELETE | /invoices/{invoice_id}/payments Označi fakturu kao neplaćenu | invoices:write | — | 30 |
| GET | /clients Popis klijenata | clients:read | — | 120 |
| POST | /clients Stvaranje ili ažuriranje klijenta | clients:write | — | 30 |
| GET | /lookup/company/{tax_id} Provjera CUI-ja u registru ANAF-a (Rumunjska) | clients:read | — | 120 |
| GET | /series Popis serija numeracije | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/validate Predprovjera (CIUS-RO za Rumunjsku) — validacija bez slanja | efactura:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/submit Slanje fakture ANAF-u (SPV, Rumunjska) | efactura:submit | obavezno | 10 |
| GET | /efactura/submissions Popis podnesaka ANAF-u (Rumunjska) | efactura:read | — | 120 |
| GET | /efactura/submissions/{submission_id} Dohvat jednog podneska | efactura:read | — | 120 |
| POST | /efactura/submissions/{submission_id}/refresh Upit ANAF-u (Rumunjska) o trenutačnom stanju | efactura:read | — | 10 |
| GET | /efactura/submissions/{submission_id}/download Preuzimanje arhive potpisanog odgovora | efactura:read | — | 120 |
| GET | /efactura/inbox Ulazne fakture dobavljača primljene putem SPV-a (Rumunjska) | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id} Dohvat jedne primljene fakture | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id}/download Preuzimanje arhive primljene fakture | efactura:read | — | 120 |
| POST | /efactura/inbox/sync Preuzimanje novih SPV poruka (Rumunjska) u sandučić | efactura:read | — | 10 |
25 endpoints · https://api.4invoices.net/v1/openapi.json
Scopeovi
- invoices:read
- invoices:write
- clients:read
- clients:write
- efactura:read
- efactura:submit
Nacionalni e-računi (ANAF e-Factura, Rumunjska)
- Ono što nas stvarno razlikuje: cijeli krug nacionalnog sustava e-računa (u Rumunjskoj: ANAF e-Factura) odvija se preko API-ja, a ne samo generiranje dokumenta.
- POST /invoices/{id}/efactura/validate pokreće provjeru (CIUS-RO za Rumunjsku) i vraća točno ona polja koja bi nacionalni sustav e-računa odbio, bez ikakvog slanja.
- GET /invoices/{id}/xml generira UBL / CIUS-RO XML (Rumunjska) bez predaje — korisno za vlastitu arhivu ili internu reviziju.
- POST /invoices/{id}/efactura/submit predaje fakturu u nacionalni sustav e-računa (u Rumunjskoj: ANAF-ov SPV). To je nepovratno: drugi primjerak iste fakture više se ne može povući.
- Životni ciklus je normaliziran: not_sent → validating → queued → sent → processing → accepted | rejected | error. accepted znači da je faktura pravno prenesena; error je greška prijenosa na našoj strani i ponovni pokušaj je siguran.
- GET /efactura/submissions/{id}/download preuzima arhivu s potpisanim odgovorom ANAF-a (Rumunjska).
- Postoji i ulazna strana: POST /efactura/inbox/sync povlači nove poruke iz SPV-a (Rumunjska), a GET /efactura/inbox ispisuje fakture koje su vam poslali dobavljači.
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)Pogreške
- Svaki 4xx i 5xx koristi isti omotač: { "error": { type, code, message, param?, doc_url, request_id, errors? } }.
- type je gruba klasa po kojoj granate logiku („mogu li ponoviti?”), a code je stabilan razlog koji mapirate u vlastiti sustav.
- param je putanja problematičnog polja u notaciji s točkama, na primjer lines.0.vat_rate.
- errors[] se pojavljuje kad jedan zahtjev ima probleme u više polja.
- request_id bilježimo na našoj strani. Navedite ga u svakom zahtjevu za podršku — on jednoznačno određuje zahtjev.
- 404 se vraća i za id koji pripada drugom tenantu: nikad ne potvrđujemo da tuđi podaci postoje.
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" }
]
}
}| Status | Tip | Kod |
|---|---|---|
| 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 |
Ograničenja zahtjeva
| Bucket | Zahtjeva / minutu | Značenje |
|---|---|---|
| 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 |
- Ograničenja su po vjerodajnici, po minuti: 120 za čitanja, 30 za upise, 10 za operacije e-računa (submit, refresh, inbox/sync).
- X-RateLimit-Limit, X-RateLimit-Remaining i X-RateLimit-Reset pojavljuju se u SVAKOM odgovoru, uključujući 429.
- Odgovor 429 nosi i Retry-After u sekundama. Poštujte ga; nemojte ponavljati u uskoj petlji.
- Bucket od 10/min postoji jer u Rumunjskoj sam ANAF dopušta otprilike jedan poziv za popis poruka u minuti po CIF-u.
- /efactura/inbox/sync pokrećite iz crona, a ne agresivnim pollingom.
- Trebate veće granice? Javite nam se preko stranice Kontakt i navedite očekivani dnevni obujam.
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
// Poštujte Retry-After; nikad ne ponavljajte 4xx osim 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;
}
// Ponovni pokušaj zapisa MORA koristiti ISTI Idempotency-Key, inače izdajete
// drugi fiskalni dokument.Vodiči po temama
Svaka tema ima svoju stranicu s odgovarajućim endpointima, primjerima i pogreškama.
- Autentikacija na 4invoices APIZamijenite client_id i client_secret za Bearer token koji traje sat, samo server-to-server.
- Izdavanje faktura preko API-jaPOST /invoices s Idempotency-Key, PDV u postocima, uz popis, storno i oznaku plaćeno.
- Klijenti i provjera u ANAF registru (Rumunjska)Umetanje ili ažuriranje (upsert) deduplicirano po tax_id i provjera u ANAF registru (Rumunjska) kako e-račun ne bi bio odbijen.
- ANAF e-Factura (Rumunjska) preko API-jaZa Rumunjsku: CIUS-RO provjera, predaja u SPV, normalizirani status, potpisani odgovor i pristigle fakture.
- Serije numeriranja u API-juBez aktivne serije tipa fiscale izdavanje vraća 409 no_series_configured.
- Kodovi pogrešaka i omotnica pogreškeJedan oblik na svim rutama: type, code, message, param, doc_url, request_id i errors.
- Ograničenja zahtjeva i ponovni pokušaji120 čitanja, 30 pisanja i 10 operacija e-računa u minuti po credentialu, sa X-RateLimit-* zaglavljima.
Česte pogreške
- Slanje PDV-a kao razlomka (0.19) ili kao 1. Oboje se odbija; pošaljite 19 ili 21.
- Traženje tokena za svaki zahtjev. Token traje sat vremena; spremite ga u cache, inače ćete udariti u ograničenje po IP adresi na endpointu za token.
- Generiranje novog ključa idempotentnosti pri svakom ponovnom pokušaju — upravo scenarij koji stvara duplicirane fakture.
- Pozivanje iz JavaScripta u pregledniku. CORS blokira svako podrijetlo, a tajna bi ionako bila izložena.
- Predaja u nacionalni sustav e-računa bez provjere (u Rumunjskoj: CIUS-RO). Pogrešna predaja ne može se povući.
- Pozivanje /efactura/submissions/{id}/refresh više od 10 puta u minuti — taj bucket dijeli se sa submit.
- Izdavanje prije nego što je profil tvrtke dovršen i postoji aktivna fiskalna serija.
Pitanja i odgovori za razvijatelje
Kako dobiti pristupne podatke za 4invoices API?
U panelu, pod Fakturiranje → Postavke → API pristup. Dobivate client_id i client_secret; secret se prikazuje jednom i čuva samo kao hash.
Koliko traje access_token?
3600 sekundi, odnosno jedan sat. Keširajte ga i obnovite prije isteka — token endpoint ima vlastito ograničenje po IP-u.
Kako poslati stopu PDV-a?
Kao postotak: 21 za 21%. Vrijednosti u (0, 1] se odbijaju, pa 0.19 i 1 padaju na validaciji.
Koji pozivi zahtijevaju Idempotency-Key?
POST /invoices, POST /invoices/{id}/storno i POST /invoices/{id}/efactura/submit. Ključevi se pamte 24 sata, a ponavljanje vraća izvorni dokument s Idempotency-Replayed: true.
Mogu li fakturu poslati u ANAF e-Factura (Rumunjska) direktno preko API-ja?
Da, za Rumunjsku: CIUS-RO provjera s /efactura/validate, predaja s /efactura/submit, praćenje normaliziranog statusa na /efactura/submissions/{id} i preuzimanje ANAF-ovog potpisanog odgovora.
Koja su ograničenja zahtjeva?
Po vjerodajnici, po minuti: 120 čitanja, 30 pisanja i 10 operacija e-računa. Svaki odgovor nosi X-RateLimit-* zaglavlja, a 429 dodaje Retry-After.
Mogu li API zvati iz frontenda?
Ne. Isključivo je server-to-server: nijedan preglednički origin ne prolazi CORS, a client_secret ne pripada kodu koji dolazi do posjetitelja.
Zašto dobivam issuer_profile_incomplete na prvoj fakturi?
Profil firme nije potpun ili ne postoji aktivna serija tipa fiscale. Dopunite oboje u panelu; API odbija proizvesti nevažeći fiskalni dokument.