120 citiri, 30 scrieri și 10 operațiuni ANAF pe minut per credențială, cu antete X-RateLimit-*.
Prima factură în 6 pași
- Limitele sunt per credențială, pe minut: 120 citiri, 30 scrieri, 10 operațiuni ANAF.
- Bucketul ANAF acoperă efactura/submit, submissions/{id}/refresh și efactura/inbox/sync.
- Fiecare răspuns are X-RateLimit-Limit, X-RateLimit-Remaining și X-RateLimit-Reset, inclusiv 429-ul.
- Pe 429 primești Retry-After în secunde; așteaptă atât înainte de a reîncerca.
Ce este API-ul 4invoices
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
// Respectă Retry-After; nu reîncerca niciodată un 4xx în afară de 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;
}
// O reîncercare de scriere TREBUIE să refolosească ACELAȘI Idempotency-Key, altfel emiți
// un al doilea document fiscal.https://api.4invoices.net/v1 · https://api.4invoices.net/v1/openapi.json
Limite de rată
| Bucket | Cereri / minut | Ce înseamnă |
|---|---|---|
| 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 |
Erori
| Status | Tip | Cod |
|---|---|---|
| 429 | rate_limit_error | rate_limit_exceeded |
Greșeli frecvente
- Bucketul de 10 pe minut nu e arbitrar: ANAF limitează la aproximativ o listare de mesaje pe minut per CIF.
- La retry pe o scriere refolosește ACEEAȘI Idempotency-Key, altfel emiți un al doilea document.
- Endpointul de token are limită separată pe IP. Ține tokenul în cache pentru toată ora lui de viață.
- GET /v1/me îți arată bucketele curente ale credențialei — util într-un health-check al integrării.
- Scrie-ne prin pagina de contact, cu volumul estimat pe zi.
Întrebări frecvente de la dezvoltatori
Limita e pe cont sau pe credențială?
Pe credențială. Împărțind traficul pe credențiale separate per sistem, un import în masă nu îți sufocă fluxul din magazin.
Ce backoff recomandați?
Respectă Retry-After când există, altfel exponențial de la 1–2 secunde, cu maximum 5 încercări. Fără bucle strânse.
429-ul are și el antetele X-RateLimit?
Da. Le emitem chiar pe 429, exact unde un client are nevoie de ele ca să calculeze pauza.