Rate limits
| Limit | Default |
|---|---|
| Requests per client | 600 a minute |
| Requests for the whole organization (all clients) | 3,000 a minute |
AI operations per caller (POST /v1/ask, Process, regenerate) |
30 a minute |
| Uploads for the organization (questionnaires, documents, versions) | 120 an hour |
Token requests per client (/oauth/token) |
60 a minute |
The limits are fixed windows, shared by all of Tradecraft’s servers. Admins can lower them for their organization in Admin → API → Settings → Rate limits; to raise them, contact us. GET /v1/me returns the limits that apply to your token.
Every response carries the headers of the tightest limit that applied:
| Header | Meaning |
|---|---|
RateLimit-Limit |
Requests allowed in the window |
RateLimit-Remaining |
Requests left |
RateLimit-Reset |
Seconds until the window resets |
Over a limit, the answer is 429 RATE_LIMITED with Retry-After in seconds. Wait that long before you retry.
async function call(url: string, init: RequestInit, tries = 3): Promise<Response> { const res = await fetch(url, init) if (res.status !== 429 || tries <= 1) return res const wait = Number(res.headers.get("Retry-After") ?? "1") await new Promise((r) => setTimeout(r, wait * 1000)) return call(url, init, tries - 1)}curl -s -D - -o /dev/null -H "Authorization: Bearer $TOKEN" https://api.tradecrafthub.ai/v1/me | grep -i '^ratelimit-'AI operations also stop with 402 when your organization’s AI budget is used up. That is a budget, not a rate limit: retrying does not help until the budget is raised or the month ends.