Budgets are counted per API key and per request class, over a one-minute sliding window. All keys for the same user also share a cap equal to 2× a single key’s budget.
Class
Routes
Default per key
heavy
POST /v1/runs, POST /v1/go/run, POST /v1/go/runs
30 requests / min, 3 concurrent HTTP requests
services
POST /services/{serviceName}
120 requests / min, 10 concurrent HTTP requests
reads
Everything else, including GET /services and GET /credits
“Concurrent” counts in-flight HTTP requests, not active runs. POST /v1/runs responds in milliseconds, so this limit rarely matters. POST /v1/go/run (synchronous) holds a slot for the entire search. Active runs have a separate cap: see Runs per organization.
Apart from these limits, at most 5 Go jobs (POST /v1/go/runs) can be running at once per user: a sixth returns 429 too_many_runs with Retry-After: 30.
Each IP address has a budget of 100 failed authentications per 10-second window. An IPv6 address counts with its whole /64 network.A key that matches no active Retriever key never counts toward this budget. Random or old keys sent from a shared IP address therefore cannot block the valid keys sent from it. Retriever checks such keys against its database at most 20 times per 10 seconds for the whole service. Past that, it answers 503 with code key_check_busy and Retry-After, without checking the key. During a flood of unknown keys, a key created a moment ago (on another server instance) can get this 503 for up to 60 seconds: retry after Retry-After.These requests count as failures:
A 401 or 403 response to a request whose Authorization header holds a key that Retriever knew as active, for example a key revoked a moment ago.
A 401 or 403 response to a request that sends a session cookie that is not valid.
A 401 from the Unipile webhook to a request that sends a Unipile signature or auth header.
Any response that is not 2xx from an /oauth/ endpoint, for example an invalid authorization code (400) or an authorization request from a browser that is not signed in (302). A signed-in browser on /oauth/authorize does not count. These failures use a separate budget, so they do not block /mcp or /v1.
A 429 response never counts. A request with no credential at all does not count and is not refused by this limit, with one exception: /oauth/ endpoints (see above), where every call counts unless it carries a valid key or session. An example of a request that never counts is the first 401 that an MCP client gets before it starts the OAuth flow.A valid key never adds a failure. While Retriever checks a key that it has not seen in the last 10 minutes, that request holds one of the 100 places of its IP address. A burst of parallel requests with new keys from one IP address can therefore get 429 until the first answers come back. Retriever keeps the list of recent keys in memory, so the list is empty after each deploy.When the budget is spent, a key that authenticated in the last 10 minutes still gets through, except on /oauth/. Other requests from that IP address that carry a credential get 429 until the window moves.For a key that authenticated recently, Retriever also reads the key’s own budgets before the key lookup. When they are spent, the request gets 429 with the per-key message. A refused request does not use any budget.
Requests to the MCP endpoint use the budgets of the key that signs them.
Each JSON-RPC message sent to /mcp counts as one request on the key’s mcp budget. This budget has the same size as reads: by default, 600 MCP messages per minute per key.
The API calls that a tool makes count in their own classes, like the same calls made over REST. For example, service_execute counts one mcp message and one services request for POST /services/{serviceName}. The JSON-RPC message itself does not count in reads. The API calls a tool makes do count, so a key used for both MCP and REST shares its reads, services and heavy budgets between them.
A JSON-RPC batch (several messages in one HTTP request; most clients never send one) holds at most 10 messages, and each message counts. A larger batch gets 400 with JSON-RPC error -32600 before any message runs. This does not limit service_batch_execute, which takes 1 to 100 inputs.
A body larger than 10 MiB gets 413 with JSON-RPC error -32600. A body that is not valid JSON gets 400 with JSON-RPC error -32700.
On /mcp, a spent budget is an HTTP 429 with the body above and Retry-After, not a JSON-RPC error.
An MCP request with a valid key never adds a failure to the per-IP budget. The API calls that a tool makes are not checked against it.
An organization executes at most 5 runs at the same time by default. This is not a request budget: it never returns 429.
Runs started with POST /v1/runs and with the MCP tool retriever_build_list_start share the same slots.
A further run is accepted with 202 and stays queued while all the slots are taken: by runs of your organization that are running or recovering, or by its older queued runs, which start first. Its queue field says why it waits and how many older runs of your organization wait before it (ahead). Read it on GET /v1/runs/{id}.
It starts on its own when one of them ends. Do not create it again.
Runs of other organizations are not delayed by yours.
Go jobs (/v1/go/runs) and conversations run from the app do not use these slots.
On the public API and MCP, a request body can be at most 10 MiB (10,485,760 bytes). POST /v1/workspaces/{id}/tables (table import) accepts up to 25 MiB (26,214,400 bytes).A larger body gets 413 with code body_too_large. The request is not processed. Do not retry it: the same body is refused again. Check the size before sending, and send less data per request, for example split an import into several tables.
{ "error": { "code": "body_too_large", "message": "The request body exceeds the 10 MiB limit (10485760 bytes)." } }
On POST /mcp, the same 413 carries a JSON-RPC error. Its id is null, because the body was not read:
{ "jsonrpc": "2.0", "id": null, "error": { "code": -32600, "message": "The request body exceeds the 10 MiB limit (10485760 bytes).", "data": { "code": "body_too_large" } } }
The limit applies after authentication: a request without a valid key gets 401 first. When the body declares its size with Content-Length, the API answers 413 without reading it. Your HTTP client may still be sending the body at that moment: some clients then report a connection reset (for example EPIPE or ECONNRESET) instead of the 413. Treat that error on a body over the limit as 413, not as a network error to retry.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Retriever API","colors":{"primary":"#4F46E5"},"seo":{"indexing":"navigable"},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode","download-spec"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"retriever-3987567e","hasAudioNarration":false,"actualSubdomain":"retriever-3987567e","customDomains":["docs.retriever.run"],"gitSource":{"type":"github","owner":"yonsy7","repo":"agentic-list-building","deployBranch":"master","contentDirectory":"docs/api/public","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ad1c49dbb2721f7e342dd4e","collectionId":"6398e8db-5d50-4b27-8556-82d610a8d2e6","liveDeploymentHistoryId":"6ad1c49dbb2721f7e342dd4e","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6ad1f6a7576d41a597562ea7","clientVersion":"0.0.4043","searchFilterCounts":[{"language":"default","tag":"API reference","count":32},{"language":"default","tag":"Guides","count":18},{"language":"default","tag":"Runs","count":9},{"language":"default","tag":"Services","count":9},{"language":"default","tag":"Recipes","count":8},{"language":"default","tag":"Concepts","count":6},{"language":"default","tag":"Go","count":4},{"language":"default","tag":"Workspaces","count":4},{"language":"default","tag":"Exclusions","count":3},{"language":"default","tag":"Get started","count":2}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"concepts/rate-limits","slug":"/concepts/rate-limits","pageMetadata":{"title":"Rate limits","description":"Retriever API request budgets per key and class, RateLimit headers, and handling 429 responses.","href":"/concepts/rate-limits"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Retriever API request budgets per key and class, RateLimit headers, and handling 429 responses.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`budgets`,children:`Budgets`}),`\n`,_jsxs(_components.p,{children:[`Budgets are counted `,_jsx(_components.strong,{children:`per API key`}),` and `,_jsx(_components.strong,{children:`per request class`}),`, over a one-minute sliding window. All keys for the same user also share a cap equal to 2× a single key’s budget.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Class`}),_jsx(_components.th,{children:`Routes`}),_jsx(_components.th,{children:`Default per key`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`heavy`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`POST /v1/runs`}),`, `,_jsx(_components.code,{children:`POST /v1/go/run`}),`, `,_jsx(_components.code,{children:`POST /v1/go/runs`})]}),_jsx(_components.td,{children:`30 requests / min, 3 concurrent HTTP requests`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`services`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`POST /services/{serviceName}`})}),_jsx(_components.td,{children:`120 requests / min, 10 concurrent HTTP requests`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`reads`})}),_jsxs(_components.td,{children:[`Everything else, including `,_jsx(_components.code,{children:`GET /services`}),` and `,_jsx(_components.code,{children:`GET /credits`})]}),_jsx(_components.td,{children:`600 requests / min`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`mcp`})}),_jsxs(_components.td,{children:[`Each JSON-RPC message sent to `,_jsx(_components.code,{children:`/mcp`}),` (see `,_jsx(_components.a,{href:`#mcp`,children:`MCP`}),`)`]}),_jsx(_components.td,{children:`600 messages / min`})]})]})]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`“Concurrent” counts in-flight HTTP requests, not active runs. `,_jsx(_components.code,{children:`POST /v1/runs`}),` responds in milliseconds, so this limit rarely matters. `,_jsx(_components.code,{children:`POST /v1/go/run`}),` (synchronous) holds a slot for the entire search. Active runs have a separate cap: see `,_jsx(_components.a,{href:`#runs-per-organization`,children:`Runs per organization`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Apart from these limits, at most 5 Go jobs (`,_jsx(_components.code,{children:`POST /v1/go/runs`}),`) can be running at once per user: a sixth returns `,_jsx(_components.code,{children:`429 too_many_runs`}),` with `,_jsx(_components.code,{children:`Retry-After: 30`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Failed authentication is limited per IP address. See `,_jsx(_components.a,{href:`#failed-authentication`,children:`Failed authentication`}),`.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`failed-authentication`,children:`Failed authentication`}),`\n`,_jsxs(_components.p,{children:[`Each IP address has a budget of 100 failed authentications per 10-second window. An IPv6 address counts with its whole `,_jsx(_components.code,{children:`/64`}),` network.`]}),`\n`,_jsxs(_components.p,{children:[`A key that matches no active Retriever key never counts toward this budget. Random or old keys sent from a shared IP address therefore cannot block the valid keys sent from it. Retriever checks such keys against its database at most 20 times per 10 seconds for the whole service. Past that, it answers `,_jsx(_components.code,{children:`503`}),` with code `,_jsx(_components.code,{children:`key_check_busy`}),` and `,_jsx(_components.code,{children:`Retry-After`}),`, without checking the key. During a flood of unknown keys, a key created a moment ago (on another server instance) can get this `,_jsx(_components.code,{children:`503`}),` for up to 60 seconds: retry after `,_jsx(_components.code,{children:`Retry-After`}),`.`]}),`\n`,_jsx(_components.p,{children:`These requests count as failures:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.code,{children:`401`}),` or `,_jsx(_components.code,{children:`403`}),` response to a request whose `,_jsx(_components.code,{children:`Authorization`}),` header holds a key that Retriever knew as active, for example a key revoked a moment ago.`]}),`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.code,{children:`401`}),` or `,_jsx(_components.code,{children:`403`}),` response to a request that sends a session cookie that is not valid.`]}),`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.code,{children:`401`}),` from the Unipile webhook to a request that sends a Unipile signature or auth header.`]}),`\n`,_jsxs(_components.li,{children:[`Any response that is not `,_jsx(_components.code,{children:`2xx`}),` from an `,_jsx(_components.code,{children:`/oauth/`}),` endpoint, for example an invalid authorization code (`,_jsx(_components.code,{children:`400`}),`) or an authorization request from a browser that is not signed in (`,_jsx(_components.code,{children:`302`}),`). A signed-in browser on `,_jsx(_components.code,{children:`/oauth/authorize`}),` does not count. These failures use a separate budget, so they do not block `,_jsx(_components.code,{children:`/mcp`}),` or `,_jsx(_components.code,{children:`/v1`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.code,{children:`429`}),` response never counts. A request with no credential at all does not count and is not refused by this limit, with one exception: `,_jsx(_components.code,{children:`/oauth/`}),` endpoints (see above), where every call counts unless it carries a valid key or session. An example of a request that never counts is the first `,_jsx(_components.code,{children:`401`}),` that an MCP client gets before it starts the OAuth flow.`]}),`\n`,_jsxs(_components.p,{children:[`A valid key never adds a failure. While Retriever checks a key that it has not seen in the last 10 minutes, that request holds one of the 100 places of its IP address. A burst of parallel requests with new keys from one IP address can therefore get `,_jsx(_components.code,{children:`429`}),` until the first answers come back. Retriever keeps the list of recent keys in memory, so the list is empty after each deploy.`]}),`\n`,_jsxs(_components.p,{children:[`When the budget is spent, a key that authenticated in the last 10 minutes still gets through, except on `,_jsx(_components.code,{children:`/oauth/`}),`. Other requests from that IP address that carry a credential get `,_jsx(_components.code,{children:`429`}),` until the window moves.`]}),`\n`,_jsxs(_components.p,{children:[`For a key that authenticated recently, Retriever also reads the key’s own budgets before the key lookup. When they are spent, the request gets `,_jsx(_components.code,{children:`429`}),` with the per-key message. A refused request does not use any budget.`]}),`\n`,_jsx(Heading,{level:`2`,id:`mcp`,children:`MCP`}),`\n`,_jsxs(_components.p,{children:[`Requests to the `,_jsx(_components.a,{href:`/mcp`,children:`MCP endpoint`}),` use the budgets of the key that signs them.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Each JSON-RPC message sent to `,_jsx(_components.code,{children:`/mcp`}),` counts as one request on the key’s `,_jsx(_components.code,{children:`mcp`}),` budget. This budget has the same size as `,_jsx(_components.code,{children:`reads`}),`: by default, 600 MCP messages per minute per key.`]}),`\n`,_jsxs(_components.li,{children:[`The API calls that a tool makes count in their own classes, like the same calls made over REST. For example, `,_jsx(_components.code,{children:`service_execute`}),` counts one `,_jsx(_components.code,{children:`mcp`}),` message and one `,_jsx(_components.code,{children:`services`}),` request for `,_jsx(_components.code,{children:`POST /services/{serviceName}`}),`. The JSON-RPC message itself does not count in `,_jsx(_components.code,{children:`reads`}),`. The API calls a tool makes do count, so a key used for both MCP and REST shares its `,_jsx(_components.code,{children:`reads`}),`, `,_jsx(_components.code,{children:`services`}),` and `,_jsx(_components.code,{children:`heavy`}),` budgets between them.`]}),`\n`,_jsxs(_components.li,{children:[`A JSON-RPC batch (several messages in one HTTP request; most clients never send one) holds at most 10 messages, and each message counts. A larger batch gets `,_jsx(_components.code,{children:`400`}),` with JSON-RPC error `,_jsx(_components.code,{children:`-32600`}),` before any message runs. This does not limit `,_jsx(_components.code,{children:`service_batch_execute`}),`, which takes 1 to 100 inputs.`]}),`\n`,_jsxs(_components.li,{children:[`A body larger than 10 MiB gets `,_jsx(_components.code,{children:`413`}),` with JSON-RPC error `,_jsx(_components.code,{children:`-32600`}),`. A body that is not valid JSON gets `,_jsx(_components.code,{children:`400`}),` with JSON-RPC error `,_jsx(_components.code,{children:`-32700`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`On `,_jsx(_components.code,{children:`/mcp`}),`, a spent budget is an HTTP `,_jsx(_components.code,{children:`429`}),` with the body above and `,_jsx(_components.code,{children:`Retry-After`}),`, not a JSON-RPC error.`]}),`\n`,_jsx(_components.li,{children:`An MCP request with a valid key never adds a failure to the per-IP budget. The API calls that a tool makes are not checked against it.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`runs-per-organization`,children:`Runs per organization`}),`\n`,_jsxs(_components.p,{children:[`An organization executes at most 5 runs at the same time by default. This is not a request budget: it never returns `,_jsx(_components.code,{children:`429`}),`.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Runs started with `,_jsx(_components.code,{children:`POST /v1/runs`}),` and with the MCP tool `,_jsx(_components.code,{children:`retriever_build_list_start`}),` share the same slots.`]}),`\n`,_jsxs(_components.li,{children:[`A further run is accepted with `,_jsx(_components.code,{children:`202`}),` and stays `,_jsx(_components.code,{children:`queued`}),` while all the slots are taken: by runs of your organization that are `,_jsx(_components.code,{children:`running`}),` or `,_jsx(_components.code,{children:`recovering`}),`, or by its older queued runs, which start first. Its `,_jsx(_components.code,{children:`queue`}),` field says why it waits and how many older runs of your organization wait before it (`,_jsx(_components.code,{children:`ahead`}),`). Read it on `,_jsx(_components.code,{children:`GET /v1/runs/{id}`}),`.`]}),`\n`,_jsx(_components.li,{children:`It starts on its own when one of them ends. Do not create it again.`}),`\n`,_jsx(_components.li,{children:`Runs of other organizations are not delayed by yours.`}),`\n`,_jsxs(_components.li,{children:[`Go jobs (`,_jsx(_components.code,{children:`/v1/go/runs`}),`) and conversations run from the app do not use these slots.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`request-size`,children:`Request size`}),`\n`,_jsxs(_components.p,{children:[`On the public API and MCP, a request body can be at most 10 MiB (10,485,760 bytes). `,_jsx(_components.code,{children:`POST /v1/workspaces/{id}/tables`}),` (table import) accepts up to 25 MiB (26,214,400 bytes).`]}),`\n`,_jsxs(_components.p,{children:[`A larger body gets `,_jsx(_components.code,{children:`413`}),` with code `,_jsx(_components.code,{children:`body_too_large`}),`. The request is not processed. Do not retry it: the same body is refused again. Check the size before sending, and send less data per request, for example split an import into several tables.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"body_too_large\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"The request body exceeds the 10 MiB limit (10485760 bytes).\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } }`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`On `,_jsx(_components.code,{children:`POST /mcp`}),`, the same `,_jsx(_components.code,{children:`413`}),` carries a JSON-RPC error. Its `,_jsx(_components.code,{children:`id`}),` is `,_jsx(_components.code,{children:`null`}),`, because the body was not read:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"jsonrpc\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2.0\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`null`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`-32600`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"The request body exceeds the 10 MiB limit (10485760 bytes).\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"data\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"body_too_large\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } } }`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The limit applies after authentication: a request without a valid key gets `,_jsx(_components.code,{children:`401`}),` first. When the body declares its size with `,_jsx(_components.code,{children:`Content-Length`}),`, the API answers `,_jsx(_components.code,{children:`413`}),` without reading it. Your HTTP client may still be sending the body at that moment: some clients then report a connection reset (for example `,_jsx(_components.code,{children:`EPIPE`}),` or `,_jsx(_components.code,{children:`ECONNRESET`}),`) instead of the `,_jsx(_components.code,{children:`413`}),`. Treat that error on a body over the limit as `,_jsx(_components.code,{children:`413`}),`, not as a network error to retry.`]}),`\n`,_jsx(Heading,{level:`2`,id:`headers`,children:`Headers`}),`\n`,_jsx(_components.p,{children:`Authenticated responses include:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`http`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`http`,children:_jsxs(_components.code,{language:`http`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`RateLimit-Limit`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 600`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`RateLimit-Remaining`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 587`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`RateLimit-Reset`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 42`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`RateLimit-Reset`}),` is in seconds.`]}),`\n`,_jsx(Heading,{level:`2`,id:`429-response`,children:`429 response`}),`\n`,_jsxs(_components.p,{children:[`When a per-key or per-user budget is exceeded, the API returns `,_jsx(_components.code,{children:`429`}),` with code `,_jsx(_components.code,{children:`rate_limited`}),` and the `,_jsx(_components.code,{children:`Retry-After`}),` header (in seconds):`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"rate_limited\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Rate limit exceeded. Retry in 12 s.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } }`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`When the failed-authentication budget of an IP address is spent, the message is different:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"rate_limited\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Too many requests. Retry in 7 s.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } }`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`/oauth/`}),` endpoints use the OAuth error format:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{ `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"rate_limited\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:`\"error_description\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Too many requests. Retry in 7 s.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The number in the message is the same as `,_jsx(_components.code,{children:`Retry-After`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Wait `,_jsx(_components.code,{children:`Retry-After`}),` seconds, then retry. When concurrency is exceeded, `,_jsx(_components.code,{children:`Retry-After`}),` is `,_jsx(_components.code,{children:`1`}),`.`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Values may be adjusted by the Retriever team. Read the headers rather than hard-coding numbers.`})}),`\n`,_jsxs(_components.p,{children:[`For a client that applies these rules, see `,_jsx(_components.a,{href:`/recipes/client`,children:`Shared Node client`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Rate limits","description":"Retriever API request budgets per key and class, RateLimit headers, and handling 429 responses.","href":"/concepts/rate-limits"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Budgets","slug":"budgets","depth":2,"children":[]},{"title":"Failed authentication","slug":"failed-authentication","depth":2,"children":[]},{"title":"MCP","slug":"mcp","depth":2,"children":[]},{"title":"Runs per organization","slug":"runs-per-organization","depth":2,"children":[]},{"title":"Request size","slug":"request-size","depth":2,"children":[]},{"title":"Headers","slug":"headers","depth":2,"children":[]},{"title":"429 response","slug":"429-response","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"retriever-3987567e","siteName":"Retriever API","title":"Rate limits - Retriever API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-16T06:31:00.223Z","originalFileLocation":"concepts/rate-limits.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Retriever API request budgets per key and class, RateLimit headers, and handling 429 responses.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Retriever API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/retriever-3987567e/_generated/favicon/apple-touch-icon.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/retriever-3987567e/_generated/favicon/favicon-32x32.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/retriever-3987567e/_generated/favicon/favicon-16x16.png?v=3\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/retriever-3987567e/_generated/favicon/favicon.ico?v=3\">\u003cmeta data-mint-head property=\"og:title\" content=\"Rate limits - Retriever API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Retriever API request budgets per key and class, RateLimit headers, and handling 429 responses.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Retriever API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.retriever.run/concepts/rate-limits\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://retriever-3987567e.mintlify.app/_mintlify/api/og/v2?division=Concepts\u0026amp;title=Rate+limits\u0026amp;description=Retriever+API+request+budgets+per+key+and+class%2C+RateLimit+headers%2C+and+handling+429+responses.\u0026amp;theme=4c917abfdccf5db373a73b47\u0026amp;signature=43bfc230bec3730ef55f5dc54c6c444b6c9296f9d44ac366e2308376c49743d0\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Rate limits - Retriever API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Retriever API request budgets per key and class, RateLimit headers, and handling 429 responses.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://retriever-3987567e.mintlify.app/_mintlify/api/og/v2?division=Concepts\u0026amp;title=Rate+limits\u0026amp;description=Retriever+API+request+budgets+per+key+and+class%2C+RateLimit+headers%2C+and+handling+429+responses.\u0026amp;theme=4c917abfdccf5db373a73b47\u0026amp;signature=43bfc230bec3730ef55f5dc54c6c444b6c9296f9d44ac366e2308376c49743d0\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/retriever-3987567e/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Retriever API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#4F46E5\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.retriever.run/concepts/rate-limits\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/concepts/rate-limits.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.retriever.run/#organization\",\"name\":\"Retriever API\",\"url\":\"https://docs.retriever.run\"},{\"@type\":\"WebSite\",\"@id\":\"https://docs.retriever.run#website\",\"name\":\"Retriever API\",\"url\":\"https://docs.retriever.run\",\"publisher\":{\"@id\":\"https://docs.retriever.run/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.retriever.run/concepts/rate-limits#webpage\",\"url\":\"https://docs.retriever.run/concepts/rate-limits\",\"name\":\"Rate limits\",\"description\":\"Retriever API request budgets per key and class, RateLimit headers, and handling 429 responses.\",\"dateModified\":\"2026-10-16T06:31:00.223Z\",\"isPartOf\":{\"@id\":\"https://docs.retriever.run#website\"},\"breadcrumb\":{\"@id\":\"https://docs.retriever.run/concepts/rate-limits#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.retriever.run/concepts/rate-limits#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Concepts\",\"item\":\"https://docs.retriever.run/concepts/runs\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rate limits\",\"item\":\"https://docs.retriever.run/concepts/rate-limits\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.retriever.run/concepts/rate-limits#article\",\"headline\":\"Rate limits\",\"name\":\"Rate limits\",\"description\":\"Retriever API request budgets per key and class, RateLimit headers, and handling 429 responses.\",\"url\":\"https://docs.retriever.run/concepts/rate-limits\",\"mainEntityOfPage\":{\"@id\":\"https://docs.retriever.run/concepts/rate-limits#webpage\"},\"dateModified\":\"2026-10-16T06:31:00.223Z\",\"publisher\":{\"@id\":\"https://docs.retriever.run/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.retriever.run#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Retriever API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Retriever API","nav":{"global":null,"tabs":[{"tab":"Guides","groups":[{"group":"Get started","pages":[{"title":"Retriever API","href":""},{"title":"Quickstart","href":"/quickstart"}]},{"group":"Model Context Protocol","pages":[{"title":"Model Context Protocol (MCP)","href":"/mcp/index"},{"title":"MCP tools","href":"/mcp/tools"}]},{"group":"Concepts","pages":[{"title":"Runs","href":"/concepts/runs"},{"title":"Tables","href":"/concepts/tables"},{"title":"Exclusions","href":"/concepts/exclusions"},{"title":"Errors","description":"Standard error format for the Retriever API, stable codes by HTTP status, and recommended actions.","href":"/concepts/errors"},{"title":"Rate limits","href":"/concepts/rate-limits"},{"title":"Pagination","description":"Offset and cursor pagination in the Retriever API, with loop examples in Node and Python.","href":"/concepts/pagination"}]},{"group":"Recipes","pages":[{"title":"Shared Node client","href":"/recipes/client"},{"title":"Enrich a list from your CRM","href":"/recipes/enrich-crm-list"},{"title":"Sync your customers to the exclusion list","href":"/recipes/sync-exclusions"},{"title":"Get a guaranteed table format","href":"/recipes/guaranteed-table-format"},{"title":"Manage multiple clients (multitenant)","href":"/recipes/multitenant"},{"title":"Make your integrations robust","href":"/recipes/robust-integrations"},{"title":"Continue a run with a new prompt","href":"/recipes/follow-up-runs"},{"title":"Extract structured data with Go","href":"/recipes/structured-extraction-go"}]}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/api-reference/runs/list-runs"}]}]},"basePath":"","title":"Rate limits - Retriever API","buildId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","deploymentId":"dpl_G9nrg4qeJSZtah1Ziwbc2n6WkLch","dynamics":[],"chunks":[]}