Getting started
Errors & rate limits
Error format
{
"error": {
"code": "slot_taken",
"message": "This time slot was just booked by someone else. Please choose another slot."
}
}Branch on error.code; the message is written for people and may change.
Common codes
| Status | Code |
|---|---|
| 400 | missing_parameter / invalid_parameterA required field is missing or malformed. |
| 400 | invalid_jsonThe body isn't valid JSON. |
| 400 | slot_in_pastThe start time has already passed. |
| 400 | booking_ruleThe time breaks a booking rule (minimum notice, daily limit, ...). |
| 401 | unauthorizedNo key, or the key is invalid or revoked. |
| 403 | insufficient_scopeThe key doesn't have the scope this endpoint needs. |
| 404 | not_foundNo such object on this account. |
| 409 | slot_unavailableThat time isn't offered. Pick a start from availability. |
| 409 | event_type_inactiveThe event type is turned off. |
| 409 | slot_takenSomeone booked that time a moment ago. |
| 409 | cannot_reschedule / cannot_cancelThe meeting is in the past or already cancelled. |
| 429 | rate_limitedToo many requests. Wait for Retry-After seconds. |
| 500 | internal_errorSomething failed on our side. Safe to retry. |
Rate limits
Each key can make 120 requests per minute. Every response tells you where you stand:
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 117
X-RateLimit-Reset: 1791230400Over the limit you'll get 429 rate_limited with a Retry-After header in seconds. Wait that long, then retry. For steady high volume, contact us.
Retrying safely
- Retry 429 and 5xx responses with exponential backoff (1s, 2s, 4s...).
- Don't retry 4xx errors other than 429; fix the request instead.
- Before retrying a booking that timed out, list bookings for the guest (
GET /bookings?guest_email=...) to check it wasn't created.