{
  "openapi": "3.1.0",
  "info": {
    "title": "HProxy API",
    "version": "1.0.0",
    "description": "Buy and manage proxies from a prepaid wallet, run the Scraper API, or use the free no-key APIs: a live proxy list, a proxy checker and an IP lookup. JSON in, JSON out. Money is always integer cents (120 = $1.20), never floats.",
    "contact": {
      "url": "https://hproxy.com/contact"
    },
    "license": {
      "name": "Proprietary"
    }
  },
  "servers": [
    {
      "url": "https://hproxy.com",
      "description": "Production"
    }
  ],
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key",
        "description": "Your API key. Free keyless endpoints ignore it."
      }
    }
  },
  "security": [
    {
      "ApiKeyAuth": []
    }
  ],
  "paths": {
    "/api/v1/me": {
      "get": {
        "operationId": "me",
        "summary": "Who am I",
        "description": "The fastest check that a key works. Accepts **any** valid key (no scope needed) and echoes the account it acts for plus the scopes the key carries.",
        "tags": [
          "Account & wallet"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "userId": "usr_1a2b3c",
                  "email": "you@example.com",
                  "scopes": [
                    "buy",
                    "scrape"
                  ],
                  "dailySpendCapCents": null
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/wallet": {
      "get": {
        "operationId": "wallet",
        "summary": "Get wallet",
        "description": "Your current wallet balance, in integer cents.",
        "tags": [
          "Account & wallet"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "balanceCents": 25765,
                  "currency": "USD"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/deposits": {
      "post": {
        "operationId": "partner-deposit-create",
        "summary": "Let the named customer pay you",
        "description": "With `X-Reseller-Customer-Id`, this creates an invoice on **your own** payment gateway (connected under Payments in your business dashboard) and returns its pay page: crypto through Heleket or NOWPayments (`method: \"crypto\"`), cards through Stripe Checkout or Payoneer Checkout (`method: \"card\"`); one live gateway per rail. The page shows your merchant name, the money goes to your account, and when it arrives we credit the customer's store credit automatically: the exact amount, the whole amount when they overpay, and what actually arrived when a crypto invoice closes short. Amounts are whole cents; sub-floor amounts are raised to the method floor ($3 crypto, $10 card) and one invoice is at most $5,000. Send an `Idempotency-Key` and a retried request returns the same open invoice. No gateway for that method ⇒ `403 deposits_not_available`.\n\n**An order can pay for itself.** [`POST /orders`](/docs/proxy-api/orders) for a named customer with `method: \"crypto\"` or `\"card\"` and short credit still answers `402 customer_credit_insufficient`, but with `payUrl`, `depositId`, `chargeCents` (the shortfall raised to the rail's minimum) and `shortfallCents` added. Send the customer to `payUrl`: when the money lands, the credit is granted and the order is placed automatically under the same `Idempotency-Key`, a Telegram customer is told in the store's bot, and [`GET /deposits/{id}`](#partner-deposit-get) shows `for_order: true`. Without a gateway for that rail the 402 carries no pay page and the customer needs credit first.",
        "tags": [
          "Reseller API: act as your customers"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "deposit_id": "rpay_cmt9x2k1a0001",
                  "pay_url": "https://pay.heleket.com/pay/4f1c…",
                  "amount_cents": 2500,
                  "status": "awaiting_payment"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "amount_cents": {
                    "type": "integer",
                    "description": "Whole cents at your prices."
                  },
                  "method": {
                    "type": "string",
                    "description": "\"crypto\" or \"card\". Default \"card\"."
                  },
                  "return_url": {
                    "type": "string",
                    "description": "Where the customer lands after paying (https). Default: your website, else your Telegram storefront."
                  }
                },
                "required": [
                  "amount_cents"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/announcements": {
      "get": {
        "operationId": "announcements",
        "summary": "List live notices",
        "description": "Every published notice addressed to an audience your account belongs to, newest first, at most 50. Accepts **any** valid key (no scope needed). Poll it once an hour at most: it is not a queue, and nothing is lost by polling less. Branch on `kind`.",
        "tags": [
          "Service notices"
        ],
        "parameters": [
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "description": "`INFO`, `MAINTENANCE`, `INCIDENT`, `RELEASE`, `PRICING` or `ACTION_REQUIRED`. Treat `ACTION_REQUIRED` as a ticket: an integration has something to change, usually with a date in the body.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "audience",
            "in": "query",
            "required": false,
            "description": "`ALL`, `CUSTOMERS`, `PARTNERS` or `DEVELOPERS`. Every account holding an API key is in `DEVELOPERS`, so notices about the API always reach you here.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "publishedAt, expiresAt",
            "in": "query",
            "required": false,
            "description": "The feed is ordered by `publishedAt`. An expired notice (a maintenance window that has passed) drops out on its own; `expiresAt` is `null` while a notice stands.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "linkHref, linkLabel",
            "in": "query",
            "required": false,
            "description": "An optional deep link, relative to hproxy.com or absolute. `null` when there is nothing more to read.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "unread",
            "in": "query",
            "required": false,
            "description": "Read state belongs to the account and is set from the dashboard, not from this endpoint. A key-only integration sees `true` until someone opens the notice there.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "announcements": [
                    {
                      "id": "1f3c9a7e-…",
                      "title": "Order bodies are now strict: unknown fields return 400",
                      "body": "From 2026-09-03, POST /orders and every other write endpoint refuse a top-level field they do not read with 400 unknown_field. Check your client for fields outside the documented set.",
                      "kind": "ACTION_REQUIRED",
                      "audience": "DEVELOPERS",
                      "publishedAt": "2026-09-03T18:40:12+00:00",
                      "expiresAt": null,
                      "linkHref": "/docs/errors",
                      "linkLabel": "Errors",
                      "unread": true
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/products": {
      "get": {
        "operationId": "products",
        "summary": "List products",
        "description": "The buyable catalog: for each product its family, its shape (what buying and delivery look like), its unit, description and features, its lifecycle, its published price, its quantity bounds and a how-to with the exact calls for that shape.",
        "tags": [
          "Products & pricing"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/products/{id}": {
      "get": {
        "operationId": "product-get",
        "summary": "Read one product",
        "description": "One product by its id, or by any id it used to carry, with its lifecycle. A retired product answers `200` with `state: \"retired\"` and `successorId`, never a `404`, so a menu built from an old catalog can tell its customer what to buy now. `state` is `active`, `parked` (listed, orders answer `409 product_unavailable` until it is back) or `retired`. `family` names the umbrella (`residential`, `isp`, `mobile`, `ipv4`, `ipv6`) so a storefront groups products without guessing from the name. `shape` says what buying and delivery look like, and it is what to key an integration on, never a list of ids: `gateway_gb` and `gateway_time` are a plan you generate lines from (`delivery` is `lines`), `addresses` and `addresses_mobile` are dedicated IPs that land in [proxies](/docs/proxy-api/proxies) (`delivery` is `addresses`). `renewal` is `topup` (order again, the units land on the plan you hold), `repurchase` (a fresh plan for a fresh period) or `extend` (an extension naming the addresses to keep). `howTo` spells the exact calls for that shape, from the price to the first use, with the targeting fields its network takes. A product we add on a known shape works in your code the day it lands.",
        "tags": [
          "Products & pricing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "id": "residential-lite",
                  "name": "Residential Lite",
                  "family": "residential",
                  "state": "active",
                  "successorId": null,
                  "available": true,
                  "shape": "gateway_gb",
                  "unit": "GB",
                  "delivery": "lines",
                  "renewal": "topup",
                  "minQuantity": 1,
                  "maxQuantity": 10000,
                  "billing": {
                    "payg": true,
                    "subscription": true,
                    "intervals": [
                      "month",
                      "year"
                    ]
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/products/{id}/price": {
      "get": {
        "operationId": "price",
        "summary": "Price a product",
        "description": "A server-authoritative quote: the exact amount `POST /orders` will charge for the same inputs. Pass the quantity as a query parameter. For dedicated per-IP products, add `country` and `period_days` to quote the exact targeting you'll order. Omitted, they default to `USA` / 30 days.\n\n**On a reseller key** the answer also says what the order costs **you**: `yourCostCents` is what we debit from your balance when one of your customers places it, `amountCents` is what that customer pays (your retail or markup, else our price), `marginCents` is the difference, `listCents` is our own price, and `note` spells out which is which. To see every period of a country at once, use the [price list](#price-list).",
        "tags": [
          "Products & pricing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "quantity",
            "in": "query",
            "required": true,
            "description": "GB for residential, or number of IPs for dedicated products.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "Per-IP products: target country, alpha-3 (e.g. USA, DEU). Default USA.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "period_days",
            "in": "query",
            "required": false,
            "description": "Per-IP products: rental period in days (e.g. 30, 90). Default 30.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "productId": "residential-lite",
                  "quantity": 5,
                  "unitPriceCents": 100,
                  "amountCents": 500,
                  "currency": "USD",
                  "billingType": "PAYG"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/products/{id}/price-list": {
      "get": {
        "operationId": "price-list",
        "summary": "Price list for a country",
        "description": "For **dedicated per-IP products** (ISP, IPv4, IPv6 and mobile IPs): every rental period of one country priced in one call, so you can print a price table without one quote per period. Each line carries `listCents`, our price for the order, and `available` (false when that period is sold out right now). Mobile answers one line per carrier, service and rotation mode for one period instead (pick it with `period_days`; the carrier ids go straight into `fulfillment_meta`), from the day's price refresh, so quote one mobile order with [price](#price) for the exact figure.\n\n**On a reseller key every line also says what it costs you**: `yourCostCents` is what we debit from your balance when one of your customers orders that line, `customerCents` what that customer pays (our price times your markup), and `marginCents` what you keep; `partner` states your discount, your markup and whether the product is on your catalog. The same table is under Pricing in your business dashboard. Products sold per GB or per speed tier answer `400 no_price_list`: they have one price per unit, which [price](#price) quotes.",
        "tags": [
          "Products & pricing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": true,
            "description": "Alpha-3 from [options](#options), e.g. USA.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "quantity",
            "in": "query",
            "required": false,
            "description": "How many IPs every line prices. Default: the product's smallest order (1, or 10 for IPv6). A bigger order can cost less per IP.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "period_days",
            "in": "query",
            "required": false,
            "description": "Mobile only: the period every carrier is priced for. Default 30.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "productId": "isp",
                  "unit": "IP",
                  "country": "USA",
                  "quantity": 1,
                  "currency": "USD",
                  "countries": [
                    {
                      "alpha3": "USA",
                      "name": "United States"
                    },
                    {
                      "alpha3": "TUR",
                      "name": "Turkey"
                    }
                  ],
                  "partner": {
                    "discountPct": 20,
                    "markup": 1.3,
                    "sellable": true
                  },
                  "lines": [
                    {
                      "days": 7,
                      "period": "1 week",
                      "available": true,
                      "listCents": 250,
                      "yourCostCents": 200,
                      "customerCents": 325,
                      "marginCents": 125
                    },
                    {
                      "days": 30,
                      "period": "1 month",
                      "available": true,
                      "listCents": 270,
                      "yourCostCents": 216,
                      "customerCents": 351,
                      "marginCents": 135
                    }
                  ],
                  "note": "listCents is our own price for this order. yourCostCents is what we debit from your balance when one of your customers orders it …"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/products/{id}/options": {
      "get": {
        "operationId": "options",
        "summary": "Available countries & periods",
        "description": "For **dedicated per-IP products** (IPv4, IPv6, ISP), the live list of countries you can order and the rental periods available, so you can build a picker without hardcoding anything. Countries come back as `{ name, alpha3 }` and are **kept current for you**: the list is refreshed from stock and a country that has run out is removed automatically, so what this returns is always orderable. Feed an `alpha3` straight into the `country` of [price](#price) and [orders](/docs/proxy-api/orders), and a `days` into `period_days`. Gateway products (`delivery` is `lines`: residential, mobile, ISP rotating, IPv4 and IPv6 per GB) have no per-country configurator and return `400 no_options`: they target by country at generation time instead (see [generate](/docs/proxy-api/plans#generate)).",
        "tags": [
          "Products & pricing"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "productId": "ipv4",
                  "unit": "IP",
                  "minQuantity": 1,
                  "maxQuantity": 1000,
                  "countries": [
                    {
                      "name": "United States",
                      "alpha3": "USA"
                    },
                    {
                      "name": "Germany",
                      "alpha3": "DEU"
                    },
                    {
                      "name": "United Kingdom",
                      "alpha3": "GBR"
                    }
                  ],
                  "periods": [
                    {
                      "days": 30,
                      "label": "30 days"
                    },
                    {
                      "days": 90,
                      "label": "90 days"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/orders": {
      "post": {
        "operationId": "orders-create",
        "summary": "Create an order",
        "description": "Buy a product. By default this is a wallet prepay: it debits your balance and returns immediately, or fails with `402` if the balance is short (it never silently charges a card you didn't pick). Set `method` to `\"card\"` or `\"crypto\"` to get a hosted `payUrl` back instead. Always send an `Idempotency-Key` so a retry never double-charges; on a reseller key an order without one is refused.\n\nThe body takes **only the five fields below**. Anything else, including a top-level `country`, is refused with `400 unknown_field` before anything is charged. What goes in it depends on the product's `delivery` on [GET /products](/docs/proxy-api/products).\n\n**Residential and other gateway products** (`delivery` is `lines`): send `product_id` and `quantity`, nothing else. There is no country in the order. You choose the country for each line when you [generate lines](/docs/proxy-api/plans#generate) from the plan, so one plan serves every country. A package size is the `quantity` (1 GB is `1`, 10 GB is `10`), never a separate product id, and it is a whole number from the product's `minQuantity`.\n\n**Dedicated IPs** (`delivery` is `addresses`: IPv4, IPv6, ISP and mobile IPs): `quantity` counts IPs, and the targeting goes inside `fulfillment_meta`, for example `{\"country\": \"DEU\", \"period_days\": 30}`.",
        "tags": [
          "Orders"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "product_id": {
                    "type": "string",
                    "description": "A product id from GET /products, e.g. \"residential-lite\"."
                  },
                  "quantity": {
                    "type": "integer",
                    "description": "A whole number; a fraction is refused. GB for residential and other per-GB products, or number of IPs for dedicated products, between the product's `minQuantity` and `maxQuantity`. For renewals: the number of ids."
                  },
                  "method": {
                    "type": "string",
                    "description": "\"wallet\" (default), \"card\" or \"crypto\". card/crypto return a payUrl."
                  },
                  "fulfillment_meta": {
                    "type": "object",
                    "description": "Dedicated IPs: country (alpha-3, e.g. \"DEU\"), period_days, and operator_id on mobile. For a RENEWAL of dedicated proxies: {\"kind\": \"extension\", \"ids\": [\"…\"], \"period_days\": 30} (ids from GET /proxies, ownership-checked server-side). Leave it out for residential and other per-GB products: you choose their country per line at POST /plans/{id}/generate."
                  },
                  "expected_amount_cents": {
                    "type": "integer",
                    "description": "The total you showed the buyer (the `amountCents` of your quote). If the price moved in between, the order is refused with `409 price_changed` carrying the new `amountCents`, and nothing is charged. Omit it to be charged the price at the moment of the order."
                  }
                },
                "required": [
                  "product_id",
                  "quantity"
                ]
              }
            }
          }
        }
      },
      "get": {
        "operationId": "orders-list",
        "summary": "List orders",
        "description": "Your order history, newest first, one page at a time. Without parameters you get the 15 most recent.",
        "tags": [
          "Orders"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Page size, 1 to 200. Default 15. A larger value is capped at 200.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Rows to skip, newest first. Default 0. Page 3 of 50 is `limit=50&offset=100`.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "orders": [
                    {
                      "orderId": "ord_8f491789-58cd-4e82-81a2-ec7c28088821",
                      "productId": "residential-lite",
                      "type": "PURCHASE",
                      "status": "PAYMENT_RECEIVED",
                      "quantityGb": 1,
                      "amountCents": 120,
                      "currency": "USD",
                      "createdAt": "2026-07-11T09:46:05.191+00:00"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/orders/{id}": {
      "get": {
        "operationId": "orders-get",
        "summary": "Get an order",
        "description": "Fetch a single order by its id to poll fulfillment status. Once it reads `completed`, a dedicated-IP order's proxies are ready at [GET /proxies?order_id=…](/docs/proxy-api/proxies).",
        "tags": [
          "Orders"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/plans": {
      "get": {
        "operationId": "plans",
        "summary": "List plans",
        "description": "Your active plans: residential GB balances and dedicated allocations. The `id` is what you pass to the endpoints below; `label` is your own tag (see PATCH), `null` until you set it. `productId` is the catalog id you ordered (`residential-lite`, `residential-premium`, …) and the field to branch on; `product` is our internal family name, kept for compatibility, and it can change when we move a product to a new pool. `dataGbTotal` and `dataGbRemaining` here are the usage sync's reading, taken about every 30 minutes (a plan bought moments ago shows its full balance until the next pass); `GET /plans/{id}` refreshes them from the network on the call and carries `usageAsOf`. The network enforces every plan's cap itself, in real time.",
        "tags": [
          "Plans & line generation"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "plans": [
                    {
                      "id": "cmjfmhhpd004c4i4hqsk3mzrr",
                      "product": "residential-premium",
                      "productId": "residential-premium",
                      "dataGbTotal": 1,
                      "dataGbRemaining": 1,
                      "expiresAt": null,
                      "createdAt": "2025-12-21T11:07:14.785Z",
                      "label": "customer-1042"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/plans/{id}": {
      "get": {
        "operationId": "plan-get",
        "summary": "Get one plan",
        "description": "A single active plan you own: the per-customer read for a reseller dashboard. `dataGbRemaining` is refreshed from the network's own meter on this call (one network read per plan per minute; between reads you get the last reading), and `usageAsOf` says when that reading was taken. The list endpoint carries the usage sync's reading instead, taken about every 30 minutes, so poll this door when you show a customer what is left. The network enforces the plan's cap itself, in real time: a customer cannot use more than the plan holds, whatever the figure here shows between readings.",
        "tags": [
          "Plans & line generation"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "id": "cmjfmhhpd004c4i4hqsk3mzrr",
                  "product": "residential-premium",
                  "productId": "residential-premium",
                  "dataGbTotal": 10,
                  "dataGbRemaining": 3.2,
                  "expiresAt": null,
                  "createdAt": "2026-07-23T01:07:14.785Z",
                  "label": "customer-1042"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "patch": {
        "operationId": "plan-label",
        "summary": "Label a plan",
        "description": "`PATCH` a plan with your own reference, e.g. which of YOUR customers it belongs to. Pure metadata: it changes nothing about pricing, traffic or generation, and it comes back in `GET /plans`, `GET /plans/{id}` and in [webhook](/docs/proxy-api/webhooks) payloads, so every signal is already attributed to your customer. `null` (or an empty body) clears it.",
        "tags": [
          "Plans & line generation"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "id": "cmjfmhhpd004c4i4hqsk3mzrr",
                  "product": "residential-premium",
                  "productId": "residential-premium",
                  "dataGbTotal": 10,
                  "dataGbRemaining": 10,
                  "expiresAt": null,
                  "createdAt": "2026-07-23T01:07:14.785Z",
                  "label": "customer-1042"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "label": {
                    "type": "string",
                    "description": "1 to 64 characters, no control characters. null/omitted clears."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/plans/{id}/stats": {
      "get": {
        "operationId": "plan-stats",
        "summary": "Traffic statistics",
        "description": "How a **Residential Premium** plan was used, bucket by bucket: bytes, requests and success rate straight from the network's own metering of that plan. Add `/targets` to the path (`GET /plans/{id}/stats/targets`) for the breakdown by target host and country, heaviest first (`rows[]` with `host`, `country`, `bandwidthBytes`, `requests`, `successRate`, `avgLatencyMs`; `limit` 1 to 500). Plans on other products answer 400.",
        "tags": [
          "Plans & line generation"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "Window ending now, 1 to 30. Default 7.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "granularity",
            "in": "query",
            "required": false,
            "description": "\"hour\" (windows up to 29 days) or \"day\". Default: hour up to 2 days, else day.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "planId": "cmjfmhhpd004c4i4hqsk3mzrr",
                  "days": 7,
                  "granularity": "day",
                  "from": "2026-08-28T00:00:00.000Z",
                  "to": "2026-09-04T00:00:00.000Z",
                  "points": [
                    {
                      "at": "2026-09-04T00:00:00.000Z",
                      "bandwidthBytes": 7497,
                      "requests": 15,
                      "successfulRequests": 15,
                      "failedRequests": 0,
                      "successRate": 100
                    }
                  ],
                  "totals": {
                    "bandwidthBytes": 7497,
                    "bandwidthGb": 0,
                    "requests": 15,
                    "successfulRequests": 15,
                    "successRate": 100
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/plans/{id}/whitelist": {
      "get": {
        "operationId": "plan-whitelist",
        "summary": "IP whitelist",
        "description": "The IP addresses that may use a **Residential Premium** plan WITHOUT the password (IP authentication), up to 150 per plan. `GET` lists them, `POST` adds (`{\"ips\": [\"203.0.113.9\", {\"ip\": \"2001:db8::1\", \"description\": \"office\"}]}`), `DELETE` removes (`{\"ips\": [\"203.0.113.9\"]}`); each answers the resulting list. Every entry must be a valid IPv4 or IPv6 address. A whitelisted connection carries no username, so it takes no targeting: it rotates through any country on the rotating ports and holds one IP per sticky port. Use the generated lines (password included) whenever you need a country, state, city or ISP. Whitelist only addresses you alone control: everything that connects from a whitelisted IP spends this plan's traffic, and a shared office, VPN or cloud egress address is shared with everyone behind it. Plans on other products answer 400.",
        "tags": [
          "Plans & line generation"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ips",
            "in": "query",
            "required": true,
            "description": "POST / DELETE body: IP strings, or `{ip, description}` objects (description up to 80 characters).",
            "schema": {
              "type": "array",
              "items": {}
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "planId": "cmjfmhhpd004c4i4hqsk3mzrr",
                  "max": 150,
                  "ips": [
                    {
                      "ip": "203.0.113.9",
                      "description": "office"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/plans/{id}/sessions": {
      "get": {
        "operationId": "plan-sessions",
        "summary": "Sticky sessions",
        "description": "The sticky sessions a **Residential Premium** plan holds right now, up to 250 per page: the port and its protocol, the session label the line carried, the exit country, the session's full length, the seconds it has run and the seconds it has left. A session whose line was generated here also carries `targeting` (what the line aimed at: country, state or city, `asn`, `os`, exclusions, `strict`, `udp`), `line` (the exact line, with the plan's password) and `generatedAt`; a session opened with a session id of your own carries null in all three. A port holds any number of sessions, one per session id, so `total` can be far larger than the number of ports; read further pages with `page`. A sticky line opens its session on the first request. `POST /plans/{id}/release-sessions` ends sessions and takes exactly one of three bodies: `{\"sessions\": [{\"port\": 10000, \"sessionId\": \"a41f9c02\"}]}` ends exactly those (up to 1,000 per call), `{\"ports\": [10000]}` ends every session on those ports (up to 200 ports), `{\"all\": true}` ends every open session. The next request on a released line draws a fresh IP. The answer carries `releasedSessions` (how many ended), `released` (their ports), `notOpen` (named ports that held none) and `remaining`: a `ports` or `all` release ends at most 5,000 sessions per call, so call again until `remaining` is 0. Plans on other products answer 400.",
        "tags": [
          "Plans & line generation"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "List only: the page to read, from 1. Default 1.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "required": false,
            "description": "List only: sessions per page, 1 to 250. Default 250.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "sessions",
            "in": "query",
            "required": false,
            "description": "Release only: 1 to 1,000 `{port, sessionId}` pairs, as the list shows them. Exactly those sessions end.",
            "schema": {
              "type": "array",
              "items": {}
            }
          },
          {
            "name": "ports",
            "in": "query",
            "required": false,
            "description": "Release only: 1 to 200 sticky ports. Every open session on them ends.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "all",
            "in": "query",
            "required": false,
            "description": "Release only: `true` ends every open session on the plan.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "planId": "cmjfmhhpd004c4i4hqsk3mzrr",
                  "total": 3,
                  "page": 1,
                  "pageSize": 250,
                  "sessions": [
                    {
                      "port": 10000,
                      "protocol": "http",
                      "sessionId": "k3m9x20000",
                      "country": "DE",
                      "lifetimeSeconds": 1800,
                      "elapsedSeconds": 587,
                      "remainingSeconds": 1213,
                      "targeting": {
                        "country": "de",
                        "city": "berlin",
                        "os": "windows"
                      },
                      "line": "premium.hproxy.com:10000:USERNAME-type-residential-country-de-city-berlin-os-windows-session-k3m9x20000-lifetime-30:PASSWORD",
                      "generatedAt": "2026-09-15T14:02:11Z"
                    },
                    {
                      "port": 10000,
                      "protocol": "http",
                      "sessionId": "c7d1e8b3",
                      "country": "US",
                      "lifetimeSeconds": 3600,
                      "elapsedSeconds": 120,
                      "remainingSeconds": 3480,
                      "targeting": null,
                      "line": null,
                      "generatedAt": null
                    },
                    {
                      "port": 12000,
                      "protocol": "socks5",
                      "sessionId": "p7q2d80000",
                      "country": "US",
                      "lifetimeSeconds": 86400,
                      "elapsedSeconds": 489,
                      "remainingSeconds": 85911,
                      "targeting": {
                        "country": "us",
                        "asn": 7922,
                        "udp": true
                      },
                      "line": "premium.hproxy.com:12000:USERNAME-type-residential-country-us-asn-7922-requireUdp-true-session-p7q2d80000-lifetime-1440:PASSWORD",
                      "generatedAt": "2026-09-15T13:40:57Z"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/plans/{id}/password": {
      "post": {
        "operationId": "plan-password",
        "summary": "Rotate the proxy password",
        "description": "Replace the password behind a **residential** plan's lines with a fresh one, confirmed by the network before it is stored, and answer the new `username` and `password` once. Every line generated before the call stops working within seconds; generate again afterwards. Use it when a line has leaked. Throttled to three rotations per account every ten minutes, because each call cuts every line that account is running. No body. Residential Plus plans answer 400.",
        "tags": [
          "Plans & line generation"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "ok": true,
                  "username": "hproxy_k2m9x4qp7wz1",
                  "password": "3f1c2a9e-8b7d-4e6f-a1b2-c3d4e5f60718"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/plans/{id}/generate": {
      "post": {
        "operationId": "generate",
        "summary": "Generate proxy lines",
        "description": "Turn a **gateway** plan you own into ready-to-use proxy lines, fully programmatic, using the same hardened generator the dashboard uses. Every product whose `delivery` is `lines` on [products](/docs/proxy-api/products) generates (residential, mobile, ISP rotating, IPv4 and IPv6 per GB); the product's `generate` block, and each plan's, says which targeting fields its network takes. Lines come back as `host:port:username:password` with the targeting baked into the username, so any client that accepts a proxy username and password uses them without extra settings. Chrome and other Chromium browsers never send a SOCKS5 username and password, so for them generate with `protocol` set to `http`, the default. Every field is optional; an empty body returns one rotating line with the plan's defaults. Generating lines is free and repeatable: traffic is only consumed when the lines are used. All generated lines draw from the SAME plan balance. Dedicated per-IP products don't generate; fetch them from [GET /proxies](/docs/proxy-api/proxies) instead.",
        "tags": [
          "Plans & line generation"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "lines": [
                    "203.0.113.10:10000:hp_x92kf-us-sess-a8x2q-t-30:9f2a1c7b",
                    "203.0.113.10:10000:hp_x92kf-us-sess-k3m7d-t-30:9f2a1c7b",
                    "203.0.113.10:10000:hp_x92kf-us-sess-p5r1w-t-30:9f2a1c7b"
                  ],
                  "productId": "residential-premium"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "protocol": {
                    "type": "string",
                    "description": "\"http\" (default) or \"socks5\"."
                  },
                  "count": {
                    "type": "integer",
                    "description": "Lines to return, 1 to 5000, and at most the plan's own `generate.maxCount` (5,000 on Residential Premium, 1,000 on Residential Lite); a count past it answers 400 `invalid_count` naming the ceiling. Default 1. Sticky and rotating batches share this limit: on Residential Premium sticky lines take the sticky ports in turn and every line holds its own session, so the number of ports never limits a batch. Each plan's `generate.sticky` block carries the sticky port range (`port`, `ports`)."
                  },
                  "country": {
                    "type": "string",
                    "description": "Country targeting, e.g. \"US\" (letters only, 2 to 40 chars). This is where a residential order gets its country: the order carries none, so one plan serves every country and each call can target a different one."
                  },
                  "state": {
                    "type": "string",
                    "description": "State / region targeting, where the pool supports it."
                  },
                  "city": {
                    "type": "string",
                    "description": "City targeting, where the pool supports it."
                  },
                  "isp": {
                    "type": "string",
                    "description": "ISP targeting by name. Residential Plus plans only (400 on other products)."
                  },
                  "asn": {
                    "type": "integer",
                    "description": "ISP targeting by AS number, e.g. 7018 for AT&T or 7922 for Comcast, together with `country`. Residential Premium plans only; the list per country is `GET /v1/products/residential-premium/geo/asns?country=US`. 400 on other products."
                  },
                  "os": {
                    "type": "string",
                    "description": "\"windows\", \"android\", \"ios\" or \"mac\": the device the exit IP belongs to. Residential Premium only."
                  },
                  "strict": {
                    "type": "boolean",
                    "description": "Default true: a target with no IP free fails the request. false: the gateway hands out another IP from the same country instead. Residential Premium only."
                  },
                  "excludeAsn": {
                    "type": "integer",
                    "description": "Up to 20 AS numbers to avoid. Not together with `excludeCountries`. Residential Premium only."
                  },
                  "excludeCountries": {
                    "type": "array",
                    "items": {},
                    "description": "Up to 20 two-letter country codes to avoid; only without `country`. Residential Premium only. One exclusion kind per call: countries, states, cities or networks, never two."
                  },
                  "excludeStates": {
                    "type": "array",
                    "items": {},
                    "description": "Up to 20 state / region names to avoid inside `country` (e.g. [\"California\", \"Texas\"]); not together with a `state` target. Residential Premium only."
                  },
                  "excludeCities": {
                    "type": "array",
                    "items": {},
                    "description": "Up to 20 city names to avoid inside `country` (e.g. [\"New York\", \"Houston\"]); not together with a `city` target. Residential Premium only."
                  },
                  "udp": {
                    "type": "boolean",
                    "description": "`true` lets a `socks5` line open UDP relays (SOCKS5 UDP ASSOCIATE). Refused on `http`. Residential Premium only."
                  },
                  "stickyMinutes": {
                    "type": "integer",
                    "description": "Turns sticky on. Omit for rotating IPs. On Residential Premium the number is the session length in minutes, 3 to 1440 (24 hours), and each sticky line holds its own session with no limit on how many; on Plus it is the session length up to 24 hours. On Residential Lite the pool takes no duration, so any value above 0 simply turns sticky on and the session lasts as long as you keep reusing the line. Each plan's `generate` block reports its own `minStickyMinutes` / `maxStickyMinutes`."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/proxies": {
      "get": {
        "operationId": "proxies-list",
        "summary": "List your proxies",
        "description": "Every **dedicated** proxy the account owns (IPv4, IPv6, ISP, Mobile), with connection credentials: the delivery step after a per-IP purchase. Served from a local mirror, so it's instant and keeps working through upstream turbulence: new purchases appear right after the order fulfills, everything else refreshes within ~30 minutes. Filter `order_id` with the id `POST /orders` returned to fetch exactly that order's proxies. Each proxy's `id` is what a [renewal](/docs/proxy-api/orders#orders-create) references in `fulfillment_meta.ids`.",
        "tags": [
          "Your dedicated proxies"
        ],
        "parameters": [
          {
            "name": "family",
            "in": "query",
            "required": false,
            "description": "\"ipv4\", \"ipv6\", \"isp\" or \"mobile\". Omitted = all.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "order_id",
            "in": "query",
            "required": false,
            "description": "Only the proxies delivered by this order (ord_…).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_inactive",
            "in": "query",
            "required": false,
            "description": "true to include expired/retired proxies. Default: active only.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Max rows. Default 1000, max 5000.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "count": 2,
                  "proxies": [
                    {
                      "active": true,
                      "country": "US",
                      "expiresAt": "2026-08-22",
                      "family": "ipv4",
                      "id": "9214321",
                      "ip": "203.0.113.7",
                      "orderId": "ord_8f491789-58cd-4e82-81a2-ec7c28088821",
                      "password": "d41f9c2a",
                      "portHttp": 10090,
                      "portSocks": 11090,
                      "protocols": [
                        "http",
                        "socks5"
                      ],
                      "username": "hp_k29dj"
                    },
                    {
                      "active": true,
                      "country": "US",
                      "expiresAt": "2026-08-22",
                      "family": "ipv4",
                      "id": "9214322",
                      "ip": "203.0.113.8",
                      "orderId": "ord_8f491789-58cd-4e82-81a2-ec7c28088821",
                      "password": "d41f9c2a",
                      "portHttp": 10090,
                      "portSocks": 11090,
                      "protocols": [
                        "http",
                        "socks5"
                      ],
                      "username": "hp_k29dj"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/webhooks": {
      "post": {
        "operationId": "webhooks-create",
        "summary": "Register an endpoint",
        "description": "Register an **https** URL for event pushes. The response carries your signing `secret` **once**. Store it now, it is never shown again. `events` defaults to everything; up to 10 active endpoints per account. Private/internal hosts are refused at registration.",
        "tags": [
          "Webhooks"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "HTTPS endpoint to receive signed event POSTs."
                  },
                  "events": {
                    "type": "array",
                    "items": {},
                    "description": "Subset of: order.fulfilled, order.failed, order.refunded, subscription.canceled, subscription.expired, plan.low_traffic, announcement.published. Omitted = all."
                  }
                },
                "required": [
                  "url"
                ]
              }
            }
          }
        }
      },
      "get": {
        "operationId": "webhooks-list",
        "summary": "List endpoints",
        "description": "Your registered endpoints, newest first. Secrets are never re-shown.",
        "tags": [
          "Webhooks"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "webhooks": [
                    {
                      "active": true,
                      "createdAt": "2026-07-23T09:15:02.114Z",
                      "events": [
                        "order.fulfilled",
                        "order.failed"
                      ],
                      "id": "whs_1f7c9a2b8d3e4f50a1b2c3d4e5f60718",
                      "url": "https://api.your-shop.com/hproxy-webhook"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/webhooks/{id}": {
      "delete": {
        "operationId": "webhooks-delete",
        "summary": "Delete an endpoint",
        "description": "Remove an endpoint; its pending deliveries go with it.",
        "tags": [
          "Webhooks"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "deleted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/webhooks/{id}/test": {
      "post": {
        "operationId": "webhooks-test",
        "summary": "Send a test delivery",
        "description": "Queues a `ping` event through the **real** pipeline (same signing, same worker) so you can verify your endpoint and signature code end to end. Expect the POST within about a minute.",
        "tags": [
          "Webhooks"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/customer": {
      "get": {
        "operationId": "partner-customer-get",
        "summary": "Read the acting customer",
        "description": "The named customer's profile: your id for them, your display name (`label`), the email you attached, the credit they can still spend (in cents, at your prices), and when they were created and last seen. Requires the `X-Reseller-Customer-Id` header.",
        "tags": [
          "Reseller API: act as your customers"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "customer": {
                    "externalId": "user-4021",
                    "label": "Alex M.",
                    "contactEmail": "alex@example.com",
                    "creditCents": 2500,
                    "createdAt": "2026-08-23T15:02:11+00:00",
                    "lastSeenAt": "2026-08-23T16:40:03+00:00"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/customer/contact": {
      "put": {
        "operationId": "partner-customer-contact",
        "summary": "Attach their identity",
        "description": "Set the customer's email and your display name for them, ideally right after your own signup flow, so your customer book, your business dashboard and our support all see a person instead of an opaque id. Each field: **omitted = unchanged, empty string = cleared, value = set**. We never send mail to this address; it is identity, not a channel.",
        "tags": [
          "Reseller API: act as your customers"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "customer": {
                    "externalId": "user-4021",
                    "label": "Alex M.",
                    "contactEmail": "alex@example.com",
                    "creditCents": 2500,
                    "createdAt": "2026-08-23T15:02:11+00:00",
                    "lastSeenAt": "2026-08-23T16:40:03+00:00"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "description": "The customer's email address. Stored lowercased. Empty string clears it."
                  },
                  "label": {
                    "type": "string",
                    "description": "Your display name for them, 1 to 120 characters. Empty string clears it."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/customer/credit": {
      "put": {
        "operationId": "partner-customer-credit",
        "summary": "Credit or revoke their balance",
        "description": "Move store credit on the named customer, from your own backend: **grant** when they paid you, **revoke** for a refund on your side or a correction. Amounts are whole cents at your retail prices; one movement is at most $5,000. Send your own `request_id` for every movement (your payment id, your refund id): a repeat with the same id answers `409 already_applied` instead of moving the credit twice, so a retry is always safe. A revoke larger than what is left is refused (`revoke_exceeds_credit`) and names the remaining figure. Requires the `X-Reseller-Customer-Id` header.",
        "tags": [
          "Reseller API: act as your customers"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "customer": {
                    "externalId": "user-4021",
                    "label": "Alex M.",
                    "contactEmail": "alex@example.com",
                    "creditCents": 5000,
                    "createdAt": "2026-08-23T15:02:11+00:00",
                    "lastSeenAt": "2026-08-23T16:40:03+00:00"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "amount_cents": {
                    "type": "integer",
                    "description": "Positive whole cents at your prices."
                  },
                  "direction": {
                    "type": "string",
                    "description": "\"grant\" or \"revoke\"."
                  },
                  "request_id": {
                    "type": "string",
                    "description": "Your id for this movement, one per intent, 1 to 100 characters."
                  },
                  "note": {
                    "type": "string",
                    "description": "Shown on your statement, up to 200 characters."
                  }
                },
                "required": [
                  "amount_cents",
                  "direction",
                  "request_id"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/deposits/{id}": {
      "get": {
        "operationId": "partner-deposit-get",
        "summary": "Read one of your customers' payments",
        "description": "The state of a deposit your storefront created, for your own backend to show \"payment received\". `status` is `awaiting_payment`, `paid`, `paid_over`, `underpaid`, `expired`, `cancelled`, `failed`, `locked` (held by the gateway; nothing credited) or `needs_review`. `credited_cents` is what landed on the customer's store credit. Account-level: no customer header needed, and only your own deposits resolve.",
        "tags": [
          "Reseller API: act as your customers"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "deposit_id": "rpay_cmt9x2k1a0001",
                  "status": "paid",
                  "provider": "heleket",
                  "method": "crypto",
                  "amount_cents": 2500,
                  "received_cents": 2500,
                  "credited_cents": 2500,
                  "pay_url": null,
                  "created_at": "2026-09-04T09:12:41+00:00",
                  "settled_at": "2026-09-04T09:20:03+00:00"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/usage": {
      "get": {
        "operationId": "partner-usage-customer",
        "summary": "A customer's bandwidth history",
        "description": "With `X-Reseller-Customer-Id`, the named customer's traffic from the meter: one row per day and one per plan over the last `days` days (1 to 365, default 30). `gbUsed` is what was consumed that day; `null` means no reading exists for that day (a plan's first day, or a gap) and is never zero, and `unknownDays` counts those. Each day also carries `gbTotal` (the caps of the plans measured that day) and `gbLeft` (what they still held at the day's last reading), so how much a customer had and how much is left is a history, not a snapshot. Each plan line carries its cap, the meter at the last reading (`gbUsedEnd`) and `gbLeft`. Narrow to one plan with `plan_id`. What they bought is on [`GET /orders`](/docs/proxy-api/orders); this is what they used. Readings land every 30 minutes, one pass after the plan's own figures are synced, so a plan bought in the last hour may have no row yet; for a live figure read the plan itself (`GET /plans/{id}`).",
        "tags": [
          "Reseller API: act as your customers"
        ],
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "Window in days, 1 to 365. Default 30.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "plan_id",
            "in": "query",
            "required": false,
            "description": "One plan only.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "days": 7,
                  "gbUsed": 3.42,
                  "unknownDays": 1,
                  "daily": [
                    {
                      "day": "2026-09-01",
                      "gbUsed": null,
                      "gbTotal": 10,
                      "gbLeft": 9.1,
                      "plans": 1,
                      "unknown": 1,
                      "meterResets": 0
                    },
                    {
                      "day": "2026-09-02",
                      "gbUsed": 1.2,
                      "gbTotal": 10,
                      "gbLeft": 7.9,
                      "plans": 1,
                      "unknown": 0,
                      "meterResets": 0
                    }
                  ],
                  "plans": [
                    {
                      "planId": "plan_…",
                      "product": "residential-premium",
                      "productName": "Residential Premium",
                      "label": null,
                      "gbUsed": 3.42,
                      "daysKnown": 6,
                      "unknownDays": 1,
                      "gbTotal": 10,
                      "gbUsedEnd": 4.3,
                      "gbLeft": 5.7
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/store/usage": {
      "get": {
        "operationId": "partner-usage-store",
        "summary": "Your whole store's bandwidth",
        "description": "Account-level (no customer header): what all your customers used per day beside what you sold per day, per product, and the ten customers that used the most, over the last `days` days. `gb_used` is the meter, `gb_sold` is GB on paid orders by the day they were paid, `gb_total` and `gb_left` are what the measured plans had and still held at the day's last reading; the four are never mixed into one number. `unknown_days` counts plan-days without a reading. Readings land every 30 minutes, one pass after each plan's own figures are synced. Snake_case like the other account-level doors.",
        "tags": [
          "Reseller API: act as your customers"
        ],
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "Window in days, 1 to 365. Default 30.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "days": 30,
                  "totals": {
                    "gb_used": 41.2,
                    "gb_sold": 120,
                    "gb_total": 300,
                    "gb_left": 212.6,
                    "unknown_days": 3,
                    "plans": 17
                  },
                  "daily": [
                    {
                      "day": "2026-09-04",
                      "gb_used": 1.4,
                      "gb_total": 300,
                      "gb_left": 212.6,
                      "gb_sold": 10,
                      "plans": 17,
                      "unknown": 0,
                      "meter_resets": 0
                    }
                  ],
                  "products": [
                    {
                      "product": "residential-premium",
                      "product_name": "Residential Premium",
                      "gb_used": 30.1,
                      "plans": 9,
                      "unknown_days": 1,
                      "gb_sold": 80,
                      "orders": 12
                    }
                  ],
                  "customers": [
                    {
                      "external_id": "user-4021",
                      "label": "Ali",
                      "gb_used": 14.2,
                      "plans": 2
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/customers": {
      "get": {
        "operationId": "partner-customers-list",
        "summary": "List your customers",
        "description": "Every customer on your account, newest first, with identity and credit, the read your backend reconciles against. This is an **account-level** call: send it **without** the `X-Reseller-Customer-Id` header (naming a customer here is refused with a `400` telling you to drop the header).",
        "tags": [
          "Reseller API: act as your customers"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Page size, 1 to 200. Default 50.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Rows to skip. Default 0.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "customers": [
                    {
                      "externalId": "user-4021",
                      "label": "Alex M.",
                      "contactEmail": "alex@example.com",
                      "creditCents": 2500,
                      "createdAt": "2026-08-23T15:02:11+00:00",
                      "lastSeenAt": "2026-08-23T16:40:03+00:00"
                    },
                    {
                      "externalId": "user-3990",
                      "label": null,
                      "contactEmail": null,
                      "creditCents": 0,
                      "createdAt": "2026-08-22T10:11:40+00:00",
                      "lastSeenAt": null
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/{platform}/{action}": {
      "get": {
        "operationId": "scrapers-envelope",
        "summary": "The envelope, field by field",
        "description": "Every scraper call returns the same stable envelope. `data` is the platform's structured payload; everything else is bookkeeping. `costUsd` is the call's exact price (for a $0.00149 scraper it reads `0.0015`, there is no minimum). `walletDebitUsd` is what actually left your wallet on **this** call: fractional costs accrue on a running tab and settle in whole cents, so it reads `0` on most calls and `0.01` as the tab crosses each cent. Summing either field over many calls converges on the same total.",
        "tags": [
          "The response envelope"
        ],
        "parameters": [
          {
            "name": "platform",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "action",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "scraper",
            "in": "query",
            "required": false,
            "description": "Internal scraper id the path resolved to.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "input",
            "in": "query",
            "required": false,
            "description": "Echo of the inputs the run used.",
            "schema": {
              "type": "object"
            }
          },
          {
            "name": "data",
            "in": "query",
            "required": false,
            "description": "The scraped payload, exactly as structured by the platform.",
            "schema": {
              "type": "object"
            }
          },
          {
            "name": "records",
            "in": "query",
            "required": false,
            "description": "Result count heuristic (longest array in data). Informational only: billing is per call, never per record.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "costUsd",
            "in": "query",
            "required": false,
            "description": "The call's exact price in USD. 0 on an idempotent replay.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "walletDebitUsd",
            "in": "query",
            "required": false,
            "description": "Whole cents actually settled from the wallet on this call.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "idempotentReplay",
            "in": "query",
            "required": false,
            "description": "Present and true when X-Request-Id matched a previous run and its result was replayed free.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "requestId",
            "in": "query",
            "required": false,
            "description": "The run id. Quote it in support tickets.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "elapsedMs",
            "in": "query",
            "required": false,
            "description": "Server-side duration of the call.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "error": "Invalid input.",
                  "details": "'trim' must be a boolean",
                  "requestId": null
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/runs": {
      "get": {
        "operationId": "scrapers-runs",
        "summary": "Your call history",
        "description": "Audit every scraper call your account made: exact per-call cost, what settled from the wallet, status and result count, plus rolling 24h totals and the pending sub-cent tab. Use it to reconcile your bill to the cent. Optional `limit` query parameter (default 50, max 200). Also visible in your [dashboard](/dashboard/scrapers).",
        "tags": [
          "Your call history"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "count": 2,
                  "runs": [
                    {
                      "id": "c4389b749c07d44209e4fb301",
                      "scraper": "threads-search-by-keyword",
                      "endpoint": "/api/v1/scrape/threads/search",
                      "status": "SUCCESS",
                      "records": 19,
                      "costUsd": 0.003,
                      "walletDebitUsd": 0,
                      "elapsedMs": 5211,
                      "requestId": null,
                      "createdAt": "2026-07-22T15:41:09.114Z"
                    }
                  ],
                  "summary": {
                    "last24h": {
                      "calls": 2,
                      "costUsd": 0.006,
                      "walletDebitedUsd": 0
                    },
                    "pendingTabUsd": 0.006
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/instagram/profile": {
      "get": {
        "operationId": "scrapeInstagramProfile",
        "summary": "Instagram Profile",
        "description": "Returns structured JSON for **Instagram Profile**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Instagram scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/instagram/post": {
      "get": {
        "operationId": "scrapeInstagramPost",
        "summary": "Instagram Post",
        "description": "Returns structured JSON for **Instagram Post**. Billed **$0.0149 per successful call** ($14.90 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Instagram scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "download_media",
            "in": "query",
            "required": false,
            "description": "Return a direct media URL alongside the metadata.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/instagram/transcript": {
      "get": {
        "operationId": "scrapeInstagramTranscript",
        "summary": "Instagram Media Transcript",
        "description": "Returns structured JSON for **Instagram Media Transcript**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Instagram scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/instagram/reels-search": {
      "get": {
        "operationId": "reels-search",
        "summary": "Instagram Reels Search",
        "description": "Returns structured JSON for **Instagram Reels Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Instagram scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date_posted",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD. Allowed values: `last-hour`, `last-day`, `last-week`, `last-month`, `last-year`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/instagram/basic-profile": {
      "get": {
        "operationId": "basic-profile",
        "summary": "Instagram Basic Profile",
        "description": "Returns structured JSON for **Instagram Basic Profile**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Instagram scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "userId",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/instagram/posts": {
      "get": {
        "operationId": "scrapeInstagramPosts",
        "summary": "Instagram User Posts",
        "description": "Returns structured JSON for **Instagram User Posts**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Instagram scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "next_max_id",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/instagram/reels": {
      "get": {
        "operationId": "reels",
        "summary": "Instagram User Reels",
        "description": "Returns structured JSON for **Instagram User Reels**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Instagram scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `handle`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username. Send this **or** `user_id`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_id",
            "in": "query",
            "required": false,
            "description": "Identifier from a previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/instagram/comments": {
      "get": {
        "operationId": "scrapeInstagramComments",
        "summary": "Instagram Post Comments",
        "description": "Returns structured JSON for **Instagram Post Comments**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Instagram scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/instagram/highlights": {
      "get": {
        "operationId": "highlights",
        "summary": "Instagram User Highlights",
        "description": "Returns structured JSON for **Instagram User Highlights**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Instagram scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `handle`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username. Send this **or** `user_id`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/instagram/highlight": {
      "get": {
        "operationId": "highlight",
        "summary": "Instagram Highlight Detail",
        "description": "Returns structured JSON for **Instagram Highlight Detail**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Instagram scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/instagram/embed": {
      "get": {
        "operationId": "embed",
        "summary": "Instagram Profile Embed HTML",
        "description": "Returns structured JSON for **Instagram Profile Embed HTML**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Instagram scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/profile": {
      "get": {
        "operationId": "scrapeTiktokProfile",
        "summary": "TikTok Profile",
        "description": "Returns structured JSON for **TikTok Profile**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username. Send this **or** `user_id`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `handle`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/profile-region": {
      "get": {
        "operationId": "profile-region",
        "summary": "TikTok Profile Region",
        "description": "Returns structured JSON for **TikTok Profile Region**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/audience": {
      "get": {
        "operationId": "audience",
        "summary": "TikTok User Audience Demographics",
        "description": "Returns structured JSON for **TikTok User Audience Demographics**. Billed **$0.03874 per successful call** ($38.74 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/video": {
      "get": {
        "operationId": "scrapeTiktokVideo",
        "summary": "TikTok Video",
        "description": "Returns structured JSON for **TikTok Video**. Billed **$0.0149 per successful call** ($14.90 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "get_transcript",
            "in": "query",
            "required": false,
            "description": "Also include transcript in the response.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "download_media",
            "in": "query",
            "required": false,
            "description": "Return a direct media URL alongside the metadata.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/video-transcript": {
      "get": {
        "operationId": "video-transcript",
        "summary": "TikTok Video Transcript",
        "description": "Returns structured JSON for **TikTok Video Transcript**. Billed **$0.01639 per successful call** ($16.39 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "required": false,
            "description": "Two-letter language code, e.g. en.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "use_ai_as_fallback",
            "in": "query",
            "required": false,
            "description": "The use ai as fallback parameter.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/profile-videos": {
      "get": {
        "operationId": "profile-videos",
        "summary": "TikTok Profile Videos",
        "description": "Returns structured JSON for **TikTok Profile Videos**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": false,
            "description": "Identifier from a previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort_by",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `latest`, `popular`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/search": {
      "get": {
        "operationId": "scrapeTiktokSearch",
        "summary": "TikTok Keyword Search",
        "description": "Returns structured JSON for **TikTok Keyword Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date_posted",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD. Allowed values: `yesterday`, `this-week`, `this-month`, `last-3-months`, `last-6-months`, `all-time`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort_by",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `relevance`, `most-liked`, `date-posted`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/shop-search": {
      "get": {
        "operationId": "shop-search",
        "summary": "TikTok Shop Search",
        "description": "Returns structured JSON for **TikTok Shop Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/live-status": {
      "get": {
        "operationId": "live-status",
        "summary": "TikTok Live Status",
        "description": "Returns structured JSON for **TikTok Live Status**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/video-comments": {
      "get": {
        "operationId": "video-comments",
        "summary": "TikTok Video Comments",
        "description": "Returns structured JSON for **TikTok Video Comments**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/comment-replies": {
      "get": {
        "operationId": "scrapeTiktokCommentReplies",
        "summary": "TikTok Comment Replies",
        "description": "Returns structured JSON for **TikTok Comment Replies**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "comment_id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/following": {
      "get": {
        "operationId": "following",
        "summary": "TikTok User Following",
        "description": "Returns structured JSON for **TikTok User Following**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "min_time",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/followers": {
      "get": {
        "operationId": "followers",
        "summary": "TikTok User Followers",
        "description": "Returns structured JSON for **TikTok User Followers**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username. Send this **or** `user_id`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `handle`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "min_time",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/search-users": {
      "get": {
        "operationId": "scrapeTiktokSearchUsers",
        "summary": "TikTok Search Users",
        "description": "Returns structured JSON for **TikTok Search Users**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/search-hashtag": {
      "get": {
        "operationId": "scrapeTiktokSearchHashtag",
        "summary": "TikTok Hashtag Search",
        "description": "Returns structured JSON for **TikTok Hashtag Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "hashtag",
            "in": "query",
            "required": true,
            "description": "Hashtag to look up, without the # sign.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/song": {
      "get": {
        "operationId": "song",
        "summary": "TikTok Song Details",
        "description": "Returns structured JSON for **TikTok Song Details**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "clipId",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/song-videos": {
      "get": {
        "operationId": "song-videos",
        "summary": "TikTok Song Videos",
        "description": "Returns structured JSON for **TikTok Song Videos**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "clipId",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/trending": {
      "get": {
        "operationId": "trending",
        "summary": "TikTok Trending Feed",
        "description": "Returns structured JSON for **TikTok Trending Feed**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": true,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/shop-products": {
      "get": {
        "operationId": "shop-products",
        "summary": "TikTok Shop Products",
        "description": "Returns structured JSON for **TikTok Shop Products**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort_by",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `top`, `new_releases`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/shop-product": {
      "get": {
        "operationId": "shop-product",
        "summary": "TikTok Shop Product Details",
        "description": "Returns structured JSON for **TikTok Shop Product Details**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/shop-product-reviews": {
      "get": {
        "operationId": "shop-product-reviews",
        "summary": "TikTok Shop Product Reviews",
        "description": "Returns structured JSON for **TikTok Shop Product Reviews**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video). Send this **or** `product_id`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "product_id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/search-top": {
      "get": {
        "operationId": "search-top",
        "summary": "TikTok Top Search",
        "description": "Returns structured JSON for **TikTok Top Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "publish_time",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD. Allowed values: `yesterday`, `this-week`, `this-month`, `last-3-months`, `last-6-months`, `all-time`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort_by",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `relevance`, `most-liked`, `date-posted`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/tiktok/shop-showcase": {
      "get": {
        "operationId": "shop-showcase",
        "summary": "TikTok Shop User Showcase",
        "description": "Returns structured JSON for **TikTok Shop User Showcase**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "TikTok scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/youtube/channel-lookup": {
      "get": {
        "operationId": "channel-lookup",
        "summary": "YouTube Channel",
        "description": "Returns structured JSON for **YouTube Channel**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "YouTube scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "channelId",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `handle` or `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username. Send this **or** `channelId` or `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video). Send this **or** `channelId` or `handle`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/youtube/channel": {
      "get": {
        "operationId": "channel",
        "summary": "YouTube Channel",
        "description": "Returns structured JSON for **YouTube Channel**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "YouTube scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "channelId",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `handle` or `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username. Send this **or** `channelId` or `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video). Send this **or** `channelId` or `handle`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/youtube/channel-videos": {
      "get": {
        "operationId": "channel-videos",
        "summary": "YouTube Channel Videos",
        "description": "Returns structured JSON for **YouTube Channel Videos**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "YouTube scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "channelId",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `handle`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username. Send this **or** `channelId`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `latest`, `popular`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "continuationToken",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "includeExtras",
            "in": "query",
            "required": false,
            "description": "Optional flag (true or false).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "is_paid_promotions",
            "in": "query",
            "required": false,
            "description": "Optional flag (true or false).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/youtube/channel-shorts": {
      "get": {
        "operationId": "channel-shorts",
        "summary": "YouTube Channel Shorts",
        "description": "Returns structured JSON for **YouTube Channel Shorts**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "YouTube scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "channelId",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `handle`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username. Send this **or** `channelId`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `newest`, `popular`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "continuationToken",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "includeExtras",
            "in": "query",
            "required": false,
            "description": "Optional flag (true or false).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/youtube/video": {
      "get": {
        "operationId": "scrapeYoutubeVideo",
        "summary": "YouTube Video",
        "description": "Returns structured JSON for **YouTube Video**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "YouTube scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "required": false,
            "description": "Two-letter language code, e.g. en.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/youtube/transcript": {
      "get": {
        "operationId": "scrapeYoutubeTranscript",
        "summary": "YouTube Video Transcript",
        "description": "Returns structured JSON for **YouTube Video Transcript**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "YouTube scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "required": false,
            "description": "Two-letter language code, e.g. en.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/youtube/search": {
      "get": {
        "operationId": "scrapeYoutubeSearch",
        "summary": "YouTube Search",
        "description": "Returns structured JSON for **YouTube Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "YouTube scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "uploadDate",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD. Allowed values: `today`, `this_week`, `this_month`, `this_year`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sortBy",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `relevance`, `popular`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "The type parameter. Allowed values: `videos`, `shorts`, `channels`, `playlists`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "duration",
            "in": "query",
            "required": false,
            "description": "The duration parameter. Allowed values: `under_3_min`, `between_3_and_20_min`, `over_20_min`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "continuationToken",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "includeExtras",
            "in": "query",
            "required": false,
            "description": "Optional flag (true or false).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/youtube/comments": {
      "get": {
        "operationId": "scrapeYoutubeComments",
        "summary": "YouTube Video Comments",
        "description": "Returns structured JSON for **YouTube Video Comments**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "YouTube scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "continuationToken",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "The order parameter. Allowed values: `top`, `newest`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/youtube/trending-shorts": {
      "get": {
        "operationId": "trending-shorts",
        "summary": "YouTube Trending Shorts",
        "description": "Returns structured JSON for **YouTube Trending Shorts**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "YouTube scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/youtube/search-hashtag": {
      "get": {
        "operationId": "scrapeYoutubeSearchHashtag",
        "summary": "YouTube Hashtag Search",
        "description": "Returns structured JSON for **YouTube Hashtag Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "YouTube scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "hashtag",
            "in": "query",
            "required": true,
            "description": "Hashtag to look up, without the # sign.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "continuationToken",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "The type parameter. Allowed values: `all`, `shorts`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/youtube/comment-replies": {
      "get": {
        "operationId": "scrapeYoutubeCommentReplies",
        "summary": "YouTube Comment Replies",
        "description": "Returns structured JSON for **YouTube Comment Replies**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "YouTube scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "continuationToken",
            "in": "query",
            "required": true,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/youtube/playlist": {
      "get": {
        "operationId": "playlist",
        "summary": "YouTube Playlist",
        "description": "Returns structured JSON for **YouTube Playlist**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "YouTube scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "playlist_id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/youtube/community-post": {
      "get": {
        "operationId": "community-post",
        "summary": "YouTube Community Post",
        "description": "Returns structured JSON for **YouTube Community Post**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "YouTube scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/twitter/tweets": {
      "get": {
        "operationId": "tweets",
        "summary": "Twitter User Tweets",
        "description": "Returns structured JSON for **Twitter User Tweets**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Twitter / X scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/twitter/profile": {
      "get": {
        "operationId": "scrapeTwitterProfile",
        "summary": "Twitter / X Profile",
        "description": "Returns structured JSON for **Twitter / X Profile**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Twitter / X scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/twitter/tweet": {
      "get": {
        "operationId": "tweet",
        "summary": "Twitter / X Tweet",
        "description": "Returns structured JSON for **Twitter / X Tweet**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Twitter / X scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/twitter/tweet-transcript": {
      "get": {
        "operationId": "tweet-transcript",
        "summary": "Twitter / X Tweet Transcript",
        "description": "Returns structured JSON for **Twitter / X Tweet Transcript**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Twitter / X scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/twitter/community": {
      "get": {
        "operationId": "community",
        "summary": "Twitter / X Community",
        "description": "Returns structured JSON for **Twitter / X Community**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Twitter / X scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/twitter/community-tweets": {
      "get": {
        "operationId": "community-tweets",
        "summary": "Twitter / X Community Tweets",
        "description": "Returns structured JSON for **Twitter / X Community Tweets**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Twitter / X scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/linkedin/profile": {
      "get": {
        "operationId": "scrapeLinkedinProfile",
        "summary": "LinkedIn Profile",
        "description": "Returns structured JSON for **LinkedIn Profile**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "LinkedIn scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/linkedin/company": {
      "get": {
        "operationId": "company",
        "summary": "LinkedIn Company",
        "description": "Returns structured JSON for **LinkedIn Company**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "LinkedIn scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/linkedin/company-posts": {
      "get": {
        "operationId": "company-posts",
        "summary": "LinkedIn Company Posts",
        "description": "Returns structured JSON for **LinkedIn Company Posts**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "LinkedIn scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/linkedin/post": {
      "get": {
        "operationId": "scrapeLinkedinPost",
        "summary": "LinkedIn Post",
        "description": "Returns structured JSON for **LinkedIn Post**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "LinkedIn scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/linkedin/ad-search": {
      "get": {
        "operationId": "scrapeLinkedinAdSearch",
        "summary": "LinkedIn Ad Library Search",
        "description": "Returns structured JSON for **LinkedIn Ad Library Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "LinkedIn scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "company",
            "in": "query",
            "required": true,
            "description": "The company parameter. Send this **or** `keyword` or `companyId`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "keyword",
            "in": "query",
            "required": true,
            "description": "The keyword parameter. Send this **or** `company` or `companyId`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "companyId",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `company` or `keyword`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "countries",
            "in": "query",
            "required": false,
            "description": "Numeric filter applied to the results.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "startDate",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "endDate",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "paginationToken",
            "in": "query",
            "required": false,
            "description": "The paginationToken parameter.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/linkedin/ad": {
      "get": {
        "operationId": "scrapeLinkedinAd",
        "summary": "LinkedIn Ad Detail",
        "description": "Returns structured JSON for **LinkedIn Ad Detail**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "LinkedIn scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/google/search": {
      "get": {
        "operationId": "scrapeGoogleSearch",
        "summary": "Google Search Results",
        "description": "Returns structured JSON for **Google Search Results**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Google scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date_posted",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD. Allowed values: `last-hour`, `last-day`, `last-week`, `last-month`, `last-year`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/google/ad-company": {
      "get": {
        "operationId": "scrapeGoogleAdCompany",
        "summary": "Google Ad Library Company Ads",
        "description": "Returns structured JSON for **Google Ad Library Company Ads**. Billed **$0.03725 per successful call** ($37.25 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Google scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "domain",
            "in": "query",
            "required": true,
            "description": "The domain parameter. Send this **or** `advertiser_id`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "advertiser_id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `domain`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "topic",
            "in": "query",
            "required": false,
            "description": "The topic parameter. Allowed values: `all`, `political`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "platform",
            "in": "query",
            "required": false,
            "description": "The platform parameter. Allowed values: `google_maps`, `google_play`, `google_search`, `google_shopping`, `youtube`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "description": "The format parameter. Allowed values: `text`, `image`, `video`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "get_ad_details",
            "in": "query",
            "required": false,
            "description": "Also include ad details in the response.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/google/ad": {
      "get": {
        "operationId": "scrapeGoogleAd",
        "summary": "Google Ad Detail",
        "description": "Returns structured JSON for **Google Ad Detail**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Google scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/google/advertiser-search": {
      "get": {
        "operationId": "advertiser-search",
        "summary": "Google Advertiser Search",
        "description": "Returns structured JSON for **Google Advertiser Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Google scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/profile": {
      "get": {
        "operationId": "scrapeFacebookProfile",
        "summary": "Facebook Profile",
        "description": "Returns structured JSON for **Facebook Profile**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "get_business_hours",
            "in": "query",
            "required": false,
            "description": "Also include business hours in the response.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "include_gated_profile",
            "in": "query",
            "required": false,
            "description": "Optional flag (true or false).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/profile-reels": {
      "get": {
        "operationId": "profile-reels",
        "summary": "Facebook Profile Reels",
        "description": "Returns structured JSON for **Facebook Profile Reels**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "next_page_id",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/profile-photos": {
      "get": {
        "operationId": "profile-photos",
        "summary": "Facebook Profile Photos",
        "description": "Returns structured JSON for **Facebook Profile Photos**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "next_page_id",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/profile-posts": {
      "get": {
        "operationId": "profile-posts",
        "summary": "Facebook Profile Posts",
        "description": "Returns structured JSON for **Facebook Profile Posts**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video). Send this **or** `pageId`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageId",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/profile-events": {
      "get": {
        "operationId": "profile-events",
        "summary": "Facebook Profile Events",
        "description": "Returns structured JSON for **Facebook Profile Events**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/post": {
      "get": {
        "operationId": "scrapeFacebookPost",
        "summary": "Facebook Post",
        "description": "Returns structured JSON for **Facebook Post**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "get_comments",
            "in": "query",
            "required": false,
            "description": "Also include comments in the response.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "get_transcript",
            "in": "query",
            "required": false,
            "description": "Also include transcript in the response.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/post-transcript": {
      "get": {
        "operationId": "post-transcript",
        "summary": "Facebook Post Transcript",
        "description": "Returns structured JSON for **Facebook Post Transcript**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/post-comments": {
      "get": {
        "operationId": "post-comments",
        "summary": "Facebook Post Comments",
        "description": "Returns structured JSON for **Facebook Post Comments**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video). Send this **or** `feedback_id`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "feedback_id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/comment-replies": {
      "get": {
        "operationId": "scrapeFacebookCommentReplies",
        "summary": "Facebook Comment Replies",
        "description": "Returns structured JSON for **Facebook Comment Replies**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "feedback_id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "expansion_token",
            "in": "query",
            "required": true,
            "description": "The expansion token parameter.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/group-posts": {
      "get": {
        "operationId": "group-posts",
        "summary": "Facebook Group Posts",
        "description": "Returns structured JSON for **Facebook Group Posts**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video). Send this **or** `group_id`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "group_id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort_by",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `TOP_POSTS`, `RECENT_ACTIVITY`, `CHRONOLOGICAL`, `CHRONOLOGICAL_LISTINGS`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/events-search": {
      "get": {
        "operationId": "events-search",
        "summary": "Facebook Events Search",
        "description": "Returns structured JSON for **Facebook Events Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/events": {
      "get": {
        "operationId": "events",
        "summary": "Facebook Events by City",
        "description": "Returns structured JSON for **Facebook Events by City**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "time",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD. Allowed values: `today`, `this_week`, `next_week`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/event": {
      "get": {
        "operationId": "event",
        "summary": "Facebook Event Details",
        "description": "Returns structured JSON for **Facebook Event Details**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video). Send this **or** `id`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/ad": {
      "get": {
        "operationId": "scrapeFacebookAd",
        "summary": "Facebook Ad Library Detail",
        "description": "Returns structured JSON for **Facebook Ad Library Detail**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video). Send this **or** `id`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "get_transcript",
            "in": "query",
            "required": false,
            "description": "Also include transcript in the response.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/ad-search": {
      "get": {
        "operationId": "scrapeFacebookAdSearch",
        "summary": "Facebook Ad Library Search",
        "description": "Returns structured JSON for **Facebook Ad Library Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort_by",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `total_impressions`, `relevancy_monthly_grouped`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search_type",
            "in": "query",
            "required": false,
            "description": "The search type parameter. Allowed values: `keyword_unordered`, `keyword_exact_phrase`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ad_type",
            "in": "query",
            "required": false,
            "description": "The ad type parameter. Allowed values: `all`, `political_and_issue_ads`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "The status parameter. Allowed values: `ALL`, `ACTIVE`, `INACTIVE`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "media_type",
            "in": "query",
            "required": false,
            "description": "The media type parameter. Allowed values: `ALL`, `IMAGE`, `VIDEO`, `MEME`, `IMAGE_AND_MEME`, `NONE`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/ad-company": {
      "get": {
        "operationId": "scrapeFacebookAdCompany",
        "summary": "Facebook Company Ads",
        "description": "Returns structured JSON for **Facebook Company Ads**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "pageId",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `companyName`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "companyName",
            "in": "query",
            "required": true,
            "description": "The companyName parameter. Send this **or** `pageId`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "Two-letter region/country code, e.g. US.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "The status parameter. Allowed values: `ALL`, `ACTIVE`, `INACTIVE`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "language",
            "in": "query",
            "required": false,
            "description": "Two-letter language code, e.g. en.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "media_type",
            "in": "query",
            "required": false,
            "description": "The media type parameter. Allowed values: `ALL`, `IMAGE`, `VIDEO`, `MEME`, `IMAGE_AND_MEME`, `NONE`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort_by",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `total_impressions`, `relevancy_monthly_grouped`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/facebook/ad-companies-search": {
      "get": {
        "operationId": "ad-companies-search",
        "summary": "Facebook Ad Library Company Search",
        "description": "Returns structured JSON for **Facebook Ad Library Company Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Facebook scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/reddit/subreddit": {
      "get": {
        "operationId": "subreddit",
        "summary": "Reddit Subreddit Details",
        "description": "Returns structured JSON for **Reddit Subreddit Details**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Reddit scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "subreddit",
            "in": "query",
            "required": true,
            "description": "Subreddit name, without the r/ prefix. Send this **or** `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video). Send this **or** `subreddit`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/reddit/subreddit-posts": {
      "get": {
        "operationId": "subreddit-posts",
        "summary": "Reddit Subreddit Posts",
        "description": "Returns structured JSON for **Reddit Subreddit Posts**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Reddit scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "subreddit",
            "in": "query",
            "required": true,
            "description": "Subreddit name, without the r/ prefix.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "timeframe",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD. Allowed values: `all`, `day`, `week`, `month`, `year`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `best`, `hot`, `new`, `top`, `rising`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "after",
            "in": "query",
            "required": false,
            "description": "The after parameter.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/reddit/comments": {
      "get": {
        "operationId": "scrapeRedditComments",
        "summary": "Reddit Post Comments",
        "description": "Returns structured JSON for **Reddit Post Comments**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Reddit scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/reddit/search": {
      "get": {
        "operationId": "scrapeRedditSearch",
        "summary": "Reddit Search",
        "description": "Returns structured JSON for **Reddit Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Reddit scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `relevance`, `new`, `top`, `comment_count`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "timeframe",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD. Allowed values: `all`, `day`, `week`, `month`, `year`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "after",
            "in": "query",
            "required": false,
            "description": "The after parameter.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/reddit/subreddit-search": {
      "get": {
        "operationId": "subreddit-search",
        "summary": "Reddit Subreddit Search",
        "description": "Returns structured JSON for **Reddit Subreddit Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Reddit scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "subreddit",
            "in": "query",
            "required": true,
            "description": "Subreddit name, without the r/ prefix.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": false,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `relevance`, `hot`, `top`, `new`, `comments`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "timeframe",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD. Allowed values: `all`, `year`, `month`, `week`, `day`, `hour`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/threads/profile": {
      "get": {
        "operationId": "scrapeThreadsProfile",
        "summary": "Threads Profile",
        "description": "Returns structured JSON for **Threads Profile**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Threads scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/threads/posts": {
      "get": {
        "operationId": "scrapeThreadsPosts",
        "summary": "Threads User Posts",
        "description": "Returns structured JSON for **Threads User Posts**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Threads scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": false,
            "description": "Identifier from a previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/threads/post": {
      "get": {
        "operationId": "scrapeThreadsPost",
        "summary": "Threads Post",
        "description": "Returns structured JSON for **Threads Post**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Threads scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/threads/search": {
      "get": {
        "operationId": "scrapeThreadsSearch",
        "summary": "Threads Search",
        "description": "Returns structured JSON for **Threads Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Threads scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "description": "Filter by date, as YYYY-MM-DD.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/threads/search-users": {
      "get": {
        "operationId": "scrapeThreadsSearchUsers",
        "summary": "Threads Search Users",
        "description": "Returns structured JSON for **Threads Search Users**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Threads scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/bluesky/profile": {
      "get": {
        "operationId": "scrapeBlueskyProfile",
        "summary": "Bluesky Profile",
        "description": "Returns structured JSON for **Bluesky Profile**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Bluesky scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/bluesky/posts": {
      "get": {
        "operationId": "scrapeBlueskyPosts",
        "summary": "Bluesky User Posts",
        "description": "Returns structured JSON for **Bluesky User Posts**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Bluesky scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username. Send this **or** `user_id`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `handle`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/bluesky/post": {
      "get": {
        "operationId": "scrapeBlueskyPost",
        "summary": "Bluesky Post",
        "description": "Returns structured JSON for **Bluesky Post**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Bluesky scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/truth-social/profile": {
      "get": {
        "operationId": "scrapeTruthSocialProfile",
        "summary": "Truth Social Profile",
        "description": "Returns structured JSON for **Truth Social Profile**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Truth Social scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/truth-social/posts": {
      "get": {
        "operationId": "scrapeTruthSocialPosts",
        "summary": "Truth Social User Posts",
        "description": "Returns structured JSON for **Truth Social User Posts**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Truth Social scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username. Send this **or** `user_id`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "user_id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `handle`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "next_max_id",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/truth-social/post": {
      "get": {
        "operationId": "scrapeTruthSocialPost",
        "summary": "Truth Social Post",
        "description": "Returns structured JSON for **Truth Social Post**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Truth Social scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/pinterest/search": {
      "get": {
        "operationId": "scrapePinterestSearch",
        "summary": "Pinterest Search",
        "description": "Returns structured JSON for **Pinterest Search**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Pinterest scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search term or keyword.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/pinterest/pin": {
      "get": {
        "operationId": "pin",
        "summary": "Pinterest Pin",
        "description": "Returns structured JSON for **Pinterest Pin**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Pinterest scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/pinterest/boards": {
      "get": {
        "operationId": "boards",
        "summary": "Pinterest User Boards",
        "description": "Returns structured JSON for **Pinterest User Boards**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Pinterest scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/pinterest/board": {
      "get": {
        "operationId": "board",
        "summary": "Pinterest Board Pins",
        "description": "Returns structured JSON for **Pinterest Board Pins**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Pinterest scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Pagination token from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/twitch/profile": {
      "get": {
        "operationId": "scrapeTwitchProfile",
        "summary": "Twitch Profile",
        "description": "Returns structured JSON for **Twitch Profile**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Twitch scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/twitch/videos": {
      "get": {
        "operationId": "videos",
        "summary": "Twitch User Videos",
        "description": "Returns structured JSON for **Twitch User Videos**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Twitch scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filter_by",
            "in": "query",
            "required": false,
            "description": "The filter by parameter. Allowed values: `HIGHLIGHT`, `ARCHIVE`, `UPLOAD`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort_by",
            "in": "query",
            "required": false,
            "description": "Ordering to apply to the results. Allowed values: `TIME`, `VIEWS`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/twitch/clip": {
      "get": {
        "operationId": "scrapeTwitchClip",
        "summary": "Twitch Clip",
        "description": "Returns structured JSON for **Twitch Clip**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Twitch scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/twitch/schedule": {
      "get": {
        "operationId": "schedule",
        "summary": "Twitch User Schedule",
        "description": "Returns structured JSON for **Twitch User Schedule**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Twitch scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/snapchat/profile": {
      "get": {
        "operationId": "scrapeSnapchatProfile",
        "summary": "Snapchat Profile",
        "description": "Returns structured JSON for **Snapchat Profile**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Snapchat scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/spotify/artist": {
      "get": {
        "operationId": "scrapeSpotifyArtist",
        "summary": "Spotify Artist",
        "description": "Returns structured JSON for **Spotify Artist**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Spotify scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video). Send this **or** `id`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/spotify/track": {
      "get": {
        "operationId": "track",
        "summary": "Spotify Track",
        "description": "Returns structured JSON for **Spotify Track**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Spotify scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video). Send this **or** `id`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/spotify/album": {
      "get": {
        "operationId": "album",
        "summary": "Spotify Album",
        "description": "Returns structured JSON for **Spotify Album**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Spotify scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "query",
            "required": true,
            "description": "Identifier from a previous response. Send this **or** `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video). Send this **or** `id`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/soundcloud/artist": {
      "get": {
        "operationId": "scrapeSoundcloudArtist",
        "summary": "SoundCloud Artist",
        "description": "Returns structured JSON for **SoundCloud Artist**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "SoundCloud scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Account handle or @username. Send this **or** `url`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video). Send this **or** `handle`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/kick/clip": {
      "get": {
        "operationId": "scrapeKickClip",
        "summary": "Kick Clip",
        "description": "Returns structured JSON for **Kick Clip**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Kick scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/linktree/page": {
      "get": {
        "operationId": "scrapeLinktreePage",
        "summary": "Linktree Page",
        "description": "Returns structured JSON for **Linktree Page**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Linktree scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/komi/page": {
      "get": {
        "operationId": "scrapeKomiPage",
        "summary": "Komi Page",
        "description": "Returns structured JSON for **Komi Page**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Komi scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/pillar/page": {
      "get": {
        "operationId": "scrapePillarPage",
        "summary": "Pillar Page",
        "description": "Returns structured JSON for **Pillar Page**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Pillar scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/linkbio/page": {
      "get": {
        "operationId": "scrapeLinkbioPage",
        "summary": "Linkbio Page",
        "description": "Returns structured JSON for **Linkbio Page**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Lnk.Bio scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/linkme/page": {
      "get": {
        "operationId": "scrapeLinkmePage",
        "summary": "Linkme Profile",
        "description": "Returns structured JSON for **Linkme Profile**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Linkme scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cache_max_age",
            "in": "query",
            "required": false,
            "description": "Accept a cached result up to this old (1d, 3d, 7d, 14d or 30d) and pay nothing for it. Omit for a live scrape. Allowed values: `1d`, `3d`, `7d`, `14d`, `30d`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/scrape/amazon/shop": {
      "get": {
        "operationId": "shop",
        "summary": "Amazon Shop Page",
        "description": "Returns structured JSON for **Amazon Shop Page**. Billed **$0.00149 per successful call** ($1.49 per 1,000); errors, timeouts and rate limits are never charged, while a lookup whose target does not exist is billed like a successful call because the platform was queried. `POST` with a JSON body works too.",
        "tags": [
          "Amazon scraper API"
        ],
        "parameters": [
          {
            "name": "x-api-key",
            "in": "query",
            "required": true,
            "description": "Your HProxy API key with the scrape scope.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Target URL (profile, post or video).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Return a slimmed-down payload (drops verbose fields).",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/proxy-list": {
      "get": {
        "operationId": "free-proxy-list",
        "summary": "The whole live list in one call",
        "description": "One GET returns **every working proxy we have**, as `txt`, `json` or `csv`. Not a sample and not a teaser: HTTP, HTTPS, SOCKS4 and SOCKS5, all of it, in a single call. No key, no signup. CORS is enabled, so you can call it straight from a browser. Fair-use rate limit of about 120 requests per minute per IP, with bursts up to 120 (a clean `429` with `Retry-After` beyond that). This is the same data behind the [free proxy list](/free-proxy-list).\n\n**How many is that?** Thousands at any moment, and tens of thousands within two days, because that is how many public proxies on Earth are actually answering. It moves every few minutes as proxies die and new ones are found, so treat any number written here as a rough order of magnitude and never as the truth. `X-Total-Available` on the response is the exact count matching your filter, and `X-Total-Count` is how many came back in this particular response. If the two are equal you already have everything and there is no next page.\n\n**Why you will see 10,000 mentioned below.** That is the most rows a single response will carry *when you ask for a specific number*. It is a page size, not a cap on what you are allowed to have. **Omit `limit` entirely and you get the complete matching set in one response**, however large it is. The page size only comes into play when you pass `limit` yourself, or on a set big enough that we page it for you (`recent=true`).",
        "tags": [
          "Free proxy list API"
        ],
        "parameters": [
          {
            "name": "format",
            "in": "query",
            "required": false,
            "description": "Response shape. Default txt (one ip:port per line).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "protocol",
            "in": "query",
            "required": false,
            "description": "Filter by protocol. Comma-separated allowed (e.g. http,https), which matches a proxy supporting ANY of them.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "Filter by country, e.g. US, DE, GB.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "anonymity",
            "in": "query",
            "required": false,
            "description": "Filter by anonymity grade. Proxies we have not been able to grade yet are excluded.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "asn",
            "in": "query",
            "required": false,
            "description": "Filter by autonomous system, e.g. 14061 for DigitalOcean. Same data as the per-network pages on the free list.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "port",
            "in": "query",
            "required": false,
            "description": "Only proxies answering on this exact port, e.g. 8080 or 1080.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "subnet",
            "in": "query",
            "required": false,
            "description": "Only proxies inside one /24 block, e.g. subnet=45.61.188 for 45.61.188.0/24. Open proxies cluster in blocks, so this finds a machine's neighbours.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "min_uptime_pct",
            "in": "query",
            "required": false,
            "description": "Only proxies whose lifetime uptime is at least this. The single most useful filter if you want proxies that stay up.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_latency_ms",
            "in": "query",
            "required": false,
            "description": "Only proxies at or below this latency, in milliseconds.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Order the whole pool by reliability before paging, so page 1 is the best proxies overall. Omit for the default order (alive first, then fastest).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Rows in THIS response, not a limit on your total. Leave it out and you receive the complete matching set in one call, which is what most callers want. Pass a number and this response stops at that many rows (10000 is the ceiling for one response); use offset to walk the rest. Whatever you do, X-Total-Available still reports how many exist.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Skip this many rows. Needed only when you passed an explicit limit, or on a set too large for one response. Default 0.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "recent",
            "in": "query",
            "required": false,
            "description": "Also include proxies that have gone quiet but answered within the last 48h, taking the set from the live-now pool to several times its size. This WIDENS the list, it does not freshen it: the extra rows come back with status recently_alive and many are not answering right now. Leave it off for the strictly alive-now pool.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": []
      }
    },
    "/api/proxy-check": {
      "get": {
        "operationId": "free-proxy-check",
        "summary": "Check one proxy",
        "description": "Check whether a proxy is alive and get its protocols, anonymity grade, latency and location. Free, no key, CORS enabled. Each request runs a **real live test** against the proxy (a dead one can take a few seconds to report).\n\nTwo limits apply, and every checker endpoint shares them. **Requests**: 120 in a burst per IP, then 5 a second. **Proxies checked**: 300,000 a day per IP, refilling continuously. A signed-in account, or an [API key](#free-proxy-check-keyed), gets ten times both. Past either you get a `429` with `Retry-After` and a `code` saying which limit it was (`rate_limited`, `daily_budget`, or `busy` when the whole service is at capacity). Every answer reports the daily budget in `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Cost`, so you can pace yourself from the headers.\n\n`status` is the verdict: `alive`, `dead`, `invalid` (we could not read the line), `unresolved` (the hostname has no DNS answer), `forbidden` (a private or reserved address we do not dial) or `unchecked` (no answer inside the time budget; not a verdict, retry the line). For a gateway proxy, `exit_ip` is where your traffic actually comes out, and the location fields describe that address. A dead proxy carries the reason in `failure` (`refused`, `timeout`, `tls_error`, `bad_status`, `no_echo`). Geo and ASN fields fill in when enrichment data exists and are `null` otherwise.",
        "tags": [
          "Proxy checker API"
        ],
        "parameters": [
          {
            "name": "proxy",
            "in": "query",
            "required": true,
            "description": "The proxy to test, e.g. 203.0.113.7:1080, or host:port:user:pass for one with a login.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "input": "203.0.113.7:1080",
                  "status": "alive",
                  "alive": true,
                  "ip": "203.0.113.7",
                  "exit_ip": "203.0.113.7",
                  "port": 1080,
                  "protocols": [
                    "socks5"
                  ],
                  "anonymity": "elite",
                  "latency_ms": 184,
                  "country_code": "US",
                  "region": "New York",
                  "city": "New York",
                  "asn": 14061,
                  "asn_org": "DigitalOcean, LLC",
                  "is_datacenter": true,
                  "failure": null,
                  "error": null
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": []
      },
      "post": {
        "operationId": "free-proxy-check-batch",
        "summary": "Check up to 1,000 at once",
        "description": "POST a JSON body with up to **1,000** proxies. They are checked in parallel and the answer comes back in one response within about 25 seconds: a few seconds when they are alive, longer when some never answer. The response is `{ \"count\": n, \"results\": [ ... ], \"complete\": true, \"unchecked\": 0 }` with the same per-proxy shape, one row for **every** line you sent. A line that did not get an answer inside the time budget comes back with `status: \"unchecked\"`, and `complete` is then `false`: retry those lines, or stream the list instead. Bigger lists belong on the streaming endpoint below, which takes up to 100,000 and reports each proxy the moment it settles.",
        "tags": [
          "Proxy checker API"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "count": 2,
                  "results": [
                    {
                      "input": "203.0.113.7:1080",
                      "status": "alive",
                      "alive": true,
                      "ip": "203.0.113.7",
                      "port": 1080,
                      "protocols": [
                        "socks5"
                      ],
                      "latency_ms": 184,
                      "failure": null,
                      "error": null
                    },
                    {
                      "input": "198.51.100.3:8080",
                      "status": "dead",
                      "alive": false,
                      "ip": "198.51.100.3",
                      "port": 8080,
                      "protocols": [],
                      "latency_ms": null,
                      "failure": "timeout",
                      "error": "proxy did not respond"
                    }
                  ],
                  "complete": true,
                  "unchecked": 0
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "proxies": {
                    "type": "array",
                    "items": {},
                    "description": "Up to 1,000 proxy lines per request (ip:port, host:port:user:pass or user:pass@host:port)."
                  }
                },
                "required": [
                  "proxies"
                ]
              }
            }
          }
        }
      }
    },
    "/api/free-proxy/check": {
      "post": {
        "operationId": "free-proxy-check-stream",
        "summary": "Stream a big list, up to 100,000",
        "description": "The endpoint behind our [online proxy checker](/proxy-checker-online) page. POST the list and read the answer as **NDJSON**: one JSON line per proxy, in the shape above, written the moment that proxy settles, so you can show results while the rest are still running. The same limits apply, counted per proxy.\n\nTwo kinds of event lines ride along; skip any line that has an `_event` key you do not know. `{\"_event\":\"progress\",\"done\":N,\"total\":M}` arrives every 15 seconds, and `{\"_event\":\"end\",\"total\":M,\"done\":M,\"duration_ms\":N}` closes a finished batch. **A stream that stops without the end line was cut** (a network drop, or a restart on our side): the lines you have no row for were not checked, so send just those again.\n\nIf your list is big enough that the run takes minutes, hand it over as a [job](#check-jobs-create) instead: nothing stays connected, and an interrupted job resumes by itself.",
        "tags": [
          "Proxy checker API"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "proxies": {
                    "type": "array",
                    "items": {},
                    "description": "Up to 100,000 proxy lines."
                  },
                  "timeout_ms": {
                    "type": "integer",
                    "description": "Per-probe budget, 1,000 to 60,000. Default 8,000."
                  },
                  "retries": {
                    "type": "integer",
                    "description": "Extra attempts for a proxy that does not answer, 0 to 3. Default 0."
                  },
                  "protocols": {
                    "type": "array",
                    "items": {},
                    "description": "Any of http, https, socks4, socks5. Default all four."
                  },
                  "measure_speed": {
                    "type": "boolean",
                    "description": "Also measure download speed through each working proxy (speed_mbps)."
                  },
                  "measure_udp": {
                    "type": "boolean",
                    "description": "Also test whether each working SOCKS5 proxy relays UDP (supports_udp)."
                  }
                },
                "required": [
                  "proxies"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/free-proxy/check": {
      "post": {
        "operationId": "free-proxy-check-keyed",
        "summary": "With your API key",
        "description": "Every checker endpoint also answers under `/api/v1` for an API key: `POST /api/v1/free-proxy/check` streams, `GET` and `POST /api/v1/proxy-check` answer in one response. Same bodies, same result rows, and your account's tier: ten times the requests and 3,000,000 proxies a day, counted on the account rather than on the address, so a whole team behind one office connection is not squeezed into one person's budget. Any key works; checking spends nothing and needs no scope. Errors come back in the usual `/api/v1` shape, `{ \"error\", \"code\" }`.",
        "tags": [
          "Proxy checker API"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "X-API-Key": {
                    "type": "string",
                    "description": "Your hpx_ key (or Authorization: Bearer hpx_...)."
                  }
                },
                "required": [
                  "X-API-Key"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/proxy-check/jobs": {
      "post": {
        "operationId": "check-jobs-create",
        "summary": "Hand over a big list as a job",
        "description": "For the lists that take minutes: hand the list over, get an id back immediately, come back for the results when it is done. Nothing has to stay connected, so a dropped line, a closed laptop or a restart on our side does not cost you the run — a job that is interrupted resumes on the line after the last one answered.\n\n**Accounts only** (an API key, or signed in on the dashboard). The list costs the same as checking it any other way: every line is charged to your daily budget of 3,000,000 when the job is created, and refunded if the job could not be created at all.\n\nThe limits that keep this from becoming a flood: up to **100,000** lines per job, **3** queued or running jobs at a time per account, and 20 job creations an hour. Job probes run in the lowest lane, below every live check, so they pause while the service is under load and pick up again by themselves. Results live for **72 hours** after the job ends, then the files are deleted and the job reads `expired`.\n\nSend the list as `{ \"proxies\": [...] }` with the same options the streaming endpoint takes, or as a `text/plain` body of one proxy per line (what `curl --data-binary @list.txt` sends). Answer is `202` with the job.",
        "tags": [
          "Proxy checker API"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "id": "cj_7f1c0e5a4b3d4f0e9a2c6b8d1e3f5a70",
                  "status": "queued",
                  "total": 41000,
                  "done": 0,
                  "alive": 0,
                  "label": null,
                  "created_at": "2026-09-12T10:04:11Z",
                  "started_at": null,
                  "finished_at": null,
                  "expires_at": null,
                  "error": null,
                  "results_url": "/api/v1/proxy-check/jobs/cj_7f1c0e5a4b3d4f0e9a2c6b8d1e3f5a70/results",
                  "queue_position": 1
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "X-API-Key": {
                    "type": "string",
                    "description": "Your hpx_ key (or Authorization: Bearer hpx_...)."
                  },
                  "proxies": {
                    "type": "array",
                    "items": {},
                    "description": "Up to 100,000 proxy lines. A text/plain body of one line per proxy works too."
                  },
                  "label": {
                    "type": "string",
                    "description": "Your own name for the run, up to 64 characters. Shown in the dashboard."
                  },
                  "timeout_ms": {
                    "type": "integer",
                    "description": "Per-probe budget, 1,000 to 60,000. Default 8,000."
                  },
                  "retries": {
                    "type": "integer",
                    "description": "Extra attempts for a proxy that does not answer, 0 to 3. Default 0."
                  },
                  "protocols": {
                    "type": "array",
                    "items": {},
                    "description": "Any of http, https, socks4, socks5. Default all four."
                  },
                  "measure_speed": {
                    "type": "boolean",
                    "description": "Also measure download speed through each working proxy (speed_mbps)."
                  },
                  "measure_udp": {
                    "type": "boolean",
                    "description": "Also test whether each working SOCKS5 proxy relays UDP (supports_udp)."
                  }
                },
                "required": [
                  "X-API-Key",
                  "proxies"
                ]
              }
            }
          }
        }
      }
    },
    "/api/v1/proxy-check/jobs/{id}": {
      "get": {
        "operationId": "check-jobs-get",
        "summary": "Watch a job",
        "description": "The same job body, with `done` and `alive` climbing as lines settle. `status` is `queued` (with `queue_position` while it waits), `running`, `done`, `cancelled`, `failed` (the reason is in `error`) or `expired` (the results have been deleted). Poll it every few seconds, not every few milliseconds — it counts against your request limit like any other call.\n\n`GET /api/v1/proxy-check/jobs` lists your 20 most recent jobs as `{ \"count\": n, \"jobs\": [ ... ] }`.",
        "tags": [
          "Proxy checker API"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-API-Key",
            "in": "query",
            "required": true,
            "description": "Your hpx_ key.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "id": "cj_7f1c0e5a4b3d4f0e9a2c6b8d1e3f5a70",
                  "status": "running",
                  "total": 41000,
                  "done": 18734,
                  "alive": 2211,
                  "started_at": "2026-09-12T10:04:13Z",
                  "finished_at": null,
                  "expires_at": null,
                  "error": null,
                  "results_url": "/api/v1/proxy-check/jobs/cj_7f1c0e5a4b3d4f0e9a2c6b8d1e3f5a70/results"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      },
      "delete": {
        "operationId": "check-jobs-cancel",
        "summary": "Cancel a job",
        "description": "Stops a queued or running job. What it already answered stays downloadable until it expires, so cancelling a long run is a fine way to say \"that is enough of these\". A job that has already finished answers `409`; the lines it did not get to are not refunded.",
        "tags": [
          "Proxy checker API"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-API-Key",
            "in": "query",
            "required": true,
            "description": "Your hpx_ key.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/v1/proxy-check/jobs/{id}/results": {
      "get": {
        "operationId": "check-jobs-results",
        "summary": "Download the results",
        "description": "Everything that has settled, in the format you ask for. It works on a running job too, so you can start reading before the list is finished — and reading does not consume anything: the file stays until the job expires, so you can download it as often as you like.\n\n`format=ndjson` (the default) is one result row per line, the exact shape every checker endpoint returns. `format=txt` is the working proxies only, one line per proxy, ready to paste straight back into whatever you feed proxies to. `format=csv` is a spreadsheet with a header row. Add `only=alive` to drop the dead rows from any format. `txt` and `csv` come back as a download; ndjson streams.\n\nAfter the retention window the job reads `expired` and this answers `410`.",
        "tags": [
          "Proxy checker API"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "X-API-Key",
            "in": "query",
            "required": true,
            "description": "Your hpx_ key.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "description": "Default ndjson. txt is the working proxies only; csv carries a header row.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "only",
            "in": "query",
            "required": false,
            "description": "Drop the dead rows (txt does this anyway).",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/api/ip/{ip}": {
      "get": {
        "operationId": "ip-lookup",
        "summary": "Location and network for any IP",
        "description": "One GET returns where an IP is and which network runs it: country, region, city, coordinates, timezone, ASN, ASN organisation and ISP. No key, no signup, CORS enabled so you can call it straight from a browser or an extension.\n\nThis is the same lookup that powers the [free proxy list](/free-proxy-list) and our own [proxy checker](/proxy-checker), so if you are writing a proxy checker of your own, you can label your results with exactly the data we label ours with. It is read from offline databases, so there is no third-party API in the path.\n\nTwo limits apply per IP, and they are deliberately separate. **Requests** on this single-address door are capped at 900 in a burst, refilling 30 per second. **Addresses** are capped by the budget described under the batch endpoint below, and both doors draw on that same budget, so a hundred thousand single lookups cost exactly what one batch of a hundred thousand costs. Every answer reports the address budget in `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Cost`, so you can pace yourself from the headers rather than discovering the limit by being refused. Past either one you get a clean `429` with `Retry-After`.\n\nResponses carry `Cache-Control: public, max-age=21600`: an address's location and ASN move on the order of weeks, so cache them hard rather than re-asking on every run.",
        "tags": [
          "IP location and ASN API"
        ],
        "parameters": [
          {
            "name": "ip",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "ip": "45.79.12.44",
                  "country": "US",
                  "country_name": "United States",
                  "region": "Texas",
                  "city": "Dallas",
                  "latitude": 32.7797,
                  "longitude": -96.8022,
                  "timezone": "America/Chicago",
                  "asn": 63949,
                  "asn_org": "Akamai Technologies, Inc.",
                  "isp": "Akamai Technologies, Inc.",
                  "is_datacenter": false
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": []
      }
    },
    "/api/ip": {
      "post": {
        "operationId": "ip-lookup-batch",
        "summary": "Batch: up to 100 000 addresses per call",
        "description": "If you are labelling a whole proxy list, use this instead of one request per proxy. Send up to **100,000** addresses in one call and get one result per address, **in the same order you sent them**, so you can zip the two lists together without matching on anything.\n\n**You are charged per distinct address, not per request and not per line.** Duplicates are free, because they are free for us: a list that repeats one host across twenty ports is one lookup on our side, so it is one address on your budget, and there is no need to deduplicate before sending. Lines we reject as invalid or private are free for the same reason, since they never reach the lookup at all. Your budget per IP is 120,000 addresses in a burst, refilling 1,000 per second, and 2,000,000 per day.\n\n**Large batches stream.** The response starts arriving as soon as the first addresses resolve rather than after the last one, which is what makes a call this size practical. It is still a single JSON document with a single `results` array in your original order, so `res.json()` and `r.json()` keep working exactly as before; the bytes simply arrive in pieces. Budget a couple of minutes for a fully cold 100 000-address batch. Anything we have looked up in the last six hours comes back from cache, so a list you re-check is far faster than the first run.\n\nAddresses that cannot be resolved come back as `{ \"ip\": \"…\", \"found\": false }` rather than being dropped, so the arrays always line up.",
        "tags": [
          "IP location and ASN API"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "results": [
                    {
                      "ip": "45.79.12.44",
                      "country": "US",
                      "city": "Dallas",
                      "asn": 63949,
                      "asn_org": "Akamai Technologies, Inc.",
                      "is_datacenter": false
                    },
                    {
                      "ip": "24.48.0.1",
                      "country": "CA",
                      "region": "Quebec",
                      "city": "Montreal",
                      "asn": 5769,
                      "asn_org": "Videotron Ltee",
                      "is_datacenter": false
                    },
                    {
                      "ip": "8.8.8.8",
                      "country": "US",
                      "asn": 15169,
                      "asn_org": "Google LLC",
                      "is_datacenter": true
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. The body names the field and the accepted set."
          },
          "401": {
            "description": "Missing or invalid API key."
          },
          "429": {
            "description": "Rate limited. Retry after the delay in the response."
          }
        },
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "ips": {
                    "type": "array",
                    "items": {},
                    "description": "Up to 100 000 IP addresses. A bare JSON array is also accepted. More than 100 000 returns 400 batch_too_large."
                  }
                },
                "required": [
                  "ips"
                ]
              }
            }
          }
        }
      }
    }
  },
  "x-endpoint-count": 163,
  "x-generated-from": "https://hproxy.com/docs",
  "x-llms": "https://hproxy.com/llms-full.txt"
}