airbnb_rate_limited
Airbnb is rate-limiting writes for this host. Back off and batch dates.
When it fires
Airbnb is rate-limiting writes for this host. It comes from PUT /v1/channels/airbnb/listings/{id}/pricing and /availability, typically when many small writes are sent in a short time, and from the inquiry and booking-request actions (pre-approvals, special offers, accepting and declining requests). It is Airbnb's limit, separate from your Repull plan limits. Airbnb did not act on the request.
Response shape
Every Repull error follows the same envelope. The code is stable and safe to switch on.
{
"error": {
"code": "airbnb_rate_limited",
"message": "Too many requests",
"retry_after": 30,
"docs_url": "https://repull.dev/docs/errors/airbnb_rate_limited",
"request_id": "req_01J5X7Y8Z9ABCDEF12345678"
}
}How to fix
- Wait `retry_after` seconds when it is present; otherwise back off exponentially with jitter.
- Retry the same request — nothing about it needs to change.
- Send fewer, larger writes: put many dates into one `operations` array (dates and ranges like `2026-07-01:2026-07-14`) instead of one call per date.
Common gotchas
- The
@repull/sdkclient retries 429 responses on its own calls; a plainfetchdoes not. - Parallel writes for listings on the same host share Airbnb's limit. Serialize them per host.
- Retry with the same Idempotency-Key. A 429 is not stored against the key, because Airbnb did nothing, so the retry reaches Airbnb again rather than replaying the refusal. Keeping the key means a retry that races an earlier attempt still cannot act twice.
Examples
curl
# One write covering a whole range instead of fourteen single-date calls
curl -X PUT https://api.repull.dev/v1/channels/airbnb/listings/4118/availability \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"type": "calendar", "operations": [{"dates": ["2026-07-01:2026-07-14"], "min_nights": 3}]}'TypeScript
async function putWithBackoff(url: string, body: unknown, maxAttempts = 5) {
for (let attempt = 0; attempt < maxAttempts; attempt++) {
const res = await fetch(url, {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.REPULL_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(body),
})
if (res.status !== 429) return res
const { error } = await res.json()
const waitSeconds = error.retry_after ?? Math.min(60, 2 ** attempt + Math.random())
await new Promise(r => setTimeout(r, waitSeconds * 1000))
}
throw new Error('Airbnb kept rate-limiting this host')
}If you're an AI agent
Airbnb is rate-limiting writes for this host. Wait retry_after seconds (or back off exponentially), then retry the same request. Batch dates into one operations array rather than sending one call per date.
Related
- Error reference — the full table of error codes
- Using Repull from AI agents — patterns for handling errors in agent loops
- Push Availability to Airbnb
- rate_limited
- Idempotency Keys
Hit an error that isn't covered? Email hello@repull.dev with the request id from the response headers.