{"openapi":"3.1.0","info":{"title":"Smart Fetch API - URL to Markdown from US, SG, EU or TW","version":"1.0.0","description":"Fetch any web page as clean Markdown or HTML from a region you choose (US, Singapore, London, Taiwan) or let the API pick the cheapest network that gets through. Error pages served with HTTP 200 (soft 404s, access denied, region blocks, cookie walls) are detected and reported instead of returned as content. Every answer lists the regions and modes that were tried. Honest crawler: one identifying User-Agent, robots.txt honored, no logins or CAPTCHA solving.\n\nAll endpoints accept GET (query string) or POST (JSON body). Errors use one shape: `{\"success\": false, \"error\": {\"code\", \"message\", \"retryable\"}}`. When a numeric `Retry-After` header is present, `error.retryAfterSeconds` is included.","contact":{"name":"TidyTools","url":"https://apify.com/tidytools"}},"servers":[{"url":"https://webcapture-api.yukailin.workers.dev","description":"Origin (reachable only through the marketplace gateway)"}],"tags":[{"name":"Smart Fetch"}],"paths":{"/api/v1/smart-fetch":{"get":{"operationId":"smartFetchGet","summary":"Fetch a URL as clean Markdown from a chosen region (GET)","description":"One URL in, clean Markdown (and/or HTML) plus metadata out, fetched from the region you pick (`us`, `sg`, `eu`, `tw`) or, with `region=auto`, from the cheapest network that gets through: Cloudflare edge, Phoenix, then a real Chrome browser for JavaScript pages. Honest by design: one User-Agent that names TidyTools on every request, robots.txt honored by default, no logins, no cookies, no CAPTCHA solving, no proxies pretending to be visitors; when a site refuses one network only the region changes, never the identity. Error pages served with HTTP 200 (soft 404, access denied, \"not available in your region\", cookie walls) are reported as failures, not returned as content. `attempts` shows every region and mode tried. Typical time 0.5-3 s; up to 55 s when every fallback is used.","tags":["Smart Fetch"],"parameters":[{"name":"url","schema":{"type":"string"},"description":"Page URL. A bare domain such as `example.com` is accepted (https is assumed). Private, local and cloud-metadata addresses are refused.","required":true,"example":"https://example.com","in":"query"},{"name":"region","schema":{"type":"string","default":"auto","enum":["auto","us","sg","eu","tw","cf"]},"description":"Where the request leaves from. `auto` (default): Cloudflare edge, then Phoenix (US) when a site refuses it, then a real browser for JavaScript pages or when everything was refused. `us` Phoenix, `sg` Singapore, `eu` London, `tw` Taiwan (residential line), `cf` Cloudflare edge. A named region is tried alone (no silent substitute) unless `fallback=true`.","required":false,"in":"query"},{"name":"mode","schema":{"type":"string","default":"auto","enum":["auto","http","browser"]},"description":"`auto` (default): HTTP first, a real Chrome browser when the page is a JavaScript shell or refused over HTTP (region `auto` or `cf` only). `http`: HTTP only. `browser`: browser only (regions `auto`, `cf` and `tw`; `tw` renders in a Taiwan Chrome).","required":false,"in":"query"},{"name":"format","schema":{"type":"string","default":"markdown","enum":["markdown","html","both"]},"description":"`markdown` (default), `html`, or `both`. `metadata` is always returned.","required":false,"in":"query"},{"name":"fallback","schema":{"type":"boolean"},"description":"Try other regions when the first is refused or fails. Default `true` for region `auto`, `false` for a named region (so the answer really comes from that region).","required":false,"in":"query"},{"name":"respectRobots","schema":{"type":"boolean","default":true},"description":"Honor the site's robots.txt for our crawler token. `false` fetches pages robots.txt disallows.","required":false,"in":"query"},{"name":"maxChars","schema":{"type":"integer","default":200000,"minimum":100,"maximum":500000},"description":"Cut Markdown and HTML at this many characters (`truncated` tells you).","required":false,"in":"query"},{"name":"timeoutMs","schema":{"type":"integer","minimum":1000,"maximum":30000},"description":"Timeout per attempt in milliseconds. Unset: 12 s per HTTP attempt with fallback (30 s for a single named region). The whole call is limited to 55 s.","required":false,"in":"query"},{"name":"waitUntil","schema":{"type":"string","default":"load","enum":["load","domcontentloaded","networkidle2"]},"description":"Browser pages: when the page counts as loaded.","required":false,"in":"query"},{"name":"includeLinks","schema":{"type":"boolean","default":false},"description":"Also return the absolute links found on the page in `metadata.links`.","required":false,"in":"query"},{"name":"mainContent","schema":{"type":"boolean","default":false},"description":"Keep only the main article/content block (readability-style).","required":false,"in":"query"},{"name":"removeBoilerplate","schema":{"type":"boolean","default":true},"description":"Drop navigation, header, footer and similar page chrome.","required":false,"in":"query"},{"name":"cssSelector","schema":{"type":"string"},"description":"Keep only the part of the page matching this CSS selector (e.g. `article`).","required":false,"in":"query"},{"name":"removeSelectors","schema":{"type":"string"},"description":"Comma-separated CSS selectors removed before conversion.","required":false,"in":"query"}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"const":true},"url":{"type":"string"},"finalUrl":{"type":"string"},"httpStatus":{"type":"integer"},"region":{"type":"string","enum":["cf","us","sg","eu","tw"],"description":"The network the page really came from: `cf` Cloudflare edge, `us` Phoenix, `sg` Singapore, `eu` London, `tw` Taiwan."},"regionLocation":{"type":"string","description":"Human-readable location of `region`."},"mode":{"type":"string","enum":["http","browser"],"description":"`http`: plain HTTP fetch. `browser`: a real Chrome render."},"requested":{"type":"object","description":"The `region` and `mode` you asked for (`auto` = we choose).","properties":{"region":{"type":"string"},"mode":{"type":"string"}}},"metadata":{"type":"object","description":"Title, description, language, canonical URL, content type, size and caching headers (and `links` with includeLinks=true).","properties":{"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"lang":{"type":"string","nullable":true},"canonical":{"type":"string","nullable":true},"contentType":{"type":"string","nullable":true},"bytes":{"type":"integer"},"lastModified":{"type":"string","nullable":true},"etag":{"type":"string","nullable":true},"xRobotsTag":{"type":"string","nullable":true},"links":{"type":"array","items":{"type":"string"}}}},"robots":{"type":"object","description":"robots.txt verdict for our crawler token (`TidyToolsSmartFetch`).","properties":{"state":{"type":"string","enum":["found","missing","unavailable","server-error","skipped"]},"allowed":{"type":"boolean"},"rule":{"type":"string","nullable":true}}},"attempts":{"type":"array","description":"Every region and mode tried, in order: the honest fallback trail. A refused or failed attempt says why (`errorType`, `httpStatus`, `pageCheck` for error pages served with HTTP 200).","items":{"type":"object","properties":{"route":{"type":"string","enum":["cf","us","sg","eu","tw"]},"mode":{"type":"string","enum":["http","browser"]},"via":{"type":"string"},"ok":{"type":"boolean"},"httpStatus":{"type":"integer","nullable":true},"errorType":{"type":"string","nullable":true},"pageCheck":{"type":"string"},"ms":{"type":"integer"}}}},"userAgent":{"type":"string","description":"The one User-Agent we send on every route; it names TidyTools."},"durationMs":{"type":"integer"},"fetchedAt":{"type":"string"},"markdown":{"type":"string","description":"Clean Markdown of the page (navigation, footers and cookie banners removed). Present with format=markdown or both."},"markdownChars":{"type":"integer"},"truncated":{"type":"boolean","description":"true when `maxChars` cut the Markdown."},"browserVia":{"type":"string","enum":["browser-rendering","chrome-pool"],"description":"Only for browser pages: which browser rendered it."},"html":{"type":"string","description":"Page HTML (decoded to UTF-8). Present with format=html or both."}}},"example":{"success":true,"url":"https://docs.python.org/3/tutorial/venv.html","finalUrl":"https://docs.python.org/3/tutorial/venv.html","httpStatus":200,"region":"cf","regionLocation":"Cloudflare edge (nearest data center)","mode":"http","requested":{"region":"auto","mode":"auto"},"metadata":{"title":"12. Virtual Environments and Packages — Python 3.14.8 documentation","description":"Introduction: Python applications will often use packages and modules that don’t come as part of the standard library. Applications will sometimes need a specific version of a library, because the ...","lang":"en","canonical":"https://docs.python.org/3/tutorial/venv.html","contentType":"text/html","bytes":31993,"lastModified":"Fri, 02 Oct 2026 20:53:52 GMT","etag":"W/\"6ac019e0-7cf9\"","xRobotsTag":null},"robots":{"state":"found","allowed":true,"rule":null},"attempts":[{"route":"cf","mode":"http","ok":true,"httpStatus":200,"errorType":null,"ms":19}],"userAgent":"Mozilla/5.0 (compatible; TidyToolsSmartFetch/1.0; +https://apify.com/tidytools/smart-fetch)","durationMs":37,"fetchedAt":"2026-10-03T04:21:12.899Z","markdown":"---\ntitle: 12. Virtual Environments and Packages\ndescription: Introduction: Python applications will often use packages and modules that don’t come as part of the standard library. Applications will sometimes need a specific version of a library, because the ...\nimage: https://docs.python.org/3.14/_…","markdownChars":1500,"truncated":true}}}},"400":{"description":"Invalid parameter (`invalid_request`) or a private/local target (`url_not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"url_not_allowed","message":"private, local and reserved hosts are not allowed"}}}}},"413":{"description":"`too_large`: the page or document is larger than 10 MB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The page was not delivered. `error.code` is `target_blocked` (the site refused every region and browser we tried, or served a bot check or an error page), `target_error` (HTTP 404/410, empty page), `target_unreachable` (DNS or network failure), `robots_disallowed` (robots.txt forbids the page for our crawler; send `respectRobots=false` to override) or `unsupported_content`. `error.details.attempts` lists every region and mode that was tried, in order. Not billed by the marketplace (non-2xx).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"target_blocked","message":"the site refused this route (HTTP 403)","details":{"errorType":"blocked","region":"auto","mode":"auto","finalUrl":null,"httpStatus":null,"robots":{"state":"found","allowed":true,"rule":null},"attempts":[{"route":"cf","mode":"http","ok":false,"httpStatus":403,"errorType":"blocked","ms":19},{"route":"us","mode":"http","ok":false,"httpStatus":403,"errorType":"blocked","ms":588},{"route":"cf","mode":"browser","via":"browser-rendering","ok":false,"httpStatus":403,"errorType":"blocked","ms":6762}],"userAgent":"Mozilla/5.0 (compatible; TidyToolsSmartFetch/1.0; +https://apify.com/tidytools/smart-fetch)"}}},"examples":{"blocked":{"summary":"Refused by every route","value":{"success":false,"error":{"code":"target_blocked","message":"the site refused this route (HTTP 403)","details":{"errorType":"blocked","region":"auto","mode":"auto","finalUrl":null,"httpStatus":null,"robots":{"state":"found","allowed":true,"rule":null},"attempts":[{"route":"cf","mode":"http","ok":false,"httpStatus":403,"errorType":"blocked","ms":19},{"route":"us","mode":"http","ok":false,"httpStatus":403,"errorType":"blocked","ms":588},{"route":"cf","mode":"browser","via":"browser-rendering","ok":false,"httpStatus":403,"errorType":"blocked","ms":6762}],"userAgent":"Mozilla/5.0 (compatible; TidyToolsSmartFetch/1.0; +https://apify.com/tidytools/smart-fetch)"}}}},"not_found":{"summary":"Page does not exist","value":{"success":false,"error":{"code":"target_error","message":"the page does not exist (HTTP 404)","details":{"errorType":"not_found","region":"auto","mode":"auto","finalUrl":null,"httpStatus":null,"robots":{"state":"missing","allowed":true,"rule":null},"attempts":[{"route":"cf","mode":"http","ok":false,"httpStatus":404,"errorType":"not_found","ms":7}],"userAgent":"Mozilla/5.0 (compatible; TidyToolsSmartFetch/1.0; +https://apify.com/tidytools/smart-fetch)"}}}}}}}},"503":{"description":"`region_unavailable` (that region is not available right now) or `browser_busy` (no browser was free; retry after the `Retry-After` seconds).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"`timeout`: the site did not answer in time on any route (`error.details.attempts` shows where).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"smartFetch","summary":"Fetch a URL as clean Markdown from a chosen region","description":"One URL in, clean Markdown (and/or HTML) plus metadata out, fetched from the region you pick (`us`, `sg`, `eu`, `tw`) or, with `region=auto`, from the cheapest network that gets through: Cloudflare edge, Phoenix, then a real Chrome browser for JavaScript pages. Honest by design: one User-Agent that names TidyTools on every request, robots.txt honored by default, no logins, no cookies, no CAPTCHA solving, no proxies pretending to be visitors; when a site refuses one network only the region changes, never the identity. Error pages served with HTTP 200 (soft 404, access denied, \"not available in your region\", cookie walls) are reported as failures, not returned as content. `attempts` shows every region and mode tried. Typical time 0.5-3 s; up to 55 s when every fallback is used.\n\nThe same parameters as the GET form, sent as a JSON body.","tags":["Smart Fetch"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Page URL. A bare domain such as `example.com` is accepted (https is assumed). Private, local and cloud-metadata addresses are refused."},"region":{"type":"string","default":"auto","enum":["auto","us","sg","eu","tw","cf"],"description":"Where the request leaves from. `auto` (default): Cloudflare edge, then Phoenix (US) when a site refuses it, then a real browser for JavaScript pages or when everything was refused. `us` Phoenix, `sg` Singapore, `eu` London, `tw` Taiwan (residential line), `cf` Cloudflare edge. A named region is tried alone (no silent substitute) unless `fallback=true`."},"mode":{"type":"string","default":"auto","enum":["auto","http","browser"],"description":"`auto` (default): HTTP first, a real Chrome browser when the page is a JavaScript shell or refused over HTTP (region `auto` or `cf` only). `http`: HTTP only. `browser`: browser only (regions `auto`, `cf` and `tw`; `tw` renders in a Taiwan Chrome)."},"format":{"type":"string","default":"markdown","enum":["markdown","html","both"],"description":"`markdown` (default), `html`, or `both`. `metadata` is always returned."},"fallback":{"type":"boolean","description":"Try other regions when the first is refused or fails. Default `true` for region `auto`, `false` for a named region (so the answer really comes from that region)."},"respectRobots":{"type":"boolean","default":true,"description":"Honor the site's robots.txt for our crawler token. `false` fetches pages robots.txt disallows."},"maxChars":{"type":"integer","default":200000,"minimum":100,"maximum":500000,"description":"Cut Markdown and HTML at this many characters (`truncated` tells you)."},"timeoutMs":{"type":"integer","minimum":1000,"maximum":30000,"description":"Timeout per attempt in milliseconds. Unset: 12 s per HTTP attempt with fallback (30 s for a single named region). The whole call is limited to 55 s."},"waitUntil":{"type":"string","default":"load","enum":["load","domcontentloaded","networkidle2"],"description":"Browser pages: when the page counts as loaded."},"includeLinks":{"type":"boolean","default":false,"description":"Also return the absolute links found on the page in `metadata.links`."},"mainContent":{"type":"boolean","default":false,"description":"Keep only the main article/content block (readability-style)."},"removeBoilerplate":{"type":"boolean","default":true,"description":"Drop navigation, header, footer and similar page chrome."},"cssSelector":{"type":"string","description":"Keep only the part of the page matching this CSS selector (e.g. `article`)."},"removeSelectors":{"type":"string","description":"Comma-separated CSS selectors removed before conversion."}},"required":["url"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"const":true},"url":{"type":"string"},"finalUrl":{"type":"string"},"httpStatus":{"type":"integer"},"region":{"type":"string","enum":["cf","us","sg","eu","tw"],"description":"The network the page really came from: `cf` Cloudflare edge, `us` Phoenix, `sg` Singapore, `eu` London, `tw` Taiwan."},"regionLocation":{"type":"string","description":"Human-readable location of `region`."},"mode":{"type":"string","enum":["http","browser"],"description":"`http`: plain HTTP fetch. `browser`: a real Chrome render."},"requested":{"type":"object","description":"The `region` and `mode` you asked for (`auto` = we choose).","properties":{"region":{"type":"string"},"mode":{"type":"string"}}},"metadata":{"type":"object","description":"Title, description, language, canonical URL, content type, size and caching headers (and `links` with includeLinks=true).","properties":{"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"lang":{"type":"string","nullable":true},"canonical":{"type":"string","nullable":true},"contentType":{"type":"string","nullable":true},"bytes":{"type":"integer"},"lastModified":{"type":"string","nullable":true},"etag":{"type":"string","nullable":true},"xRobotsTag":{"type":"string","nullable":true},"links":{"type":"array","items":{"type":"string"}}}},"robots":{"type":"object","description":"robots.txt verdict for our crawler token (`TidyToolsSmartFetch`).","properties":{"state":{"type":"string","enum":["found","missing","unavailable","server-error","skipped"]},"allowed":{"type":"boolean"},"rule":{"type":"string","nullable":true}}},"attempts":{"type":"array","description":"Every region and mode tried, in order: the honest fallback trail. A refused or failed attempt says why (`errorType`, `httpStatus`, `pageCheck` for error pages served with HTTP 200).","items":{"type":"object","properties":{"route":{"type":"string","enum":["cf","us","sg","eu","tw"]},"mode":{"type":"string","enum":["http","browser"]},"via":{"type":"string"},"ok":{"type":"boolean"},"httpStatus":{"type":"integer","nullable":true},"errorType":{"type":"string","nullable":true},"pageCheck":{"type":"string"},"ms":{"type":"integer"}}}},"userAgent":{"type":"string","description":"The one User-Agent we send on every route; it names TidyTools."},"durationMs":{"type":"integer"},"fetchedAt":{"type":"string"},"markdown":{"type":"string","description":"Clean Markdown of the page (navigation, footers and cookie banners removed). Present with format=markdown or both."},"markdownChars":{"type":"integer"},"truncated":{"type":"boolean","description":"true when `maxChars` cut the Markdown."},"browserVia":{"type":"string","enum":["browser-rendering","chrome-pool"],"description":"Only for browser pages: which browser rendered it."},"html":{"type":"string","description":"Page HTML (decoded to UTF-8). Present with format=html or both."}}},"example":{"success":true,"url":"https://docs.python.org/3/tutorial/venv.html","finalUrl":"https://docs.python.org/3/tutorial/venv.html","httpStatus":200,"region":"cf","regionLocation":"Cloudflare edge (nearest data center)","mode":"http","requested":{"region":"auto","mode":"auto"},"metadata":{"title":"12. Virtual Environments and Packages — Python 3.14.8 documentation","description":"Introduction: Python applications will often use packages and modules that don’t come as part of the standard library. Applications will sometimes need a specific version of a library, because the ...","lang":"en","canonical":"https://docs.python.org/3/tutorial/venv.html","contentType":"text/html","bytes":31993,"lastModified":"Fri, 02 Oct 2026 20:53:52 GMT","etag":"W/\"6ac019e0-7cf9\"","xRobotsTag":null},"robots":{"state":"found","allowed":true,"rule":null},"attempts":[{"route":"cf","mode":"http","ok":true,"httpStatus":200,"errorType":null,"ms":19}],"userAgent":"Mozilla/5.0 (compatible; TidyToolsSmartFetch/1.0; +https://apify.com/tidytools/smart-fetch)","durationMs":37,"fetchedAt":"2026-10-03T04:21:12.899Z","markdown":"---\ntitle: 12. Virtual Environments and Packages\ndescription: Introduction: Python applications will often use packages and modules that don’t come as part of the standard library. Applications will sometimes need a specific version of a library, because the ...\nimage: https://docs.python.org/3.14/_…","markdownChars":1500,"truncated":true}}}},"400":{"description":"Invalid parameter (`invalid_request`) or a private/local target (`url_not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"url_not_allowed","message":"private, local and reserved hosts are not allowed"}}}}},"413":{"description":"`too_large`: the page or document is larger than 10 MB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The page was not delivered. `error.code` is `target_blocked` (the site refused every region and browser we tried, or served a bot check or an error page), `target_error` (HTTP 404/410, empty page), `target_unreachable` (DNS or network failure), `robots_disallowed` (robots.txt forbids the page for our crawler; send `respectRobots=false` to override) or `unsupported_content`. `error.details.attempts` lists every region and mode that was tried, in order. Not billed by the marketplace (non-2xx).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"success":false,"error":{"code":"target_blocked","message":"the site refused this route (HTTP 403)","details":{"errorType":"blocked","region":"auto","mode":"auto","finalUrl":null,"httpStatus":null,"robots":{"state":"found","allowed":true,"rule":null},"attempts":[{"route":"cf","mode":"http","ok":false,"httpStatus":403,"errorType":"blocked","ms":19},{"route":"us","mode":"http","ok":false,"httpStatus":403,"errorType":"blocked","ms":588},{"route":"cf","mode":"browser","via":"browser-rendering","ok":false,"httpStatus":403,"errorType":"blocked","ms":6762}],"userAgent":"Mozilla/5.0 (compatible; TidyToolsSmartFetch/1.0; +https://apify.com/tidytools/smart-fetch)"}}},"examples":{"blocked":{"summary":"Refused by every route","value":{"success":false,"error":{"code":"target_blocked","message":"the site refused this route (HTTP 403)","details":{"errorType":"blocked","region":"auto","mode":"auto","finalUrl":null,"httpStatus":null,"robots":{"state":"found","allowed":true,"rule":null},"attempts":[{"route":"cf","mode":"http","ok":false,"httpStatus":403,"errorType":"blocked","ms":19},{"route":"us","mode":"http","ok":false,"httpStatus":403,"errorType":"blocked","ms":588},{"route":"cf","mode":"browser","via":"browser-rendering","ok":false,"httpStatus":403,"errorType":"blocked","ms":6762}],"userAgent":"Mozilla/5.0 (compatible; TidyToolsSmartFetch/1.0; +https://apify.com/tidytools/smart-fetch)"}}}},"not_found":{"summary":"Page does not exist","value":{"success":false,"error":{"code":"target_error","message":"the page does not exist (HTTP 404)","details":{"errorType":"not_found","region":"auto","mode":"auto","finalUrl":null,"httpStatus":null,"robots":{"state":"missing","allowed":true,"rule":null},"attempts":[{"route":"cf","mode":"http","ok":false,"httpStatus":404,"errorType":"not_found","ms":7}],"userAgent":"Mozilla/5.0 (compatible; TidyToolsSmartFetch/1.0; +https://apify.com/tidytools/smart-fetch)"}}}}}}}},"503":{"description":"`region_unavailable` (that region is not available right now) or `browser_busy` (no browser was free; retry after the `Retry-After` seconds).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"`timeout`: the site did not answer in time on any route (`error.details.attempts` shows where).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["success","error"],"properties":{"success":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_configured","unauthorized","not_found","method_not_allowed","invalid_request","rate_limited","url_not_allowed","target_blocked","target_unreachable","target_error","unsupported_content","too_large","timeout","upstream_error","board_not_found","app_not_found","robots_disallowed","browser_busy","region_unavailable","no_region_delivered","location_not_found"]},"message":{"type":"string"},"retryable":{"type":"boolean","description":"true for rate_limited, timeout, upstream_error and browser_busy; false for other errors."},"retryAfterSeconds":{"type":"integer","description":"Seconds to wait before retrying, when a numeric Retry-After header is present."},"details":{"type":"object","additionalProperties":true}}}}}}}}