Docs
Ctrl+K

Hibakódok

Hibakódok, újrapróbálhatóság és hibakezelési útmutató.

Áttekintés#

A Bokko Public API minden válasza egységes boríték (envelope) formátumot használ, függetlenül attól, hogy a kérés sikeres volt-e vagy sem. A hibakezelés egyetlen szabálya:

  • Mindig az error.code mező alapján ágazz el
  • Soha ne értelmezd az error.message szövegét programozottan
Figyelmeztetés
Az error.message mező értéke bármikor változhat, és lokalizált (magyar nyelvű) lehet. Ne építs rá logikát -- kizárólag az error.code mező stabil és szerződéses.

Válasz formátum#

Sikeres válasz#

Info
Az alábbi blokk strukturális illusztráció — a { ... } placeholder, nem érvényes JSON. A tényleges data mező tartalma endpointonként eltér; konkrét példákért lásd a Gyors indulás oldalt.
json
{
  "ok": true,
  "data": { ... },
  "meta": { "requestId": "req_01HX...", "v": "1" }
}

Hibaválasz#

json
{
  "ok": false,
  "error": {
    "code": "booking.slot_unavailable",
    "message": "A kiválasztott időpont nem elérhető.",
    "retryable": false,
    "details": {
      "requestedDate": "2026-04-05",
      "requestedStartTime": "10:00",
      "nextAvailableStartTime": "10:45"
    }
  },
  "meta": { "requestId": "req_01HX...", "v": "1" }
}

A details mező opcionális, és hibakód-specifikus struktúrát tartalmaz. Csak akkor van jelen, ha a hiba további kontextust igényel.

Hibakód struktúra#

A hibakódok {domain}.{reason} formátumot követnek:

DomainPéldaLeírás
authauth.invalid_keyHitelesítési és jogosultsági hibák
bookingbooking.slot_unavailableFoglalási logika hibák
requestrequest.invalid_inputBemeneti validációs és kérési hibák
rate_limitrate_limit.exceededKéréslimit túllépés
idempotencyidempotency.payload_mismatchIdempotencia-kulcs ütközés
serviceservice.not_foundErőforrás nem található
internalinternal.errorBelső rendszerhiba (5xx)

A code mező stabil -- az API verziójának élettartama alatt nem változik. Az message mező kizárólag emberi olvasásra szánt.

Újrapróbálhatóság#

Minden hibaválasz tartalmaz egy retryable boolean mezőt, amely jelzi, hogy a kérés változtatás nélkül újraküldhető-e.

HibakódretryableTeendő
rate_limit.exceededtrueVárd meg a Retry-After fejlécben jelzett időt, majd próbáld újra
idempotency.request_in_progresstrueAz eredeti kérés még feldolgozás alatt áll -- várd meg, majd próbáld újra
internal.error (5xx)trueBelső hiba — exponenciális visszalépéssel próbáld újra; mellékeld a requestId-t
Minden egyébfalseJavítsd a kérést, ne próbáld újra vakon

Exponenciális visszalépés (exponential backoff):

1. kísérlet: azonnali
2. kísérlet: 1s várakozás
3. kísérlet: 2s várakozás
4. kísérlet: 4s várakozás
(max 3 újrapróbálás)

Ha a válasz tartalmaz Retry-After fejlécet, annak értéke élvez elsőbbséget a backoff logikával szemben.

Hibakeresés#

Minden válasz tartalmaz egy meta.requestId mezőt, amely egyedileg azonosítja a kérést.

Tipp
A requestId-t mindig mentsd el és mellékeld a support kérésekhez. Ez teszi lehetővé a kérés pontos visszakövetését a rendszerben.

A requestId segítségével:

  • Korreláció a webhook kézbesítési naplókkal
  • Pontos hibaazonosítás support kérés esetén
  • Időrendi rekonstrukció több kérés között

Gyakori HTTP státuszkódok#

