Un singur format pe toate rutele: type, code, message, param, doc_url, request_id și errors.
Prima factură în 6 pași
- Orice 4xx sau 5xx întoarce { "error": { type, code, message, param?, doc_url, request_id, errors? } }.
- Ramifică pe type ca să decizi dacă are sens un retry, și mapează code în propriul tău sistem.
- param arată câmpul vinovat, ca lines.0.vat_rate; errors[] apare când sunt mai multe.
- Loghează request_id la fiecare eroare — cu el găsim requestul exact în logurile noastre.
Ce este API-ul 4invoices
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" }
]
}
}https://api.4invoices.net/v1 · https://api.4invoices.net/v1/openapi.json
Erori
| Status | Tip | Cod |
|---|---|---|
| 401 | authentication_error | missing_bearer_token |
| 401 | authentication_error | unauthorized |
| 403 | permission_error | forbidden |
| 404 | not_found_error | not_found |
| 409 | conflict_error | idempotency_key_reuse |
| 409 | conflict_error | idempotency_in_progress |
| 422 | invalid_request_error | validation_failed |
| 422 | invalid_request_error | invalid_json_number |
| 502 | upstream_error | upstream_error |
| 503 | service_unavailable_error | service_unavailable |
Greșeli frecvente
- rate_limit_error și cele două tipuri de upstream se pot reîncerca. authentication_error, permission_error și invalid_request_error nu se rezolvă prin retry.
- 404 apare și pentru un id care aparține altui tenant: nu confirmăm niciodată existența datelor altcuiva.
- 409 idempotency_key_reuse înseamnă că ai refolosit o cheie cu un body diferit. Nu forța: verifică ce s-a emis deja.
- doc_url din fiecare eroare trimite direct în secțiunea de erori a acestei documentații.
- Mesajele sunt în română, pentru că API-ul deservește un flux fiscal românesc; nu parsa message, ramifică pe code.
Întrebări frecvente de la dezvoltatori
Pot să mă bazez pe valorile code între versiuni?
Da, code este stabil și e făcut exact pentru asta. message este text pentru oameni și se poate reformula.
Ce fac la 502 sau 503?
Reîncearcă cu backoff exponențial. Sunt erori de upstream sau de disponibilitate temporară, nu probleme cu requestul tău.
De ce primesc 422 și nu 400 pentru date invalide?
422 marchează un JSON bine format, dar semantic invalid — de exemplu vat_rate ca fracție. 400 rămâne pentru un request malformat.