Rate limits
We apply rate limits per API key, measured in requests per minute (RPM).
| Plan | RPM |
|---|---|
| Free | 20 |
| Monthly | 200 |
| Annual | 300 |
| Enterprise | 1500 (custom) |
Headers we set
Every response includes the current rate-limit posture:
x-ratelimit-limit: 200x-ratelimit-remaining: 187x-ratelimit-reset: 1716040860x-ratelimit-reset is a unix timestamp at which your bucket refills.
When you exceed the limit
We return HTTP 429 with the JSON error body:
{ "error": { "status": 429, "code": "rate_limited", "message": "Try again in 32 seconds." }, "request_id": "req_abc"}A retry-after header gives you the wait in seconds. Sleep, then retry — your
client SHOULD honor it.
Quotas
Independent of RPM, every call charges credits from your plan balance. When the
balance hits zero we return 429 quota_exceeded instead. Top up or wait for the
next cycle to resume.
Best practices
- Don’t poll faster than 1 request per second per endpoint.
- For bulk work, use
/v1/stays/batch(up to 50 entries per call) or walk/v1/searchpages vianextPageToken. Page tokens are cheaper than re-querying. - Cache idempotent reads on your side too. We cache detail rows for 24h internally; you don’t need to re-fetch every hour.