For AI agents: a documentation index is available at /llms.txt. Every guide and example is also available as markdown by adding .md to its URL.
Rate Limits
Limits are applied per credential — each API key (or OAuth access token) has its own budget, so one key can't exhaust another's.
| Requests | Limit |
|---|---|
Reads (GET) | 300 per minute |
Writes (POST, PUT, PATCH, DELETE) | 60 per minute |
| All requests combined | 300 per minute |
| Unauthenticated requests | 50 per 10 seconds, per IP |
So a credential can make up to 300 requests a minute in total, of which at most 60 can be writes.
Per-network publishing limits also apply on top of the API limits — a channel can only post as often as the platform allows.
Headers
Responses carry RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset (seconds
until the window resets) for the combined per-credential budget, so you can pace requests.
Handling 429
When you exceed a limit, the API returns 429 Too Many Requests with a Retry-After
header (in seconds). The body depends on which limit you hit:
{ "error": { "message": "Rate limit exceeded. Retry after 12s.", "code": "RATE_LIMITED" } }
is returned when you exceed the per-minute read or write limit, and
{ "defined": false, "code": "TOO_MANY_REQUESTS", "status": 429, "message": "Too Many Requests", "data": { "message": "You are being rate limited. Please try again later." } }
when you exceed the combined limit. Either way, wait for Retry-After and try again:
async function withRetry(fn: () => Promise<Response>, attempts = 5) { for (let i = 0; i < attempts; i++) { const res = await fn(); if (res.status !== 429) return res; const retryAfter = Number(res.headers.get("Retry-After")); const wait = Number.isFinite(retryAfter) && retryAfter > 0 ? retryAfter * 1000 : Math.min(2 ** i * 500, 10_000); await new Promise((r) => setTimeout(r, wait)); } throw new Error("Rate limited after retries"); }