Ce trebuie făcut
- Bazați logica pe starea HTTP și pe error.code, nu pe textul error.message destinat utilizatorilor.
- Un răspuns 401 necesită autentificare validă; 403 necesită modificarea accesului sau a planului; 409 necesită verificarea operației aflate în conflict sau a versiunii resursei.
Acces refuzat și reîncercări
- 401
- 401 nu înseamnă întotdeauna că tokenul a expirat. Dacă a expirat, obține unul nou și repetă citirea cel mult o dată. Dacă obținerea tokenului returnează 401, verifică cheia și oprește încercările automate.
- 403
- La 403, verifică permisiunile, restricțiile IP și planul. Un token nou nu restabilește accesul revocat.
Reguli de reîncercare
- Pentru erori temporare, folosiți un număr limitat de reîncercări, cu întârzieri progresive și variație aleatorie.
- Respectați Retry-After când este prezent.
- Dacă o scriere depășește timpul de așteptare, rezultatul poate fi necunoscut: păstrați aceeași valoare Idempotency-Key și cererea neschimbată la reîncercarea acelei operații logice.
- Catalogul de mai jos explică fiecare cod de eroare publicat.
422 / 409
- Pentru prețuri, un format de monedă sau o precizie a sumei nevalide returnează 422 request.validation_failed.
- Un cod de monedă valid, dar diferit de cel al listei de prețuri selectate, returnează 409 resource.version_conflict.
- Verifică contextul și versiunile înainte de a reîncerca.
Catalog de erori
400request.malformedCererea nu poate fi interpretată.
- Ce trebuie făcut
- Verificați sintaxa JSON, codificarea URL-ului și structura cererii.
- Reguli de reîncercare
- Reîncercați după corectarea cererii.
{
"error": {
"code": "request.malformed",
"fields": null,
"message": "The request could not be read."
},
"meta": {
"request_id": "example-request"
}
}
401authentication.invalid_credentialsCheia API sau tokenul de acces este invalid, a expirat ori a fost revocat.
- Ce trebuie făcut
- Verificați URL-ul magazinului și credențialul. Obțineți un token nou folosind o cheie API activă.
- Reguli de reîncercare
- Reîncercați după corectarea autentificării; evitați cererile repetate cu tokenuri invalide.
{
"error": {
"code": "authentication.invalid_credentials",
"fields": null,
"message": "The credentials are invalid."
},
"meta": {
"request_id": "example-request"
}
}
401authentication.requiredAntetul Authorization necesar lipsește sau folosește o schemă incorectă.
- Ce trebuie făcut
- Folosiți ApiKey la solicitarea unui token și Bearer pentru operațiile asupra resurselor.
- Reguli de reîncercare
- Reîncercați după furnizarea antetului corect.
{
"error": {
"code": "authentication.required",
"fields": null,
"message": "Authentication is required."
},
"meta": {
"request_id": "example-request"
}
}
403authorization.client_ip_unverifiedServiciul nu a putut stabili o adresă IP de client de încredere.
- Ce trebuie făcut
- Cereți operatorului magazinului să verifice traseul de acces. Nu introduceți singuri antete de redirecționare.
- Reguli de reîncercare
- Reîncercați după restabilirea traseului de conexiune de încredere.
{
"error": {
"code": "authorization.client_ip_unverified",
"fields": null,
"message": "The client IP address could not be verified."
},
"meta": {
"request_id": "example-request"
}
}
403authorization.ip_not_allowedAdresa IP sursă nu se află în lista adreselor permise pentru cheie.
- Ce trebuie făcut
- Folosiți o adresă sursă aprobată sau cereți unui administrator autorizat să editeze lista IP a cheii.
- Reguli de reîncercare
- Reîncercați numai după ce adresa este permisă.
{
"error": {
"code": "authorization.ip_not_allowed",
"fields": null,
"message": "Access from this IP address is not allowed."
},
"meta": {
"request_id": "example-request"
}
}
403authorization.scope_deniedCheia nu are o permisiune efectivă necesară acestei operații.
- Ce trebuie făcut
- Verificați permisiunile obligatorii și condiționale ale operației, permisiunile cheii și accesul emitentului.
- Reguli de reîncercare
- Reîncercați după ce un administrator autorizat acordă accesul necesar.
{
"error": {
"code": "authorization.scope_denied",
"fields": null,
"message": "The required permission has not been granted."
},
"meta": {
"request_id": "example-request"
}
}
403entitlements.api_disabledAccesul API este dezactivat pentru acest magazin.
- Ce trebuie făcut
- Cereți proprietarului magazinului să verifice planul activ și disponibilitatea API.
- Reguli de reîncercare
- Nu reîncercați până la activarea accesului API.
{
"error": {
"code": "entitlements.api_disabled",
"fields": null,
"message": "API access is disabled for this store."
},
"meta": {
"request_id": "example-request"
}
}
403entitlements.limit_exceededModificarea ar depăși o limită a planului curent.
- Ce trebuie făcut
- Verificați limita aplicabilă resursei și adaptați modificarea dorită sau planul.
- Reguli de reîncercare
- Reîncercați după rezolvarea limitei; folosiți o cheie de idempotență nouă dacă cererea se schimbă.
{
"error": {
"code": "entitlements.limit_exceeded",
"fields": null,
"message": "The operation exceeds a plan limit."
},
"meta": {
"request_id": "example-request"
}
}
403entitlements.operation_disabledPlanul curent nu include această operație.
- Ce trebuie făcut
- Verificați planul minim indicat pentru operație.
- Reguli de reîncercare
- Reîncercați după ce planul permite operația și cheia are permisiunile necesare.
{
"error": {
"code": "entitlements.operation_disabled",
"fields": null,
"message": "The current plan does not allow this operation."
},
"meta": {
"request_id": "example-request"
}
}
403entitlements.resource_blockedO limită a planului blochează această resursă.
- Ce trebuie făcut
- Cereți proprietarului să rezolve restricția impusă resursei de plan.
- Reguli de reîncercare
- Nu repetați aceeași cerere cât timp resursa rămâne blocată.
{
"error": {
"code": "entitlements.resource_blocked",
"fields": null,
"message": "A plan limit blocks access to this resource."
},
"meta": {
"request_id": "example-request"
}
}
404resource.not_foundResursa lipsește, a fost ștearsă sau nu este disponibilă sub identificatorul furnizat.
- Ce trebuie făcut
- Verificați magazinul, calea resursei și identificatorul. Folosiți identificatori returnați de acest magazin.
- Reguli de reîncercare
- Reîncercați numai după corectarea destinației sau confirmarea existenței acesteia.
{
"error": {
"code": "resource.not_found",
"fields": null,
"message": "The resource was not found."
},
"meta": {
"request_id": "example-request"
}
}
405request.method_not_allowedEndpointul nu acceptă această metodă HTTP.
- Ce trebuie făcut
- Folosiți metoda documentată; antetul Allow indică metodele acceptate.
- Reguli de reîncercare
- Nu reîncercați metoda neacceptată.
{
"error": {
"code": "request.method_not_allowed",
"fields": null,
"message": "This method is not supported for this resource."
},
"meta": {
"request_id": "example-request"
}
}
409idempotency.key_reusedAceastă cheie de idempotență aparține unei alte cereri.
- Ce trebuie făcut
- Identificați operația originală. Folosiți o cheie nouă numai pentru o operație logică nouă, intenționată.
- Reguli de reîncercare
- Nu reîncercați date modificate folosind cheia aflată în conflict.
{
"error": {
"code": "idempotency.key_reused",
"fields": null,
"message": "This idempotency key was used with a different request."
},
"meta": {
"request_id": "example-request"
}
}
409resource.already_existsO valoare unică intră în conflict cu o resursă existentă.
- Ce trebuie făcut
- Citiți resursa existentă și decideți dacă o folosiți sau alegeți o altă valoare unică.
- Reguli de reîncercare
- Nu repetați aceeași creare aflată în conflict.
{
"error": {
"code": "resource.already_exists",
"fields": null,
"message": "A resource with these unique values already exists."
},
"meta": {
"request_id": "example-request"
}
}
409resource.in_useAlte resurse depind încă de această resursă.
- Ce trebuie făcut
- Verificați dependențele și eliminați-le sau modificați-le prin operațiile acceptate înainte de ștergere.
- Reguli de reîncercare
- Reîncercați după rezolvarea dependențelor.
{
"error": {
"code": "resource.in_use",
"fields": null,
"message": "The resource is still in use."
},
"meta": {
"request_id": "example-request"
}
}
409resource.state_conflictStarea comercială curentă împiedică această modificare.
- Ce trebuie făcut
- Citiți starea curentă și alegeți o tranziție comercială validă.
- Reguli de reîncercare
- Nu forțați automat și nu retrimiteți repetat modificarea aflată în conflict.
{
"error": {
"code": "resource.state_conflict",
"fields": null,
"message": "The current resource state does not allow this operation."
},
"meta": {
"request_id": "example-request"
}
}
409resource.version_conflictO altă scriere a modificat resursa după versiunea pe care ați citit-o.
- Ce trebuie făcut
- Citiți starea cea mai recentă, adaptați modificarea și trimiteți noua valoare expected_version.
- Reguli de reîncercare
- Folosiți o cheie de idempotență nouă pentru operația revizuită; nu suprascrieți fără verificare.
{
"error": {
"code": "resource.version_conflict",
"fields": null,
"message": "The resource version has changed."
},
"meta": {
"request_id": "example-request"
}
}
413request.too_largeCererea depășește limita de dimensiune.
- Ce trebuie făcut
- Reduceți datele trimise sau împărțiți operația în operații individuale acceptate.
- Reguli de reîncercare
- Reîncercați operații mai mici și valide, fiecare cu propria cheie de idempotență.
{
"error": {
"code": "request.too_large",
"fields": null,
"message": "The request exceeds the size limit."
},
"meta": {
"request_id": "example-request"
}
}
415request.unsupported_media_typeTipul media sau codificarea conținutului nu este acceptată.
- Ce trebuie făcut
- Pentru scrieri JSON, folosiți Content-Type: application/json și un corp necomprimat acceptat.
- Reguli de reîncercare
- Reîncercați după corectarea tipului media sau a codificării.
{
"error": {
"code": "request.unsupported_media_type",
"fields": null,
"message": "The request media type or encoding is not supported."
},
"meta": {
"request_id": "example-request"
}
}
422request.validation_failedUnul sau mai multe câmpuri ori parametri nu trec validarea.
- Ce trebuie făcut
- Consultați error.fields, apoi verificați câmpurile obligatorii, acceptarea valorii null, identificatorii și valorile permise.
- Reguli de reîncercare
- Reîncercați o cerere corectată; o scriere modificată reprezintă o operație logică nouă.
{
"error": {
"code": "request.validation_failed",
"fields": null,
"message": "Some request parameters are invalid."
},
"meta": {
"request_id": "example-request"
}
}
429capacity.queue_fullCoada scurtă a API-ului este plină; executarea cererii nu a început.
- Ce trebuie făcut
- Puneți cererile într-o coadă și respectați antetul de răspuns Retry-After.
- Reguli de reîncercare
- Așteptați cel puțin numărul de secunde din Retry-After și adăugați o variație aleatorie. La reîncercarea unei scrieri, păstrați cheia și datele originale.
{
"error": {
"code": "capacity.queue_full",
"fields": null,
"message": "The API is busy. Please retry shortly."
},
"meta": {
"request_id": "example-request"
}
}
429capacity.wait_timeoutTimpul de așteptare în coada API-ului a expirat; executarea cererii nu a început.
- Ce trebuie făcut
- Puneți cererile într-o coadă și respectați antetul de răspuns Retry-After.
- Reguli de reîncercare
- Așteptați cel puțin numărul de secunde din Retry-After și adăugați o variație aleatorie. La reîncercarea unei scrieri, păstrați cheia și datele originale.
{
"error": {
"code": "capacity.wait_timeout",
"fields": null,
"message": "The API could not start this request in time. Please retry shortly."
},
"meta": {
"request_id": "example-request"
}
}
429rate_limit.exceededFrecvența cererilor depășește limita aplicabilă.
- Ce trebuie făcut
- Puneți cererile într-o coadă și respectați antetul de răspuns Retry-After.
- Reguli de reîncercare
- Așteptați cel puțin numărul de secunde din Retry-After și adăugați o variație aleatorie. La reîncercarea unei scrieri, păstrați cheia și datele originale.
{
"error": {
"code": "rate_limit.exceeded",
"fields": null,
"message": "The request rate limit has been exceeded."
},
"meta": {
"request_id": "example-request"
}
}
500internal.errorA apărut o eroare neașteptată a serviciului.
- Ce trebuie făcut
- Înregistrați identificatorul cererii și contactați operatorul dacă eroarea persistă; excludeți credențialele din jurnale.
- Reguli de reîncercare
- Folosiți reîncercări limitate, cu întârzieri progresive. Pentru scriere păstrați cheia de idempotență originală și datele neschimbate.
{
"error": {
"code": "internal.error",
"fields": null,
"message": "An unexpected error occurred."
},
"meta": {
"request_id": "example-request"
}
}
502gateway.bad_responseGateway-ul nu a primit un răspuns API valid.
- Ce trebuie făcut
- Păstrați identificatorul cererii. Un răspuns nereușit nu dovedește că scrierea nu a fost aplicată.
- Reguli de reîncercare
- Folosiți reîncercări limitate, cu întârzieri progresive; repetați aceeași scriere logică folosind valoarea Idempotency-Key și datele originale.
{
"error": {
"code": "gateway.bad_response",
"fields": null,
"message": "The API gateway could not obtain a valid response."
},
"meta": {
"request_id": "example-request"
}
}
504gateway.timeoutGateway-ul a depășit timpul de așteptare pentru API.
- Ce trebuie făcut
- Păstrați identificatorul cererii și considerați rezultatul scrierii necunoscut.
- Reguli de reîncercare
- Folosiți reîncercări limitate, cu întârzieri progresive; pentru scriere reutilizați cheia de idempotență originală și datele neschimbate.
{
"error": {
"code": "gateway.timeout",
"fields": null,
"message": "The API gateway timed out."
},
"meta": {
"request_id": "example-request"
}
}