{
  "openapi": "3.1.0",
  "x-zeroclick-navigation": {
    "fullSpec": "https://agents.zenrows.com/zcj/ual7m94zw5th/openapi.json",
    "services": "https://agents.zenrows.com/zcj/ual7m94zw5th/services",
    "serviceSpecTemplate": "https://agents.zenrows.com/zcj/ual7m94zw5th/services/{slug}/openapi.json",
    "searchTemplate": "https://agents.zenrows.com/zcj/ual7m94zw5th/openapi.json?q={text}",
    "operationTemplate": "https://agents.zenrows.com/zcj/ual7m94zw5th/openapi.json?path={path}&method={method}",
    "firstPage": "https://agents.zenrows.com/zcj/ual7m94zw5th/openapi.json?page=1",
    "instructions": [
      "Use this spec if it contains the operation and details you need. Otherwise, search or open a relevant service spec using the links below.",
      "Find service slugs in x-zeroclick-services or x-payment-info.rates[].service; use them in serviceSpecTemplate, never as request values.",
      "URL-encode template values. Search is ranked; service, path, and method filters are exact. Filters combine.",
      "Pages contain up to 10 operations; follow info.x-next or the Link header if you need more results. Shared operations retain all selector values."
    ]
  },
  "info": {
    "title": "Zenrows",
    "version": "1.0.0",
    "description": "Zenrows gives AI agents reliable access to the live web. Your agent asks for a page and gets it back clean, ready for a model to read, even on sites that are hard to get.\r\n\r\nFetch returns any page your agent needs as Markdown, HTML, plain text, a PDF or a screenshot. Extract returns its data as structured JSON.\r\n\r\nYou only pay for the pages that come back. This server is a pay-per-use, transparent proxy in front of Zenrows's own API: it handles identity, payment, and proxying. Agents can purchase autonomously or with their human's approval. Operations whose x-payment-info.access is \"plan\" are sold on plans, not per call: they answer an unidentified call with 401 and an identified call with no covering plan with 403, never a 402. The complete verified paid surface is listed at /openapi.json, the source of truth for available operations. Each operation here carries its pricing in x-payment-info. Use the operations and details here when they meet your needs. Filtered specs contain only matching operations; if you cannot find what you need here, use search or the service catalog. The live catalog at /manifest.json is authoritative for prices and any free included units (prices[].includedUnits) - some meters include free usage per account before any charge, reserved for agents claimed by a human with a verified email.",
    "contact": {
      "email": "support@zenrows.com"
    },
    "x-guidance": "This is a filtered API reference. Request and response schemas are preserved. Shared operations retain selector values and prices for all their services; service slugs are pricing labels, never request values. If this spec lacks what you need, use the navigation links to search or open a relevant service spec."
  },
  "x-service-info": {
    "categories": [
      "data",
      "web"
    ],
    "docs": {
      "homepage": "https://www.zenrows.com",
      "apiReference": "https://agents.zenrows.com/zcj/ual7m94zw5th/openapi.json",
      "llms": "https://agents.zenrows.com/zcj/ual7m94zw5th/llms.txt"
    }
  },
  "externalDocs": {
    "url": "https://agents.zenrows.com/zcj/ual7m94zw5th/llms-full.txt",
    "description": "How to authenticate, pay, and call this API; links the upstream API reference."
  },
  "servers": [
    {
      "url": "https://agents.zenrows.com/zcj/ual7m94zw5th",
      "description": "Pay-per-use access to Zenrows's API"
    }
  ],
  "security": [
    {
      "payPerUse": []
    }
  ],
  "components": {
    "securitySchemes": {
      "payPerUse": {
        "type": "apiKey",
        "in": "header",
        "name": "x-payment",
        "description": "Pay-per-use access. An unpaid call returns 402 Payment Required with a signed challenge; settle it with a supported payment method (x402 or MPP today) and retry with the proof in this header (x402) or as Authorization: Payment (MPP; use ZC-Agent-Authorization for a separate buyer bearer). No upstream API key is needed, and an agent without a payment method can set one up instantly at no cost."
      },
      "planAccess": {
        "type": "http",
        "scheme": "bearer",
        "description": "Plan access. Calls are sold on plans (credit or subscription), not per call: an unidentified call returns 401 bearer_required with a registration recipe, and an identified call with no covering plan returns 403 plan_required listing the plans that cover it. Reuse your existing agent identity; register only if new (anonymous registration is one free API call; the recipe is at https://agents.zenrows.com/zcj/ual7m94zw5th/auth.md), buy a plan at POST https://agents.zenrows.com/zcj/ual7m94zw5th/plans/{planId}/purchase (its priced 402 settles with a supported payment method - x402 or MPP today - or by card), then retry with the access token as Authorization: Bearer <token>. No upstream API key is needed."
      },
      "sellerAgentX402": {
        "type": "apiKey",
        "in": "header",
        "name": "Payment-Signature",
        "description": "Signed $0 x402 proof from the 402 challenge"
      },
      "sellerAgentMpp": {
        "type": "http",
        "scheme": "Payment",
        "description": "Signed $0 MPP proof from the 402 challenge"
      }
    },
    "schemas": {
      "sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0": {
        "schema": {
          "type": "integer",
          "example": 20
        },
        "description": "Concurrent requests this plan allows. The rate limit, in the unit Zenrows meters: slots in flight, not requests per interval."
      },
      "sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1": {
        "schema": {
          "type": "integer",
          "example": 17
        },
        "description": "Free slots at the moment the request was received. Zero means the next request is refused with 429 until one finishes."
      },
      "sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2": {
        "schema": {
          "type": "number",
          "example": 0.001
        },
        "description": "Cost of this request in US dollars at your plan's price per credit, so it varies with the features the request enabled. `0` when the request is not charged. For the number of credits, read `X-Request-Credits`."
      },
      "sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3": {
        "schema": {
          "type": "integer",
          "example": 5
        },
        "description": "Credits charged for this request. Requests that fail, and Extract refusals such as `REQS007`, `no_data_extracted` and `blocked_document`, are not charged."
      },
      "sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4": {
        "schema": {
          "type": "string",
          "example": "67fa4e35647515d8ad61bb3ee041e1bb"
        },
        "description": "Identifier for this request. Quote it when reporting a problem."
      },
      "sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref5": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "example": "AUTH002"
          },
          "type": {
            "type": "string",
            "format": "uri",
            "example": "https://docs.zenrows.com/api-error-codes#AUTH002"
          },
          "title": {
            "type": "string",
            "example": "Invalid apikey provided (AUTH002)"
          },
          "detail": {
            "type": "string",
            "example": "Invalid API key."
          },
          "status": {
            "type": "integer",
            "example": 401
          },
          "instance": {
            "type": "string",
            "example": "/v1",
            "description": "The request path or a request URN. Quote it when reporting a problem."
          }
        },
        "description": "Zenrows error envelope, sent as `application/problem+json` (RFC 9457 problem details). `code` is the stable identifier to branch on; `type` links to its entry in the catalogue at https://docs.zenrows.com/api-error-codes. Read back from live responses."
      }
    }
  },
  "paths": {
    "/v1/": {
      "get": {
        "summary": "Fetch a page",
        "responses": {
          "200": {
            "content": {
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary",
                  "description": "Screenshot of the page or of the selected element."
                }
              },
              "text/html": {
                "schema": {
                  "type": "string",
                  "description": "The page as returned by the target."
                },
                "example": "<!doctype html>\n<html lang=\"en-US\">\n<head>\n<title>Ecommerce Test Site to Learn Web Scraping</title>\n</head>\n<body>\n<h1>Shop</h1>\n...\n</body>\n</html>"
              },
              "text/plain": {
                "schema": {
                  "type": "string",
                  "description": "The page as plaintext."
                },
                "example": "Ecommerce Test Site to Learn Web Scraping\nShop\nAbominable Hoodie $69.00\n..."
              },
              "text/markdown": {
                "schema": {
                  "type": "string",
                  "description": "The page converted to Markdown."
                },
                "example": "[Ecommerce Test Site to Learn Web Scraping](https://www.scrapingcourse.com/ecommerce/)\n\n# Shop\n\n- [Abominable Hoodie](https://www.scrapingcourse.com/ecommerce/product/abominable-hoodie/) $69.00\n..."
              },
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary",
                  "description": "The page rendered to PDF."
                }
              },
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Structured output: the extracted fields, the autoparsed record, or the JSON envelope with captured network requests.",
                  "additionalProperties": true
                },
                "example": {
                  "html": "<!doctype html>\n<html lang=\"en-US\">...</html>",
                  "parsed": {
                    "product": {
                      "name": "Abominable Hoodie",
                      "category": "Hoodies & Sweatshirts",
                      "availability": "out_of_stock"
                    },
                    "breadcrumbs": [
                      {
                        "url": "https://www.scrapingcourse.com/ecommerce",
                        "name": "Home",
                        "position": 1
                      }
                    ]
                  }
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2",
                "schema": {
                  "type": "string"
                }
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1",
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "The target's content, in the shape the request asked for: HTML by default, Markdown or plaintext with `response_type`, a PDF or PNG/JPEG binary for `response_type=pdf` and the screenshot parameters, and JSON for `extract`, `css_extractor`, `autoparse` or `json_response`."
          },
          "400": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref5"
                },
                "example": {
                  "code": "REQS004",
                  "type": "https://docs.zenrows.com/api-error-codes#REQS004",
                  "title": "Invalid value provided for 'js_render' parameter; invalid boolean value 'maybe' (REQS004)",
                  "status": 400,
                  "instance": "/v1"
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "The request is malformed, or a parameter combination is not allowed."
          },
          "401": {
            "description": "Agent identity credential required: register once, then retry with Authorization: Bearer <token>."
          },
          "402": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref5"
                },
                "example": {
                  "code": "AUTH004",
                  "type": "https://docs.zenrows.com/api-error-codes#AUTH004",
                  "title": "Usage exceeded (AUTH004)",
                  "detail": "This account has used all its credits for the period. Upgrade or add credits to continue.",
                  "status": 402,
                  "instance": "/v1"
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "The account is out of credits, or the plan does not include this capability."
          },
          "403": {
            "description": "No active plan covers this call; the body lists the plans that do. Buy one with your bearer, then retry."
          },
          "413": {
            "description": "Content Too Large"
          },
          "422": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref5"
                },
                "example": {
                  "code": "RESP001",
                  "type": "https://docs.zenrows.com/api-error-codes#RESP001",
                  "title": "Could not get content (RESP001)",
                  "detail": "The target could not be returned under this configuration. Try js_render=true and premium_proxy=true, or mode=auto.",
                  "status": 422,
                  "instance": "/v1"
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "Zenrows reached the target but could not return it under the requested configuration. With `extract`, the lowercase code `no_data_extracted` means something else: Extract knows this kind of page and applied its extraction, but no field came back filled. That answer is not charged, carries no HTML, and comes back the same on a retry, so do not retry it; check that the page rendered fully instead. The lowercase code `blocked_document` means the page Zenrows fetched was a bot challenge, an error page or a page that had not finished loading, so Extract had nothing real to read. It is not charged either; retry with `js_render=true` and/or `premium_proxy=true`, or with Adaptive Stealth Mode (`mode=auto`). Documented at https://docs.zenrows.com/api-error-codes#no_data_extracted."
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref5"
                },
                "example": {
                  "code": "AUTH008",
                  "type": "https://docs.zenrows.com/api-error-codes#AUTH008",
                  "title": "Concurrency limit reached (AUTH008)",
                  "detail": "Every concurrency slot on the plan is in use. Retry when a request in flight finishes.",
                  "status": 429,
                  "instance": "/v1"
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "Error `AUTH008`: every concurrency slot on the plan is occupied. There is no fixed requests-per-minute quota to wait out and no Retry-After to read: a slot frees when one of your requests in flight finishes. Read `Concurrency-Remaining` on any response to pace yourself, and back off exponentially before retrying. Documented at https://docs.zenrows.com/api-error-codes#AUTH008 and https://docs.zenrows.com/fetch/features/concurrency."
          }
        },
        "parameters": [
          {
            "in": "query",
            "name": "url",
            "schema": {
              "type": "string",
              "format": "uri",
              "examples": [
                "https://www.scrapingcourse.com/ecommerce/"
              ]
            },
            "example": "https://www.scrapingcourse.com/ecommerce/",
            "required": true,
            "description": "The URL of the page to retrieve."
          },
          {
            "in": "query",
            "name": "mode",
            "schema": {
              "enum": [
                "auto"
              ],
              "type": "string"
            },
            "required": false,
            "description": "Adaptive Stealth Mode. `auto` starts from the cheapest viable configuration and escalates to JavaScript rendering or premium proxies only when the target requires it. You are billed for the configuration that succeeds."
          },
          {
            "in": "query",
            "name": "js_render",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Render the page in a headless browser before returning it. Required for content that only exists after JavaScript runs."
          },
          {
            "in": "query",
            "name": "js_instructions",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "JSON array of browser instructions (click, fill, scroll, wait) executed on the page before the content is returned. Requires js_render."
          },
          {
            "in": "query",
            "name": "custom_headers",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Forward your own request headers (cookies, referer) to the target."
          },
          {
            "in": "query",
            "name": "premium_proxy",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Route the request through residential IPs. Required by most protected sites."
          },
          {
            "in": "query",
            "name": "proxy_country",
            "schema": {
              "type": "string",
              "pattern": "^[a-z]{2}$",
              "examples": [
                "us"
              ]
            },
            "example": "us",
            "required": false,
            "description": "Two-letter country code for the exit IP. Requires premium_proxy."
          },
          {
            "in": "query",
            "name": "session_id",
            "schema": {
              "type": "integer"
            },
            "required": false,
            "description": "Reuse the same IP across requests for up to 10 minutes. Any integer you choose identifies the session."
          },
          {
            "in": "query",
            "name": "original_status",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Return the target's own HTTP status code instead of the Zenrows one."
          },
          {
            "in": "query",
            "name": "allowed_status_codes",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Comma-separated status codes whose body should be returned instead of raising an error, for example `404,500`."
          },
          {
            "in": "query",
            "name": "wait_for",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "CSS selector to wait for before returning. Requires js_render."
          },
          {
            "in": "query",
            "name": "wait",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            },
            "required": false,
            "description": "Milliseconds to wait after load before returning. Requires js_render."
          },
          {
            "in": "query",
            "name": "block_resources",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Comma-separated resource types to block (for example `image,media,font`). Blocking is on by default."
          },
          {
            "in": "query",
            "name": "json_response",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Return a JSON envelope that also carries the network requests (XHR/fetch) the page made."
          },
          {
            "in": "query",
            "name": "css_extractor",
            "schema": {
              "type": "string",
              "examples": [
                "{\"title\":\"h1\",\"price\":\".price\"}"
              ]
            },
            "example": "{\"title\":\"h1\",\"price\":\".price\"}",
            "required": false,
            "description": "JSON object mapping output keys to CSS selectors, applied to the retrieved page."
          },
          {
            "in": "query",
            "name": "extract",
            "schema": {
              "enum": [
                "auto",
                "native",
                "standard"
              ],
              "type": "string"
            },
            "required": false,
            "description": "Return structured JSON extracted from the page with no selectors to write (Extract). Omit it and Extract is off. `auto` and `native` return the website's own field names; `standard` returns a canonical schema shared by every website in a vertical (real estate only for now). Extract works on any prepared domain, with any active API key (prepare a new one with `POST /extract/prepared-domains`), and is currently free on top of the Fetch cost. A domain, or a kind of page on it, that is not prepared yet answers 403 `REQS007`: see `requestExtractDomain`."
          },
          {
            "in": "query",
            "name": "extract_fields",
            "schema": {
              "type": "string",
              "examples": [
                "products.name,products.price"
              ]
            },
            "example": "products.name,products.price",
            "required": false,
            "description": "Comma-separated list of the fields `extract` should return, dot-notated for fields inside a group (for example `products.name,products.price`). Omit it to receive every field."
          },
          {
            "in": "query",
            "name": "autoparse",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "deprecated": true,
            "description": "Deprecated in favour of Extract (`extract=auto`). Returns general-purpose JSON parsed from the page, not tailored to the website."
          },
          {
            "in": "query",
            "name": "response_type",
            "schema": {
              "enum": [
                "markdown",
                "plaintext",
                "pdf"
              ],
              "type": "string"
            },
            "required": false,
            "description": "Convert the page before returning it: Markdown, plaintext or PDF."
          },
          {
            "in": "query",
            "name": "screenshot",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Return an above-the-fold screenshot of the page. Requires js_render."
          },
          {
            "in": "query",
            "name": "screenshot_fullpage",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Return a full-page screenshot. Requires js_render."
          },
          {
            "in": "query",
            "name": "screenshot_selector",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Screenshot only the element matching this CSS selector. Requires js_render."
          },
          {
            "in": "query",
            "name": "screenshot_format",
            "schema": {
              "enum": [
                "png",
                "jpeg"
              ],
              "type": "string",
              "default": "png"
            },
            "required": false,
            "description": "Screenshot image format."
          },
          {
            "in": "query",
            "name": "screenshot_quality",
            "schema": {
              "type": "integer",
              "maximum": 100,
              "minimum": 1
            },
            "required": false,
            "description": "JPEG quality, 1 to 100. Only with screenshot_format=jpeg."
          },
          {
            "in": "query",
            "name": "outputs",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Comma-separated data types to pull out of the retrieved HTML (for example `emails,phone_numbers`)."
          }
        ],
        "description": "Retrieve a URL through Zenrows and return its content. The same operation covers Extract (`extract=auto` or `css_extractor`), format conversion (`response_type`), screenshots and structured output, because they are configurations of one request rather than separate endpoints.",
        "operationId": "fetchPage",
        "x-zeroclick-document-sources": [
          {
            "gaps": [],
            "pages": [],
            "sourceId": "sds_rqF2y7CB25919nWKSHcFb",
            "authority": "official",
            "conflicts": [],
            "revisionId": "sdrn_WCRGbgsMEG_jpk-1Qxa2w"
          },
          {
            "gaps": [],
            "pages": [
              1
            ],
            "sourceId": "sds_ENVVT_ppnOK69sfjmVqtW",
            "authority": "supplemental",
            "conflicts": [
              "/responses/200/description",
              "/parameters/query/apikey",
              "/description"
            ],
            "revisionId": "sdrn_JMXjRxICRF7S-cZWoUUMI"
          },
          {
            "gaps": [
              "Missing full list of optional query parameters like js_render or premium_proxy",
              "Missing POST /v1/ definition details"
            ],
            "pages": [
              1
            ],
            "sourceId": "sds_l7n__uyqc_hsWFiJ1d8Tk",
            "authority": "supplemental",
            "conflicts": [
              "/summary",
              "/responses/200/description",
              "/parameters/query/apikey",
              "/parameters/query/response_type/schema/enum",
              "/description",
              "/operationId"
            ],
            "revisionId": "sdrn_dFDhH-lEprSM6k1zgrsm9"
          },
          {
            "gaps": [],
            "pages": [
              1
            ],
            "sourceId": "sds_YeXEGbvpX7xRc49BnGtoT",
            "authority": "supplemental",
            "conflicts": [
              "/responses/200/description",
              "/parameters/query/apikey",
              "/description"
            ],
            "revisionId": "sdrn_mv2xZg4urTPpllmOk2Rts"
          },
          {
            "gaps": [
              "Missing explicit requestBody schema for POST /v1/ in documentation",
              "Missing detailed response schema for GET /v1/"
            ],
            "pages": [
              1,
              2,
              3
            ],
            "sourceId": "sds_zGDRoH1VcSJjoqT9r_CVM",
            "authority": "supplemental",
            "conflicts": [
              "/responses/200/description",
              "/responses/429/description",
              "/parameters/query/apikey",
              "/description",
              "/operationId"
            ],
            "revisionId": "sdrn_FjnZOEsvoHf7gA09QWkot"
          }
        ],
        "x-zeroclick-services": [
          "fetch"
        ],
        "x-payment-info": {
          "access": "plan",
          "price": {
            "mode": "dynamic",
            "currency": "USD",
            "min": "0.500000"
          },
          "rates": [
            {
              "service": "fetch",
              "meter": "credits",
              "unit": "credit",
              "unitSize": 1000,
              "priceUsd": "0.500000",
              "includedUnits": 0
            }
          ]
        },
        "security": [
          {
            "planAccess": []
          }
        ]
      },
      "post": {
        "summary": "Fetch a page with a POST",
        "responses": {
          "200": {
            "content": {
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary",
                  "description": "Screenshot of the page or of the selected element."
                }
              },
              "text/html": {
                "schema": {
                  "type": "string",
                  "description": "The page as returned by the target."
                },
                "example": "<!doctype html>\n<html lang=\"en-US\">\n<head>\n<title>Ecommerce Test Site to Learn Web Scraping</title>\n</head>\n<body>\n<h1>Shop</h1>\n...\n</body>\n</html>"
              },
              "text/plain": {
                "schema": {
                  "type": "string",
                  "description": "The page as plaintext."
                },
                "example": "Ecommerce Test Site to Learn Web Scraping\nShop\nAbominable Hoodie $69.00\n..."
              },
              "text/markdown": {
                "schema": {
                  "type": "string",
                  "description": "The page converted to Markdown."
                },
                "example": "[Ecommerce Test Site to Learn Web Scraping](https://www.scrapingcourse.com/ecommerce/)\n\n# Shop\n\n- [Abominable Hoodie](https://www.scrapingcourse.com/ecommerce/product/abominable-hoodie/) $69.00\n..."
              },
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary",
                  "description": "The page rendered to PDF."
                }
              },
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Structured output: the extracted fields, the autoparsed record, or the JSON envelope with captured network requests.",
                  "additionalProperties": true
                },
                "example": {
                  "html": "<!doctype html>\n<html lang=\"en-US\">...</html>",
                  "parsed": {
                    "product": {
                      "name": "Abominable Hoodie",
                      "category": "Hoodies & Sweatshirts",
                      "availability": "out_of_stock"
                    },
                    "breadcrumbs": [
                      {
                        "url": "https://www.scrapingcourse.com/ecommerce",
                        "name": "Home",
                        "position": 1
                      }
                    ]
                  }
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "The target's content, in the shape the request asked for: HTML by default, Markdown or plaintext with `response_type`, a PDF or PNG/JPEG binary for `response_type=pdf` and the screenshot parameters, and JSON for `extract`, `css_extractor`, `autoparse` or `json_response`."
          },
          "400": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref5"
                },
                "example": {
                  "code": "REQS004",
                  "type": "https://docs.zenrows.com/api-error-codes#REQS004",
                  "title": "Invalid value provided for 'js_render' parameter; invalid boolean value 'maybe' (REQS004)",
                  "status": 400,
                  "instance": "/v1"
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "The request is malformed, or a parameter combination is not allowed."
          },
          "401": {
            "description": "Agent identity credential required: register once, then retry with Authorization: Bearer <token>."
          },
          "402": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref5"
                },
                "example": {
                  "code": "AUTH004",
                  "type": "https://docs.zenrows.com/api-error-codes#AUTH004",
                  "title": "Usage exceeded (AUTH004)",
                  "detail": "This account has used all its credits for the period. Upgrade or add credits to continue.",
                  "status": 402,
                  "instance": "/v1"
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "The account is out of credits, or the plan does not include this capability."
          },
          "403": {
            "description": "No active plan covers this call; the body lists the plans that do. Buy one with your bearer, then retry."
          },
          "422": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref5"
                },
                "example": {
                  "code": "RESP001",
                  "type": "https://docs.zenrows.com/api-error-codes#RESP001",
                  "title": "Could not get content (RESP001)",
                  "detail": "The target could not be returned under this configuration. Try js_render=true and premium_proxy=true, or mode=auto.",
                  "status": 422,
                  "instance": "/v1"
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "Zenrows reached the target but could not return it under the requested configuration. With `extract`, the lowercase code `no_data_extracted` means something else: Extract knows this kind of page and applied its extraction, but no field came back filled. That answer is not charged, carries no HTML, and comes back the same on a retry, so do not retry it; check that the page rendered fully instead. The lowercase code `blocked_document` means the page Zenrows fetched was a bot challenge, an error page or a page that had not finished loading, so Extract had nothing real to read. It is not charged either; retry with `js_render=true` and/or `premium_proxy=true`, or with Adaptive Stealth Mode (`mode=auto`). Documented at https://docs.zenrows.com/api-error-codes#no_data_extracted."
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref5"
                },
                "example": {
                  "code": "AUTH008",
                  "type": "https://docs.zenrows.com/api-error-codes#AUTH008",
                  "title": "Concurrency limit reached (AUTH008)",
                  "detail": "Every concurrency slot on the plan is in use. Retry when a request in flight finishes.",
                  "status": 429,
                  "instance": "/v1"
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "Error `AUTH008`: every concurrency slot on the plan is occupied. There is no fixed requests-per-minute quota to wait out and no Retry-After to read: a slot frees when one of your requests in flight finishes. Read `Concurrency-Remaining` on any response to pace yourself, and back off exponentially before retrying. Documented at https://docs.zenrows.com/api-error-codes#AUTH008 and https://docs.zenrows.com/fetch/features/concurrency."
          }
        },
        "parameters": [
          {
            "in": "query",
            "name": "url",
            "schema": {
              "type": "string",
              "format": "uri",
              "examples": [
                "https://www.scrapingcourse.com/ecommerce/"
              ]
            },
            "example": "https://www.scrapingcourse.com/ecommerce/",
            "required": true,
            "description": "The URL of the page to retrieve."
          },
          {
            "in": "query",
            "name": "mode",
            "schema": {
              "enum": [
                "auto"
              ],
              "type": "string"
            },
            "required": false,
            "description": "Adaptive Stealth Mode. `auto` starts from the cheapest viable configuration and escalates to JavaScript rendering or premium proxies only when the target requires it. You are billed for the configuration that succeeds."
          },
          {
            "in": "query",
            "name": "js_render",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Render the page in a headless browser before returning it. Required for content that only exists after JavaScript runs."
          },
          {
            "in": "query",
            "name": "js_instructions",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "JSON array of browser instructions (click, fill, scroll, wait) executed on the page before the content is returned. Requires js_render."
          },
          {
            "in": "query",
            "name": "custom_headers",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Forward your own request headers (cookies, referer) to the target."
          },
          {
            "in": "query",
            "name": "premium_proxy",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Route the request through residential IPs. Required by most protected sites."
          },
          {
            "in": "query",
            "name": "proxy_country",
            "schema": {
              "type": "string",
              "pattern": "^[a-z]{2}$",
              "examples": [
                "us"
              ]
            },
            "example": "us",
            "required": false,
            "description": "Two-letter country code for the exit IP. Requires premium_proxy."
          },
          {
            "in": "query",
            "name": "session_id",
            "schema": {
              "type": "integer"
            },
            "required": false,
            "description": "Reuse the same IP across requests for up to 10 minutes. Any integer you choose identifies the session."
          },
          {
            "in": "query",
            "name": "original_status",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Return the target's own HTTP status code instead of the Zenrows one."
          },
          {
            "in": "query",
            "name": "allowed_status_codes",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Comma-separated status codes whose body should be returned instead of raising an error, for example `404,500`."
          },
          {
            "in": "query",
            "name": "wait_for",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "CSS selector to wait for before returning. Requires js_render."
          },
          {
            "in": "query",
            "name": "wait",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            },
            "required": false,
            "description": "Milliseconds to wait after load before returning. Requires js_render."
          },
          {
            "in": "query",
            "name": "block_resources",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Comma-separated resource types to block (for example `image,media,font`). Blocking is on by default."
          },
          {
            "in": "query",
            "name": "json_response",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Return a JSON envelope that also carries the network requests (XHR/fetch) the page made."
          },
          {
            "in": "query",
            "name": "css_extractor",
            "schema": {
              "type": "string",
              "examples": [
                "{\"title\":\"h1\",\"price\":\".price\"}"
              ]
            },
            "example": "{\"title\":\"h1\",\"price\":\".price\"}",
            "required": false,
            "description": "JSON object mapping output keys to CSS selectors, applied to the retrieved page."
          },
          {
            "in": "query",
            "name": "extract",
            "schema": {
              "enum": [
                "auto",
                "native",
                "standard"
              ],
              "type": "string"
            },
            "required": false,
            "description": "Return structured JSON extracted from the page with no selectors to write (Extract). Omit it and Extract is off. `auto` and `native` return the website's own field names; `standard` returns a canonical schema shared by every website in a vertical (real estate only for now). Extract works on any prepared domain, with any active API key (prepare a new one with `POST /extract/prepared-domains`), and is currently free on top of the Fetch cost. A domain, or a kind of page on it, that is not prepared yet answers 403 `REQS007`: see `requestExtractDomain`."
          },
          {
            "in": "query",
            "name": "extract_fields",
            "schema": {
              "type": "string",
              "examples": [
                "products.name,products.price"
              ]
            },
            "example": "products.name,products.price",
            "required": false,
            "description": "Comma-separated list of the fields `extract` should return, dot-notated for fields inside a group (for example `products.name,products.price`). Omit it to receive every field."
          },
          {
            "in": "query",
            "name": "autoparse",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "deprecated": true,
            "description": "Deprecated in favour of Extract (`extract=auto`). Returns general-purpose JSON parsed from the page, not tailored to the website."
          },
          {
            "in": "query",
            "name": "response_type",
            "schema": {
              "enum": [
                "markdown",
                "plaintext",
                "pdf"
              ],
              "type": "string"
            },
            "required": false,
            "description": "Convert the page before returning it: Markdown, plaintext or PDF."
          },
          {
            "in": "query",
            "name": "screenshot",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Return an above-the-fold screenshot of the page. Requires js_render."
          },
          {
            "in": "query",
            "name": "screenshot_fullpage",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Return a full-page screenshot. Requires js_render."
          },
          {
            "in": "query",
            "name": "screenshot_selector",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Screenshot only the element matching this CSS selector. Requires js_render."
          },
          {
            "in": "query",
            "name": "screenshot_format",
            "schema": {
              "enum": [
                "png",
                "jpeg"
              ],
              "type": "string",
              "default": "png"
            },
            "required": false,
            "description": "Screenshot image format."
          },
          {
            "in": "query",
            "name": "screenshot_quality",
            "schema": {
              "type": "integer",
              "maximum": 100,
              "minimum": 1
            },
            "required": false,
            "description": "JPEG quality, 1 to 100. Only with screenshot_format=jpeg."
          },
          {
            "in": "query",
            "name": "outputs",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Comma-separated data types to pull out of the retrieved HTML (for example `emails,phone_numbers`)."
          }
        ],
        "description": "Send a POST to the target through Zenrows. Takes the same query parameters as fetchPage; the request body is forwarded to the target as is, and the response carries the target's content.",
        "operationId": "fetchPagePost",
        "requestBody": {
          "content": {
            "*/*": {
              "schema": {
                "type": "string"
              }
            },
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            }
          },
          "description": "Forwarded to the target as is."
        },
        "x-zeroclick-document-sources": [
          {
            "gaps": [],
            "pages": [],
            "sourceId": "sds_rqF2y7CB25919nWKSHcFb",
            "authority": "official",
            "conflicts": [],
            "revisionId": "sdrn_WCRGbgsMEG_jpk-1Qxa2w"
          }
        ],
        "x-zeroclick-services": [
          "fetch"
        ],
        "x-payment-info": {
          "access": "plan",
          "price": {
            "mode": "dynamic",
            "currency": "USD",
            "min": "0.500000"
          },
          "rates": [
            {
              "service": "fetch",
              "meter": "credits",
              "unit": "credit",
              "unitSize": 1000,
              "priceUsd": "0.500000",
              "includedUnits": 0
            }
          ]
        },
        "security": [
          {
            "planAccess": []
          }
        ]
      },
      "put": {
        "summary": "Fetch a page with a PUT",
        "responses": {
          "200": {
            "content": {
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary",
                  "description": "Screenshot of the page or of the selected element."
                }
              },
              "text/html": {
                "schema": {
                  "type": "string",
                  "description": "The page as returned by the target."
                },
                "example": "<!doctype html>\n<html lang=\"en-US\">\n<head>\n<title>Ecommerce Test Site to Learn Web Scraping</title>\n</head>\n<body>\n<h1>Shop</h1>\n...\n</body>\n</html>"
              },
              "text/plain": {
                "schema": {
                  "type": "string",
                  "description": "The page as plaintext."
                },
                "example": "Ecommerce Test Site to Learn Web Scraping\nShop\nAbominable Hoodie $69.00\n..."
              },
              "text/markdown": {
                "schema": {
                  "type": "string",
                  "description": "The page converted to Markdown."
                },
                "example": "[Ecommerce Test Site to Learn Web Scraping](https://www.scrapingcourse.com/ecommerce/)\n\n# Shop\n\n- [Abominable Hoodie](https://www.scrapingcourse.com/ecommerce/product/abominable-hoodie/) $69.00\n..."
              },
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary",
                  "description": "The page rendered to PDF."
                }
              },
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Structured output: the extracted fields, the autoparsed record, or the JSON envelope with captured network requests.",
                  "additionalProperties": true
                },
                "example": {
                  "html": "<!doctype html>\n<html lang=\"en-US\">...</html>",
                  "parsed": {
                    "product": {
                      "name": "Abominable Hoodie",
                      "category": "Hoodies & Sweatshirts",
                      "availability": "out_of_stock"
                    },
                    "breadcrumbs": [
                      {
                        "url": "https://www.scrapingcourse.com/ecommerce",
                        "name": "Home",
                        "position": 1
                      }
                    ]
                  }
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "The target's content, in the shape the request asked for: HTML by default, Markdown or plaintext with `response_type`, a PDF or PNG/JPEG binary for `response_type=pdf` and the screenshot parameters, and JSON for `extract`, `css_extractor`, `autoparse` or `json_response`."
          },
          "400": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref5"
                },
                "example": {
                  "code": "REQS004",
                  "type": "https://docs.zenrows.com/api-error-codes#REQS004",
                  "title": "Invalid value provided for 'js_render' parameter; invalid boolean value 'maybe' (REQS004)",
                  "status": 400,
                  "instance": "/v1"
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "The request is malformed, or a parameter combination is not allowed."
          },
          "401": {
            "description": "Agent identity credential required: register once, then retry with Authorization: Bearer <token>."
          },
          "402": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref5"
                },
                "example": {
                  "code": "AUTH004",
                  "type": "https://docs.zenrows.com/api-error-codes#AUTH004",
                  "title": "Usage exceeded (AUTH004)",
                  "detail": "This account has used all its credits for the period. Upgrade or add credits to continue.",
                  "status": 402,
                  "instance": "/v1"
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "The account is out of credits, or the plan does not include this capability."
          },
          "403": {
            "description": "No active plan covers this call; the body lists the plans that do. Buy one with your bearer, then retry."
          },
          "422": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref5"
                },
                "example": {
                  "code": "RESP001",
                  "type": "https://docs.zenrows.com/api-error-codes#RESP001",
                  "title": "Could not get content (RESP001)",
                  "detail": "The target could not be returned under this configuration. Try js_render=true and premium_proxy=true, or mode=auto.",
                  "status": 422,
                  "instance": "/v1"
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "Zenrows reached the target but could not return it under the requested configuration. With `extract`, the lowercase code `no_data_extracted` means something else: Extract knows this kind of page and applied its extraction, but no field came back filled. That answer is not charged, carries no HTML, and comes back the same on a retry, so do not retry it; check that the page rendered fully instead. The lowercase code `blocked_document` means the page Zenrows fetched was a bot challenge, an error page or a page that had not finished loading, so Extract had nothing real to read. It is not charged either; retry with `js_render=true` and/or `premium_proxy=true`, or with Adaptive Stealth Mode (`mode=auto`). Documented at https://docs.zenrows.com/api-error-codes#no_data_extracted."
          },
          "429": {
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref5"
                },
                "example": {
                  "code": "AUTH008",
                  "type": "https://docs.zenrows.com/api-error-codes#AUTH008",
                  "title": "Concurrency limit reached (AUTH008)",
                  "detail": "Every concurrency slot on the plan is in use. Retry when a request in flight finishes.",
                  "status": 429,
                  "instance": "/v1"
                }
              }
            },
            "headers": {
              "X-Request-Id": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref4"
              },
              "X-Request-Cost": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref2"
              },
              "Concurrency-Limit": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref0"
              },
              "X-Request-Credits": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref3"
              },
              "Concurrency-Remaining": {
                "$ref": "#/components/schemas/sds_rqF2y7CB25919nWKSHcFb_60495ef7b903276c_ref1"
              }
            },
            "description": "Error `AUTH008`: every concurrency slot on the plan is occupied. There is no fixed requests-per-minute quota to wait out and no Retry-After to read: a slot frees when one of your requests in flight finishes. Read `Concurrency-Remaining` on any response to pace yourself, and back off exponentially before retrying. Documented at https://docs.zenrows.com/api-error-codes#AUTH008 and https://docs.zenrows.com/fetch/features/concurrency."
          }
        },
        "parameters": [
          {
            "in": "query",
            "name": "url",
            "schema": {
              "type": "string",
              "format": "uri",
              "examples": [
                "https://www.scrapingcourse.com/ecommerce/"
              ]
            },
            "example": "https://www.scrapingcourse.com/ecommerce/",
            "required": true,
            "description": "The URL of the page to retrieve."
          },
          {
            "in": "query",
            "name": "mode",
            "schema": {
              "enum": [
                "auto"
              ],
              "type": "string"
            },
            "required": false,
            "description": "Adaptive Stealth Mode. `auto` starts from the cheapest viable configuration and escalates to JavaScript rendering or premium proxies only when the target requires it. You are billed for the configuration that succeeds."
          },
          {
            "in": "query",
            "name": "js_render",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Render the page in a headless browser before returning it. Required for content that only exists after JavaScript runs."
          },
          {
            "in": "query",
            "name": "js_instructions",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "JSON array of browser instructions (click, fill, scroll, wait) executed on the page before the content is returned. Requires js_render."
          },
          {
            "in": "query",
            "name": "custom_headers",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Forward your own request headers (cookies, referer) to the target."
          },
          {
            "in": "query",
            "name": "premium_proxy",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Route the request through residential IPs. Required by most protected sites."
          },
          {
            "in": "query",
            "name": "proxy_country",
            "schema": {
              "type": "string",
              "pattern": "^[a-z]{2}$",
              "examples": [
                "us"
              ]
            },
            "example": "us",
            "required": false,
            "description": "Two-letter country code for the exit IP. Requires premium_proxy."
          },
          {
            "in": "query",
            "name": "session_id",
            "schema": {
              "type": "integer"
            },
            "required": false,
            "description": "Reuse the same IP across requests for up to 10 minutes. Any integer you choose identifies the session."
          },
          {
            "in": "query",
            "name": "original_status",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Return the target's own HTTP status code instead of the Zenrows one."
          },
          {
            "in": "query",
            "name": "allowed_status_codes",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Comma-separated status codes whose body should be returned instead of raising an error, for example `404,500`."
          },
          {
            "in": "query",
            "name": "wait_for",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "CSS selector to wait for before returning. Requires js_render."
          },
          {
            "in": "query",
            "name": "wait",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            },
            "required": false,
            "description": "Milliseconds to wait after load before returning. Requires js_render."
          },
          {
            "in": "query",
            "name": "block_resources",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Comma-separated resource types to block (for example `image,media,font`). Blocking is on by default."
          },
          {
            "in": "query",
            "name": "json_response",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Return a JSON envelope that also carries the network requests (XHR/fetch) the page made."
          },
          {
            "in": "query",
            "name": "css_extractor",
            "schema": {
              "type": "string",
              "examples": [
                "{\"title\":\"h1\",\"price\":\".price\"}"
              ]
            },
            "example": "{\"title\":\"h1\",\"price\":\".price\"}",
            "required": false,
            "description": "JSON object mapping output keys to CSS selectors, applied to the retrieved page."
          },
          {
            "in": "query",
            "name": "extract",
            "schema": {
              "enum": [
                "auto",
                "native",
                "standard"
              ],
              "type": "string"
            },
            "required": false,
            "description": "Return structured JSON extracted from the page with no selectors to write (Extract). Omit it and Extract is off. `auto` and `native` return the website's own field names; `standard` returns a canonical schema shared by every website in a vertical (real estate only for now). Extract works on any prepared domain, with any active API key (prepare a new one with `POST /extract/prepared-domains`), and is currently free on top of the Fetch cost. A domain, or a kind of page on it, that is not prepared yet answers 403 `REQS007`: see `requestExtractDomain`."
          },
          {
            "in": "query",
            "name": "extract_fields",
            "schema": {
              "type": "string",
              "examples": [
                "products.name,products.price"
              ]
            },
            "example": "products.name,products.price",
            "required": false,
            "description": "Comma-separated list of the fields `extract` should return, dot-notated for fields inside a group (for example `products.name,products.price`). Omit it to receive every field."
          },
          {
            "in": "query",
            "name": "autoparse",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "deprecated": true,
            "description": "Deprecated in favour of Extract (`extract=auto`). Returns general-purpose JSON parsed from the page, not tailored to the website."
          },
          {
            "in": "query",
            "name": "response_type",
            "schema": {
              "enum": [
                "markdown",
                "plaintext",
                "pdf"
              ],
              "type": "string"
            },
            "required": false,
            "description": "Convert the page before returning it: Markdown, plaintext or PDF."
          },
          {
            "in": "query",
            "name": "screenshot",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Return an above-the-fold screenshot of the page. Requires js_render."
          },
          {
            "in": "query",
            "name": "screenshot_fullpage",
            "schema": {
              "type": "boolean",
              "default": false
            },
            "required": false,
            "description": "Return a full-page screenshot. Requires js_render."
          },
          {
            "in": "query",
            "name": "screenshot_selector",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Screenshot only the element matching this CSS selector. Requires js_render."
          },
          {
            "in": "query",
            "name": "screenshot_format",
            "schema": {
              "enum": [
                "png",
                "jpeg"
              ],
              "type": "string",
              "default": "png"
            },
            "required": false,
            "description": "Screenshot image format."
          },
          {
            "in": "query",
            "name": "screenshot_quality",
            "schema": {
              "type": "integer",
              "maximum": 100,
              "minimum": 1
            },
            "required": false,
            "description": "JPEG quality, 1 to 100. Only with screenshot_format=jpeg."
          },
          {
            "in": "query",
            "name": "outputs",
            "schema": {
              "type": "string"
            },
            "required": false,
            "description": "Comma-separated data types to pull out of the retrieved HTML (for example `emails,phone_numbers`)."
          }
        ],
        "description": "Send a PUT to the target through Zenrows. Takes the same query parameters as fetchPage; the request body is forwarded to the target as is, and the response carries the target's content.",
        "operationId": "fetchPagePut",
        "requestBody": {
          "content": {
            "*/*": {
              "schema": {
                "type": "string"
              }
            },
            "application/json": {
              "schema": {}
            },
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            }
          },
          "description": "Forwarded to the target as is."
        },
        "x-zeroclick-document-sources": [
          {
            "gaps": [],
            "pages": [],
            "sourceId": "sds_rqF2y7CB25919nWKSHcFb",
            "authority": "official",
            "conflicts": [],
            "revisionId": "sdrn_WCRGbgsMEG_jpk-1Qxa2w"
          },
          {
            "gaps": [
              "Full OpenAPI schema details for parameters and responses are not provided in the source text; relying on the example provided."
            ],
            "pages": [
              1
            ],
            "sourceId": "sds_1ej8EBvw1CgwPnJ4H3h8D",
            "authority": "supplemental",
            "conflicts": [
              "/summary",
              "/responses/200/description",
              "/parameters/query/apikey",
              "/description",
              "/operationId"
            ],
            "revisionId": "sdrn_1rDOV25IIkeIVJSZnhLr0"
          }
        ],
        "x-zeroclick-services": [
          "fetch"
        ],
        "x-payment-info": {
          "access": "plan",
          "price": {
            "mode": "dynamic",
            "currency": "USD",
            "min": "0.500000"
          },
          "rates": [
            {
              "service": "fetch",
              "meter": "credits",
              "unit": "credit",
              "unitSize": 1000,
              "priceUsd": "0.500000",
              "includedUnits": 0
            }
          ]
        },
        "security": [
          {
            "planAccess": []
          }
        ]
      }
    }
  },
  "x-zeroclick-navigation-footer": {
    "instructions": [
      "Use this spec if it contains the operation and details you need. Otherwise, search or open a relevant service spec using the links below.",
      "Find service slugs in x-zeroclick-services or x-payment-info.rates[].service; use them in serviceSpecTemplate, never as request values.",
      "URL-encode template values. Search is ranked; service, path, and method filters are exact. Filters combine.",
      "Pages contain up to 10 operations; follow info.x-next or the Link header if you need more results. Shared operations retain all selector values."
    ],
    "fullSpec": "https://agents.zenrows.com/zcj/ual7m94zw5th/openapi.json",
    "services": "https://agents.zenrows.com/zcj/ual7m94zw5th/services",
    "serviceSpecTemplate": "https://agents.zenrows.com/zcj/ual7m94zw5th/services/{slug}/openapi.json",
    "searchTemplate": "https://agents.zenrows.com/zcj/ual7m94zw5th/openapi.json?q={text}",
    "operationTemplate": "https://agents.zenrows.com/zcj/ual7m94zw5th/openapi.json?path={path}&method={method}",
    "firstPage": "https://agents.zenrows.com/zcj/ual7m94zw5th/openapi.json?page=1"
  }
}
