{"openapi":"3.1.0","info":{"title":"Slot","version":"1.1.0","description":"A reservations API: resources with weekly hours in their own time zone, slots in UTC, holds that expire, bookings that cannot double-book, signed webhooks with retries, an idempotent payment hook. Errors are RFC 9457 problem details; lists are cursor-paginated."},"tags":[{"name":"Sandbox","description":"A key and a tenant of your own, for a day"},{"name":"Resources","description":"Things that can be booked, their hours and their free slots"},{"name":"Bookings","description":"Book, hold, confirm, cancel"},{"name":"Webhooks","description":"Signed event deliveries with retries"},{"name":"Payments","description":"The payment provider's side"}],"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"The tenant's API key. Get a sandbox key from POST /v1/sandbox."}},"schemas":{"Sandbox":{"type":"object","properties":{"api_key":{"type":"string","example":"sk_test_6f1d0c8e2b7a4f3e9d5c1b0a8e7f6d5c"},"payment_secret":{"type":"string","description":"Signs the simulated payment provider's events for this sandbox"},"tenant_id":{"type":"string","minLength":1,"example":"res_room_a"},"expires_at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"},"resources":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"example":"res_room_a"},"name":{"type":"string"},"timezone":{"type":"string"}},"required":["id","name","timezone"]}},"limits":{"type":"object","properties":{"resources":{"type":"integer"},"bookings":{"type":"integer"},"webhooks":{"type":"integer"},"deliveries":{"type":"integer"}},"required":["resources","bookings","webhooks","deliveries"]}},"required":["api_key","payment_secret","tenant_id","expires_at","resources","limits"]},"Problem":{"type":"object","properties":{"type":{"type":"string","example":"https://slot.kocalcengizhan.workers.dev/docs/errors#full"},"title":{"type":"string","example":"No capacity left"},"status":{"type":"integer","example":409},"detail":{"type":"string","example":"That slot has no capacity left."},"instance":{"type":"string","example":"/v1/bookings"},"code":{"type":"string","example":"full","description":"Stable; branch on this"},"request_id":{"type":"string","example":"req_3f9a1c2e7b0d4a5e"},"errors":{"type":"array","items":{"type":"object","properties":{"pointer":{"type":"string"},"detail":{"type":"string"}},"required":["pointer","detail"]},"description":"Validation only: one entry per field, as a JSON Pointer"}},"required":["type","title","status","detail","instance","code","request_id"]},"ResourceList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Resource"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page; null on the last"}},"required":["data","next_cursor"]},"Resource":{"type":"object","properties":{"id":{"type":"string","minLength":1,"example":"res_room_a"},"name":{"type":"string","example":"Room A — recording"},"timezone":{"type":"string","example":"Europe/Istanbul","description":"IANA zone the availability rules are written in"},"slot_minutes":{"type":"integer","example":60},"capacity":{"type":"integer","example":1,"description":"Bookings that may overlap. A room is 1; a class with ten places is 10."},"created_at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"}},"required":["id","name","timezone","slot_minutes","capacity","created_at"]},"NewResource":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"timezone":{"type":"string","minLength":1},"slot_minutes":{"type":"integer","minimum":5,"maximum":720,"default":30},"capacity":{"type":"integer","minimum":1,"maximum":1000,"default":1}},"required":["name","timezone"]},"Rule":{"type":"object","properties":{"weekday":{"type":"integer","minimum":0,"maximum":6,"example":1,"description":"0 = Sunday"},"start_minute":{"type":"integer","minimum":0,"maximum":1440,"example":540,"description":"Minutes from local midnight"},"end_minute":{"type":"integer","minimum":0,"maximum":1440,"example":1080}},"required":["weekday","start_minute","end_minute"]},"Availability":{"type":"object","properties":{"resource_id":{"type":"string","minLength":1,"example":"res_room_a"},"timezone":{"type":"string"},"slot_minutes":{"type":"integer"},"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-10-23"},"slots":{"type":"array","items":{"$ref":"#/components/schemas/Slot"}}},"required":["date","slots"]}}},"required":["resource_id","timezone","slot_minutes","days"]},"Slot":{"type":"object","properties":{"starts_at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"},"ends_at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"},"local":{"type":"string","example":"2026-10-23T09:00"},"available":{"type":"integer","example":1}},"required":["starts_at","ends_at","local","available"]},"Booking":{"type":"object","properties":{"id":{"type":"string","minLength":1,"example":"bkg_1f3a9c2e7b0d4a5e6f12"},"resource_id":{"type":"string","minLength":1,"example":"res_room_a"},"starts_at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"},"ends_at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"},"status":{"type":"string","enum":["held","confirmed","cancelled"]},"hold_expires_at":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"},"customer_name":{"type":["string","null"]},"customer_email":{"type":["string","null"]},"notes":{"type":["string","null"]},"created_at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"},"updated_at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"}},"required":["id","resource_id","starts_at","ends_at","status","hold_expires_at","customer_name","customer_email","notes","created_at","updated_at"]},"NewBooking":{"type":"object","properties":{"resource_id":{"type":"string","minLength":1,"example":"res_room_a"},"starts_at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"},"ends_at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"},"customer_name":{"type":"string","minLength":1,"maxLength":120,"example":"Deniz Aksoy"},"customer_email":{"type":"string","format":"email","example":"deniz@example.com"},"notes":{"type":"string","maxLength":500},"hold":{"type":"boolean","default":false,"description":"Hold the slot instead of confirming it. A hold expires unless confirmed."},"hold_minutes":{"type":"integer","minimum":1,"maximum":60,"default":10}},"required":["resource_id","starts_at","ends_at","customer_name"]},"BookingList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Booking"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page; null on the last"}},"required":["data","next_cursor"]},"WebhookList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page; null on the last"}},"required":["data","next_cursor"]},"Webhook":{"type":"object","properties":{"id":{"type":"string","minLength":1,"example":"whk_8a1c"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string"},"example":["booking.confirmed","booking.cancelled"]},"active":{"type":"boolean"},"created_at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"}},"required":["id","url","events","active","created_at"]},"NewWebhook":{"type":"object","properties":{"url":{"type":"string","maxLength":2000,"example":"https://example.com/hooks/slot","description":"HTTPS on port 443 to a public host name; IP addresses and private names are refused"},"events":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":10,"default":["*"]}},"required":["url"]},"DeliveryList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Delivery"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page; null on the last"}},"required":["data","next_cursor"]},"Delivery":{"type":"object","properties":{"id":{"type":"string","minLength":1,"example":"res_room_a"},"webhook_id":{"type":"string","minLength":1,"example":"res_room_a"},"event":{"type":"string"},"attempts":{"type":"integer"},"delivered_at":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"},"next_attempt_at":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"},"last_status":{"type":["integer","null"]},"last_error":{"type":["string","null"]},"created_at":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$","example":"2026-10-23T07:00:00Z","description":"ISO 8601, UTC, seconds, Z"}},"required":["id","webhook_id","event","attempts","delivered_at","next_attempt_at","last_status","last_error","created_at"]},"PaymentEvent":{"type":"object","properties":{"provider_ref":{"type":"string","minLength":1,"example":"pay_7Qx9k2","description":"The provider's own id; a replay with the same ref changes nothing"},"booking_id":{"type":"string","minLength":1,"example":"res_room_a"},"amount_minor":{"type":"integer","minimum":0,"example":12000},"currency":{"type":"string","minLength":3,"maxLength":3,"example":"GBP"},"status":{"type":"string","enum":["succeeded","failed"]}},"required":["provider_ref","booking_id","amount_minor","currency","status"]}},"parameters":{}},"paths":{"/v1/sandbox":{"post":{"tags":["Sandbox"],"summary":"Create a sandbox and its API key","description":"No key needed. Returns a key for a tenant of your own, seeded with a small studio's calendar — three resources, their weekly hours and a few bookings — that is deleted 24 hours later with everything in it. The key is shown once. Ten per minute per address.","security":[],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sandbox"}}}},"429":{"description":"Too many from this address","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Every sandbox is in use","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/resources":{"get":{"tags":["Resources"],"summary":"List resources","description":"Oldest first.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"example":20,"description":"Items per page"},"required":false,"description":"Items per page","name":"limit","in":"query"},{"schema":{"type":"string","maxLength":300,"description":"`next_cursor` from the previous page"},"required":false,"description":"`next_cursor` from the previous page","name":"cursor","in":"query"}],"responses":{"200":{"description":"A page of the tenant's resources","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceList"}}}},"422":{"description":"Invalid cursor","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"tags":["Resources"],"summary":"Create a resource","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewResource"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resource"}}}},"403":{"description":"Sandbox quota reached","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Unknown time zone","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/resources/{id}":{"get":{"tags":["Resources"],"summary":"Get a resource","parameters":[{"schema":{"type":"string","minLength":1,"example":"res_room_a"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"The resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resource"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/resources/{id}/rules":{"get":{"tags":["Resources"],"summary":"Weekly availability rules","parameters":[{"schema":{"type":"string","minLength":1,"example":"res_room_a"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Rules, in the resource's zone","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Rule"}}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"put":{"tags":["Resources"],"summary":"Replace the weekly availability rules","parameters":[{"schema":{"type":"string","minLength":1,"example":"res_room_a"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Rule"},"maxItems":50}}}},"responses":{"200":{"description":"The rules now in force","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Rule"}}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/resources/{id}/availability":{"get":{"tags":["Resources"],"summary":"Free slots between two local dates","description":"Every slot the resource offers on each day, with how many bookings it can still take. Dates are local to the resource's zone; instants are UTC. At most 31 days.","parameters":[{"schema":{"type":"string","minLength":1,"example":"res_room_a"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-10-23"},"required":true,"name":"from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","example":"2026-10-23"},"required":false,"name":"to","in":"query"}],"responses":{"200":{"description":"Availability","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Availability"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Bad range","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/bookings":{"post":{"tags":["Bookings"],"summary":"Book a slot, or hold it","description":"Confirms a booking, or with `hold: true` holds the slot for `hold_minutes` until it is confirmed. Checked against the resource's hours, its slot grid and its capacity in one atomic statement, so two requests for the last place cannot both succeed. Send an `Idempotency-Key` header and a retried request returns the original booking.","parameters":[{"schema":{"type":"string","maxLength":200},"required":false,"name":"idempotency-key","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewBooking"}}}},"responses":{"201":{"description":"Booked or held","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"403":{"description":"Sandbox quota reached","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No such resource","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Cannot be booked — full, outside hours, off the slot grid — or the first request under this Idempotency-Key is still running","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Idempotency-Key reused with a different request","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"get":{"tags":["Bookings"],"summary":"List bookings","description":"Newest start time first.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"example":20,"description":"Items per page"},"required":false,"description":"Items per page","name":"limit","in":"query"},{"schema":{"type":"string","maxLength":300,"description":"`next_cursor` from the previous page"},"required":false,"description":"`next_cursor` from the previous page","name":"cursor","in":"query"},{"schema":{"type":"string","minLength":1,"example":"res_room_a"},"required":false,"name":"resource_id","in":"query"}],"responses":{"200":{"description":"A page of bookings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingList"}}}},"422":{"description":"Invalid cursor","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/bookings/{id}":{"get":{"tags":["Bookings"],"summary":"Get a booking, with its payments","parameters":[{"schema":{"type":"string","minLength":1,"example":"res_room_a"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"The booking","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Booking"},{"type":"object","properties":{"payments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"provider_ref":{"type":"string"},"amount_minor":{"type":"number"},"currency":{"type":"string"},"status":{"type":"string"},"received_at":{"type":"string"}},"required":["id","provider_ref","amount_minor","currency","status","received_at"]}}},"required":["payments"]}]}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/bookings/{id}/confirm":{"post":{"tags":["Bookings"],"summary":"Confirm a hold","parameters":[{"schema":{"type":"string","minLength":1,"example":"res_room_a"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Confirmed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Not a live hold","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/bookings/{id}/cancel":{"post":{"tags":["Bookings"],"summary":"Cancel a booking or a hold","parameters":[{"schema":{"type":"string","minLength":1,"example":"res_room_a"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Cancelled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Booking"}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"List webhook endpoints","responses":{"200":{"description":"Every endpoint; a tenant has few, so this list is never paged","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookList"}}}}}},"post":{"tags":["Webhooks"],"summary":"Add a webhook endpoint","description":"The response carries the signing secret once. Every delivery is signed `X-Slot-Signature: t=<unix>,v1=<hex HMAC-SHA256 of \"t.body\">`. The URL must be HTTPS to a public host name.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewWebhook"}}}},"responses":{"201":{"description":"Created, with the secret","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"type":"object","properties":{"secret":{"type":"string"}},"required":["secret"]}]}}}},"403":{"description":"Sandbox quota reached","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"The URL is not allowed","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/webhooks/{id}":{"delete":{"tags":["Webhooks"],"summary":"Remove a webhook endpoint","parameters":[{"schema":{"type":"string","minLength":1,"example":"res_room_a"},"required":true,"name":"id","in":"path"}],"responses":{"204":{"description":"Removed"},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/webhooks/{id}/test":{"post":{"tags":["Webhooks"],"summary":"Send a test event to one endpoint","parameters":[{"schema":{"type":"string","minLength":1,"example":"res_room_a"},"required":true,"name":"id","in":"path"}],"responses":{"202":{"description":"Queued and attempted","content":{"application/json":{"schema":{"type":"object","properties":{"queued":{"type":"boolean"}},"required":["queued"]}}}},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/webhooks/deliveries":{"get":{"tags":["Webhooks"],"summary":"Deliveries, with the last attempt's outcome","description":"Newest first.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"example":20,"description":"Items per page"},"required":false,"description":"Items per page","name":"limit","in":"query"},{"schema":{"type":"string","maxLength":300,"description":"`next_cursor` from the previous page"},"required":false,"description":"`next_cursor` from the previous page","name":"cursor","in":"query"}],"responses":{"200":{"description":"A page of deliveries","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryList"}}}},"422":{"description":"Invalid cursor","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/payments/webhook":{"post":{"tags":["Payments"],"summary":"Payment provider webhook (signed, idempotent)","description":"Signed with the tenant's payment secret: `X-Provider-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of \"t.body\">`. Replays of the same `provider_ref` are acknowledged and change nothing. No API key: the signature is the authentication.","security":[],"parameters":[{"schema":{"type":"string"},"required":false,"name":"x-provider-signature","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentEvent"}}}},"responses":{"200":{"description":"Acknowledged","content":{"application/json":{"schema":{"type":"object","properties":{"received":{"type":"boolean"},"applied":{"type":"boolean"},"booking_status":{"type":"string"}},"required":["received","applied","booking_status"]}}}},"400":{"description":"Bad signature","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No such booking","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"webhooks":{}}