{"openapi":"3.1.0","info":{"title":"BrowserSolver API Reference","description":"Complete API reference documentation.","version":"1.0.0"},"servers":[{"url":"https://api.browsersolver.com","description":"API Server"}],"paths":{"/v1/stats":{"get":{"summary":"Stats","description":"Infrastructure health for an engine or endpoint over the last hour. Not scoped to your account or tenant. Enabled per account: HTTP 403 means contact support to activate it.","operationId":"stats","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"engine","in":"query","required":false,"description":"API family to check, for example `website`. Provide at least `engine` or `path`.","schema":{"type":"string","description":"API family to check, for example `website`. Provide at least `engine` or `path`."}},{"name":"path","in":"query","required":false,"description":"Specific endpoint to check, for example `/v1/website/screenshot`. If you also pass `engine`, use an endpoint from that API.","schema":{"type":"string","description":"Specific endpoint to check, for example `/v1/website/screenshot`. If you also pass `engine`, use an endpoint from that API."}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"path":{"nullable":true},"engine":{"type":"string"},"health":{"type":"string"},"window":{"type":"string"},"success_rate":{"type":"number"},"avg_response_time_ms":{"type":"integer"}}},"examples":{"Engine health snapshot":{"value":{"path":null,"engine":"website","health":"operational","window":"1h","success_rate":99.412,"avg_response_time_ms":840}},"Path health snapshot":{"value":{"path":"/v1/website/screenshot","engine":"website","health":"operational","window":"1h","success_rate":99.412,"avg_response_time_ms":840}}}}}},"400":{"description":"Bad Request — missing or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad Request"}}}},"401":{"description":"Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidKey":{"value":{"error":"Invalid API Key"}},"planRateLimit":{"value":{"error":"Rate limit exceeded: You've exceeded the per second rate limit on your subscription"}},"keyQuota":{"value":{"error":"Rate limit exceeded for the API key: quota monthly"}}}}}},"402":{"description":"Payment Required — your subscription or credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Payment required"}}}},"500":{"description":"Internal Server Error — something went wrong on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal Error"}}}}}}},"/v1/website/webunlocker":{"get":{"summary":"Website WebUnlocker","description":"BrowserSolver's highest HTML fetch tier for retail and marketplace hosts on your account whitelist. Solves persistent bot challenges that still block Rendering.\n\n**Credit cost:** 3 credits per call","operationId":"get-website-webunlocker","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"query","in":"query","required":true,"description":"Public URL to fetch with the WebUnlocker tier. Include `http://` or `https://`. The hostname must be on your BrowserSolver whitelist.\n\n**Example:**\n\n    https://www.decathlon.fr/p/perceuse-sans-fil/_/R-p-8781921\n\n**Pick a tier:**\n- Try [Website Crawler](/v1/website/crawler) and [Website Rendering](/v1/website/rendering) first when possible.\n- Use WebUnlocker (this endpoint) for advanced bot walls on approved domains only.\n- Request whitelist access from BrowserSolver support before production.\n\nGuide: [fetch tier comparison](https://www.browsersolver.com/blog/website-crawler-vs-rendering-vs-webunlocker).","schema":{"type":"string","description":"Public URL to fetch with the WebUnlocker tier. Include `http://` or `https://`. The hostname must be on your BrowserSolver whitelist.\n\n**Example:**\n\n    https://www.decathlon.fr/p/perceuse-sans-fil/_/R-p-8781921\n\n**Pick a tier:**\n- Try [Website Crawler](/v1/website/crawler) and [Website Rendering](/v1/website/rendering) first when possible.\n- Use WebUnlocker (this endpoint) for advanced bot walls on approved domains only.\n- Request whitelist access from BrowserSolver support before production.\n\nGuide: [fetch tier comparison](https://www.browsersolver.com/blog/website-crawler-vs-rendering-vs-webunlocker)."}},{"name":"allow_redirects","in":"query","required":false,"description":"Whether the unlock session should chase HTTP redirects.\n\n- `true`: follow redirects (**default**)\n- `false`: keep the first response after unlock\n\n**Tip:** use `false` to inspect intermediate locations in a redirect chain.","schema":{"type":"boolean","description":"Whether the unlock session should chase HTTP redirects.\n\n- `true`: follow redirects (**default**)\n- `false`: keep the first response after unlock\n\n**Tip:** use `false` to inspect intermediate locations in a redirect chain.","default":true}},{"name":"return_page_source","in":"query","required":false,"description":"Choose between processed markup and the exact post-unlock source.\n\n- `false`: return processed HTML (**default**)\n- `true`: return the unmodified HTML delivered after bypass\n\n**Tip:** useful when your parser must match the origin bytes exactly.","schema":{"type":"boolean","description":"Choose between processed markup and the exact post-unlock source.\n\n- `false`: return processed HTML (**default**)\n- `true`: return the unmodified HTML delivered after bypass\n\n**Tip:** useful when your parser must match the origin bytes exactly.","default":false}},{"$ref":"#/components/parameters/fields"},{"$ref":"#/components/parameters/is_async"},{"$ref":"#/components/parameters/soft_fail"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"string"},"examples":{"Whitelisted DIY catalog page":{"value":"<!DOCTYPE html><html lang=\"fr\"><head><meta charset=\"utf-8\"><title>Perceuse sans fil 18V | Decathlon</title><link rel=\"stylesheet\" href=\"/static/pdp.css\"></head><body data-store=\"fr\"><header class=\"site-nav\"><a href=\"/\">Decathlon</a></header><section class=\"pdp\" data-sku=\"8781921\"><h1>Perceuse sans fil 18V</h1><p class=\"price\" data-currency=\"EUR\">89,99</p><ul class=\"specs\"><li>Batterie 2.0 Ah</li><li>Mandrin 13 mm</li></ul><button class=\"add-to-cart\">Ajouter au panier</button></section></body></html>"}}}}},"400":{"description":"Bad Request — missing or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad Request"}}}},"401":{"description":"Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidKey":{"value":{"error":"Invalid API Key"}},"planRateLimit":{"value":{"error":"Rate limit exceeded: You've exceeded the per second rate limit on your subscription"}},"keyQuota":{"value":{"error":"Rate limit exceeded for the API key: quota monthly"}}}}}},"402":{"description":"Payment Required — your subscription or credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Payment required"}}}},"500":{"description":"Internal Server Error — something went wrong on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal Error"}}}}}},"post":{"summary":"Website WebUnlocker (POST)","description":"Call approved JSON APIs with POST through BrowserSolver unlock sessions when a normal Crawler POST is rejected by bot management.\n\n**Credit cost:** 3 credits per call","operationId":"post-website-webunlocker","security":[{"ApiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/fields"},{"$ref":"#/components/parameters/is_async"},{"$ref":"#/components/parameters/soft_fail"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","description":"Approved upstream URL (HTML page or JSON API) that BrowserSolver will call with POST. Include `http://` or `https://`. Hostname must already be whitelisted.\n\n**Example:**\n\n    https://www.kleinanzeigen.de/s-api/search\n\n**Payload pattern:**\n- Preferred: `query` in the query string, JSON body forwarded upstream.\n- Or wrap both: `{ \"query\": \"...\", \"json\": { ... } }`.\n- Plain GET HTML: use [Website WebUnlocker](/v1/website/webunlocker) instead.\n\nAsk BrowserSolver support to approve new hostnames before production.\n\nGuide: [fetch tier comparison](https://www.browsersolver.com/blog/website-crawler-vs-rendering-vs-webunlocker)."}},"required":["query"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"ref":{"type":"string"},"link":{"type":"string"},"label":{"type":"string"},"stock":{"type":"integer"},"warehouse":{"type":"string"},"list_price":{"type":"integer"}}}},"cursor":{"type":"object","properties":{"next":{"type":"string"},"count":{"type":"integer"}}}}},"examples":{"POST inventory API after unlock":{"value":{"data":[{"ref":"INV-44019","link":"https://catalog.example.org/items/INV-44019","label":"Office desk oak","stock":12,"warehouse":"LYS-02","list_price":459}],"cursor":{"next":"eyJwYWdlIjoyfQ==","count":86}}}}}}},"400":{"description":"Bad Request — missing or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad Request"}}}},"401":{"description":"Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidKey":{"value":{"error":"Invalid API Key"}},"planRateLimit":{"value":{"error":"Rate limit exceeded: You've exceeded the per second rate limit on your subscription"}},"keyQuota":{"value":{"error":"Rate limit exceeded for the API key: quota monthly"}}}}}},"402":{"description":"Payment Required — your subscription or credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Payment required"}}}},"500":{"description":"Internal Server Error — something went wrong on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal Error"}}}}}}},"/v1/website/technology":{"get":{"summary":"Website Technology","description":"Map CMS, frameworks, analytics, CDN, and security tooling exposed by a public URL. Choose simple lists or expert metadata with confidence scores.\n\n**Credit cost:** 1 credit per call","operationId":"get-website-technology","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"query","in":"query","required":true,"description":"Public URL to fingerprint for CMS, frameworks, analytics, CDN, and security tooling. Include `http://` or `https://`.\n\n**Example:**\n\n    https://www.shopify.com/\n\n**Notes:**\n- Typical latency is 10 to 15 seconds.\n- Use `mode=simple` for dashboards; `mode=expert` (default) for confidence scores and versions.\n- Pair with [Website Antibot](/v1/website/antibot) to learn which bot vendor protects the same host.","schema":{"type":"string","description":"Public URL to fingerprint for CMS, frameworks, analytics, CDN, and security tooling. Include `http://` or `https://`.\n\n**Example:**\n\n    https://www.shopify.com/\n\n**Notes:**\n- Typical latency is 10 to 15 seconds.\n- Use `mode=simple` for dashboards; `mode=expert` (default) for confidence scores and versions.\n- Pair with [Website Antibot](/v1/website/antibot) to learn which bot vendor protects the same host."}},{"name":"mode","in":"query","required":false,"description":"How much detail to include in the stack report.\n\n- `expert`: full objects with confidence, versions, CPE, categories, and descriptions (**default**)\n- `simple`: CMS name, URL statuses, and a flat list of technology names\n\n**Notes:**\n- Pick `simple` for lightweight dashboards.\n- Pick `expert` when you need scores, categories, or version strings.","schema":{"type":"string","default":"expert","description":"How much detail to include in the stack report.\n\n- `expert`: full objects with confidence, versions, CPE, categories, and descriptions (**default**)\n- `simple`: CMS name, URL statuses, and a flat list of technology names\n\n**Notes:**\n- Pick `simple` for lightweight dashboards.\n- Pick `expert` when you need scores, categories, or version strings."}},{"$ref":"#/components/parameters/fields"},{"$ref":"#/components/parameters/is_async"},{"$ref":"#/components/parameters/soft_fail"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"cms":{"nullable":true},"urls":{"type":"object","properties":{"https://vercel.com/":{"type":"object","properties":{"status":{"type":"integer"}}}}},"technologies":{"type":"array","items":{"type":"string"}}}},"examples":{"Simple mode: vercel.com":{"value":{"cms":null,"urls":{"https://vercel.com/":{"status":200}},"technologies":["Next.js","React","Vercel","Google Analytics","Intercom","HSTS","HTTP/3"]}},"Expert mode: digitalocean.com":{"value":{"urls":{"https://digitalocean.com/":{"status":301},"https://www.digitalocean.com/":{"status":200}},"technologies":[{"cpe":null,"icon":"Nginx.svg","name":"Nginx","slug":"nginx","version":null,"website":"https://nginx.org","rootPath":true,"categories":[{"id":22,"name":"Web servers","slug":"web-servers"}],"confidence":100,"description":"Nginx is a high-performance HTTP server and reverse proxy."},{"cpe":null,"icon":"Segment.svg","name":"Segment","slug":"segment","version":null,"website":"https://segment.com","rootPath":false,"categories":[{"id":10,"name":"Analytics","slug":"analytics"}],"confidence":90,"description":"Segment collects customer data and routes it to analytics tools."},{"cpe":null,"icon":"JQuery.svg","name":"jQuery","slug":"jquery","version":"3.7.1","website":"https://jquery.com","rootPath":false,"categories":[{"id":12,"name":"JavaScript libraries","slug":"javascript-libraries"}],"confidence":100,"description":"jQuery is a fast, small JavaScript library."}]}},"Simple mode: linear.app":{"value":{"cms":null,"urls":{"https://linear.app/":{"status":200}},"technologies":["React","Next.js","Emotion","Google Tag Manager","Cloudflare","HSTS"]}}}}}},"400":{"description":"Bad Request — missing or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad Request"}}}},"401":{"description":"Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidKey":{"value":{"error":"Invalid API Key"}},"planRateLimit":{"value":{"error":"Rate limit exceeded: You've exceeded the per second rate limit on your subscription"}},"keyQuota":{"value":{"error":"Rate limit exceeded for the API key: quota monthly"}}}}}},"402":{"description":"Payment Required — your subscription or credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Payment required"}}}},"500":{"description":"Internal Server Error — something went wrong on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal Error"}}}}}},"post":{"summary":"Website Technology","description":"Map CMS, frameworks, analytics, CDN, and security tooling exposed by a public URL. Choose simple lists or expert metadata with confidence scores.\n\n**Credit cost:** 1 credit per call","operationId":"post-website-technology","security":[{"ApiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/fields"},{"$ref":"#/components/parameters/is_async"},{"$ref":"#/components/parameters/soft_fail"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","description":"Public URL to fingerprint for CMS, frameworks, analytics, CDN, and security tooling. Include `http://` or `https://`.\n\n**Example:**\n\n    https://www.shopify.com/\n\n**Notes:**\n- Typical latency is 10 to 15 seconds.\n- Use `mode=simple` for dashboards; `mode=expert` (default) for confidence scores and versions.\n- Pair with [Website Antibot](/v1/website/antibot) to learn which bot vendor protects the same host."},"mode":{"type":"string","default":"expert","description":"How much detail to include in the stack report.\n\n- `expert`: full objects with confidence, versions, CPE, categories, and descriptions (**default**)\n- `simple`: CMS name, URL statuses, and a flat list of technology names\n\n**Notes:**\n- Pick `simple` for lightweight dashboards.\n- Pick `expert` when you need scores, categories, or version strings."}},"required":["query"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"cms":{"nullable":true},"urls":{"type":"object","properties":{"https://vercel.com/":{"type":"object","properties":{"status":{"type":"integer"}}}}},"technologies":{"type":"array","items":{"type":"string"}}}},"examples":{"Simple mode: vercel.com":{"value":{"cms":null,"urls":{"https://vercel.com/":{"status":200}},"technologies":["Next.js","React","Vercel","Google Analytics","Intercom","HSTS","HTTP/3"]}},"Expert mode: digitalocean.com":{"value":{"urls":{"https://digitalocean.com/":{"status":301},"https://www.digitalocean.com/":{"status":200}},"technologies":[{"cpe":null,"icon":"Nginx.svg","name":"Nginx","slug":"nginx","version":null,"website":"https://nginx.org","rootPath":true,"categories":[{"id":22,"name":"Web servers","slug":"web-servers"}],"confidence":100,"description":"Nginx is a high-performance HTTP server and reverse proxy."},{"cpe":null,"icon":"Segment.svg","name":"Segment","slug":"segment","version":null,"website":"https://segment.com","rootPath":false,"categories":[{"id":10,"name":"Analytics","slug":"analytics"}],"confidence":90,"description":"Segment collects customer data and routes it to analytics tools."},{"cpe":null,"icon":"JQuery.svg","name":"jQuery","slug":"jquery","version":"3.7.1","website":"https://jquery.com","rootPath":false,"categories":[{"id":12,"name":"JavaScript libraries","slug":"javascript-libraries"}],"confidence":100,"description":"jQuery is a fast, small JavaScript library."}]}},"Simple mode: linear.app":{"value":{"cms":null,"urls":{"https://linear.app/":{"status":200}},"technologies":["React","Next.js","Emotion","Google Tag Manager","Cloudflare","HSTS"]}}}}}},"400":{"description":"Bad Request — missing or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad Request"}}}},"401":{"description":"Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidKey":{"value":{"error":"Invalid API Key"}},"planRateLimit":{"value":{"error":"Rate limit exceeded: You've exceeded the per second rate limit on your subscription"}},"keyQuota":{"value":{"error":"Rate limit exceeded for the API key: quota monthly"}}}}}},"402":{"description":"Payment Required — your subscription or credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Payment required"}}}},"500":{"description":"Internal Server Error — something went wrong on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal Error"}}}}}}},"/v1/website/screenshot":{"get":{"summary":"Website Screenshot","description":"Turn any public URL into a PNG, JPEG, WebP, or PDF asset rendered by BrowserSolver. No local Chromium fleet to operate.\n\n**Credit cost:** 2 credits per call","operationId":"get-website-screenshot","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"Page address to render into an image or PDF. Must include a protocol.\n\nSample targets:\n```\nhttps://www.amazon.com/s?k=pokemon\n```\n\n```\nhttps://www.cdiscount.com/sante-mieux-vivre/materiel-medical/soin-domicile/l-1650608.html\n```\n\n```\nhttps://github.com/seaweedfs/seaweedfs\n```","schema":{"type":"string","description":"Page address to render into an image or PDF. Must include a protocol.\n\nSample targets:\n```\nhttps://www.amazon.com/s?k=pokemon\n```\n\n```\nhttps://www.cdiscount.com/sante-mieux-vivre/materiel-medical/soin-domicile/l-1650608.html\n```\n\n```\nhttps://github.com/seaweedfs/seaweedfs\n```"}},{"name":"format","in":"query","required":false,"description":"File type returned in the response body.\n\nChoose one of:\n\n- `webp`\n- `jpeg`\n```\njpg\n```\n\n```\npng\n```\n\n```\npdf\n```","schema":{"type":"string","enum":["jpeg","jpg","pdf","png","webp"],"default":"png","description":"File type returned in the response body.\n\nChoose one of:\n\n- `webp`\n- `jpeg`\n```\njpg\n```\n\n```\npng\n```\n\n```\npdf\n```"}},{"name":"device","in":"query","required":false,"description":"Swap the desktop viewport for a preset handset or tablet fingerprint.\n\nPresets:\n\n- `iphone_14_pro_max`\n- `iphone_14_pro`\n- `iphone_13_pro_max`\n- `iphone_13_mini`\n- `iphone_12`\n- `iphone_x`\n- `ipad`\n- `galaxy_s23_ultra`\n- `galaxy_s23`\n- `galaxy_s8`\n- `galaxy_fold4`\n- `pixel_7_pro`\n- `pixel_6a`\n- `pixel_5`\n- `redmi_note_12_pro`\n```\nredmi_note_11\n```\n\n```\nhuawei_p60_pro\n```\n\n```\nhuawei_mate_50_pro\n```","schema":{"type":"string","enum":["galaxy_fold4","galaxy_s23","galaxy_s23_ultra","galaxy_s8","huawei_mate_50_pro","huawei_p60_pro","ipad","iphone_12","iphone_13_mini","iphone_13_pro_max","iphone_14_pro","iphone_14_pro_max","iphone_x","pixel_5","pixel_6a","pixel_7_pro","redmi_note_11","redmi_note_12_pro"],"description":"Swap the desktop viewport for a preset handset or tablet fingerprint.\n\nPresets:\n\n- `iphone_14_pro_max`\n- `iphone_14_pro`\n- `iphone_13_pro_max`\n- `iphone_13_mini`\n- `iphone_12`\n- `iphone_x`\n- `ipad`\n- `galaxy_s23_ultra`\n- `galaxy_s23`\n- `galaxy_s8`\n- `galaxy_fold4`\n- `pixel_7_pro`\n- `pixel_6a`\n- `pixel_5`\n- `redmi_note_12_pro`\n```\nredmi_note_11\n```\n\n```\nhuawei_p60_pro\n```\n\n```\nhuawei_mate_50_pro\n```"}},{"name":"full_page","in":"query","required":false,"description":"Extend the capture beyond the viewport so the entire scrollable document is included.","schema":{"type":"boolean","description":"Extend the capture beyond the viewport so the entire scrollable document is included.","default":false}},{"name":"full_page_scroll","in":"query","required":false,"description":"Drive a scroll pass first so deferred content mounts before a tall capture.","schema":{"type":"boolean","description":"Drive a scroll pass first so deferred content mounts before a tall capture.","default":false}},{"name":"full_page_scroll_duration","in":"query","required":false,"description":"Milliseconds spent scrolling prior to a full-height capture.","schema":{"type":"number","default":"400","description":"Milliseconds spent scrolling prior to a full-height capture."}},{"name":"viewport_width","in":"query","required":false,"description":"Width of the synthetic desktop window, in pixels.","schema":{"type":"number","default":"1280","description":"Width of the synthetic desktop window, in pixels."}},{"name":"viewport_height","in":"query","required":false,"description":"Height of the synthetic desktop window, in pixels.","schema":{"type":"number","default":"1024","description":"Height of the synthetic desktop window, in pixels."}},{"name":"scale_factor","in":"query","required":false,"description":"Pixel density multiplier. Raise it for retina-quality output; files grow accordingly.","schema":{"type":"number","default":"1","description":"Pixel density multiplier. Raise it for retina-quality output; files grow accordingly."}},{"name":"image_quality","in":"query","required":false,"description":"Lossy compression level for soft formats.\n\nApplies when format is:\n\n```\njpeg\n```\n\n```\nwebp\n```","schema":{"type":"string","default":"80","description":"Lossy compression level for soft formats.\n\nApplies when format is:\n\n```\njpeg\n```\n\n```\nwebp\n```"}},{"name":"selector","in":"query","required":false,"description":"Limit the shot to one DOM node matched by this CSS selector.","schema":{"type":"string","description":"Limit the shot to one DOM node matched by this CSS selector."}},{"name":"cache","in":"query","required":false,"description":"Serve a stored capture on repeat requests when caching is enabled.","schema":{"type":"boolean","description":"Serve a stored capture on repeat requests when caching is enabled.","default":false}},{"name":"cache_ttl","in":"query","required":false,"description":"Lifetime of cached captures in seconds.","schema":{"type":"number","minimum":3600,"maximum":2592000,"default":"2592000","description":"Lifetime of cached captures in seconds."}},{"name":"remove_selectors","in":"query","required":false,"description":"Hide matching CSS selectors (modals, promo bars, etc.) before shooting.","schema":{"type":"string","description":"Hide matching CSS selectors (modals, promo bars, etc.) before shooting."}},{"name":"remove_cookie_banners","in":"query","required":false,"description":"Best-effort removal of cookie consent layers before capture.","schema":{"type":"boolean","description":"Best-effort removal of cookie consent layers before capture.","default":false}},{"name":"remove_ads","in":"query","required":false,"description":"Best-effort stripping of ad slots before capture.","schema":{"type":"boolean","description":"Best-effort stripping of ad slots before capture.","default":false}},{"name":"block_resources","in":"query","required":false,"description":"Resource kinds to discard during load, as a comma list (example: `image,stylesheet,font`).\n\nKinds:\n\n- `document`\n- `stylesheet`\n- `image`\n- `media`\n- `font`\n- `script`\n- `texttrack`\n- `xhr`\n- `fetch`\n- `eventsource`\n- `websocket`\n- `manifest`\n- `other`\nHelps shorten load time on media-heavy pages.","schema":{"type":"string","enum":["document","eventsource","fetch","font","image","manifest","media","other","script","stylesheet","texttrack","websocket","xhr"],"description":"Resource kinds to discard during load, as a comma list (example: `image,stylesheet,font`).\n\nKinds:\n\n- `document`\n- `stylesheet`\n- `image`\n- `media`\n- `font`\n- `script`\n- `texttrack`\n- `xhr`\n- `fetch`\n- `eventsource`\n- `websocket`\n- `manifest`\n- `other`\nHelps shorten load time on media-heavy pages."}},{"name":"block_urls","in":"query","required":false,"description":"Substring patterns that should never be fetched (example: `analytics,tracking,advertisement`). Hosts, paths, or fragments such as `.example.com/` work.","schema":{"type":"string","description":"Substring patterns that should never be fetched (example: `analytics,tracking,advertisement`). Hosts, paths, or fragments such as `.example.com/` work."}},{"name":"delay","in":"query","required":false,"description":"Additional settle time in seconds after the readiness event.","schema":{"type":"number","minimum":0,"maximum":10,"default":"0","description":"Additional settle time in seconds after the readiness event."}},{"name":"wait_until","in":"query","required":false,"description":"Which browser lifecycle event marks the page ready.\n\nValues:\n\n- `networkidle2`\n- `load`\n- `domcontentloaded`\n- `networkidle0`","schema":{"type":"array","items":{"type":"string"},"enum":["domcontentloaded","load","networkidle0","networkidle2"],"description":"Which browser lifecycle event marks the page ready.\n\nValues:\n\n- `networkidle2`\n- `load`\n- `domcontentloaded`\n- `networkidle0`"}},{"name":"wait_for_selector","in":"query","required":false,"description":"Hold capture until this CSS node is present.","schema":{"type":"string","description":"Hold capture until this CSS node is present."}},{"name":"proxy","in":"query","required":false,"description":"Route the browser through an intermediate proxy.\n\nProtocols: `HTTP`, `HTTPS`, `SOCKS5`.\n\nShape: `http://username:password@proxy.com:PORT`.\n\nHandy for region-specific views or IP rotation.","schema":{"type":"string","description":"Route the browser through an intermediate proxy.\n\nProtocols: `HTTP`, `HTTPS`, `SOCKS5`.\n\nShape: `http://username:password@proxy.com:PORT`.\n\nHandy for region-specific views or IP rotation."}},{"name":"s3_secret_key","in":"query","required":false,"description":"Secret key used to authenticate uploads.","schema":{"type":"string","description":"Secret key used to authenticate uploads."}},{"name":"s3_access_key_id","in":"query","required":false,"description":"Access key used to authenticate uploads.","schema":{"type":"string","description":"Access key used to authenticate uploads."}},{"name":"s3_bucket","in":"query","required":false,"description":"Destination bucket for the binary asset.","schema":{"type":"string","description":"Destination bucket for the binary asset."}},{"name":"s3_object_key","in":"query","required":false,"description":"Key under which the object is stored (generated automatically if blank).","schema":{"type":"string","description":"Key under which the object is stored (generated automatically if blank)."}},{"name":"s3_region","in":"query","required":false,"description":"Cloud region of the bucket.","schema":{"type":"string","description":"Cloud region of the bucket."}},{"name":"storage_endpoint","in":"query","required":false,"description":"Override the default AWS endpoint for S3-compatible backends. Leave blank for AWS. R2 example: `https://<accountId>.r2.cloudflarestorage.com`.","schema":{"type":"string","description":"Override the default AWS endpoint for S3-compatible backends. Leave blank for AWS. R2 example: `https://<accountId>.r2.cloudflarestorage.com`."}},{"name":"s3_url","in":"query","required":false,"description":"Upload the binary and include the public object URL in the API response.","schema":{"type":"boolean","description":"Upload the binary and include the public object URL in the API response.","default":false}},{"$ref":"#/components/parameters/fields"},{"$ref":"#/components/parameters/is_async"},{"$ref":"#/components/parameters/soft_fail"}],"responses":{"200":{"description":"Successful response","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}},"application/pdf":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Bad Request — missing or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad Request"}}}},"401":{"description":"Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidKey":{"value":{"error":"Invalid API Key"}},"planRateLimit":{"value":{"error":"Rate limit exceeded: You've exceeded the per second rate limit on your subscription"}},"keyQuota":{"value":{"error":"Rate limit exceeded for the API key: quota monthly"}}}}}},"402":{"description":"Payment Required — your subscription or credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Payment required"}}}},"500":{"description":"Internal Server Error — something went wrong on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal Error"}}}}}},"post":{"summary":"Website Screenshot","description":"Turn any public URL into a PNG, JPEG, WebP, or PDF asset rendered by BrowserSolver. No local Chromium fleet to operate.\n\n**Credit cost:** 2 credits per call","operationId":"post-website-screenshot","security":[{"ApiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/fields"},{"$ref":"#/components/parameters/is_async"},{"$ref":"#/components/parameters/soft_fail"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Page address to render into an image or PDF. Must include a protocol.\n\nSample targets:\n```\nhttps://www.amazon.com/s?k=pokemon\n```\n\n```\nhttps://www.cdiscount.com/sante-mieux-vivre/materiel-medical/soin-domicile/l-1650608.html\n```\n\n```\nhttps://github.com/seaweedfs/seaweedfs\n```"},"format":{"type":"string","enum":["jpeg","jpg","pdf","png","webp"],"default":"png","description":"File type returned in the response body.\n\nChoose one of:\n\n- `webp`\n- `jpeg`\n```\njpg\n```\n\n```\npng\n```\n\n```\npdf\n```"},"device":{"type":"string","enum":["galaxy_fold4","galaxy_s23","galaxy_s23_ultra","galaxy_s8","huawei_mate_50_pro","huawei_p60_pro","ipad","iphone_12","iphone_13_mini","iphone_13_pro_max","iphone_14_pro","iphone_14_pro_max","iphone_x","pixel_5","pixel_6a","pixel_7_pro","redmi_note_11","redmi_note_12_pro"],"description":"Swap the desktop viewport for a preset handset or tablet fingerprint.\n\nPresets:\n\n- `iphone_14_pro_max`\n- `iphone_14_pro`\n- `iphone_13_pro_max`\n- `iphone_13_mini`\n- `iphone_12`\n- `iphone_x`\n- `ipad`\n- `galaxy_s23_ultra`\n- `galaxy_s23`\n- `galaxy_s8`\n- `galaxy_fold4`\n- `pixel_7_pro`\n- `pixel_6a`\n- `pixel_5`\n- `redmi_note_12_pro`\n```\nredmi_note_11\n```\n\n```\nhuawei_p60_pro\n```\n\n```\nhuawei_mate_50_pro\n```"},"full_page":{"type":"boolean","description":"Extend the capture beyond the viewport so the entire scrollable document is included.","default":false},"full_page_scroll":{"type":"boolean","description":"Drive a scroll pass first so deferred content mounts before a tall capture.","default":false},"full_page_scroll_duration":{"type":"number","default":"400","description":"Milliseconds spent scrolling prior to a full-height capture."},"viewport_width":{"type":"number","default":"1280","description":"Width of the synthetic desktop window, in pixels."},"viewport_height":{"type":"number","default":"1024","description":"Height of the synthetic desktop window, in pixels."},"scale_factor":{"type":"number","default":"1","description":"Pixel density multiplier. Raise it for retina-quality output; files grow accordingly."},"image_quality":{"type":"string","default":"80","description":"Lossy compression level for soft formats.\n\nApplies when format is:\n\n```\njpeg\n```\n\n```\nwebp\n```"},"selector":{"type":"string","description":"Limit the shot to one DOM node matched by this CSS selector."},"cache":{"type":"boolean","description":"Serve a stored capture on repeat requests when caching is enabled.","default":false},"cache_ttl":{"type":"number","minimum":3600,"maximum":2592000,"default":"2592000","description":"Lifetime of cached captures in seconds."},"remove_selectors":{"type":"string","description":"Hide matching CSS selectors (modals, promo bars, etc.) before shooting."},"remove_cookie_banners":{"type":"boolean","description":"Best-effort removal of cookie consent layers before capture.","default":false},"remove_ads":{"type":"boolean","description":"Best-effort stripping of ad slots before capture.","default":false},"block_resources":{"type":"string","enum":["document","eventsource","fetch","font","image","manifest","media","other","script","stylesheet","texttrack","websocket","xhr"],"description":"Resource kinds to discard during load, as a comma list (example: `image,stylesheet,font`).\n\nKinds:\n\n- `document`\n- `stylesheet`\n- `image`\n- `media`\n- `font`\n- `script`\n- `texttrack`\n- `xhr`\n- `fetch`\n- `eventsource`\n- `websocket`\n- `manifest`\n- `other`\nHelps shorten load time on media-heavy pages."},"block_urls":{"type":"string","description":"Substring patterns that should never be fetched (example: `analytics,tracking,advertisement`). Hosts, paths, or fragments such as `.example.com/` work."},"delay":{"type":"number","minimum":0,"maximum":10,"default":"0","description":"Additional settle time in seconds after the readiness event."},"wait_until":{"type":"array","items":{"type":"string"},"enum":["domcontentloaded","load","networkidle0","networkidle2"],"description":"Which browser lifecycle event marks the page ready.\n\nValues:\n\n- `networkidle2`\n- `load`\n- `domcontentloaded`\n- `networkidle0`"},"wait_for_selector":{"type":"string","description":"Hold capture until this CSS node is present."},"proxy":{"type":"string","description":"Route the browser through an intermediate proxy.\n\nProtocols: `HTTP`, `HTTPS`, `SOCKS5`.\n\nShape: `http://username:password@proxy.com:PORT`.\n\nHandy for region-specific views or IP rotation."},"s3_secret_key":{"type":"string","description":"Secret key used to authenticate uploads."},"s3_access_key_id":{"type":"string","description":"Access key used to authenticate uploads."},"s3_bucket":{"type":"string","description":"Destination bucket for the binary asset."},"s3_object_key":{"type":"string","description":"Key under which the object is stored (generated automatically if blank)."},"s3_region":{"type":"string","description":"Cloud region of the bucket."},"storage_endpoint":{"type":"string","description":"Override the default AWS endpoint for S3-compatible backends. Leave blank for AWS. R2 example: `https://<accountId>.r2.cloudflarestorage.com`."},"s3_url":{"type":"boolean","description":"Upload the binary and include the public object URL in the API response.","default":false}},"required":["url"]}}}},"responses":{"200":{"description":"Successful response","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}},"application/pdf":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Bad Request — missing or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad Request"}}}},"401":{"description":"Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidKey":{"value":{"error":"Invalid API Key"}},"planRateLimit":{"value":{"error":"Rate limit exceeded: You've exceeded the per second rate limit on your subscription"}},"keyQuota":{"value":{"error":"Rate limit exceeded for the API key: quota monthly"}}}}}},"402":{"description":"Payment Required — your subscription or credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Payment required"}}}},"500":{"description":"Internal Server Error — something went wrong on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal Error"}}}}}}},"/v1/website/rendering":{"get":{"summary":"Website Rendering","description":"Run a managed browser session against a public URL and collect the HTML after client-side scripts finish. Prefer Crawler for static markup; escalate to WebUnlocker on approved hosts when challenges persist.\n\n**Credit cost:** 2 credits per call","operationId":"website-rendering","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"query","in":"query","required":true,"description":"Public URL to load inside BrowserSolver's headless browser. Include `http://` or `https://`.\n\n**Example:**\n\n    https://quotes.toscrape.com/js/\n\n**Pick a tier:**\n- HTML already in the response: try [Website Crawler](/v1/website/crawler) first (1 credit).\n- JavaScript required: [Website Rendering](/v1/website/rendering) (this endpoint).\n- Still blocked on an approved domain: [Website WebUnlocker](/v1/website/webunlocker).\n\nGuide: [fetch tier comparison](https://www.browsersolver.com/blog/website-crawler-vs-rendering-vs-webunlocker).","schema":{"type":"string","description":"Public URL to load inside BrowserSolver's headless browser. Include `http://` or `https://`.\n\n**Example:**\n\n    https://quotes.toscrape.com/js/\n\n**Pick a tier:**\n- HTML already in the response: try [Website Crawler](/v1/website/crawler) first (1 credit).\n- JavaScript required: [Website Rendering](/v1/website/rendering) (this endpoint).\n- Still blocked on an approved domain: [Website WebUnlocker](/v1/website/webunlocker).\n\nGuide: [fetch tier comparison](https://www.browsersolver.com/blog/website-crawler-vs-rendering-vs-webunlocker)."}},{"name":"wait_in_seconds","in":"query","required":false,"description":"Extra pause, in seconds, after the page load event before BrowserSolver returns HTML. Helpful when widgets animate or hydrate late.\n\n**Note:** every extra second adds latency to the call. Keep this low unless the page needs it.","schema":{"type":"number","minimum":0,"maximum":30,"default":"0","description":"Extra pause, in seconds, after the page load event before BrowserSolver returns HTML. Helpful when widgets animate or hydrate late.\n\n**Note:** every extra second adds latency to the call. Keep this low unless the page needs it."}},{"name":"wait_for","in":"query","required":false,"description":"CSS or XPath selector that must appear in the DOM before HTML is returned. The managed browser waits until the node exists (or until `timeout`).\n\nSupported shapes:\n- **ID:** `#results-ready`\n- **Class:** `.product-grid`\n- **Combined:** `main#catalog .item`\n\n**Example:**\n\n    wait_for=#results-ready","schema":{"type":"string","description":"CSS or XPath selector that must appear in the DOM before HTML is returned. The managed browser waits until the node exists (or until `timeout`).\n\nSupported shapes:\n- **ID:** `#results-ready`\n- **Class:** `.product-grid`\n- **Combined:** `main#catalog .item`\n\n**Example:**\n\n    wait_for=#results-ready"}},{"name":"block_ads","in":"query","required":false,"description":"Skip ad-network requests while the page renders.\n\n- `false`: load ads as the site would (**default**)\n- `true`: drop ad traffic for cleaner HTML and faster renders\n\n**Note:** useful on ad-heavy storefronts where creatives pollute the DOM.","schema":{"type":"boolean","description":"Skip ad-network requests while the page renders.\n\n- `false`: load ads as the site would (**default**)\n- `true`: drop ad traffic for cleaner HTML and faster renders\n\n**Note:** useful on ad-heavy storefronts where creatives pollute the DOM.","default":false}},{"name":"timeout","in":"query","required":false,"description":"Hard ceiling, in seconds, for the render session. When reached, BrowserSolver returns whatever HTML is available.\n\n**Notes:**\n- Lower values may truncate slow pages.\n- Pair with `wait_for` so critical nodes appear before the ceiling.","schema":{"type":"number","default":"30","description":"Hard ceiling, in seconds, for the render session. When reached, BrowserSolver returns whatever HTML is available.\n\n**Notes:**\n- Lower values may truncate slow pages.\n- Pair with `wait_for` so critical nodes appear before the ceiling."}},{"$ref":"#/components/parameters/fields"},{"$ref":"#/components/parameters/is_async"},{"$ref":"#/components/parameters/soft_fail"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"string"},"examples":{"Render a JS-hydrated blog post":{"value":"<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><title>Shipping faster with edge caches | Engineering Notes</title><script src=\"/assets/app.bundle.js\" defer></script></head><body><div id=\"root\" data-hydrated=\"true\"><article><h1>Shipping faster with edge caches</h1><p class=\"byline\">Published 2026-03-12</p><p>After hydration, product metrics and comments appear below.</p><section id=\"comments\" data-loaded=\"true\"><div class=\"comment\">Nice write-up.</div></section></article></div></body></html>"}}}}},"400":{"description":"Bad Request — missing or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad Request"}}}},"401":{"description":"Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidKey":{"value":{"error":"Invalid API Key"}},"planRateLimit":{"value":{"error":"Rate limit exceeded: You've exceeded the per second rate limit on your subscription"}},"keyQuota":{"value":{"error":"Rate limit exceeded for the API key: quota monthly"}}}}}},"402":{"description":"Payment Required — your subscription or credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Payment required"}}}},"500":{"description":"Internal Server Error — something went wrong on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal Error"}}}}}}},"/v1/website/crawler":{"get":{"summary":"Website Crawler","description":"Fast HTTP pull of public HTML with no browser session. Ideal when the first response already contains the content you need.\n\n**Credit cost:** 1 credit per call","operationId":"get-website-crawler","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"query","in":"query","required":true,"description":"Public URL to retrieve with the Crawler tier (plain HTTP, no JavaScript). Include `http://` or `https://`.\n\n**Example:**\n\n    https://books.toscrape.com/\n\n**Pick a tier:**\n- Static or SSR HTML: [Website Crawler](/v1/website/crawler) (this endpoint).\n- Needs JavaScript: [Website Rendering](/v1/website/rendering).\n- Bot wall on an approved domain: [Website WebUnlocker](/v1/website/webunlocker).\n\nGuide: [fetch tier comparison](https://www.browsersolver.com/blog/website-crawler-vs-rendering-vs-webunlocker).","schema":{"type":"string","description":"Public URL to retrieve with the Crawler tier (plain HTTP, no JavaScript). Include `http://` or `https://`.\n\n**Example:**\n\n    https://books.toscrape.com/\n\n**Pick a tier:**\n- Static or SSR HTML: [Website Crawler](/v1/website/crawler) (this endpoint).\n- Needs JavaScript: [Website Rendering](/v1/website/rendering).\n- Bot wall on an approved domain: [Website WebUnlocker](/v1/website/webunlocker).\n\nGuide: [fetch tier comparison](https://www.browsersolver.com/blog/website-crawler-vs-rendering-vs-webunlocker)."}},{"name":"allow_redirects","in":"query","required":false,"description":"Whether BrowserSolver should chase HTTP redirects for this fetch.\n\n- `true`: follow the redirect chain (**default**)\n- `false`: stop on the first status and return that response\n\n**Tip:** set `false` when you need the intermediate 301/302 hop itself.","schema":{"type":"boolean","description":"Whether BrowserSolver should chase HTTP redirects for this fetch.\n\n- `true`: follow the redirect chain (**default**)\n- `false`: stop on the first status and return that response\n\n**Tip:** set `false` when you need the intermediate 301/302 hop itself.","default":true}},{"name":"return_page_source","in":"query","required":false,"description":"Choose between processed markup and the exact bytes from the origin.\n\n- `false`: return BrowserSolver's processed HTML (**default**)\n- `true`: return the untouched source from the web server\n\n**Tip:** enable `true` for debugging parsers against the raw document.","schema":{"type":"boolean","description":"Choose between processed markup and the exact bytes from the origin.\n\n- `false`: return BrowserSolver's processed HTML (**default**)\n- `true`: return the untouched source from the web server\n\n**Tip:** enable `true` for debugging parsers against the raw document.","default":false}},{"$ref":"#/components/parameters/fields"},{"$ref":"#/components/parameters/is_async"},{"$ref":"#/components/parameters/soft_fail"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"string"},"examples":{"Fetch docs.python.org homepage":{"value":"<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><title>Welcome to Python.org</title><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><link rel=\"stylesheet\" href=\"/static/stylesheets/style.css\"></head><body><div id=\"touchnav-wrapper\"><header class=\"main-header\"><h1>Python</h1><nav><a href=\"/downloads/\">Downloads</a><a href=\"/doc/\">Documentation</a></nav></header><main><section class=\"launch-shell\"><h2>Get Started</h2><p>Python is a programming language that lets you work quickly.</p></section></main></div></body></html>"},"Fetch mozilla.org with raw page source":{"value":"<!DOCTYPE html><html lang=\"en\" dir=\"ltr\"><head><meta charset=\"utf-8\"><title>Mozilla - Internet for people, not profit</title><meta name=\"description\" content=\"Mozilla is a nonprofit building a healthier internet.\"></head><body class=\"mzp-t-mozilla\"><div class=\"c-navigation\"><a href=\"/en-US/\">Mozilla</a></div><main><h1>Internet for people, not profit</h1><p>We are a nonprofit working to keep the internet open and accessible.</p></main></body></html>"},"Fetch stackoverflow.com without following redirects":{"value":"<!DOCTYPE html><html class=\"html__responsive\"><head><meta charset=\"utf-8\"><title>Stack Overflow - Where Developers Learn, Share, &amp; Build Careers</title></head><body class=\"unified-theme\"><header class=\"s-topbar\"><a href=\"/\">Stack Overflow</a></header><div id=\"content\"><h1>Top Questions</h1><div class=\"s-post-summary\"><h3>How to parse JSON in Python?</h3></div></div></body></html>"}}}}},"400":{"description":"Bad Request — missing or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad Request"}}}},"401":{"description":"Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidKey":{"value":{"error":"Invalid API Key"}},"planRateLimit":{"value":{"error":"Rate limit exceeded: You've exceeded the per second rate limit on your subscription"}},"keyQuota":{"value":{"error":"Rate limit exceeded for the API key: quota monthly"}}}}}},"402":{"description":"Payment Required — your subscription or credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Payment required"}}}},"500":{"description":"Internal Server Error — something went wrong on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal Error"}}}}}},"post":{"summary":"Website Crawler (POST)","description":"Relay a JSON POST to a public page or API endpoint and return whatever the upstream server replies. No JS execution and no unlock layer.\n\n**Credit cost:** 1 credit per call","operationId":"post-website-crawler","security":[{"ApiKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/fields"},{"$ref":"#/components/parameters/is_async"},{"$ref":"#/components/parameters/soft_fail"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","description":"Upstream URL (page or JSON API) to call with HTTP POST through the Crawler tier. Include `http://` or `https://`.\n\n**Example:**\n\n    https://httpbin.org/post\n\n**How to send the payload:**\n- Recommended: pass `query` in the query string and put the upstream JSON body in the POST body.\n- Alternative: send `{ \"query\": \"...\", \"json\": { ... } }` in a single JSON body.\n- For simple page GET fetches, use [Website Crawler](/v1/website/crawler) instead.\n\nGuide: [fetch tier comparison](https://www.browsersolver.com/blog/website-crawler-vs-rendering-vs-webunlocker)."}},"required":["query"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"meta":{"type":"object","properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total_items":{"type":"integer"}}},"items":{"type":"array","items":{"type":"object","properties":{"sku":{"type":"string"},"href":{"type":"string"},"name":{"type":"string"},"amount":{"type":"number"},"currency":{"type":"string"},"availability":{"type":"string"}}}}}},"examples":{"POST catalog search JSON":{"value":{"meta":{"page":1,"per_page":25,"total_items":318},"items":[{"sku":"SKU-88421","href":"https://httpbin.org/p/wireless-earbuds","name":"Wireless earbuds","amount":79.99,"currency":"EUR","availability":"in_stock"},{"sku":"SKU-99102","href":"https://httpbin.org/p/usb-c-hub","name":"USB-C hub 7-in-1","amount":49.5,"currency":"EUR","availability":"limited"}]}}}}}},"400":{"description":"Bad Request — missing or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad Request"}}}},"401":{"description":"Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidKey":{"value":{"error":"Invalid API Key"}},"planRateLimit":{"value":{"error":"Rate limit exceeded: You've exceeded the per second rate limit on your subscription"}},"keyQuota":{"value":{"error":"Rate limit exceeded for the API key: quota monthly"}}}}}},"402":{"description":"Payment Required — your subscription or credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Payment required"}}}},"500":{"description":"Internal Server Error — something went wrong on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal Error"}}}}}}},"/v1/website/antibot":{"get":{"summary":"Website Antibot","description":"Single-pass scan that names the bot-protection vendor in front of a URL so you can choose the right BrowserSolver fetch tier next.\n\n**Credit cost:** 1 credit per call","operationId":"website-antibot","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"query","in":"query","required":true,"description":"Full URL or bare domain to scan for bot-protection vendors.\n\n**Examples:**\n\n```\nhttps://www.cloudflare.com/\n```\n\n```\ncloudflare.com\n```\n\n**Notes:**\n- Passive fingerprint from HTTP headers, cookies, and HTML markers.\n- Challenge responses (403, 503) still produce a valid analysis.\n- Use the result to pick [Website Crawler](/v1/website/crawler), [Website Rendering](/v1/website/rendering), or [Website WebUnlocker](/v1/website/webunlocker).","schema":{"type":"string","description":"Full URL or bare domain to scan for bot-protection vendors.\n\n**Examples:**\n\n```\nhttps://www.cloudflare.com/\n```\n\n```\ncloudflare.com\n```\n\n**Notes:**\n- Passive fingerprint from HTTP headers, cookies, and HTML markers.\n- Challenge responses (403, 503) still produce a valid analysis.\n- Use the result to pick [Website Crawler](/v1/website/crawler), [Website Rendering](/v1/website/rendering), or [Website WebUnlocker](/v1/website/webunlocker)."}},{"name":"timeout","in":"query","required":false,"description":"Upper bound for waiting on the target HTTP response, expressed in seconds (defaults to `15`).","schema":{"type":"number","description":"Upper bound for waiting on the target HTTP response, expressed in seconds (defaults to `15`)."}},{"$ref":"#/components/parameters/fields"},{"$ref":"#/components/parameters/is_async"},{"$ref":"#/components/parameters/soft_fail"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"integer"},"vendor":{"type":"string"},"final_url":{"type":"string"},"confidence":{"type":"string"},"detections":{"type":"array","items":{"type":"object","properties":{"vendor":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"}},"confidence":{"type":"string"}}}},"requested_url":{"type":"string"}}},"examples":{"Cloudflare Bot Management on asana.com":{"value":{"status":200,"vendor":"cloudflare","final_url":"https://asana.com/","confidence":"high","detections":[{"vendor":"cloudflare","evidence":["cf-ray header matched: d41e8c2f91ab3340-AMS","server header equals cloudflare","bot-management cookie __cf_bm detected","cf-cache-status=DYNAMIC"],"confidence":"high"}],"requested_url":"https://asana.com/"}},"Imperva challenge on a retail host":{"value":{"status":403,"vendor":"imperva","final_url":"https://www.footlocker.com/","confidence":"high","detections":[{"vendor":"imperva","evidence":["Set-Cookie contains visid_incap_","Set-Cookie contains incap_ses_","HTML contains _Incapsula_Resource","Response powered by Incapsula markers"],"confidence":"high"}],"requested_url":"https://www.footlocker.com"}},"Kasada fingerprint on a ticketing host":{"value":{"status":200,"vendor":"kasada","final_url":"https://www.ticketmaster.com/","confidence":"medium","detections":[{"vendor":"kasada","evidence":["Script path includes /fp/script","Response header x-kpsdk-ct present","Body references KPSDK"],"confidence":"medium"},{"vendor":"recaptcha","evidence":["Script host www.google.com/recaptcha detected"],"confidence":"low"}],"requested_url":"https://www.ticketmaster.com"}},"No bot vendor signatures found":{"value":{"status":200,"vendor":"none","final_url":"https://jsonplaceholder.typicode.com/","confidence":null,"detections":[],"requested_url":"https://jsonplaceholder.typicode.com"}}}}}},"400":{"description":"Bad Request — missing or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad Request"}}}},"401":{"description":"Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidKey":{"value":{"error":"Invalid API Key"}},"planRateLimit":{"value":{"error":"Rate limit exceeded: You've exceeded the per second rate limit on your subscription"}},"keyQuota":{"value":{"error":"Rate limit exceeded for the API key: quota monthly"}}}}}},"402":{"description":"Payment Required — your subscription or credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Payment required"}}}},"500":{"description":"Internal Server Error — something went wrong on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal Error"}}}}}}},"/v1/usage":{"get":{"summary":"Usage","description":"Retrieve real-time usage statistics and credit balance for your BrowserSolver account.","operationId":"usage","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"packs":{"nullable":true},"period":{"type":"object","properties":{"end":{"type":"string"},"start":{"type":"string"}}},"account":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"}}},"api_key":{"type":"object","properties":{"alias":{"type":"string"},"active":{"type":"boolean"},"quotas":{"type":"object","properties":{"daily":{"nullable":true},"total":{"nullable":true},"weekly":{"nullable":true},"monthly":{"nullable":true}}},"expires":{"nullable":true},"category":{"type":"string"}}},"credits":{"type":"object","properties":{"given":{"type":"integer"},"consumed":{"type":"integer"},"remaining":{"type":"integer"},"percent_used":{"type":"integer"}}},"remaining":{"type":"integer"},"rate_limit":{"type":"object","properties":{"per_minute":{"nullable":true},"per_second":{"nullable":true}}},"total_used":{"type":"integer"},"renewal_date":{"type":"string"},"subscription":{"type":"object","properties":{"used":{"type":"integer"},"total":{"type":"integer"},"remaining":{"type":"integer"},"percent_used":{"type":"integer"}}}}},"examples":{"Account usage overview":{"value":{"packs":null,"period":{"end":"2026-04-25","start":"2026-03-25"},"account":{"name":"Microsoft","slug":"microsoft"},"api_key":{"alias":"my-api-key","active":true,"quotas":{"daily":null,"total":null,"weekly":null,"monthly":null},"expires":null,"category":"development"},"credits":{"given":0,"consumed":0,"remaining":0,"percent_used":0},"remaining":0,"rate_limit":{"per_minute":null,"per_second":null},"total_used":15871,"renewal_date":"2026-04-25","subscription":{"used":15871,"total":50,"remaining":0,"percent_used":31742}}},"Account with one-time packs":{"value":{"packs":{"used":15200000,"count":2,"items":[{"id":"cmhtn…","used":12500000,"title":"Ultimate","total":12500000,"exhausted":true,"remaining":0,"percent_used":100,"purchased_at":"2025-11-10"},{"id":"cmlc9…","used":2700000,"title":"Ultimate","total":12500000,"exhausted":false,"remaining":9800000,"percent_used":21.6,"purchased_at":"2026-02-07"}],"total":25000000,"current":{"id":"cmlc9…","used":2700000,"title":"Ultimate","total":12500000,"exhausted":false,"remaining":9800000,"percent_used":21.6,"purchased_at":"2026-02-07"},"remaining":9800000,"percent_used":60.8,"all_exhausted":false,"current_index":2,"exhausted_count":1},"period":{"end":"2026-10-01","start":"2026-09-01"},"account":{"name":"Microsoft","slug":"microsoft"},"api_key":{"alias":"my-api-key","active":true,"quotas":{"daily":null,"total":null,"weekly":null,"monthly":null},"expires":null,"category":"development"},"credits":{"given":0,"consumed":0,"remaining":0,"percent_used":0},"remaining":9800000,"rate_limit":{"per_minute":null,"per_second":null},"total_used":15200000,"renewal_date":"2026-10-01","subscription":{"used":15200000,"total":25000000,"remaining":9800000,"percent_used":60.8}}}}}}},"400":{"description":"Bad Request — missing or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad Request"}}}},"401":{"description":"Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidKey":{"value":{"error":"Invalid API Key"}},"planRateLimit":{"value":{"error":"Rate limit exceeded: You've exceeded the per second rate limit on your subscription"}},"keyQuota":{"value":{"error":"Rate limit exceeded for the API key: quota monthly"}}}}}},"402":{"description":"Payment Required — your subscription or credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Payment required"}}}},"500":{"description":"Internal Server Error — something went wrong on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal Error"}}}}}}},"/v1/jobs/{id}":{"get":{"summary":"Jobs","description":"Poll the status, progress (0–100) and result of a job started with `is_async=true`. Polling is free. Poll until `status` is terminal: `CompletedJob`, `Error`, `NotFound` or `BadRequest`.","operationId":"jobs-id","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"The `job_id` returned by an endpoint called with `is_async=true`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Job status, with the result once `status` is `CompletedJob`.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"success":{"type":["boolean","null"]},"status":{"type":"string","enum":["Queued","Running","CompletedJob","Error","NotFound","BadRequest"]},"endpoint":{"type":"string"},"created_at":{"type":"string"},"started_at":{"type":["string","null"]},"completed_at":{"type":["string","null"]},"duration_ms":{"type":["number","null"]},"args":{"type":"object"},"result":{},"progress":{"type":["integer","null"]}}}}}},"400":{"description":"Bad Request — missing or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Bad Request"}}}},"401":{"description":"Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"invalidKey":{"value":{"error":"Invalid API Key"}},"planRateLimit":{"value":{"error":"Rate limit exceeded: You've exceeded the per second rate limit on your subscription"}},"keyQuota":{"value":{"error":"Rate limit exceeded for the API key: quota monthly"}}}}}},"402":{"description":"Payment Required — your subscription or credit balance is insufficient.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Payment required"}}}},"404":{"description":"Not Found — no job with this id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Job or content not found"}}}},"500":{"description":"Internal Server Error — something went wrong on our side.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"example":{"error":"Internal Error"}}}}}}}},"components":{"parameters":{"fields":{"name":"fields","in":"query","required":false,"description":"Comma-separated list of response fields to return, with dot notation for nested fields (e.g. `name,location.city`).","schema":{"type":"string"}},"is_async":{"name":"is_async","in":"query","required":false,"description":"Run the request as a background job: the API answers `202` with a `job_id` to poll on `GET /v1/jobs/{id}`.","schema":{"type":"boolean","default":false}},"soft_fail":{"name":"soft_fail","in":"query","required":false,"description":"Return HTTP 200 even when the request fails; the error is in the `error` field of the body.","schema":{"type":"boolean","default":false}}},"schemas":{"ErrorResponse":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message."}}}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"Your API key. Include it in the x-api-key header for every request."}}}}