Knowledge baseDevelopers & API

Rate limits, idempotency & errors

Every endpoint shares the same rules for rate limiting, safe retries, and error shapes. Learn these once and they apply across Discovery, Availability, and Bookings.

Rate limits

The default ceiling is 60 requests per minute per key. Every response carries the current budget, and a 429 tells you when to retry:

HeaderMeaning
X-RateLimit-LimitYour per-minute ceiling.
X-RateLimit-RemainingRequests left in the current window.
X-RateLimit-ResetUnix epoch (seconds) when the window resets.
Retry-AfterOn a 429, seconds to wait before retrying.

Need a higher limit? Contact [email protected].

Idempotency

Make retries safe on writes (POST / PATCH / DELETE) by sending a client-generated key:

Idempotency-Key: 5f9c2b7e-3a1d-4e88-9c0a-1b2c3d4e5f60
  • The first request with a given key stores its response for 24 hours.
  • A retry with the same key and body returns that stored response instead of acting twice.
  • The same key with a different body returns 409 idempotency.key_reused.
  • 5xx responses aren't cached, so a retry can still succeed against a healthy instance.

Use a fresh UUID per logical operation (per booking, per cancellation).

Errors

Every error uses the same envelope. Match on code (stable) — never parse message, which can be reworded:

{
  "error": {
    "code": "validation.failed",
    "message": "contact requires an identifier (email, phone, or an ID)",
    "retryable": false
  }
}

retryable is a hint: generally true for 5xx and 429, false for other 4xx. Common codes:

CodeHTTPMeaning
auth.invalid_key401Key missing, malformed, revoked, or expired.
auth.insufficient_scope403Key lacks the scope this endpoint needs.
auth.api_access_disabled403API access isn't enabled on the account.
platform.mismatch403URL platform ≠ the platform configured on the location.
validation.failed400Required field missing or body shape wrong (see issues[]).
contact.not_found404Contact didn't resolve and autoCreateContact was false.
idempotency.key_reused409Same idempotency key, different body.
ratelimit.exceeded429Over 60 req/min — wait Retry-After.
platform.circuit_open503The booking platform is erroring — breaker is open (below).

Circuit breaker

If a booking platform throws 5+ server errors in 60 seconds, AutoSync opens a per-platform breaker for 5 minutes and returns 503 platform.circuit_open during that window. It auto-recovers — wait the indicated Retry-After rather than looping retries.

Last updated July 2026

Which platform do you use?

Pick where your bookings live — we'll start your 30-day free trial there.

Mindbody Fitness studios, gyms & boutiques Booker Salons, spas & med-spas