StátuszJelentésJavasolt lépés
400Érvénytelen bemenet vagy séma hibaEllenőrizd a kérés törzsét a details mező alapján; javítsd és próbáld újra
401Érvénytelen vagy hiányzó API kulcsEllenőrizd a kulcs formátumát (bk_live_...) és státuszát a dashboardon
403Nincs jogosultságEllenőrizd a kulcs capability halmazát és a salonSlug egyezést
404Az erőforrás nem találhatóEllenőrizd az URL-t és az erőforrás azonosítóját
409ÜtközésEllenőrizd a foglalás állapotát vagy az időpont elérhetőségét
429Kéréslimit túllépésTartsd be a Retry-After fejlécet, csökkentsd a kérésgyakoriságot
500Belső hibaNem a te hibád -- próbáld újra később, vagy jelezd a requestId-vel

Hibakód katalógus#

Hitelesítési hibák (auth.*)

KódHTTPRetryableLeírás
auth.invalid_key401❌ NemHiányzó vagy érvénytelen API kulcs
auth.insufficient_capability403❌ NemA kulcs nem rendelkezik a szükséges capability-vel
Details: { required, granted }
auth.scope_mismatch403❌ NemA salonSlug nem egyezik a kulcs tenant scope-jával
auth.plan_insufficient403❌ NemAz aktív előfizetés nem tartalmazza a Public API hozzáférést (Pro csomag szükséges)

Kérési hibák (request.*)

KódHTTPRetryableLeírás
request.invalid_input400❌ NemSéma validáció sikertelen
Details: { fieldErrors: [{ field, reason }] }
request.invalid_cursor400❌ NemÉrvénytelen vagy lejárt cursor
request.missing_idempotency_key400❌ NemIdempotency-Key header hiányzik
request.not_found404❌ NemAz endpoint nem létezik
request.method_not_allowed405❌ NemNem engedélyezett HTTP metódus

Foglalási hibák (booking.*)

KódHTTPRetryableLeírás
booking.slot_unavailable409❌ NemA kért időpont már nem elérhető
Details: { requestedDate, requestedStartTime, nextAvailableStartTime }
booking.not_found404❌ NemFoglalás nem található
booking.invalid_transition409❌ NemA foglalás terminális állapotban van
Details: { currentStatus, attemptedTransition }
booking.booking_disabled409❌ NemOnline foglalás nincs engedélyezve
booking.booking_restricted409❌ NemFoglalás átmenetileg korlátozva
booking.service_pricing_changed409❌ NemA szolgáltatás ára változott a megerősítés óta — kérj friss listát
Details: { currentPricingVersion }

Idempotencia hibák (idempotency.*)

KódHTTPRetryableLeírás
idempotency.payload_mismatch409❌ NemUgyanaz a kulcs, de eltérő payload
idempotency.request_in_progress503✅ IgenA kérés még feldolgozás alatt áll

Rate limit (rate_limit.*)

KódHTTPRetryableLeírás
rate_limit.exceeded429✅ IgenRate limit túllépve
Details: { retryAfterSeconds }

Elérhetőség (availability.*)

KódHTTPRetryableLeírás
availability.date_range_too_wide400❌ NemDátumtartomány túl széles
Details: { maxDays: 31 }

Szolgáltatás (service.*)

KódHTTPRetryableLeírás
service.not_found404❌ NemIsmeretlen serviceId
service.unavailable409❌ NemA szolgáltatás jelenleg nem elérhető (deactivated vagy archive-ban)
Details: { serviceId }
service.not_bookable409❌ NemA szolgáltatás nem online foglalható (onlineBookable=false)
Details: { serviceId }

Szolgáltató (salon.*)

KódHTTPRetryableLeírás
salon.not_found404❌ NemSzolgáltató nem található

Webhook (webhook.*)

KódHTTPRetryableLeírás
webhook.not_found404❌ NemWebhook konfiguráció nem található

Előfizetés (subscription.*)

KódHTTPRetryableLeírás
subscription.not_found404❌ NemAz előfizetés még nem aktivált (pre-activation állapot, nem kliens hiba)
subscription.snapshot_missing500❌ NemBelső invariáns sérülés — szerver-oldali alert

Belső hiba (internal.*)

KódHTTPRetryableLeírás
internal.error500✅ IgenBelső szerverhiba — generic fallback. Próbáld újra később, vagy jelezd a requestId-vel.