Run browser jobs in parallel, manage shared account limits, and clean up failed workers.
Limit the number of browser jobs running at once, queue excess work, and stop each session when its job finishes. Your account limit applies across all processes using the account.
available is a snapshot. It does not reserve slots; another worker can start a browser before your next request. Set an application concurrency limit below the account cap if other jobs share the account, and handle parallel_browsers_limit_reached at startup.Browser slots are one of several account limits; limits covers request rates and proxy traffic quotas and the 429 codes each one returns.
The Python and TypeScript SDKs provide map() and browser pools with a concurrency setting and managed cleanup.A pool can reuse a browser for several items. Cookies, storage, and open pages can carry over. Use separate sessions for jobs that need independent state, and retire a browser after a job that leaves it unusable.A persistent profile runs one browser at a time, so use a separate profile per account you run concurrently.
Put the stop call in finally, outside the framework connection block, so it also runs if connecting fails. The framework quickstarts show the full lifecycle.Choose an inactivity timeout long enough for legitimate pauses, but do not rely on it as your only cleanup.After a worker crashes, compare GET /profiles/active with the session IDs your application owns. Session age alone does not prove a leak: another worker may still be using that browser. Stop only sessions you can identify as abandoned.
POST /profiles/stop stops every browser on the account, including work owned by other processes. Use individual stop calls for routine cleanup.
Start with a small worker count. Measure completed jobs, target-site failures, proxy traffic, and browser startup errors before raising it.Browser slots and API rate limits are separate. Starting many browsers at once can hit a request limit even when slots remain. Queue startups and use bounded backoff with jitter for temporary capacity errors. See errors and retries.A start request can time out after the server has created the browser. Check active sessions before repeating a one-time start request.
Check account capacity; do not treat it as a reservation.
Active sessions and your worker records
Find sessions whose owning job has ended.
Minute and hour rate-limit headers
Slow API requests before exhausting either window.
cluster_is_full or startup failures
Back off and stop retrying after a bounded number of attempts.
Proxy quota and traffic stats
Estimate how much work your remaining traffic can support.
Target status and expected page content
Measure completed work, including responses that contain challenge pages.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Surfsky","description":"Surfsky cloud browser for automation and scraping","colors":{"primary":"#111111","light":"#ffffff","dark":"#767676"},"logo":{"light":"https://mintcdn.com/llcfzecyberfinity/sOzW2rg1MprciyvQ/images/logo-light.svg?fit=max\u0026auto=format\u0026n=sOzW2rg1MprciyvQ\u0026q=85\u0026s=c6cc1d7d380cb1803815c2369dc6f6c2","dark":"https://mintcdn.com/llcfzecyberfinity/sOzW2rg1MprciyvQ/images/logo-dark.svg?fit=max\u0026auto=format\u0026n=sOzW2rg1MprciyvQ\u0026q=85\u0026s=de57992e58089755f7cd4f3d518da18f","href":"https://surfsky.io"},"favicon":{"light":"https://mintcdn.com/llcfzecyberfinity/sOzW2rg1MprciyvQ/images/favicon-light.svg?fit=max\u0026auto=format\u0026n=sOzW2rg1MprciyvQ\u0026q=85\u0026s=435f78bbb4fbb8acbf012947b73cbaf4","dark":"https://mintcdn.com/llcfzecyberfinity/sOzW2rg1MprciyvQ/images/favicon-dark.svg?fit=max\u0026auto=format\u0026n=sOzW2rg1MprciyvQ\u0026q=85\u0026s=26f98ca931286a0355c2f45a1ea9a892"},"appearance":{"default":"dark"},"background":{"color":{"light":"#ffffff","dark":"#111111"}},"navbar":{"links":[{"href":"https://surfsky.io","label":"Go to Website"}],"primary":{"type":"button","label":"Get Started","href":"https://surfsky.io/signin"}},"footer":{"socials":{"x":"https://x.com/surfskyio","github":"https://github.com/surfskyio","youtube":"https://www.youtube.com/@surfskyio","linkedin":"https://www.linkedin.com/company/surfskyio"}},"seo":{"metatags":{"canonical":"https://docs.surfsky.io","google-site-verification":"J4sdCp8jl5MCOHehI0AOmiPBlLduJLMGQrT4pTNwvU4","msvalidate.01":"C003BE57DE9AE70B5829DB3858FF8609"}},"integrations":{"gtm":{"tagId":"GTM-NX966VJC"}},"contextual":{"options":["copy","view","chatgpt","claude","download-spec"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"llcfzecyberfinity","hasAudioNarration":false,"actualSubdomain":"llcfzecyberfinity","customDomains":["docs.surfsky.io"],"gitSource":{"type":"github","owner":"surfskyio","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"d2105f4c-27e1-4f56-99c4-5125d10cb8dc","liveDeploymentHistoryId":"6aeb8d9cda80903cd692cbc5","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aeb8d9cda80903cd692cbc5"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aeb8d9cda80903cd692cbc5","clientVersion":"0.0.4074","searchFilterCounts":[{"language":"default","tag":"API reference","count":37},{"language":"default","tag":"Documentation","count":37},{"language":"default","tag":"Profiles","count":14},{"language":"default","tag":"CAPTCHA guides","count":12},{"language":"default","tag":"Proxies","count":11},{"language":"default","tag":"Connect your tools","count":6},{"language":"default","tag":"SDKs","count":6},{"language":"default","tag":"Browser sessions","count":5},{"language":"default","tag":"Extensions","count":5},{"language":"default","tag":"Get started","count":4}]},"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":"rbac-expansion","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":"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":"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},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#content-area span[id]:empty{display:block;scroll-margin-top:var(--scroll-mt, 8rem)}"}],"page":{"pagePath":"concurrency","slug":"/concurrency","pageMetadata":{"title":"Concurrency","description":"Run browser jobs in parallel, manage shared account limits, and clean up failed workers.","href":"/concurrency"},"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: \"Run browser jobs in parallel, manage shared account limits, and clean up failed workers.\"\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`,p:`p`,pre:`pre`,span:`span`,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(_components.p,{children:`Limit the number of browser jobs running at once, queue excess work, and stop each session when its job finishes. Your account limit applies across all processes using the account.`}),`\n`,_jsx(`span`,{id:`gate-on-what-is-actually-free`}),`\n`,_jsx(Heading,{level:`2`,id:`check-available-capacity`,children:`Check available capacity`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,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:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$SURFSKY_API_BASE_URL`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/users/browser-limits\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"X-Cloud-Api-Token: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$SURFSKY_API_TOKEN`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Example response for an account with a browser limit:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`10`,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:`10`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"success\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"msg\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Browser limits retrieved\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"data\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"has_browser_limits\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"parallel_browsers\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`50`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"running\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`12`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"available\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`38`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`available`}),` is a snapshot. It does not reserve slots; another worker can start a browser before your next request. Set an application concurrency limit below the account cap if other jobs share the account, and handle `,_jsx(_components.code,{children:`parallel_browsers_limit_reached`}),` at startup.`]}),`\n`,_jsxs(_components.p,{children:[`Browser slots are one of several account limits; `,_jsx(_components.a,{href:`/limits`,children:`limits`}),` covers request rates and proxy traffic quotas and the `,_jsx(_components.code,{children:`429`}),` codes each one returns.`]}),`\n`,_jsx(`span`,{id:`pick-the-cheaper-session`}),`\n`,_jsx(Heading,{level:`2`,id:`use-an-sdk-pool`,children:`Use an SDK pool`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.a,{href:`/sdk/python#process-items-concurrently`,children:`Python`}),` and `,_jsx(_components.a,{href:`/sdk/typescript#process-items-concurrently`,children:`TypeScript`}),` SDKs provide `,_jsx(_components.code,{children:`map()`}),` and browser pools with a concurrency setting and managed cleanup.`]}),`\n`,_jsx(_components.p,{children:`A pool can reuse a browser for several items. Cookies, storage, and open pages can carry over. Use separate sessions for jobs that need independent state, and retire a browser after a job that leaves it unusable.`}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.a,{href:`/sessions#persistent-profiles`,children:`persistent profile`}),` runs one browser at a time, so use a separate profile per account you run concurrently.`]}),`\n`,_jsx(`span`,{id:`always-stop-in-a-finally`}),`\n`,_jsx(`span`,{id:`sweep-for-leaks`}),`\n`,_jsx(Heading,{level:`2`,id:`stop-sessions-after-failures`,children:`Stop sessions after failures`}),`\n`,_jsxs(_components.p,{children:[`Put the stop call in `,_jsx(_components.code,{children:`finally`}),`, outside the framework connection block, so it also runs if connecting fails. The `,_jsx(_components.a,{href:`/quickstart#choose-an-integration`,children:`framework quickstarts`}),` show the full lifecycle.`]}),`\n`,_jsxs(_components.p,{children:[`Choose an `,_jsx(_components.a,{href:`/sessions#how-a-session-ends`,children:`inactivity timeout`}),` long enough for legitimate pauses, but do not rely on it as your only cleanup.`]}),`\n`,_jsxs(_components.p,{children:[`After a worker crashes, compare `,_jsx(_components.code,{children:`GET /profiles/active`}),` with the session IDs your application owns. Session age alone does not prove a leak: another worker may still be using that browser. Stop only sessions you can identify as abandoned.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`POST /profiles/stop`}),` stops every browser on the account, including work owned by other processes. Use individual stop calls for routine cleanup.`]})}),`\n`,_jsx(`span`,{id:`ramping-up`}),`\n`,_jsx(Heading,{level:`2`,id:`increase-load-gradually`,children:`Increase load gradually`}),`\n`,_jsx(_components.p,{children:`Start with a small worker count. Measure completed jobs, target-site failures, proxy traffic, and browser startup errors before raising it.`}),`\n`,_jsxs(_components.p,{children:[`Browser slots and API rate limits are separate. Starting many browsers at once can hit a request limit even when slots remain. Queue startups and use bounded backoff with jitter for temporary capacity errors. See `,_jsx(_components.a,{href:`/errors#retrying`,children:`errors and retries`}),`.`]}),`\n`,_jsx(_components.p,{children:`A start request can time out after the server has created the browser. Check active sessions before repeating a one-time start request.`}),`\n`,_jsx(`span`,{id:`what-to-watch`}),`\n`,_jsx(Heading,{level:`2`,id:`what-to-monitor`,children:`What to monitor`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Signal`}),_jsx(_components.th,{children:`What to do with it`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`data.available`}),` from `,_jsx(_components.code,{children:`/users/browser-limits`})]}),_jsx(_components.td,{children:`Check account capacity; do not treat it as a reservation.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Active sessions and your worker records`}),_jsx(_components.td,{children:`Find sessions whose owning job has ended.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Minute and hour rate-limit headers`}),_jsx(_components.td,{children:`Slow API requests before exhausting either window.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`cluster_is_full`}),` or startup failures`]}),_jsx(_components.td,{children:`Back off and stop retrying after a bounded number of attempts.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Proxy quota and traffic stats`}),_jsx(_components.td,{children:`Estimate how much work your remaining traffic can support.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Target status and expected page content`}),_jsx(_components.td,{children:`Measure completed work, including responses that contain challenge pages.`})]})]})]})]})}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":"Concurrency","description":"Run browser jobs in parallel, manage shared account limits, and clean up failed workers.","href":"/concurrency"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Check available capacity","slug":"check-available-capacity","depth":2,"children":[]},{"title":"Use an SDK pool","slug":"use-an-sdk-pool","depth":2,"children":[]},{"title":"Stop sessions after failures","slug":"stop-sessions-after-failures","depth":2,"children":[]},{"title":"Increase load gradually","slug":"increase-load-gradually","depth":2,"children":[]},{"title":"What to monitor","slug":"what-to-monitor","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"llcfzecyberfinity","siteName":"Surfsky","title":"Concurrency - Surfsky","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-22T12:11:56.830Z","originalFileLocation":"concurrency.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=\"dark\"}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=\"Run browser jobs in parallel, manage shared account limits, and clean up failed workers.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Surfsky\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/llcfzecyberfinity/SHqOt5EXHexpipeW/_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/llcfzecyberfinity/SHqOt5EXHexpipeW/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/llcfzecyberfinity/SHqOt5EXHexpipeW/_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/llcfzecyberfinity/SHqOt5EXHexpipeW/_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/llcfzecyberfinity/SHqOt5EXHexpipeW/_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/llcfzecyberfinity/SHqOt5EXHexpipeW/_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/llcfzecyberfinity/SHqOt5EXHexpipeW/_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/llcfzecyberfinity/SHqOt5EXHexpipeW/_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/llcfzecyberfinity/SHqOt5EXHexpipeW/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Concurrency - Surfsky\">\u003cmeta data-mint-head property=\"og:description\" content=\"Run browser jobs in parallel, manage shared account limits, and clean up failed workers.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Surfsky\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.surfsky.io/concurrency\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://llcfzecyberfinity.mintlify.site/_mintlify/api/og/v2?division=Performance+and+limits\u0026amp;title=Concurrency\u0026amp;description=Run+browser+jobs+in+parallel%2C+manage+shared+account+limits%2C+and+clean+up+failed+workers.\u0026amp;theme=b88efaa132919559f01989e9\u0026amp;signature=13427790c38dfb6cd2c364181bd21e75f8827b0545f0900abcd240970470051b\">\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=\"Concurrency - Surfsky\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Run browser jobs in parallel, manage shared account limits, and clean up failed workers.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://llcfzecyberfinity.mintlify.site/_mintlify/api/og/v2?division=Performance+and+limits\u0026amp;title=Concurrency\u0026amp;description=Run+browser+jobs+in+parallel%2C+manage+shared+account+limits%2C+and+clean+up+failed+workers.\u0026amp;theme=b88efaa132919559f01989e9\u0026amp;signature=13427790c38dfb6cd2c364181bd21e75f8827b0545f0900abcd240970470051b\">\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/llcfzecyberfinity/SHqOt5EXHexpipeW/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Surfsky\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#111111\">\u003cmeta data-mint-head name=\"google-site-verification\" content=\"J4sdCp8jl5MCOHehI0AOmiPBlLduJLMGQrT4pTNwvU4\">\u003cmeta data-mint-head name=\"msvalidate.01\" content=\"C003BE57DE9AE70B5829DB3858FF8609\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.surfsky.io/concurrency\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/concurrency.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.surfsky.io/#organization\",\"name\":\"Surfsky\",\"url\":\"https://docs.surfsky.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/llcfzecyberfinity/sOzW2rg1MprciyvQ/images/logo-light.svg?fit=max\u0026auto=format\u0026n=sOzW2rg1MprciyvQ\u0026q=85\u0026s=c6cc1d7d380cb1803815c2369dc6f6c2\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.surfsky.io#website\",\"name\":\"Surfsky\",\"url\":\"https://docs.surfsky.io\",\"publisher\":{\"@id\":\"https://docs.surfsky.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.surfsky.io/concurrency#webpage\",\"url\":\"https://docs.surfsky.io/concurrency\",\"name\":\"Concurrency\",\"description\":\"Run browser jobs in parallel, manage shared account limits, and clean up failed workers.\",\"dateModified\":\"2026-09-22T12:11:56.830Z\",\"isPartOf\":{\"@id\":\"https://docs.surfsky.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.surfsky.io/concurrency#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.surfsky.io/concurrency#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Performance and limits\",\"item\":\"https://docs.surfsky.io/speed-optimization\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Concurrency\",\"item\":\"https://docs.surfsky.io/concurrency\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.surfsky.io/concurrency#article\",\"headline\":\"Concurrency\",\"name\":\"Concurrency\",\"description\":\"Run browser jobs in parallel, manage shared account limits, and clean up failed workers.\",\"url\":\"https://docs.surfsky.io/concurrency\",\"mainEntityOfPage\":{\"@id\":\"https://docs.surfsky.io/concurrency#webpage\"},\"dateModified\":\"2026-09-22T12:11:56.830Z\",\"publisher\":{\"@id\":\"https://docs.surfsky.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.surfsky.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Surfsky\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Surfsky","nav":{"global":null,"tabs":[{"tab":"Documentation","groups":[{"group":"Get started","pages":[{"title":"Intro","href":""},{"title":"Quickstart","href":"/quickstart"},{"title":"Coding agents","href":"/coding-agents"},{"title":"How it works","href":"/intro-to-surfsky"}]},{"group":"Connect your tools","pages":[{"title":"Playwright","href":"/quickstart/playwright"},{"title":"Puppeteer","href":"/quickstart/puppeteer"},{"title":"Selenium","href":"/quickstart/selenium"},{"title":"Chromedp","href":"/quickstart/chromedp"},{"title":"Scrapy","href":"/quickstart/scrapy"},{"title":"Scraping API","href":"/quickstart/scraping_api"}]},{"group":"Browser sessions","pages":[{"title":"Sessions","href":"/sessions"},{"title":"Cookies","href":"/cookies"},{"title":"Fingerprints","href":"/fingerprints"},{"title":"Proxies","href":"/proxies"},{"title":"Extensions","href":"/extensions"}]},{"group":"Browser actions","pages":[{"title":"Human emulation","href":"/human_emulation"},{"title":"Human behavior","href":"/human-behavior"}]},{"group":"CAPTCHA guides","pages":[{"title":"CAPTCHA guides","href":"/category/use-cases"},{"title":"CAPTCHA solving","sidebarTitle":"Setup and usage","href":"/captcha-solving"},{"title":"Datadome Bypass - Automatic Captcha Solver","sidebarTitle":"DataDome","href":"/use-cases/datadome"},{"title":"Cloudflare Turnstile Bypass - Automatic Captcha Solver","sidebarTitle":"Turnstile","href":"/use-cases/turnstile"},{"title":"reCAPTCHA Bypass - Automatic v2, v3 \u0026 Enterprise Solver","sidebarTitle":"reCAPTCHA","href":"/use-cases/recaptcha"},{"title":"PerimeterX Bypass - HUMAN Security Captcha Solver","sidebarTitle":"PerimeterX","href":"/use-cases/perimeterx"},{"title":"GeeTest Captcha Bypass - Automatic Solver","sidebarTitle":"GeeTest","href":"/use-cases/geetest"},{"title":"AWS WAF Captcha Bypass - Automatic Solver","sidebarTitle":"AWS WAF","href":"/use-cases/aws-waf"},{"title":"FunCaptcha Bypass - Arkose Labs Solver","sidebarTitle":"FunCaptcha","href":"/use-cases/funcaptcha"},{"title":"BLS Captcha Bypass - Automatic Visa Portal Solver","sidebarTitle":"BLS","href":"/use-cases/bls"},{"title":"Click CAPTCHA","href":"/use-cases/click"},{"title":"Image CAPTCHA","href":"/use-cases/image"}]},{"group":"Debugging","pages":[{"title":"Troubleshooting","href":"/troubleshooting"},{"title":"Debugging","href":"/debugging"},{"title":"Screencast","href":"/screencast"}]},{"group":"Performance and limits","pages":[{"title":"Speed optimization","description":"Measure browser startup, page loading, and automation time before tuning throughput.","href":"/speed-optimization"},{"title":"Concurrency","href":"/concurrency"},{"title":"Shared cache","description":"Reuse cached browser resources across sessions that visit the same sites.","href":"/shared-cache"},{"title":"Limits","href":"/limits"}]},{"group":"About Surfsky","pages":[{"title":"Why Surfsky","href":"/why-surfsky"}]}]},{"tab":"SDKs","pages":[{"title":"SDKs","href":"/sdk"}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/api-reference"}]}]},"basePath":"","title":"Concurrency - Surfsky","buildId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","deploymentId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","dynamics":[],"chunks":[]}