Appearance
Certification
Before production credentials are issued, CBMS staff confirm that your integration behaves like a well-behaved partner: it authenticates, discovers inventory, books in two phases, retries safely, respects ownership, and verifies webhooks.
You do not run our internal test suite. You demonstrate the behaviours below against sandbox. We check them.
What you need to demonstrate
Authentication
- A valid sandbox key can call
GET /partner/venues. - A missing or invented key receives 401.
- You do not send a
partner_id(or any header) to impersonate another partner.
Discovery
- List authorized venues; retrieve one; list its resources.
- An unknown / ungranted venue id is 404, not a leak of other tenants.
Availability
- Query by
venue_id+date(and optionalresource_id). - You treat
is_availableas a hint, not a lock.
Booking flow
- Create a hold; confirm it before expiry; cancel a hold you no longer need.
- Cancel and/or refund a confirmed booking.
- You send
idempotency_keyon every mutation above.
Idempotency
- A retry with the same key returns the original hold/booking/cancel/refund — not a second side effect.
- You do not reuse a hold key across different slots (if you do, you will get the original hold back, not a new one).
- Reusing a confirm/cancel/refund/package key for a different object is treated as a conflict on your side (the API returns 409).
Authorization
- You cannot cancel someone else’s hold.
- You cannot list another venue’s resources.
Errors
- You handle 401 / 403 / 404 / 409 as documented, not as 500s you retry blindly.
- You honour 429
Retry-After.
Webhooks
- You subscribe with your own HTTPS (or reachable HTTP in sandbox) endpoint.
- You verify
X-CBMS-Signatureover{timestamp}.{rawBody}and reject skew beyond 300 seconds. - You accept
booking_createdas the confirm event name.
How we run it
Platform staff run an internal checker against the sandbox host using your key and a receiver they control. You do not need our source code, env var names, or operator credentials.
If something fails, we will tell you which category failed and the HTTP exchange — not a stack trace from our repo.