Всеки отговор за грешка носи един и същ JSON envelope, HTTP статус кодът съответства на семантиката, а низът на грешката е достатъчно стабилен, за да превключвате по него в клиента. Списъкът по-долу е изчерпателен — ако срещнете нещо извън него, докладвайте го на support@tracepass.eu.
Envelope
{
"error": "Validation error",
"details": {
"fieldErrors": {
"model": ["Required"]
}
}
}error винаги присъства и е стабилен низ — превключвайте по него в клиента. details е незадължително; когато присъства, формата му зависи от конкретната грешка (flattened Zod резултат при валидация, числови данни за плана / използването при overage, име на ролята / разрешението при 403).
Статус кодове
| Статус | Кога | Повторение? |
|---|---|---|
| 400 | Валидационна грешка — тялото или query параметрите не преминаха schema проверка; или непознат ключ на поле при PATCH на паспорт. | Не (поправете заявката) |
| 401 | Липсващ или отзован API ключ, или изтекла сесия. | Не (генерирайте нов ключ / преминете отново auth) |
| 402 | DPP квотата е изчерпана при повикване за създаване на паспорт. Повторете с `confirmOverage: true`, ако планът поддържа overage. Връща се и когато се изисква активен абонамент, но е past_due/canceled. | Да, с `confirmOverage: true` |
| 403 | Plan-gate (напр. v1 API на план Free) или отказано разрешение в работното пространство. | Не |
| 404 | Ресурсът не съществува или е в друго работно пространство. | Не |
| 409 | Конфликт — дублиран model на продукт, GTIN регистриран от друг тенант, колизия на сериен номер в рамките на GTIN. | Понякога (разрешете конфликта, после повторете) |
| 410 | Ресурсът е премахнат за постоянно (рядко; основно при публични URL на паспорти след архивиране). | Не |
| 413 | Payload-ът е твърде голям — отнася се за multipart качване на изображения (5 MB лимит). | Не |
| 415 | Неподдържан media type — качено изображение, което не е PNG / JPG / WebP. | Не |
| 422 | Idempotency-Key е използван повторно с различно тяло на заявката. | Не (генерирайте нов ключ) |
| 423 | Ресурсът е спрян (само в публичния преглед на паспорта). | Не |
| 429 | Превишен лимит — дневни записи или дневни четения на паспорти. | Да (след следващата UTC полунощ) |
| 500 | Необработена грешка на сървъра. Алармирани сме. | Да (с backoff) |
| 503 | Maintenance прозорец или претоварване. Връща Retry-After. | Да (след Retry-After) |
Насоки за повторение
За редовете „Да“ по-горе: експоненциален backoff с jitter, капнат на шест опита. Не приемаме повторения, по-агресивни от веднъж в секунда на един endpoint — нещо по-бързо няма да достигне базата данни (in-memory rate limiter ги отхвърля), но ще изгори дневния ви бюджет за запис.Retry-After header се задава при всеки 503; нулирането на rate-limit за 429 винаги е следващата 00:00 UTC.
Често срещани низове на грешки
| Низ на грешката | Статус | Значение |
|---|---|---|
Validation error | 400 | Schema проверката е неуспешна. details.fieldErrors носи причините по поле (Zod flatten()). |
Invalid field key: <key> | 400 | PATCH .../fields/<key> е цитирал ключ, който не е в шаблона на паспорта. |
No template found for category: <slug> | 400 | Категорията, която сте изпратили, не е seeded — проверете изписването спрямо публичния Buyer's Guide. |
A product with this model already exists for your company | 409 | Низовете model са уникални в работното пространство. Изберете различен model или актуализирайте съществуващия продукт. |
This GTIN is already registered by another company. Contact support if this is an error. | 409 | GTIN е глобално уникален между тенантите — две компании не могат да притежават един и същ GTIN. |
Serial number already exists for this GTIN | 409 | Изберете различен сериен номер. В рамките на един GTIN серийните номера трябва да са уникални. |
Idempotency-Key has already been used with a different request body. Use a new key for the new request, or reuse the original body. | 422 | Изпратили сте същия ключ два пъти с различни тела. Генерирайте нов ключ. |
overage_required | 402 | DPP квотата е изчерпана. Тялото носи planLimit + currentUsage + extraPriceCents. Повторете с `confirmOverage: true`, за да приемете таксата за паспорт. |
API rate limit: N writes/day via /api/v1. Currently X today; requested Y. Retry tomorrow (UTC) or upgrade your plan. | 429 | Дневният v1 бюджет за запис е изчерпан. Изчакайте или направете upgrade. |
API rate limit: N passports/day read via /api/v1. Currently X today; requested Y. Retry tomorrow (UTC) or contact support for a bulk export. | 429 | Дневният v1 бюджет за четене на паспорти е изчерпан. Изчакайте, направете upgrade, или използвайте JSON-LD масовия експорт от таблото. |
Passport not found | 404 | Грешен ID или грешно работно пространство. Проверете, че API ключът съответства на работното пространство, което притежава паспорта. |