Hitelesítés
API kulcsok, Bearer hitelesítés, jogosultsági modell, kulcs-életciklus és kérési limitek.
Áttekintés#
A Bokko Public API minden kérése Bearer-tokenes hitelesítést igényel. Az API kulcsot az Authorization fejlécben kell küldeni.
Authorization: Bearer bk_live_<key>- Minden kulcs egyetlen szolgáltatói üzlethez van kötve
- A kulcsok explicit jogosultsághalmazzal rendelkeznek -- csak azokat a műveleteket engedik, amelyekre jogosultságot kaptak
- A kulcs önmagában nem ad teljes hozzáférést: a jogosultságok és az üzletszintű hatókör együtt határozzák meg a hozzáférést
403 auth.plan_insufficient hibával elutasításra kerülnek.API kulcs típusok#
owner vagy guest_partner kulcsfajta választható. Részletes UI útmutató: Help: API kulcsok kezelése.| Típus | Leírás | Visszavonás |
|---|---|---|
| personal | Delegált felhasználói jogosultság. A kulcs a létrehozó felhasználó nevében jár. | Automatikusan visszavonódik, ha a felhasználó hozzáférése megszűnik. |
| integration | Független jogosultság. Nem kötődik felhasználóhoz, önállóan működik. | Csak manuális visszavonással vagy lejárattal. |
API kulcsfajták#
A kulcstípus mellett a Bokko v1 egy külön key kind mezőt is használ, amely tovább szűkíti, mit tehet egy integration kulcs.
| Fajta | Leírás | Jogosultsági hatókör |
|---|---|---|
| owner | Teljes tulajdonosi integrációs kulcs. | A kulcshoz rendelt teljes jogosultságkészlet használható. |
| guest_partner | Külső foglalási partner kulcs, amely vendégoldali foglalási műveleteket végez. | Csak a vendégoldali foglalási jogosultságok használhatók. |
guest_partner kulcsnál az engedélyezett jogosultságkészlet erre a négyre szűkül:
services.readstaff.readavailability.readbooking.create
Jogosultságok#
| Capability | Leírás |
|---|---|
availability.read | Search available slots |
booking.create | Create a booking |
booking.read | Read a booking |
booking.cancel | Cancel a booking |
services.read | List services |
staff.read | List staff |
webhook.manage | Manage webhook configuration |
subscription.read | Read subscription state |
A kulcsok jogosultságokkal rendelkeznek, amelyek meghatározzák, mely műveleteket végezhetik el. Ezeket a kulcs létrehozásakor kell beállítani.
| Jogosultság | Leírás | Érintett végpontok |
|---|---|---|
services.read | Szolgáltatások listázása | GET /services |
staff.read | Munkatársak listázása | GET /staff |
availability.read | Szabad időpontok keresése | POST /availability/search |
booking.create | Új foglalás beküldése | POST /bookings |
booking.read | Foglalások listázása és részletei | GET /bookings, GET /bookings/{bookingId}, GET /bookings/{bookingId}/events |
booking.cancel | Foglalás lemondása | POST /bookings/{bookingId}/cancel |
webhook.manage | Webhook konfiguráció kezelése | GET/PUT/DELETE /webhooks/config, GET /webhooks/deliveries |
subscription.read | Előfizetési csomag lekérdezése | GET /subscription |
Üzletszintű hatókör#
Az API kulcsok egyetlen szolgáltató üzletéhez vannak kötve. Az üzletszintű hatókör érvényesítése az alábbi módon történik:
Kötelező salonSlug és locationSlug paraméterek:
POST /availability/search-- szabad időpontok lekérdezéséhez (request body-ban)POST /bookings-- foglalás létrehozásához (request body-ban)GET /services-- szolgáltatások listázásához (query stringben)GET /staff-- munkatársak listázásához (query stringben)
Kötelező salonSlug paraméter:
GET /bookings-- foglalások listázásához (query stringben)GET /webhooks/config,PUT /webhooks/config,DELETE /webhooks/config-- webhook konfiguráció kezeléséhezPOST /webhooks/config/rotate-secret-- webhook secret rotálásáhozGET /webhooks/deliveries-- kézbesítési napló lekérdezéséhez
Nem kötelező (a kulcs + booking resource alapján érvényesítve):
GET /bookings/{bookingId}GET /bookings/{bookingId}/eventsPOST /bookings/{bookingId}/cancelGET /subscription(a kulcs önmagában meghatározza, melyik szolgáltatói üzlet előfizetéséről van szó)
Ha a megadott salonSlug nem egyezik a kulcshoz rendelt üzlettel, vagy a locationSlug nem található:
HTTP 403
{
"error": {
"code": "auth.scope_mismatch",
"message": "A kulcs nem jogosult erre a szolgáltatóra vagy telephelyre."
}
}403-at ad vissza 404 helyett, hogy megakadályozza az üzletazonosítók felderítését.Idempotencia#
Write műveletek támogatják az Idempotency-Key fejlécet az ismételt küldés elleni védelemhez.
| Tulajdonság | Érték |
|---|---|
| Fejléc | Idempotency-Key |
| Formátum | RFC 4122 UUID (v1-v5, v4 ajánlott) |
| TTL | 24 óra |
| Fingerprint | üzletszintű hatókör + operationId + path params + kanonikus body |
Működés:
- Ugyanaz a kulcs + egyező fingerprint --> az eredeti válasz visszaadásra kerül (
meta.idempotent: true) - Ugyanaz a kulcs + eltérő fingerprint -->
409 idempotency.payload_mismatch
Rate limiting#
| Route group | Standard | Elevated | Egység |
|---|---|---|---|
catalog | 120 | 600 | kérés / perc |
availability | 30 | 150 | kérés / perc |
booking | 30 | 150 | kérés / perc |
webhook | 10 | 50 | kérés / perc |
subscription | 60 | 300 | kérés / perc |
A Bokko Public API végpontcsoportonként (route group) és API kulcsonként külön limitet alkalmaz, 1 perces gördülő ablakkal. Két limit-szint (tier) létezik: standard és elevated.
| Végpontcsoport | Érintett végpontok | Standard (req/min) | Elevated (req/min) |
|---|---|---|---|
| catalog | GET /services, GET /staff | 120 | 600 |
| availability | POST /availability/search | 30 | 150 |
| booking | POST /bookings, GET /bookings, POST /bookings/{bookingId}/cancel | 30 | 150 |
| webhook | GET/PUT/DELETE /webhooks/config, GET /webhooks/deliveries | 10 | 50 |
| subscription | GET /subscription | 60 | 300 |
Túllépés esetén a válasz:
HTTP 429
Retry-After: 30
{
"error": {
"code": "rate_limit.exceeded",
"message": "Túllépte a kérésmennyiséget.",
"retryable": true,
"details": {
"retryAfterSeconds": 30
}
}
}Kulcs életciklus#
| Művelet | Leírás |
|---|---|
| Létrehozás | A Bokko dashboardon, az Integrációk → API kulcsok menüpontban. |
| Visszavonás | Azonnali érvénytelenítés. A visszavont kulccsal küldött kérések 401-et kapnak. |
| Lejárat | Opcionális expiresAt mező. Lejárat után a kulcs automatikusan érvénytelen. |
Kódpéldák#
cURL#
curl -X GET "https://api.bokko.io/v1/services?salonSlug=pelda-uzlet&locationSlug=belvaros" \
-H "Authorization: Bearer bk_live_abc123def456"JavaScript (fetch)#
const response = await fetch(
'https://api.bokko.io/v1/services?salonSlug=pelda-uzlet&locationSlug=belvaros',
{
headers: {
'Authorization': 'Bearer bk_live_abc123def456',
'Content-Type': 'application/json',
},
}
);
const data = await response.json();Python (requests)#
import requests
response = requests.get(
'https://api.bokko.io/v1/services',
params={'salonSlug': 'pelda-uzlet', 'locationSlug': 'belvaros'},
headers={
'Authorization': 'Bearer bk_live_abc123def456',
'Content-Type': 'application/json',
},
)
data = response.json()bk_live_abc123def456 kulcs csak illusztráció. A saját kulcsodat a Bokko dashboard Integrációk → API kulcsok menüpontjában találod.