Send X-Subject and each distinct value gets a tenth of the key’s budget for that endpoint. So 6 scans a minute per customer against a key allowing 60.This exists so one customer of yours cannot exhaust the key and take down your other customers. Both ceilings apply: the subject limit first, then the key limit.
Sustained throughput is lower than the burst limit
These are burst ceilings, not a throughput guarantee.
A scan takes 20 to 30 seconds of wall clock and a playbook 50 to 90, so sustained throughput is bounded by how long the work takes and by upstream provider capacity, well before the limiter is what stops you.If you need a committed sustained rate, talk to us rather than reading these numbers as a contract.
Back off exponentially and retry. Rate limit windows are 60 seconds, so a wait of a few seconds is usually enough.
if (response.status === 429) { await new Promise((r) => setTimeout(r, 5_000)) // retry with the same Idempotency-Key}
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Nouvel API","colors":{"primary":"#000000","light":"#ffffff","dark":"#000000"},"logo":{"light":"https://mintcdn.com/nouvel-hq/r7f23H47fjmSkJ48/logo/light.svg?fit=max\u0026auto=format\u0026n=r7f23H47fjmSkJ48\u0026q=85\u0026s=600caf20b1b48dbe0f2e082f0ba9011e","dark":"https://mintcdn.com/nouvel-hq/r7f23H47fjmSkJ48/logo/dark.svg?fit=max\u0026auto=format\u0026n=r7f23H47fjmSkJ48\u0026q=85\u0026s=23f1e414edf1155eacba74f1326f3f8f"},"favicon":"https://mintcdn.com/nouvel-hq/r7f23H47fjmSkJ48/favicon.svg?fit=max\u0026auto=format\u0026n=r7f23H47fjmSkJ48\u0026q=85\u0026s=a1a6871d27f82d276145ce1d2c99570e","navbar":{"links":[{"href":"mailto:hello@nouvelhq.com","label":"Support"}]},"footer":{"socials":{"website":"https://nouvelhq.com"}},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"nouvel-hq","hasAudioNarration":false,"actualSubdomain":"nouvel-hq","customDomains":["docs.nouvelhq.com"],"gitSource":{"type":"github","owner":"shutiancheng","repo":"nouvel-hq-api-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6a6a5555deb2f7588ab6f546","collectionId":"5636bbe1-0c2f-46f2-b6c2-69fb0b61a909","liveDeploymentHistoryId":"6a6a5555deb2f7588ab6f546","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aea2117d79cc52e698a1131:success","clientVersion":"0.0.4064","searchFilterCounts":[{"language":"default","tag":"API reference","count":4},{"language":"default","tag":"Concepts","count":4},{"language":"default","tag":"Getting started","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"rate-limits","slug":"/rate-limits","pageMetadata":{"title":"Rate limits","description":"Per-key and per-customer ceilings.","href":"/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: \"Per-key and per-customer ceilings.\"\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={code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`per-key`,children:`Per key`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Endpoint`}),_jsx(_components.th,{children:`Limit`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/scan`})}),_jsx(_components.td,{children:`60 requests / minute`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/playbook`})}),_jsx(_components.td,{children:`60 requests / minute`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/music`})}),_jsx(_components.td,{children:`60 requests / minute`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`/v1/assist`})}),_jsx(_components.td,{children:`600 requests / minute`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Exceeding a limit returns `,_jsx(_components.code,{children:`429 rate_limited`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`per-end-customer`,children:`Per end customer`}),`\n`,_jsxs(_components.p,{children:[`Send `,_jsx(_components.code,{children:`X-Subject`}),` and each distinct value gets `,_jsx(_components.strong,{children:`a tenth`}),` of the key’s budget for that endpoint. So 6 scans a minute per customer against a key allowing 60.`]}),`\n`,_jsx(_components.p,{children:`This exists so one customer of yours cannot exhaust the key and take down your other customers. Both ceilings apply: the subject limit first, then the key limit.`}),`\n`,_jsx(Heading,{level:`2`,id:`sustained-throughput-is-lower-than-the-burst-limit`,children:`Sustained throughput is lower than the burst limit`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`These are burst ceilings, not a throughput guarantee.`})}),`\n`,_jsx(_components.p,{children:`A scan takes 20 to 30 seconds of wall clock and a playbook 50 to 90, so sustained throughput is bounded by how long the work takes and by upstream provider capacity, well before the limiter is what stops you.`}),`\n`,_jsx(_components.p,{children:`If you need a committed sustained rate, talk to us rather than reading these numbers as a contract.`}),`\n`,_jsx(Heading,{level:`2`,id:`handling-429`,children:`Handling 429`}),`\n`,_jsx(_components.p,{children:`Back off exponentially and retry. Rate limit windows are 60 seconds, so a wait of a few seconds is usually enough.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`typescript`,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:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`response`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`status`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ===`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 429`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Promise`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`((`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`r`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`=>`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` setTimeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`r`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`5_000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`))`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // retry with the same Idempotency-Key`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})})]})}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":"Per-key and per-customer ceilings.","href":"/rate-limits"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Per key","slug":"per-key","depth":2,"children":[]},{"title":"Per end customer","slug":"per-end-customer","depth":2,"children":[]},{"title":"Sustained throughput is lower than the burst limit","slug":"sustained-throughput-is-lower-than-the-burst-limit","depth":2,"children":[]},{"title":"Handling 429","slug":"handling-429","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"nouvel-hq","siteName":"Nouvel API","title":"Rate limits - Nouvel API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-29T15:53:46.215Z","originalFileLocation":"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=\"Per-key and per-customer ceilings.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Nouvel API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nouvel-hq/Xb8zJc6Jl1Kwb5x3/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/nouvel-hq/Xb8zJc6Jl1Kwb5x3/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nouvel-hq/Xb8zJc6Jl1Kwb5x3/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nouvel-hq/Xb8zJc6Jl1Kwb5x3/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nouvel-hq/Xb8zJc6Jl1Kwb5x3/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nouvel-hq/Xb8zJc6Jl1Kwb5x3/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nouvel-hq/Xb8zJc6Jl1Kwb5x3/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nouvel-hq/Xb8zJc6Jl1Kwb5x3/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nouvel-hq/Xb8zJc6Jl1Kwb5x3/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Rate limits - Nouvel API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Per-key and per-customer ceilings.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Nouvel API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.nouvelhq.com/rate-limits\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://nouvel-hq.mintlify.app/_mintlify/api/og/v2?division=Concepts\u0026amp;title=Rate+limits\u0026amp;description=Per-key+and+per-customer+ceilings.\u0026amp;theme=9055956b9f7abae6be2f7e79\u0026amp;signature=22b03f9b7e628415d5b42786e700bed02dc91945c7f5c8ee0bd2d3949ec6e1ee\">\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 - Nouvel API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Per-key and per-customer ceilings.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://nouvel-hq.mintlify.app/_mintlify/api/og/v2?division=Concepts\u0026amp;title=Rate+limits\u0026amp;description=Per-key+and+per-customer+ceilings.\u0026amp;theme=9055956b9f7abae6be2f7e79\u0026amp;signature=22b03f9b7e628415d5b42786e700bed02dc91945c7f5c8ee0bd2d3949ec6e1ee\">\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=\"/mintlify-assets/_mintlify/favicons/nouvel-hq/Xb8zJc6Jl1Kwb5x3/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Nouvel API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#000000\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.nouvelhq.com/rate-limits\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/rate-limits.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.nouvelhq.com/#organization\",\"name\":\"Nouvel API\",\"url\":\"https://docs.nouvelhq.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/nouvel-hq/r7f23H47fjmSkJ48/logo/light.svg?fit=max\u0026auto=format\u0026n=r7f23H47fjmSkJ48\u0026q=85\u0026s=600caf20b1b48dbe0f2e082f0ba9011e\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.nouvelhq.com#website\",\"name\":\"Nouvel API\",\"url\":\"https://docs.nouvelhq.com\",\"publisher\":{\"@id\":\"https://docs.nouvelhq.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.nouvelhq.com/rate-limits#webpage\",\"url\":\"https://docs.nouvelhq.com/rate-limits\",\"name\":\"Rate limits\",\"description\":\"Per-key and per-customer ceilings.\",\"dateModified\":\"2026-07-29T15:53:46.215Z\",\"isPartOf\":{\"@id\":\"https://docs.nouvelhq.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.nouvelhq.com/rate-limits#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.nouvelhq.com/rate-limits#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Concepts\",\"item\":\"https://docs.nouvelhq.com/markets\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rate limits\",\"item\":\"https://docs.nouvelhq.com/rate-limits\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.nouvelhq.com/rate-limits#article\",\"headline\":\"Rate limits\",\"name\":\"Rate limits\",\"description\":\"Per-key and per-customer ceilings.\",\"url\":\"https://docs.nouvelhq.com/rate-limits\",\"mainEntityOfPage\":{\"@id\":\"https://docs.nouvelhq.com/rate-limits#webpage\"},\"dateModified\":\"2026-07-29T15:53:46.215Z\",\"publisher\":{\"@id\":\"https://docs.nouvelhq.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.nouvelhq.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Nouvel API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Nouvel API","nav":{"global":null,"groups":[{"group":"Getting started","pages":[{"title":"Introduction","href":"/index"},{"title":"Quickstart","href":"/quickstart"},{"title":"Authentication","href":"/authentication"}]},{"group":"Concepts","pages":[{"title":"Markets and languages","href":"/markets"},{"title":"Billing","description":"Prepaid credit, per-call pricing, and how partial work is charged.","href":"/billing"},{"title":"Rate limits","href":"/rate-limits"},{"title":"Errors","description":"Stable machine-readable codes you can branch on.","href":"/errors"}]},{"group":"API reference","pages":[{"title":"Assist","href":"/api-reference/assist"},{"title":"Scan","href":"/api-reference/scan"},{"title":"Playbook","href":"/api-reference/playbook"},{"title":"Music","href":"/api-reference/music"}]}]},"basePath":"","title":"Rate limits - Nouvel API","buildId":"dpl_2gSLkbMoF5kkLsBqYzq9KWtDyJRo","deploymentId":"dpl_2gSLkbMoF5kkLsBqYzq9KWtDyJRo","dynamics":[],"chunks":[]}