Developer docs
Cloudbrowse API
Submit browser crawl jobs, control retry behavior, choose direct or residential proxy egress, and fetch artifacts from stable result links.
Authentication
Send your API key as a bearer token on every API request.
Authorization: Bearer <api-key>
API keys
Use the dashboard to sign in, generate a client key, copy it once, and revoke it when needed.
GET /v1/api-keys
POST /v1/api-keys
DELETE /v1/api-keys/:id
Create a crawl
Create a crawl job with a target URL, mode, outputs, proxy policy, and retry strategy.
POST /v1/crawl
Content-Type: application/json
{
"url": "https://example.com",
"mode": "browser-cdp",
"referer": "https://example.com/",
"outputs": ["metadata", "html", "text", "screenshot"],
"proxy": { "pool": "direct" },
"strategy": {
"maxAttempts": 2,
"retryOnBlock": true,
"retryOnTimeout": true,
"proxyRotation": "rotate_on_retry",
"adaptiveProfile": true
}
}
Eligible anonymous public Indeed job-search and G2 product-review crawls may use a managed hard-target provider. This route supports only metadata, HTML, and text with no custom identity, actions, or persisted session. Results must pass target-aware job/review content checks; HTTP 200 alone is not considered success.
Proxy controls
No proxy
{ "proxy": { "pool": "direct" } }
Residential proxy
{ "proxy": { "pool": "residential", "country": "AUTO", "sessionId": "user-42" } }
Use AUTO when any residential country is acceptable. Use an ISO country code when country-tagged inventory is available.
The same sessionId pins the same residential exit IP for the provider's sticky window, so repeated requests in a session keep one IP.
Sessions
A persistent session routes later jobs to the same warm headful Chromium profile and keeps its fingerprint, cookies, localStorage, cache, and residential exit IP together. Cookies and storage are checkpointed to R2 for container restarts.
{
"url": "https://example.com/account",
"proxy": { "pool": "residential", "sessionId": "customer-1" },
"session": { "id": "customer-1", "persist": true },
"strategy": { "proxyRotation": "sticky" }
}
session.persist: reuse the live browser profile and checkpoint cookies + storage after every completed attempt, including block pages.- The jar is keyed by
session.id(falling back toproxy.sessionId); a residential crawl with asession.idpins its IP to that id automatically. - Persisted sessions default to
proxyRotation: "sticky"when strategy is omitted and keep one stable browser fingerprint. - Containers wind down automatically after five idle minutes; R2 restores cookies and local storage when a fresh container starts.
Import a verified state
PUT /v1/sessions/customer-1
Content-Type: application/json
{
"ttlSeconds": 86400,
"storageState": { "cookies": [], "origins": [] }
}
GET /v1/sessions/customer-1
DELETE /v1/sessions/customer-1
Outputs
metadata: final URL, status code, title, timings, block signal.html: rendered document HTML.text: visible page text.screenshot: PNG screenshot.pdf: PDF rendering where supported.network: request and response metadata.
Job polling
GET /v1/jobs/:id
GET /v1/jobs/:id/result
GET /v1/jobs/:id/artifacts/html
Attempt records disclose the selected backend, browser engine and transport, block signals, semantic quality metrics, and managed-provider request cost when applicable.
"browserRuntime": {
"engine": "cloakbrowser",
"transport": "cdp",
"fallback": false
}
Errors
Errors use a consistent shape with a machine-readable code and a developer-readable message.
{
"error": {
"code": "invalid_request",
"message": "url must be a valid http or https URL"
}
}