QuantumProxies API (2026-10-07)
Scrape, search, crawl, unlock, run collectors and build datasets — one host, one Bearer key, one JSON envelope.
This specification is generated from the application source (route handlers, auth middleware, billing config). Every endpoint answers the same envelope: {"type":"response","message":"…","payload":{…}} on success and {"type":"error","message":"…","payload":{…}} on failure. Data API calls are pay-per-success: a blocked page, a target 4xx/5xx, a timeout or an error on our side is never charged. Billed responses carry payload.usage (cost_usd, free_usd, paid_usd, balance). Prices are referenced by key (x-price-key) and resolved from pricing.json; rate limits per tier live in tiers.json. Brand placeholders (quantumproxies.io, QuantumProxies) are resolved from brands.json.
Every request carries an API key in the Authorization header:
Authorization: Bearer qp_live_…
Authorization: Bearer qp_live_YOUR_API_KEY. Keys are qd_live_/qp_live_ followed by 64 hex characters and are created on the dashboard API keys page. Only this header is read: there is no x-api-key fallback and keys are never accepted in the query string. A disabled, expired or unknown key, or a banned account, answers 401.
Keys are created on the API keys page of the dashboard; register if you do not have an account. Keys are shown once; keep them in an environment variable, never in client-side code.
Base URL: https://api.quantumproxies.io/v1 (same API on the dashboard host: https://app.quantumproxies.io/api/v1, without the short aliases).
Machine-readable formats: openapi.json · openapi.yaml · index.md (this reference as Markdown) · llms.txt.
Status codes used by this API and what each one means (collected from every endpoint below). Error bodies are JSON with type: "error"; read message for the reason.
| Status | Meaning | Returned by |
|---|---|---|
400 |
Malformed input. message names the parameter and the rule it broke. |
28 endpoints |
401 |
Missing, malformed, unknown, disabled or expired API key; or the account is not active. | 47 endpoints |
402 |
The free tier plus wallet balance cannot cover the worst-case estimate of this call, or the account's monthly spend cap is reached. Nothing was run or charged. | 16 endpoints |
403 |
No proxy pool is available to serve the call (no house plan and no residential/datacenter/IPv6 plan on the account). | 11 endpoints |
404 |
presetId does not resolve to one of your presets. |
24 endpoints |
422 |
Input that can never resolve (documentation placeholder, undelegated TLD) — before or after the run; retrying the same input cannot help. Not billed. | POST /scraper/collectors/{slug}/run |
424 |
The run failed at the source (blocked, timed out, layout changed). JSON body with run_id and error; not billed, safe to retry. |
POST /scraper/collectors/{slug}/run |
429 |
Key rate limit (hourly window), plan per-minute budget, browser-render concurrency, or pool capacity. Back off on Retry-After. | 47 endpoints |
500 |
Extraction failed on our side or timed out (70 s budget). Never billed. | 36 endpoints |
502 |
Only with failOnBlock: true: every tier came back blocked. Same diagnostics as the 200 form; the GB moved are debited. |
POST /scraper/unlock, POST /public/proxies/generate |
503 |
The Data API group is switched off for non-admin keys (early-access kill switch). | 39 endpoints |
Response headers related to limits: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Retry-After, X-RateLimit-Scope, X-RateLimit-Plan.
Limits per tier (live values as of 2026-10-07):
| Tier | Monthly | Free usage / month | Requests / minute | Batch concurrency | Unit price discount |
|---|---|---|---|---|---|
| Pay as you go | $0 | $2 | 20 | 5 | 0% |
| Starter | $19/month | $15 | 300 | 10 | 10% |
| Growth | $79/month | $50 | 600 | 20 | 20% |
| Scale | $299/month | $250 | 1200 | 20 | 30% |
- Per API key. Two windows apply: the tier's requests/minute (tiers.json → rateLimitPerMin) and an hourly window of max(1000, rateLimitPerMin × 60). Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (hourly window); a 429 also carries Retry-After. Plan-level limiters (per-minute budget, browser-render concurrency) add X-RateLimit-Scope and X-RateLimit-Plan to their 429s.
- rateLimitPerMin is enforced per API key; the key also has an hourly window = max(1000, rateLimitPerMin × 60) requests.
- A pay-as-you-go account in real-balance billing mode gets balance_mode_rate_limit_per_min (pricing.json) instead of its tier cap.
- 429 responses carry X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset and Retry-After.
- Real-balance billing mode: 300 requests/minute instead of the tier cap.
Every pay-as-you-go account includes $2 of free usage per month. Only successful calls are billed; a blocked page, a target 4xx/5xx, a timeout or an error on our side costs nothing. Prices below are the list of 2026-10-07; GET /scraper/billing returns the live list applied to your key. LLM tokens used by the AI endpoints are billed at provider cost × 2.
| Endpoint | Price keys |
|---|---|
POST /scraper/extract |
extract $0.0002 per call + $3/GB, max $0.02 per callextract_render $0.001 per call + $4/GB, max $0.05 per callai_extract $0.001 per call, max $1.50 per call |
POST /scraper/serp |
serp $0.0005 per callserp_render $0.002 per call |
POST /scraper/serp/bulk |
serp_render $0.002 per callserp $0.0005 per call |
POST /scraper/map |
map $0.0005 per call |
POST /scraper/crawl |
crawl_page $0.0003 per callextract_render $0.001 per call + $4/GB, max $0.05 per call |
POST /scraper/batch |
batch_url $0.0002 per callextract_render $0.001 per call + $4/GB, max $0.05 per call |
POST /scraper/unlock |
unlock_request $2.40/GB of transferred data |
POST /scraper/ai |
ai_extract $0.001 per call, max $1.50 per callextract $0.0002 per call + $3/GB, max $0.02 per callserp $0.0005 per callmap $0.0005 per call |
POST /scraper/places-ai |
places_ai $0.005 per call, max $3 per callserp_render $0.002 per call |
POST /scraper/shopping-ai |
shopping_ai $0.005 per call, max $3 per callserp_render $0.002 per call |
POST /scraper/ai-visibility |
ai_visibility $0.002 per callai_visibility_citation $0.01 per callserp $0.0005 per call |
POST /scraper/seo-audit |
seo_audit $0.0012 per callextract $0.0002 per call + $3/GB, max $0.02 per call |
POST /scraper/collectors/{slug}/run |
collector_result — by collector, table below |
POST /scraper/datasets |
dataset_row $0.03 per calldataset_row_refresh $0.01 per call |
POST /scraper/parser/generate |
parser_generate $0.02 per call |
POST /scraper/parser/presets/{id}/heal |
parser_generate $0.02 per call |
Collector results (POST /scraper/collectors/{slug}/run, per delivered result): |
| Collector price key | Per delivered result |
|---|---|
collector_ai_readiness |
$0.003 |
collector_airbnb_stays |
$0.001 |
collector_aliexpress_search |
$0.001 |
collector_amazon_product |
$0.008 |
collector_amazon_reviews |
$0.002 |
collector_amazon_search |
$0.001 |
collector_app_store_apps |
$0.0008 |
collector_app_store_reviews |
$0.0005 |
collector_arxiv_papers |
$0.0004 |
collector_asos_search |
$0.001 |
collector_autotrader_search |
$0.001 |
collector_bbb_businesses |
$0.002 |
collector_bestbuy_product |
$0.002 |
collector_booking_stays |
$0.02 |
collector_business_directory |
$0.001 |
collector_capterra_products |
$0.001 |
collector_carvana_cars |
$0.001 |
collector_certificate_transparency |
$0.0004 |
collector_clinical_trials |
$0.0005 |
collector_coingecko_coins |
$0.0002 |
collector_company_profile |
$0.03 |
collector_coursera_courses |
$0.001 |
collector_crates_io |
$0.0003 |
collector_defillama |
$0.0003 |
collector_dns_records |
$0.0002 |
collector_docker_hub |
$0.0003 |
collector_doordash_restaurants |
$0.001 |
collector_ebay_product |
$0.006 |
collector_ebay_search |
$0.001 |
collector_exchange_rates |
$0.0002 |
collector_flipkart_search |
$0.001 |
collector_g2_products |
$0.001 |
collector_github_repos |
$0.0005 |
collector_gleif_lei |
$0.0004 |
collector_google_autocomplete |
$0.0002 |
collector_google_events |
$0.002 |
collector_google_flights |
$0.003 |
collector_google_jobs |
$0.001 |
collector_google_lens |
$0.004 |
collector_google_maps_places |
$0.001 |
collector_google_news |
$0.0005 |
collector_google_play_apps |
$0.006 |
collector_google_shopping |
$0.001 |
collector_google_trends |
$0.0005 |
collector_hacker_news |
$0.0003 |
collector_healthgrades_doctors |
$0.001 |
collector_hotels |
$0.02 |
collector_idealista_search |
$0.001 |
collector_indeed_jobs |
$0.001 |
collector_instagram_profile |
$0.006 |
collector_itunes_search |
$0.0004 |
collector_keyword_ideas |
$0.0002 |
collector_kleinanzeigen_search |
$0.001 |
collector_linkedin_company |
$0.005 |
collector_linkedin_jobs |
$0.001 |
collector_linkedin_profile |
$0.005 |
collector_local_business_leads |
$0.01 |
collector_marketwatch_quote |
$0.003 |
collector_miodottore_doctors |
$0.001 |
collector_nike_products |
$0.001 |
collector_npm_packages |
$0.0003 |
collector_nvd_cve |
$0.0004 |
collector_openalex |
$0.0004 |
collector_openfda |
$0.0004 |
collector_openlibrary_books |
$0.0004 |
collector_paginegialle_profiles |
$0.002 |
collector_place_reviews |
$0.0005 |
collector_product_offers |
$0.002 |
collector_producthunt_posts |
$0.001 |
collector_pypi_packages |
$0.0003 |
collector_reddit_comments |
$0.002 |
collector_reddit_posts |
$0.0005 |
collector_redfin_search |
$0.0008 |
collector_rottentomatoes_movies |
$0.001 |
collector_search_images |
$0.0003 |
collector_search_videos |
$0.0004 |
collector_sec_filings |
$0.0005 |
collector_site_contacts |
$0.02 |
collector_site_documents |
$0.005 |
collector_stackoverflow |
$0.0003 |
collector_steam |
$0.0008 |
collector_subito_search |
$0.001 |
collector_target_product |
$0.0006 |
collector_tech_stack |
$0.005 |
collector_tiktok_profile |
$0.004 |
collector_tiktok_video |
$0.004 |
collector_tripadvisor_search |
$0.001 |
collector_trustpilot_reviews |
$0.002 |
collector_udemy_courses |
$0.001 |
collector_walmart_product |
$0.0015 |
collector_walmart_search |
$0.002 |
collector_wayback_machine |
$0.0003 |
collector_weather_forecast |
$0.0002 |
collector_web_search |
$0.0004 |
collector_wellfound_jobs |
$0.001 |
collector_whois_domain |
$0.0005 |
collector_wikidata |
$0.0003 |
collector_wikipedia_articles |
$0.0005 |
collector_world_bank |
$0.0002 |
collector_yahoo_finance |
$0.001 |
collector_youtube_channel |
$0.0008 |
collector_youtube_search |
$0.0008 |
collector_youtube_video |
$0.005 |
collector_zalando_search |
$0.001 |
collector_zillow_property |
$0.005 |
collector_zillow_search |
$0.001 |
The same API is available as an MCP server for Claude, Cursor, ChatGPT and any MCP client. Product page: quantumproxies.io/mcp-server.
Remote server (OAuth 2.1, no key to paste): https://api.quantumproxies.io/mcp
OAuth metadata: authorization server · protected resource
Claude Code (remote, OAuth):
claude mcp add --transport http quantumproxies https://api.quantumproxies.io/mcp
Local server (npx, API key in the environment):
QUANTUMPROXIES_API_KEY=qp_live_… npx -y quantumproxies-mcp
Claude Code (local):
claude mcp add quantumproxies -e QUANTUMPROXIES_API_KEY=qp_live_… -- npx -y quantumproxies-mcp
Clients without native remote MCP support can bridge through npx -y quantumproxies-mcp-remote.
Trial limits for keyless use are published by GET /mcp/trial-config (see Account).
Tools exposed by the remote server (as of 2026-10-07) and the REST endpoint behind each one:
| MCP tool | Endpoint |
|---|---|
scrape |
POST /scraper/extract |
search |
POST /scraper/serp |
search_and_read |
POST /scraper/serp + POST /scraper/extract |
search_bulk |
POST /scraper/serp/bulk |
search_bulk_status |
GET /scraper/serp/bulk/{jobId} |
map |
POST /scraper/map |
crawl |
POST /scraper/crawl |
crawl_status |
GET /scraper/crawl/{jobId} |
batch |
POST /scraper/batch |
batch_status |
GET /scraper/batch/{jobId} |
unlock |
POST /scraper/unlock |
ai_visibility |
POST /scraper/ai-visibility |
seo_audit |
POST /scraper/seo-audit |
list_collectors |
GET /scraper/collectors |
run_collector |
POST /scraper/collectors/{slug}/run |
collector_run_status |
GET /scraper/collectors/runs/{runId} |
create_dataset |
POST /scraper/datasets |
dataset_status |
GET /scraper/datasets/{jobId} |
generate_parser |
POST /scraper/parser/generate |
list_parser_presets |
GET /scraper/parser/presets |
save_parser_preset |
POST /scraper/parser/presets |
heal_parser_preset |
POST /scraper/parser/presets/{id}/heal |
parser_preset_stats |
GET /scraper/parser/presets/{id}/stats |
list_proxies |
GET /public/proxies |
generate_proxies |
POST /public/proxies/generate |
proxy_locations |
POST /public/proxies/generate (targeting options) |
whitelist_ip |
POST /public/proxies/whitelist-ip |
report |
(MCP only: usage report of the session) |
Scrape one URL
Price: extract $0.0002 per call + $3/GB, max $0.02 per call · extract_render $0.001 per call + $4/GB, max $0.05 per call · ai_extract $0.001 per call, max $1.50 per call. extract when the TLS/fetch tier served the page, extract_render when the browser did; both carry a perGb meter and a capUsd ceiling (pricing.json → meters). ai_extract + LLM tokens × ai_token_markup when ai_prompt/ai_schema is used. The pre-check reserves the worst case (render price unless engine is pinned to tls/fetch without render). (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Short alias: POST https://api.quantumproxies.io/v1/scrape (same handler, primary host only)
Try it in the Playground · Markdown for this group
Fetches one page through the residential pool and returns it as Markdown, HTML or text. Starts on a TLS-fingerprint tier (fast, cheap) and, with engine: auto, escalates to a stealth headless browser only when the target blocks; render: true (or engine: render, screenshot, xhr, reveal_hidden) forces the browser. Binary documents (PDF, DOCX, XLSX, CSV) are converted to text. Optional structured extraction (extract CSS schema or a stored presetId) and AI extraction (ai_prompt/ai_schema) run on the same fetch. Pass html instead of url to convert markup you already have (no fetch, no proxy bandwidth). What it does not do: it does not solve interactive captchas, and mode: summary returns no page content (so it cannot be combined with AI extraction). Billed per successful page by the engine that served it, plus a per-GB bandwidth component with a per-call cap; AI extraction adds the ai_extract fee plus marked-up LLM tokens. A page flagged as blocked or a target status ≥ 400 is not charged.
Authorizations:
Request Body schema: application/jsonrequired
| url | string <= 2048 characters http/https URL to scrape. Required unless |
| html | string Markup to convert instead of fetching (max 5 MB). |
| format | string Default: "markdown" Enum: "markdown" "html" "text" "raw"
|
| formats | Array of strings <= 3 items Items Enum: "markdown" "html" "text" Extra formats returned together under |
| data_format | string Enum: "markdown" "screenshot" Compatibility alias: |
| engine | string Default: "auto" Enum: "auto" "tls" "fetch" "render"
|
| autoEscalate | boolean Allow/forbid the auto engine's escalation to the browser (ignored once the plan's render budget is spent). |
| tlsProfile | string <= 64 characters TLS fingerprint profile for the TLS tier (opaque to the API; see /scraper/unlock for the known names). |
| render | boolean Default: false Force the stealth headless browser (JS execution). Bills the render rate. |
| mobile | boolean Default: false Mobile viewport and user agent. |
| waitMs | number Extra wait after load before capture, render tier (clamped by the service, max 15000). |
| waitForSelector | string <= 512 characters Wait until this CSS selector appears (render tier). |
| scrollToBottom | boolean Default: false Auto-scroll to trigger lazy-loaded content (render tier). |
| actions | Array of objects (PageAction) <= 20 items |
boolean or string
| |
| xhr | boolean Record the page's XHR/fetch traffic under |
object Assertion that the page is the real one: | |
object (ExtractSchema) Examples: {"title":"h1","price":".price","image":{"selector":"img.hero","attr":"src"},"features":{"selector":"li.feature","all":true}} Structured-extraction schema: field name → CSS selector, or an object with | |
| presetId | string Run a stored parser preset instead of an inline |
| contentMode | string Default: "smart" Enum: "smart" "article" "full"
|
| content_modes | Array of strings <= 3 items Items Enum: "smart" "article" "full" Return several content modes at once under |
| fullPage | boolean Legacy: |
| mode | string Default: "full" Enum: "full" "summary"
|
| include_links | boolean Default: false Also return de-duplicated absolute links under |
boolean or string Mine the page's own hydration state (Next/Nuxt/JSON islands) into | |
object Caller CSS rules: | |
| reveal_hidden | boolean Render tier: open |
object Markdown shaping; every key also accepted flat (snake_case) at the top level, flat wins. | |
| frontmatter | boolean |
| links_mode | string Enum: "inline" "footnote" "strip" |
| toc | boolean |
| max_tokens | number [ 200 .. 2000000 ] |
| images_mode | string Enum: "inline" "alt" "strip" |
| query | string <= 512 characters |
| highlights | integer [ 1 .. 20 ] |
| chunk | object |
| summary_sections | boolean |
| ai_prompt | string Natural-language instruction: the LLM turns the page into structured JSON under |
| ai_schema | object JSON Schema the AI output must follow (deterministic shape). Either |
object or string (ForwardHeaders) | |
object <= 50 properties name → value cookies sent to the target. | |
| country | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Country code or place name: letters, digits, spaces, dots, hyphens, underscores; max 56 characters. |
| state | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Requires |
| city | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Requires |
| rotation | string Default: "rotating" Enum: "rotating" "sticky" New exit IP per request, or keep one IP for the session. Any other value is treated as |
| sessionId | string <= 64 characters Sticky session id (generated if omitted). |
| sessionDuration | number Sticky session lifetime in minutes (clamped by the proxy layer, 3–1440, default 10). |
Responses
| X-RateLimit-Limit | integer Requests allowed in the current hourly window for this key. |
| X-RateLimit-Remaining | integer Requests left in the window. |
| X-RateLimit-Reset | string <date-time> ISO-8601 instant when the window resets. |
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object Payload of a scrape. Optional fields appear only when requested ( |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "format": "markdown",
- "country": "us",
- "extract": {
- "title": "h1",
- "price": ".price"
}
}Response samples
- 200
- 400
- 401
- 402
- 403
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Extraction successful",
- "payload": {
- "status": 200,
- "contentType": "text/html; charset=utf-8",
- "format": "markdown",
- "title": "Pricing — Example",
- "metadata": {
- "description": "Simple, transparent pricing.",
- "language": "en"
}, - "content": "# Pricing\n\nStarter — $9/month …",
- "data": {
- "title": "Pricing",
- "price": "$9"
}, - "engine": "tls",
- "attempts": 1,
- "escalated": false,
- "bytes": 48213,
- "durationMs": 1240,
- "geo": {
- "country": "us",
- "state": null,
- "city": null,
- "rotation": "rotating"
}, - "usage": {
- "cost_usd": 0.0002,
- "free_usd": 0.0002,
- "paid_usd": 0
}
}, - "pagination": { }
}Structured search results
Price: serp $0.0005 per call · serp_render $0.002 per call. Google (except autocomplete/reviews): serp when search_metadata.path is http, serp_render otherwise; Bing/DuckDuckGo: always serp. The pre-check reserves serp_render for Google. (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Short alias: POST https://api.quantumproxies.io/v1/serp (same handler, primary host only)
Try it in the Playground · Markdown for this group
One search on Google, Bing or DuckDuckGo through the residential pool, returned as JSON in the common SERP-API shape: organic results, ads, People Also Ask, related searches, knowledge panels, AI Overview and 17 Google verticals (search_type). Google renders by default so JS-only blocks are populated; pass render: false for the cheaper HTTP tier. Identical requests are served from a 24h cache for free (search_metadata.from_cache). It does not paginate on your behalf: request one page at a time and read pagination.available_pages/has_next, or use /scraper/serp/bulk. Billed per successful search by the tier that served it (search_metadata.path); blocked searches answer 429 and cost nothing; autocomplete and reviews always bill the request price.
Authorizations:
Request Body schema: application/jsonrequired
| query | string <= 2048 characters Search query. Required except for ID-addressed verticals: |
| engine | string Default: "google" Enum: "google" "bing" "duckduckgo" |
| search_type | string Default: "search" Enum: "search" "shopping" "images" "news" "places" "maps" "videos" "scholar" "jobs" "autocomplete" "place_details" "hotels" "flights" "events" "product" "lens" "reviews" "trends" Vertical. Alias |
| country | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Proxy exit and engine locale. Alias |
| lang | string <= 10 characters UI language, e.g. |
| num | number Results to request (clamped to 1–100 by the service; Google serves ~10 per page and merges pages — see |
| page | number Result page, 1-based. |
| start | number Result offset (alternative to |
| device | string Default: "desktop" Enum: "desktop" "mobile" Alias |
| render | boolean Google: renders by default; |
| browser | string Enum: "chrome" "firefox" "safari" Browser profile for the render tier. Alias |
| safe | string Enum: "active" "off" SafeSearch. |
boolean or integer Disable auto-corrected results. | |
| location | string <= 256 characters Human-readable search location ("Milan, Italy"), encoded to uule server-side. |
| uule | string <= 512 characters Encoded uule token OR raw |
| google_params | object <= 24 properties Escape hatch: extra Google URL params (keys ≤40 chars of letters, digits, |
| jobs | boolean Jobs box on the main SERP. Alias |
| place_id | string <= 128 characters
|
| data_id | string <= 128 characters
|
string or number
| |
| departure_id | string <= 64 characters
|
| arrival_id | string <= 64 characters |
| outbound_date | string <= 10 characters YYYY-MM-DD. |
| return_date | string <= 10 characters |
| check_in_date | string <= 10 characters
|
| check_out_date | string <= 10 characters |
| adults | number
|
| children_ages | Array of numbers <= 10 items |
| free_cancellation | boolean |
| accommodation_type | string Enum: "hotels" "vacation_rentals" |
| currency | string <= 8 characters
|
| gps_coordinates | string <= 64 characters
|
| image_url | string <= 2048 characters
|
| exact_matches | boolean
|
| sort_by | string Enum: "relevance" "newest" "highest_rating" "lowest_rating"
|
| filter | string <= 256 characters
|
| next_page_token | string <= 512 characters
|
| wait_for | string <= 512 characters Render tier: CSS selector to wait for before capture. |
| include_html | boolean Also return the page HTML under |
| product_ids | boolean
|
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object Search result in the common SERP-API JSON shape (drop-in for most existing SERP clients). Vertical arrays are always present (empty when the vertical did not apply); the single-object verticals ( |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "query": "best coffee grinder",
- "engine": "google",
- "country": "us",
- "lang": "en",
- "num": 10
}Response samples
- 200
- 400
- 401
- 402
- 403
- 429
- 500
- 503
{- "type": "response",
- "message": "SERP successful",
- "payload": {
- "search_metadata": {
- "status": "Success",
- "engine": "google",
- "created_at": "2026-10-07T09:12:44.000Z",
- "total_time_taken": 2.8,
- "attempts": 1,
- "bytes": 212544,
- "path": "http"
}, - "search_parameters": {
- "engine": "google",
- "q": "best coffee grinder",
- "search_type": "search",
- "device": "desktop",
- "country": "us",
- "language": "en",
- "page": 1
}, - "organic": [
- {
- "rank": 1,
- "title": "The 6 Best Coffee Grinders of 2026",
- "display_link": "example.com › reviews",
- "source": "example.com",
- "description": "We tested 24 burr grinders…",
- "date": "12 Sep 2026"
}
], - "ads": [ ],
- "people_also_ask": [
- {
- "question": "Is a burr grinder worth it?"
}
], - "related_searches": [
- {
- "query": "best coffee grinder under 100"
}
], - "ai_overview": null,
- "knowledge_graph": null,
- "pagination": {
- "current": 1,
- "next": 2,
- "total_pages": null,
- "available_pages": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "has_next": true
}, - "usage": {
- "cost_usd": 0.0005,
- "free_usd": 0.0005,
- "paid_usd": 0
}
}, - "pagination": {
- "current": 1,
- "next": 2,
- "total_pages": null,
- "available_pages": [
- 1,
- 2,
- 3,
- 4,
- 5
], - "has_next": true
}
}Start a multi-page search job
Price: serp_render $0.002 per call · serp $0.0005 per call. Google: serp_render × max_pages up front; Bing/DuckDuckGo: serp × max_pages. Unfetched pages refunded at settlement. (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Short alias: POST https://api.quantumproxies.io/v1/serp/bulk (same handler, primary host only)
Try it in the Playground · Markdown for this group
Paginates one query across up to 10 result pages asynchronously, riding real pagination on one session. Returns a job id immediately; poll GET /scraper/serp/bulk/{jobId} for the merged, de-duplicated organic results as pages land, or pass a webhook to receive the finished job. Only web-type verticals (search, news, videos, images, shopping) are supported here. Charged up front for max_pages; pages the query does not have are refunded when the job settles.
Authorizations:
Request Body schema: application/jsonrequired
| query required | string <= 2048 characters |
| engine | string Default: "google" Enum: "google" "bing" "duckduckgo" |
| search_type | string Default: "search" Enum: "search" "news" "videos" "images" "shopping" Alias |
| max_pages | integer [ 1 .. 10 ] Default: 5 |
| country | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Alias |
| lang | string <= 10 characters Alias |
| device | string Enum: "desktop" "mobile" Alias |
| render | boolean |
| wait_for | string <= 512 characters |
| browser | string Enum: "chrome" "firefox" "safari" |
| safe | string Enum: "active" "off" |
boolean or integer | |
| uule | string <= 512 characters |
| location | string <= 256 characters |
| google_params | object <= 24 properties |
| webhook | string <= 2048 characters Public http(s) URL that receives the finished job by POST. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object Answer of a POST that started an async job. |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "query": "best coffee grinder",
- "engine": "google",
- "country": "us",
- "max_pages": 3
}Response samples
- 200
- 400
- 401
- 402
- 403
- 429
- 500
- 503
{- "type": "response",
- "message": "Bulk SERP started",
- "payload": {
- "id": "sb_4d1e9c",
- "status": "running",
- "query": "best coffee grinder",
- "total": 3,
- "completed": 0,
- "statusUrl": "/api/v1/scraper/serp/bulk/sb_4d1e9c",
- "usage": {
- "cost_usd": 0.006,
- "free_usd": 0.006,
- "paid_usd": 0
}
}, - "pagination": { }
}Poll a multi-page search job
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Short alias: GET https://api.quantumproxies.io/v1/serp/bulk/{jobId} (same handler, primary host only)
Try it in the Playground · Markdown for this group
Progress and merged organic results of a bulk search job you own. Pass the previous response's nextCursor as since to receive only new rows. Jobs are kept about an hour after they finish. Free to poll.
Authorizations:
path Parameters
| jobId required | string Example: job_8f2c1a Job id returned by the POST that started it. |
query Parameters
| since | integer Organic cursor from the previous poll's |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/serp/bulk/job_8f2c1a');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Bulk SERP status",
- "payload": {
- "id": "sb_4d1e9c",
- "status": "completed",
- "query": "best coffee grinder",
- "total": 3,
- "completed": 3,
- "failed": 0,
- "pages": [
- {
- "page": 1,
- "organic_count": 10,
- "bytes": 210331,
- "path": "http"
}, - {
- "page": 2,
- "organic_count": 10,
- "bytes": 198002,
- "path": "http"
}, - {
- "page": 3,
- "organic_count": 9,
- "bytes": 190114,
- "path": "http"
}
], - "organic": [
- {
- "rank": 1,
- "title": "The 6 Best Coffee Grinders of 2026",
- "display_link": "example.com",
- "description": "…"
}
], - "related_searches": [ ],
- "ai_overview": null,
- "nextCursor": 29,
- "createdAt": 1759828364000,
- "finishedAt": 1759828391000
}, - "pagination": { }
}Cancel a multi-page search job
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Short alias: DELETE https://api.quantumproxies.io/v1/serp/bulk/{jobId} (same handler, primary host only)
Try it in the Playground · Markdown for this group
Stops a running bulk search job you own. Pages never fetched are refunded at settlement.
Authorizations:
path Parameters
| jobId required | string Example: job_8f2c1a Job id returned by the POST that started it. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
| payload required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/serp/bulk/job_8f2c1a');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Bulk SERP cancelled",
- "payload": {
- "id": "sb_4d1e9c",
- "status": "cancelled"
}, - "pagination": { }
}Discover a site's URLs
Price: map $0.0005 per call (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Short alias: POST https://api.quantumproxies.io/v1/map (same handler, primary host only)
Try it in the Playground · Markdown for this group
Merges robots.txt sitemaps, /sitemap.xml (nested indexes included) and same-domain homepage links into one de-duplicated list, synchronously. Returns up to limit URLs plus the site-wide total and a per-section summary; group_by: path returns the path tree instead of the list. It does not fetch page bodies — pair it with /scraper/batch for that. One flat price per call.
Authorizations:
Request Body schema: application/jsonrequired
| url required | string <= 2048 characters Seed URL. |
| limit | number Default: 100 Max URLs to return (service cap 5000). |
| search | string <= 256 characters Only return URLs containing this substring. |
| includeSubdomains | boolean Default: false |
| sitemapOnly | boolean Default: false Skip the homepage link scrape. |
| group_by | string Value: "path" Return the path tree with counts instead of the URL list. Alias |
| country | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Country code or place name: letters, digits, spaces, dots, hyphens, underscores; max 56 characters. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "limit": 100,
- "search": "blog"
}Response samples
- 200
- 400
- 401
- 402
- 403
- 429
- 500
- 503
{- "type": "response",
- "message": "Map successful",
- "payload": {
- "count": 100,
- "total": 2417,
- "summary": {
- "/blog": 1988,
- "/docs": 240,
- "/": 1
}, - "sources": {
- "sitemap": 2410,
- "homepage": 42
}, - "durationMs": 3120,
- "geo": {
- "country": null
}, - "usage": {
- "cost_usd": 0.0005,
- "free_usd": 0.0005,
- "paid_usd": 0
}
}, - "pagination": { }
}Start a site crawl
Price: crawl_page $0.0003 per call · extract_render $0.001 per call + $4/GB, max $0.05 per call. crawl_page × min(limit, 500) up front, or extract_render × pages when render is true. Refund of the unfetched share at settlement. (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Short alias: POST https://api.quantumproxies.io/v1/crawl (same handler, primary host only)
Try it in the Playground · Markdown for this group
Breadth-first crawl from a seed URL through the residential pool, each page converted to the requested format. Returns a job id immediately; poll GET /scraper/crawl/{jobId}. Charged up front on limit pages (render price per page with render: true); unfetched or failed pages are refunded when the job settles. A render crawl takes one browser-render token at submission and its pages then queue on the plan's render concurrency.
Authorizations:
Request Body schema: application/jsonrequired
| url required | string <= 2048 characters Seed URL. |
| limit | number Default: 50 Max pages (cap 500). Billed on this up front. |
| depth | number Default: 3 Max link depth from the seed (cap 10). |
| format | string Default: "markdown" Enum: "markdown" "html" "text" |
| contentMode | string Default: "smart" Enum: "smart" "article" "full" Alias |
| render | boolean Default: false Render every page with the stealth browser (slower, rendered rate). |
| sameDomain | boolean Default: true |
| allowSubdomains | boolean Default: false |
| include | Array of strings <= 50 items [ items <= 256 characters ] URL substrings/globs to include, e.g. ["/guides/*"]. |
| exclude | Array of strings <= 50 items [ items <= 256 characters ] |
| country | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Country code or place name: letters, digits, spaces, dots, hyphens, underscores; max 56 characters. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object Answer of a POST that started an async job. |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "limit": 50,
- "depth": 3,
- "include": [
- "/guides/*"
]
}Response samples
- 200
- 400
- 401
- 402
- 403
- 429
- 500
- 503
{- "type": "response",
- "message": "Crawl started",
- "payload": {
- "id": "cr_d5b8a1",
- "status": "running",
- "limit": 50,
- "depth": 3,
- "format": "markdown",
- "pagesCrawled": 0,
- "pagesQueued": 1,
- "statusUrl": "/api/v1/scraper/crawl/cr_d5b8a1",
- "usage": {
- "cost_usd": 0.015,
- "free_usd": 0.015,
- "paid_usd": 0
}
}, - "pagination": { }
}Poll a crawl job
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Short alias: GET https://api.quantumproxies.io/v1/crawl/{jobId} (same handler, primary host only)
Try it in the Playground · Markdown for this group
Progress and crawled pages of a job you own. Use since (the previous nextCursor) to page a large crawl and include_content=false for cheap status checks. Jobs are kept about an hour after they finish. Free to poll.
Authorizations:
path Parameters
| jobId required | string Example: job_8f2c1a Job id returned by the POST that started it. |
query Parameters
| since | integer Page cursor from the previous poll's |
| include_content | string Enum: "true" "false" Omit to get the full job; |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/crawl/job_8f2c1a');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Crawl status",
- "payload": {
- "id": "cr_d5b8a1",
- "status": "completed",
- "limit": 50,
- "depth": 3,
- "format": "markdown",
- "pagesCrawled": 37,
- "pagesQueued": 0,
- "pages": [
- {
- "status": 200,
- "title": "Getting started",
- "depth": 1,
- "content": "# Getting started\n…"
}
], - "nextCursor": 37,
- "hasMore": false,
- "createdAt": 1759828364000,
- "finishedAt": 1759828512000
}, - "pagination": { }
}Cancel a crawl job
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Short alias: DELETE https://api.quantumproxies.io/v1/crawl/{jobId} (same handler, primary host only)
Try it in the Playground · Markdown for this group
Stops a running crawl you own; pages never fetched are refunded at settlement.
Authorizations:
path Parameters
| jobId required | string Example: job_8f2c1a Job id returned by the POST that started it. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
| payload required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/crawl/job_8f2c1a');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Crawl cancelled",
- "payload": {
- "id": "cr_d5b8a1",
- "status": "cancelled"
}, - "pagination": { }
}Scrape many URLs asynchronously
Price: batch_url $0.0002 per call · extract_render $0.001 per call + $4/GB, max $0.05 per call. batch_url × urls up front (or extract_render × urls when rendering). Failed URLs refunded at settlement. (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Short alias: POST https://api.quantumproxies.io/v1/batch (same handler, primary host only)
Try it in the Playground · Markdown for this group
Up to 5,000 URLs you already know, with shared options, run concurrently through the residential pool. Returns a job id immediately; poll GET /scraper/batch/{jobId} or pass a webhook to receive the finished job by POST. Charged up front per URL (render price with render: true or engine: render); the failed/blocked share is refunded when the job settles. A render batch takes one browser-render token at submission.
Authorizations:
Request Body schema: application/jsonrequired
| urls required | Array of strings [ 1 .. 5000 ] items [ items <= 2048 characters ] |
| format | string Default: "markdown" Enum: "markdown" "html" "text" |
| engine | string Default: "auto" Enum: "auto" "tls" "fetch" "render" |
| render | boolean Default: false Force the headless browser for every URL. |
object (ExtractSchema) Examples: {"title":"h1","price":".price","image":{"selector":"img.hero","attr":"src"},"features":{"selector":"li.feature","all":true}} Structured-extraction schema: field name → CSS selector, or an object with | |
| contentMode | string Default: "smart" Enum: "smart" "article" "full" Alias |
| fullPage | boolean Legacy: contentMode full. |
| mode | string Default: "full" Enum: "full" "summary"
|
| concurrency | number [ 1 .. 20 ] Default: 5 Simultaneous fetches (clamped 1–20; your tier's batch concurrency also applies). |
| webhook | string <= 2048 characters Public http(s) URL that receives the finished job by POST. |
| country | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Country code or place name: letters, digits, spaces, dots, hyphens, underscores; max 56 characters. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object Answer of a POST that started an async job. |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "format": "markdown",
- "mode": "summary"
}Response samples
- 200
- 400
- 401
- 402
- 403
- 429
- 500
- 503
{- "type": "response",
- "message": "Batch started",
- "payload": {
- "id": "bt_91ac07",
- "status": "running",
- "total": 2,
- "completed": 0,
- "failed": 0,
- "statusUrl": "/api/v1/scraper/batch/bt_91ac07",
- "usage": {
- "cost_usd": 0.0004,
- "free_usd": 0.0004,
- "paid_usd": 0
}
}, - "pagination": { }
}Poll a batch job
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Short alias: GET https://api.quantumproxies.io/v1/batch/{jobId} (same handler, primary host only)
Try it in the Playground · Markdown for this group
Progress and per-URL results of a job you own. Polls return metadata only unless include_content=true; pass the previous nextCursor as since to receive only newer items. Jobs are kept about an hour after they finish. Free to poll.
Authorizations:
path Parameters
| jobId required | string Example: job_8f2c1a Job id returned by the POST that started it. |
query Parameters
| since | integer Item cursor from the previous poll's |
| include_content | string Enum: "true" "false"
|
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/batch/job_8f2c1a');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Batch status",
- "payload": {
- "id": "bt_91ac07",
- "status": "completed",
- "total": 2,
- "completed": 2,
- "failed": 0,
- "contentTruncated": false,
- "items": [
- {
- "status": 200,
- "title": "Page A",
- "description": "…",
- "contentLength": 5120,
- "engine": "tls",
- "bytes": 31870
}, - {
- "status": 200,
- "title": "Page B",
- "description": null,
- "canonical": null,
- "contentLength": 2210,
- "engine": "tls",
- "bytes": 12003
}
], - "nextCursor": 2,
- "hasMore": false,
- "createdAt": 1759828364000,
- "finishedAt": 1759828370000
}, - "pagination": { }
}Cancel a batch job
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Short alias: DELETE https://api.quantumproxies.io/v1/batch/{jobId} (same handler, primary host only)
Try it in the Playground · Markdown for this group
Stops a running batch you own; URLs never fetched are refunded at settlement.
Authorizations:
path Parameters
| jobId required | string Example: job_8f2c1a Job id returned by the POST that started it. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
| payload required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/batch/job_8f2c1a');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Batch cancelled",
- "payload": {
- "id": "bt_91ac07",
- "status": "cancelled"
}, - "pagination": { }
}Replay any HTTP request through a residential exit with a real browser fingerprint; prepaid per GB.
Replay a request through the Web Unlocker
Price: unlock_request $2.40/GB of transferred data. Flat base is 0; the whole charge is the unlock_request perGb meter applied to usage.bytes, debited from the prepaid unlocker GB of the chosen tier. No wallet charge, no free tier. 402 when the tier's GB are exhausted or expired. (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Send a request the way your own HTTP client would (url, method, headers, body) and get it back replayed through a residential (or mobile) exit under a real browser TLS fingerprint. GET/HEAD/OPTIONS retry on a fresh exit IP under a different fingerprint when blocked and finally escalate to a headless browser that answers JavaScript challenges; any other method gets exactly one attempt (a response means the target saw it, and replaying a POST could double-submit). A still-blocked page is returned with blocked: true, blockClass and vendor, never as a silent success; failOnBlock: true turns that into a 502. It does not solve interactive captchas. This is the same engine as the CONNECT forward proxy, without the proxy protocol — no certificate to install. Billing is different from every other Data API call: it is metered in bytes against the tier's prepaid Web Unlocker GB (premium = residential exits, mobile = mobile exits), not the wallet, and every attempt counts — retries, a blocked page, the browser escalation's page load.
Authorizations:
Request Body schema: application/jsonrequired
| url required | string <= 2048 characters |
| method | string^[A-Za-z]{1,16}$ Default: "GET" |
object or string (ForwardHeaders) | |
| body | string Request body as UTF-8 text (JSON, form data…). Use this OR |
| bodyBase64 | string Request body as base64 for binary payloads. Max 8 MB decoded. |
| tier | string Default: "premium" Enum: "premium" "mobile" Which prepaid pool pays and which exits are used. Anything other than |
| tlsProfile | string Default: "chrome" Enum: "chrome" "firefox" "safari" "safari_ios" "edge" "brave" "mobile" |
| mobile | boolean Default: false Mobile Safari fingerprint (fingerprint only — the product tier is |
string or boolean
| |
| autoRender | boolean Default: true Escalate a blocked GET to the browser. |
| keepHeaders | boolean Default: false |
| successStatusCodes | Array of integers <= 20 items [ items [ 100 .. 599 ] ] Origin statuses to accept as success — never treated as a block, never retried. |
| timeoutMs | integer [ 1000 .. 120000 ] Per-attempt timeout at the target (capped by the service's 90 s total budget). |
| failOnBlock | boolean Default: false 502 instead of a 200 with |
| waitForSelector | string [ 1 .. 256 ] characters Browser tier: CSS selector to wait for before capture. |
| waitMs | integer [ 0 .. 15000 ] |
| returnCookies | boolean Default: false Return the origin's cookie jar under |
object <= 50 properties Cookies merged into the Cookie header sent to the target (e.g. a clearance obtained earlier). | |
| country | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Country code or place name: letters, digits, spaces, dots, hyphens, underscores; max 56 characters. |
| state | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Requires |
| city | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Requires |
| rotation | string Default: "rotating" Enum: "rotating" "sticky" |
| sessionId | string <= 64 characters Sticky session id — reuse it across calls to keep one exit IP. |
| sessionDuration | number Sticky session lifetime in minutes. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object The target's response, replayed. |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "method": "GET",
- "headers": {
- "Accept": "application/json"
}, - "country": "us",
- "tier": "premium"
}Response samples
- 200
- 400
- 401
- 402
- 403
- 429
- 500
- 502
- 503
{- "type": "response",
- "message": "Unlocker request successful",
- "payload": {
- "status": 200,
- "headers": {
- "content-type": "application/json; charset=utf-8",
- "cache-control": "no-store"
}, - "body": "{\"results\":[{\"id\":1,\"name\":\"Runner\"}]}",
- "bodyBase64": "eyJyZXN1bHRzIjpbeyJpZCI6MSwibmFtZSI6IlJ1bm5lciJ9XX0=",
- "contentType": "application/json; charset=utf-8",
- "profile": "chrome",
- "attempts": 1,
- "blocked": false,
- "clearance": "miss",
- "exitSessionId": "s_2f91",
- "strategy": {
- "startTier": "tls",
- "hedged": false
}, - "rendered": false,
- "escalated": false,
- "tier": "premium",
- "geo": {
- "country": "us",
- "state": null,
- "city": null,
- "rotation": "rotating"
}, - "usage": {
- "bytes": 18432,
- "unlock_gb_remaining": 4.98,
- "unlock_gb_purchased": 5
}
}, - "pagination": { }
}Download the unlocker CA certificate
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
The interception CA used by the Web Unlocker forward proxy (CONNECT mode). The proxy terminates your TLS to read and rewrite the request, so an HTTP client that keeps certificate verification on must trust this file for the target host (curl --proxy-cacert qp-unlocker-ca.pem --cacert qp-unlocker-ca.pem …). Not needed for POST /scraper/unlock, nor for the proxy's direct mode. Public by nature, kept behind the key so downloads are attributable. Free.
Authorizations:
Responses
Response Schema: application/x-pem-file
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/unlock/ca');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
file_put_contents('response.out', $raw);Response samples
- 200
- 401
- 429
- 503
-----BEGIN CERTIFICATE----- MIIB… -----END CERTIFICATE-----
Natural-language scraping agent
Price: ai_extract $0.001 per call, max $1.50 per call · extract $0.0002 per call + $3/GB, max $0.02 per call · serp $0.0005 per call · map $0.0005 per call. ai_extract + steps × extract + searches × serp + mapped × map + tokens × ai_token_markup, capped at meters.ai_extract.capUsd. (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Describe a task in plain English; a model drives the scraper API as a tool — formats the request, fetches the page(s) through residential proxies, can search and map when the task needs it, and returns the extracted JSON under data with the pages it visited under steps. Use it when you do not want to write selectors or a schema; use /scraper/extract with extract/ai_schema when you already know the page. Not deterministic and not the cheapest path for repeated layouts (see /scraper/parser/generate). Billed as the ai_extract base fee plus one extract per page fetched, serp per search, map per map, plus LLM tokens × ai_token_markup, capped at the ai_extract meter's capUsd; the pre-check reserves that cap.
Authorizations:
Request Body schema: application/jsonrequired
| task required | string Plain-English instruction, e.g. "get every product with its name and price from this page". |
| url | string Starting URL, if the task does not already contain one. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "task": "Get every plan and its monthly price",
}Response samples
- 200
- 400
- 401
- 402
- 429
- 500
- 503
{- "type": "response",
- "message": "AI extraction successful",
- "payload": {
- "data": {
- "plans": [
- {
- "name": "Starter",
- "price_usd": 9
}, - {
- "name": "Growth",
- "price_usd": 29
}
]
}, - "searches": 0,
- "mapped": 0,
- "model": "gpt-4o-mini",
- "bytes": 48213,
- "usage": {
- "input_tokens": 3120,
- "output_tokens": 180,
- "cost_usd": 0.0019,
- "free_usd": 0.0019,
- "paid_usd": 0
}
}, - "pagination": { }
}AI Places Finder
Price: places_ai $0.005 per call, max $3 per call · serp_render $0.002 per call. places_ai + searches × serp_render + tokens × ai_token_markup, capped at meters.places_ai.capUsd. (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Describe what you are looking for ("find every car repair shop in Naples"); the model crafts the Google local queries, paginates, de-duplicates and returns the aggregated businesses, optionally enriched from each knowledge panel (phone, website, hours, full address). For a deterministic, per-row-priced alternative use the google_maps_places collector. Billed as the places_ai base plus serp_render per search run plus LLM tokens × ai_token_markup, capped at the places_ai meter's capUsd; the pre-check reserves that cap.
Authorizations:
Request Body schema: application/jsonrequired
| task required | string |
| country | string ISO country override for the proxy exit and |
| enrich | boolean Default: true Fill phone/website/hours/address from each business's knowledge panel. |
| max_enrich | number Default: 15 Knowledge-panel lookups budget (cap 30). |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object Shared shape of the AI Places and AI Shopping finders. |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "task": "find every car repair shop in Naples",
- "country": "it",
- "max_enrich": 10
}Response samples
- 200
- 400
- 401
- 402
- 429
- 500
- 503
{- "type": "response",
- "message": "Places search successful",
- "payload": {
- "places": [
- {
- "name": "Autofficina Esposito",
- "rating": 4.6,
- "reviews": 212,
- "address": "Via Toledo 12, 80134 Napoli NA",
- "phone": "+39 081 000 0000",
}
], - "total": 38,
- "enriched": 10,
- "queries": [
- "autofficina Napoli",
- "meccanico Napoli"
], - "summary": "38 repair shops across central Naples.",
- "model": "gpt-4o-mini",
- "usage": {
- "input_tokens": 9800,
- "output_tokens": 2200,
- "cost_usd": 0.0218,
- "free_usd": 0.0218,
- "paid_usd": 0
}
}, - "pagination": { }
}AI Shopping Finder
Price: shopping_ai $0.005 per call, max $3 per call · serp_render $0.002 per call. shopping_ai + searches × serp_render + tokens × ai_token_markup, capped at meters.shopping_ai.capUsd. (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Describe the product ("find the cheapest Nintendo Switch OLED in Italy"); the model crafts Google Shopping queries, paginates, de-duplicates and returns the aggregated products with merchant and price. For a deterministic alternative use /scraper/serp with search_type: shopping or the google_shopping collector. Billed as the shopping_ai base plus serp_render per search plus LLM tokens × ai_token_markup, capped at the shopping_ai meter's capUsd; the pre-check reserves that cap.
Authorizations:
Request Body schema: application/jsonrequired
| task required | string |
| country | string ISO country override for the proxy exit, |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object Shared shape of the AI Places and AI Shopping finders. |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "task": "cheapest Nintendo Switch OLED",
- "country": "it"
}Response samples
- 200
- 400
- 401
- 402
- 429
- 500
- 503
{- "type": "response",
- "message": "Shopping search successful",
- "payload": {
- "products": [
- {
- "title": "Nintendo Switch OLED Bianco",
- "price": "€ 299,00",
- "merchant": "Example Store",
}
], - "total": 24,
- "queries": [
- "Nintendo Switch OLED prezzo"
], - "searches": [
- {
- "query": "Nintendo Switch OLED prezzo",
- "results": 24
}
], - "summary": "Lowest price €299 at Example Store.",
- "model": "gpt-4o-mini",
- "usage": {
- "input_tokens": 7100,
- "output_tokens": 900,
- "cost_usd": 0.0121,
- "free_usd": 0.0121,
- "paid_usd": 0
}
}, - "pagination": { }
}AI visibility audit
Price: ai_visibility $0.002 per call · ai_visibility_citation $0.01 per call · serp $0.0005 per call. ai_visibility + answered (query × engine) × ai_visibility_citation + (2 retrieval + 5 offsite) × serp, only for SERPs that answered. Pre-check reserves the worst case. (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Answers one question about a page — can an AI assistant read it, and does it cite it? — on two levels. On-page (always): AI crawler access from the real robots.txt (24 bots), Content-Signal, a fetch that identifies itself as an AI crawler, noindex/nosnippet/noai directives, text without JavaScript, structured data and resolvable entities, citable form (questions, opening answer, lists/tables, numbers, chunk-sized sections), dated and authored content — scored per pillar with blockers that cap the total and the evidence behind every check. Citations (only when queries is given): the questions are really asked to Perplexity, ChatGPT, Claude, Google AI Overview, Bing Copilot and a DeepSeek-over-Google-SERP engine, and the answer reports who is cited or at least mentioned, plus share of voice against competitors. It does not change the page and the citation panel is capped at 10 queries per call and a daily per-account cap on LLM engine calls. Billed as the on-page audit fee plus one ai_visibility_citation per (query × engine) that actually answered, plus serp for the 2 retrievability SERPs and the 5 offsite SERPs when run.
Authorizations:
Request Body schema: application/jsonrequired
| url required | string <= 2048 characters |
| queries | Array of strings <= 10 items Questions to ask the engines. Absent = on-page audit only. |
| engines | Array of strings Items Enum: "perplexity" "openai" "anthropic" "aio" "copilot" "deepseek" Subset of engines for the citation panel; default all six. |
| competitors | Array of strings <= 20 items Domains to name explicitly in the share of voice. |
| brand | string <= 80 characters Name to look for in answer text ("mentioned"). |
| country | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Country code or place name: letters, digits, spaces, dots, hyphens, underscores; max 56 characters. |
| no_render | boolean Default: false Skip the rendered pass (cheaper). Alias |
| no_bot_fetch | boolean Default: false Skip the extra request that identifies as an AI crawler. Alias |
| no_retrieval | boolean Default: false Skip the 2 retrievability SERPs (rank for the page's own H1 question, index status). Alias |
| offsite | boolean Default: false Also search the brand on YouTube, Reddit, Wikipedia, LinkedIn and review sites (5 SERPs). |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "queries": [
- "how do I choose a residential proxy provider?"
], - "engines": [
- "perplexity",
- "aio"
], - "brand": "Example"
}Response samples
- 200
- 400
- 401
- 402
- 403
- 429
- 500
- 503
{- "type": "response",
- "message": "AI visibility audit successful",
- "payload": {
- "domain": "example.com",
- "score": {
- "overall": 71,
- "pillars": {
- "access": 90,
- "content": 68,
- "structure": 60,
- "citability": 66
}, - "scoredPillars": [
- "access",
- "content",
- "structure",
- "citability"
], - "blockers": [ ],
- "uncapped": 71
}, - "checks": [
- {
- "id": "robots_gptbot",
- "pillar": "access",
- "status": "pass",
- "weight": 8,
- "title": "GPTBot allowed",
- "detail": "robots.txt does not disallow GPTBot.",
- "evidence": {
- "rule": null
}
}
], - "topFixes": [
- {
- "id": "author_resolvable",
- "status": "fail",
- "title": "Author not resolvable",
- "fix": "Add an author Person node with url or sameAs."
}
], - "access": {
- "robotsTxtFound": true,
- "blockedCritical": [ ],
- "llmsTxt": false
}, - "content": {
- "contentOnlyInJs": false,
- "fkGrade": 9.1
}, - "structure": {
- "jsonldTypes": [
- "Article"
], - "hasAuthor": true,
- "authorResolvable": false
}, - "citations": {
- "rows": [
- {
- "query": "how do I choose a residential proxy provider?",
- "engine": "perplexity",
- "cited": false,
- "mentioned": true,
- "rank": null,
- "citedDomains": [
- "competitor.example"
]
}
], - "usage": {
- "perplexity": {
- "searches": 1
}
}
}, - "geo": {
- "country": null
}, - "billing": {
- "citation_calls_billed": 2,
- "offsite_serps_billed": 2
}, - "usage": {
- "cost_usd": 0.023,
- "free_usd": 0.023,
- "paid_usd": 0
}
}, - "pagination": { }
}No-JS vs rendered SEO audit
Price: seo_audit $0.0012 per call · extract $0.0002 per call + $3/GB, max $0.02 per call. seo_audit when the render pass ran; extract when no_render is true or the render pass errored. (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Short alias: POST https://api.quantumproxies.io/v1/seo-audit (same handler, primary host only)
Try it in the Playground · Markdown for this group
Fetches a URL twice — once as a pure HTTP bot (no JavaScript) and once fully rendered — and returns what search engines see in each view, the diff (title/description changes, H1 or content only after JS, missing canonical) and the bot-facing meta (robots, OpenGraph, JSON-LD types). It is a page-level technical check, not a site crawl or a keyword tool. The full audit takes one browser-render token; with no_render only the no-JS view is produced and the call bills the plain scrape price. If the render pass fails on our side you still get the no-JS view at the plain scrape price.
Authorizations:
Request Body schema: application/jsonrequired
| url required | string <= 2048 characters |
| country | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Country code or place name: letters, digits, spaces, dots, hyphens, underscores; max 56 characters. |
| no_render | boolean Default: false Skip the rendered pass. Alias |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{
}Response samples
- 200
- 400
- 401
- 402
- 403
- 429
- 500
- 503
{- "type": "response",
- "message": "SEO audit successful",
- "payload": {
- "noJs": {
- "status": 200,
- "title": "Example Domain",
- "description": null,
- "canonical": null,
- "h1": "Example Domain",
- "wordCount": 28,
- "hasContent": false
}, - "render": {
- "status": 200,
- "title": "Example Domain",
- "description": null,
- "canonical": null,
- "h1": "Example Domain",
- "wordCount": 28,
- "hasContent": false
}, - "diff": {
- "titleChanged": false,
- "descriptionChanged": false,
- "h1OnlyInRender": false,
- "canonicalMissingNoJs": true,
- "contentOnlyInJs": false
}, - "meta": {
- "robots": null,
- "ogTitle": null,
- "ogUrl": null,
- "twitterCard": null,
- "jsonldTypes": [ ]
}, - "durationMs": 4210,
- "geo": {
- "country": null
}, - "usage": {
- "cost_usd": 0.0012,
- "free_usd": 0.0012,
- "paid_usd": 0
}
}, - "pagination": { }
}Ready-made, versioned scrapers on a semantic input; billed per delivered row. The catalog is dynamic: read it from GET /scraper/collectors.
Collector catalog
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Every ready-made collector with its identity and version, semantic input_schema (JSON Schema — what to POST to run_url), full output_schema, examples, hourly health probe and YOUR price per delivered result (list price × tier discount). The catalog is the source of truth: collectors are added and versioned without an API change, so read it rather than hard-coding slugs. Free.
Authorizations:
query Parameters
| category | string Enum: "search" "seo" "social" "apps" "real_estate" "local" "jobs" "news" "ecommerce" "travel" "leads" "company" "classifieds" "finance" "dev" "knowledge" "gaming" "osint" "research" Only collectors of this category. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/collectors');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 429
- 503
{- "type": "response",
- "message": "Collectors",
- "payload": {
- "collectors": [
- {
- "slug": "google_maps_places",
- "name": "Google Maps places",
- "version": "1.1.0",
- "category": "local",
- "category_label": "Local & Maps",
- "tagline": "Businesses for a keyword in a location — name, rating, address, phone, website, coordinates.",
- "description": "Searches Google's local results for a keyword in a location and delivers de-duplicated place records with contact and geo fields.",
- "unit": "place",
- "engines": [
- "serp"
], - "price": {
- "list_usd": 0.001,
- "your_usd": 0.001,
- "price_key": "collector_google_maps_places",
- "per_1k_usd": 1,
- "min_billable_results": 0,
- "min_run_usd": 0
}, - "max_results": 300,
- "input_schema": {
- "type": "object",
- "properties": {
- "query": {
- "type": "string",
- "title": "Keyword",
- "minLength": 2,
- "maxLength": 120,
- "examples": [
- "pizza restaurants"
]
}, - "location": {
- "type": "string",
- "title": "Location",
- "minLength": 2,
- "maxLength": 120,
- "examples": [
- "Brooklyn, NY"
]
}, - "country": {
- "type": "string",
- "format": "country"
}, - "lang": {
- "type": "string",
- "format": "lang"
}, - "max_results": {
- "type": "integer",
- "default": 20,
- "minimum": 1,
- "maximum": 300
}, - "enrich_details": {
- "type": "boolean",
- "default": true
}
}, - "required": [
- "query",
- "location"
], - "additionalProperties": false
}, - "output_schema": {
- "fields": [
- {
- "name": "rank",
- "type": "integer",
- "description": "1-based position across the merged pages."
}, - {
- "name": "name",
- "type": "string",
- "description": "Business name."
}, - {
- "name": "rating",
- "type": "number",
- "nullable": true,
- "description": "Star rating (1–5)."
}, - {
- "name": "place_id",
- "type": "string",
- "nullable": true,
- "description": "Google place id."
}
]
}, - "examples": [
- {
- "title": "Pizza in Brooklyn",
- "input": {
- "query": "pizza restaurants",
- "location": "Brooklyn, NY",
- "country": "us",
- "max_results": 20
}
}
], - "health_input": {
- "query": "pizza",
- "location": "Brooklyn, NY",
- "country": "us",
- "max_results": 10
}, - "health": {
- "status": "healthy",
- "checked_at": "2026-10-07T08:00:12.000Z",
- "latency_ms": 6210,
- "result_count": 10,
- "error": null,
- "success_rate_24h": 1,
- "last_ok_at": "2026-10-07T08:00:12.000Z"
}, - "run_url": "/api/v1/scraper/collectors/google_maps_places/run"
}
], - "billing": {
- "enabled": true,
- "discount_multiplier": 1
}
}, - "pagination": { }
}One collector
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
The catalog entry of one collector plus its changelog and the last 24 health probes. Free.
Authorizations:
path Parameters
| slug required | string Example: google_maps_places Collector slug from the catalog. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/collectors/google_maps_places');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 404
- 429
- 503
{- "type": "response",
- "message": "Collector",
- "payload": {
- "collector": {
- "slug": "google_maps_places",
- "name": "Google Maps places",
- "version": "1.1.0",
- "category": "local",
- "category_label": "Local & Maps",
- "tagline": "Businesses for a keyword in a location.",
- "description": "…",
- "unit": "place",
- "engines": [
- "serp"
], - "price": {
- "list_usd": 0.001,
- "your_usd": 0.001,
- "price_key": "collector_google_maps_places",
- "per_1k_usd": 1,
- "min_billable_results": 0,
- "min_run_usd": 0
}, - "max_results": 300,
- "input_schema": {
- "type": "object",
- "properties": { },
- "required": [
- "query",
- "location"
], - "additionalProperties": false
}, - "output_schema": {
- "fields": [ ]
}, - "examples": [ ],
- "health_input": { },
- "health": {
- "status": "healthy",
- "checked_at": "2026-10-07T08:00:12.000Z",
- "latency_ms": 6210,
- "result_count": 10,
- "error": null,
- "success_rate_24h": 1,
- "last_ok_at": "2026-10-07T08:00:12.000Z"
}, - "run_url": "/api/v1/scraper/collectors/google_maps_places/run",
- "changelog": [
- {
- "version": "1.1.0",
- "date": "2026-08-21",
- "notes": "Paginates past offset 240."
}
], - "health_history": [
- {
- "checked_at": "2026-10-07T08:00:12.000Z",
- "ok": true,
- "latency_ms": 6210,
- "result_count": 10,
- "error": null
}
]
}
}, - "pagination": { }
}Run a collector
Price: collector_result per delivered result, price by collector (see the collector price table). Per delivered row: pricing.json key collector_<slug> when it exists, else collector_result. GET /scraper/collectors returns the resolved key and your discounted price for every collector. (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
The body is the collector's semantic input exactly as published in its input_schema (flat, or wrapped as {"input": {...}}), plus runner options: async: true forces background processing (also mode: "async" or wait: false). Short runs answer synchronously with the rows; long ones (the collector decides from the input size) answer 202 with a statusUrl to poll. Identical input re-sent inside the dedup window returns the existing run (deduplicated: true) — nothing new is created or charged. Per-account brakes (runs per hour, concurrent runs, failure streak) answer 429 with Retry-After. Billed per DELIVERED row at the collector's unit price × your tier discount (some collectors have a small per-run floor, see price.min_billable_results); zero rows = zero charge, failed runs are never billed. The worst case (unit × max_results) must be covered by free tier + balance or the run is refused with 402.
Authorizations:
path Parameters
| slug required | string Example: google_maps_places Collector slug from the catalog. |
Request Body schema: application/jsonrequired
| async | boolean Default: false Force background processing (202 + statusUrl). |
| mode | string Value: "async" Alias of |
| wait | boolean
|
| input | object Optional wrapper for the collector input. |
| property name* additional property | any |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "query": "pizza restaurants",
- "location": "Brooklyn, NY",
- "country": "us",
- "max_results": 20
}Response samples
- 200
- 202
- 400
- 401
- 402
- 404
- 422
- 424
- 429
- 503
{- "type": "response",
- "message": "Collector run complete",
- "payload": {
- "run_id": "cmgfq2x1b0001",
- "slug": "google_maps_places",
- "version": "1.1.0",
- "status": "done",
- "input": {
- "query": "pizza restaurants",
- "location": "Brooklyn, NY",
- "country": "us",
- "max_results": 20
}, - "count": 20,
- "partial": false,
- "cost": {
- "usd": 0.02,
- "unit_usd": 0.001,
- "unit": "place",
- "billed": true
}, - "error": null,
- "results": [
- {
- "rank": 1,
- "name": "Joe's Pizza",
- "rating": 4.5,
- "reviews": 3120,
- "category": "Pizza restaurant",
- "address": "7 Carmine St, New York, NY 10014",
- "phone": "+1 212-366-1182",
- "website": "joespizzanyc.com",
- "latitude": 40.7306,
- "longitude": -74.0027,
- "place_id": "ChIJ…",
- "data_id": "0x89c259…:0x…",
- "found_by": "pizza restaurants Brooklyn, NY"
}
], - "notes": [ ],
- "created_at": "2026-10-07T09:20:01.000Z",
- "started_at": "2026-10-07T09:20:01.000Z",
- "finished_at": "2026-10-07T09:20:14.000Z",
- "usage": {
- "cost_usd": 0.02,
- "free_usd": 0.02,
- "paid_usd": 0
}
}, - "pagination": { }
}Your collector runs
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Newest first, without result rows. Page with next_cursor. Free.
Authorizations:
query Parameters
| limit | integer [ 1 .. 100 ] Default: 20 |
| cursor | string
|
| slug | string Only runs of this collector. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/collectors/runs');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 429
- 503
{- "type": "response",
- "message": "Collector runs",
- "payload": {
- "runs": [
- {
- "run_id": "cmgfq2x1b0001",
- "slug": "google_maps_places",
- "version": "1.1.0",
- "status": "done",
- "input": {
- "query": "pizza restaurants",
- "location": "Brooklyn, NY"
}, - "count": 20,
- "partial": false,
- "cost": {
- "usd": 0.02,
- "unit_usd": 0.001,
- "unit": "place",
- "billed": true
}, - "error": null,
- "created_at": "2026-10-07T09:20:01.000Z",
- "started_at": "2026-10-07T09:20:01.000Z",
- "finished_at": "2026-10-07T09:20:14.000Z"
}
], - "next_cursor": null
}, - "pagination": { }
}One run with its rows
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
The run you own with its delivered results. format=csv streams the rows as CSV (columns follow the collector's output_schema). Free.
Authorizations:
path Parameters
| runId required | string^[a-z0-9]{10,40}$ Example: cmgfq2x1b0001 Collector run id (10–40 alphanumeric characters). |
query Parameters
| format | string Value: "csv"
|
Responses
Response Schema:
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/collectors/runs/cmgfq2x1b0001');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 400
- 401
- 404
- 429
- 503
{- "type": "response",
- "message": "Collector run",
- "payload": {
- "run_id": "cmgfq2x1b0001",
- "slug": "google_maps_places",
- "version": "1.1.0",
- "status": "done",
- "input": {
- "query": "pizza restaurants",
- "location": "Brooklyn, NY",
- "country": "us",
- "max_results": 20
}, - "count": 20,
- "partial": false,
- "cost": {
- "usd": 0.02,
- "unit_usd": 0.001,
- "unit": "place",
- "billed": true
}, - "error": null,
- "results": [
- {
- "rank": 1,
- "name": "Joe's Pizza"
}
], - "created_at": "2026-10-07T09:20:01.000Z",
- "started_at": "2026-10-07T09:20:01.000Z",
- "finished_at": "2026-10-07T09:20:14.000Z",
- "usage": {
- "cost_usd": 0.02,
- "free_usd": 0.02,
- "paid_usd": 0
}
}, - "pagination": { }
}Your recent dataset runs
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
The last 20 runs, newest first, with status reconciled against the live job for runs still marked running, the settled cost, and whether the rows are still stored. Free.
Authorizations:
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/datasets');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 429
- 503
{- "type": "response",
- "message": "Datasets",
- "payload": {
- "datasets": [
- {
- "id": "cmgf0",
- "jobId": "ds_7a1c22",
- "name": null,
- "prompt": "Car rental companies in Bologna with phone and website",
- "columns": "[{\"name\":\"company\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"phone\"},{\"name\":\"website\",\"type\":\"url\"}]",
- "country": "it",
- "status": "completed",
- "rowCount": 42,
- "billableRows": 40,
- "refresh": false,
- "createdAt": "2026-10-06T14:02:11.000Z",
- "completedAt": "2026-10-06T14:09:40.000Z",
- "purgedAt": null,
- "costUsd": 1.86,
- "stored": true,
- "storedRows": 42,
- "storedBytes": 18311,
- "purged": false,
- "dropped": null
}
]
}, - "pagination": { }
}Build a dataset from a prompt
Price: dataset_row $0.03 per call · dataset_row_refresh $0.01 per call. max_cost_usd charged up front, refunded down to actual spend. Actual spend = delivered validated rows × dataset_row (dataset_row_refresh on refresh) + premium field fees + metered pipeline units (serp/map/extract/AI). (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
One plain-language prompt → a structured dataset. The service plans queries, searches, maps and scrapes, extracts the requested columns and returns validated rows; refresh: true re-reads a known URL set (refreshUrls) without discovery at a reduced row fee. Returns a job id immediately; poll GET /scraper/datasets/{jobId}, download the file, or pass a webhook (public host only, delivered after settlement with the hygiene filters applied). Billing is value-based: the run's budget limits.max_cost_usd (default $5, max $500, min $0.05) is charged up front and the unspent share is refunded at settlement, so you pay only for delivered, validated records (dataset_row, or dataset_row_refresh on a refresh) plus premium columns found (email, phone, deep) plus the pipeline units consumed. Low-confidence rows, off-target pages and blocked pages are never billed.
Authorizations:
Request Body schema: application/jsonrequired
| prompt required | string <= 2000 characters What the dataset is. |
Array of objects Omit to let the planner infer columns from the prompt. | |
| country | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Country code or place name: letters, digits, spaces, dots, hyphens, underscores; max 56 characters. |
object Domain allow/deny lists. | |
object | |
| webhook | string <= 2048 characters Public http(s) URL that receives the finished, filtered dataset by POST. |
| refresh | boolean Default: false |
| refreshUrls | Array of strings <= 1000 items [ items <= 2048 characters ] Required with |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object Answer of a POST that started an async job. |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "prompt": "Car rental companies in Bologna with phone and website",
- "columns": [
- {
- "name": "company",
- "type": "string"
}, - {
- "name": "phone",
- "type": "phone"
}, - {
- "name": "website",
- "type": "url"
}
], - "country": "it",
- "limits": {
- "max_rows": 50,
- "max_cost_usd": 3
}
}Response samples
- 200
- 400
- 401
- 402
- 403
- 429
- 500
- 503
{- "type": "response",
- "message": "Dataset started",
- "payload": {
- "id": "ds_7a1c22",
- "status": "running",
- "prompt": "Car rental companies in Bologna with phone and website",
- "columns": [
- {
- "name": "company",
- "type": "string"
}, - {
- "name": "phone",
- "type": "phone"
}, - {
- "name": "website",
- "type": "url"
}
], - "limits": {
- "max_rows": 50,
- "max_pages": 200,
- "max_cost_usd": 3
}, - "statusUrl": "/api/v1/scraper/datasets/ds_7a1c22",
- "usage": {
- "cost_usd": 3,
- "free_usd": 2,
- "paid_usd": 1,
- "balance": 9
}
}, - "pagination": { }
}Poll a dataset job
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Progress, the collection trace (steps) and the rows so far, filtered for you (removal list, your exclusion list, rows already delivered to you). A run the service has already forgotten (about an hour after it finishes) is served from storage (source: storage, no progress/steps). Free.
Authorizations:
path Parameters
| jobId required | string Example: job_8f2c1a Job id returned by the POST that started it. |
query Parameters
| since | integer Row cursor from the previous poll's |
| mode | string Value: "summary"
|
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object Live job view (from the service) or the stored view of a finished run ( |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/datasets/job_8f2c1a');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Dataset status",
- "payload": {
- "id": "ds_7a1c22",
- "status": "completed",
- "prompt": "Car rental companies in Bologna with phone and website",
- "columns": [
- {
- "name": "company",
- "type": "string"
}, - {
- "name": "phone",
- "type": "phone"
}, - {
- "name": "website",
- "type": "url"
}
], - "files": null,
- "progress": {
- "queries_run": 6,
- "sites_mapped": 12,
- "pages_scraped": 58,
- "pages_failed": 3,
- "rows": 42,
- "dropped_offtarget": 4,
- "cost_so_far_usd": 1.86
}, - "limits": {
- "max_rows": 50,
- "max_pages": 200,
- "max_cost_usd": 3
}, - "entity": "car rental company",
- "billable": {
- "row_fees_usd": 1.62,
- "unit_usd": 0.24
}, - "steps": [
- {
- "phase": "plan",
- "detail": "entity: car rental company; 6 queries",
- "ts": 1759759331000
}
], - "rows": [
- {
- "_fetched_at": "2026-10-06T14:05:10.000Z",
- "confidence": 0.93,
- "billed_fields": [
- "phone"
], - "fee_usd": 0.05
}
], - "row_count": 42,
- "billable_rows": 40,
- "nextCursor": 42,
- "createdAt": 1759759331000,
- "finishedAt": 1759759780000
}, - "pagination": { }
}Cancel a dataset job
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Stops a running job you own; the unspent budget is refunded at settlement. To delete the stored record of a finished run use DELETE /scraper/datasets/{jobId}/record.
Authorizations:
path Parameters
| jobId required | string Example: job_8f2c1a Job id returned by the POST that started it. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
| payload required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/datasets/job_8f2c1a');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Dataset cancelled",
- "payload": {
- "id": "ds_7a1c22",
- "status": "cancelled"
}, - "pagination": { }
}Download a dataset file
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
The run's rows as CSV or JSON, partial runs included (rows collected before an interruption are delivered too). Always built from rows that passed the list-hygiene filter. 404 while the run is still going or when it produced no rows. Free.
Authorizations:
path Parameters
| jobId required | string Example: job_8f2c1a Job id returned by the POST that started it. |
query Parameters
| format | string Default: "csv" Enum: "csv" "json" |
Responses
Response Schema:
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/datasets/job_8f2c1a/download');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
file_put_contents('response.out', $raw);Response samples
- 200
- 400
- 401
- 404
- 429
- 500
- 503
company,phone,website,_source_url Bologna Rent,+39 051 000000,https://example.it,https://example.it/contatti
Rename a dataset run
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Sets the run's label (max 120 characters); an empty string or null clears it and the prompt becomes the label again. The prompt itself is never rewritten. Free.
Authorizations:
path Parameters
| jobId required | string Example: job_8f2c1a Job id returned by the POST that started it. |
Request Body schema: application/jsonrequired
| name | string or null <= 120 characters |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
| payload required | object |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "name": "Bologna car rentals — October"
}Response samples
- 200
- 400
- 401
- 404
- 429
- 503
{- "type": "response",
- "message": "Dataset renamed",
- "payload": {
- "jobId": "ds_7a1c22",
- "name": "Bologna car rentals — October",
- "prompt": "Car rental companies in Bologna with phone and website"
}, - "pagination": { }
}Delete a dataset run's stored record
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Permanently removes the record and its stored rows. A run still in flight must be cancelled first (400). Irreversible. Free.
Authorizations:
path Parameters
| jobId required | string Example: job_8f2c1a Job id returned by the POST that started it. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
| payload required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/datasets/job_8f2c1a/record');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 400
- 401
- 404
- 429
- 503
{- "type": "response",
- "message": "Dataset deleted",
- "payload": {
- "jobId": "ds_7a1c22"
}, - "pagination": { }
}Generate CSS selectors with an LLM, once
Price: parser_generate $0.02 per call. parser_generate, only when coverage > 0. (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Looks at a page once with a model and returns CSS selectors (parser) that extract the fields you asked for — ready to pass as extract on every later scrape of that layout, where no model is involved and the plain scrape price applies. Every selector is run against the page before it is returned: report, missed and coverage tell you which fields are reliable. Give url (fetched through the pool, render: true for SPA pages) or html you already have (max 3 MB, no proxy bandwidth). Charged once as a setup step, and only when the parser extracts something (coverage > 0).
Authorizations:
Request Body schema: application/jsonrequired
| url | string <= 2048 characters Required unless |
| html | string |
object <= 25 properties field name → what it is. Required unless | |
| prompt | string <= 2000 characters Free-text alternative to |
| render | boolean Default: false |
| country | string (GeoValue) ^([a-zA-Z0-9 ._-]{1,56}|all)$ Examples: "us" "it" "all" Country code or place name: letters, digits, spaces, dots, hyphens, underscores; max 56 characters. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "fields": {
- "title": "product name",
- "price": "current price with currency",
- "sku": "SKU code"
}
}Response samples
- 200
- 400
- 401
- 402
- 403
- 429
- 500
- 503
{- "type": "response",
- "message": "Parser generated",
- "payload": {
- "parser": {
- "title": "h1.product-title",
- "price": {
- "selector": "span.price",
- "attr": null
}, - "sku": "dd.sku"
}, - "report": [
- {
- "field": "title",
- "selector": "h1.product-title",
- "sample": "Trail Runner 2",
- "missed": false
}, - {
- "field": "price",
- "selector": "span.price",
- "sample": "€ 129,00",
- "missed": false
}, - {
- "field": "sku",
- "selector": "dd.sku",
- "sample": "TR2-42",
- "missed": false
}
], - "missed": [ ],
- "coverage": 1,
- "repaired": false,
- "usage": {
- "cost_usd": 0.02,
- "free_usd": 0.02,
- "paid_usd": 0
}
}, - "pagination": { }
}List your presets
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Every stored parser of your account with its stats and version history. Free.
Authorizations:
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/parser/presets');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 429
- 500
- 503
{- "type": "response",
- "message": "Presets",
- "payload": {
- "presets": [
- {
- "id": "pst_7Qk3",
- "name": "example-product",
- "fields": {
- "title": "product name",
- "price": "current price"
}, - "render": false,
- "parser": {
- "title": "h1.product-title",
- "price": "span.price"
}, - "version": 1,
- "autoHeal": true,
- "createdAt": 1759759331000,
- "updatedAt": 1759759331000,
- "lastHealAt": null,
- "stats": {
- "runs": 12,
- "lastRunAt": 1759830000000,
- "fields": {
- "title": {
- "hits": 12,
- "misses": 0
}, - "price": {
- "hits": 11,
- "misses": 1
}
}, - "recent": [
- 1,
- 1,
- 0.5,
- 1
]
}, - "history": [
- {
- "version": 1,
- "parser": {
- "title": "h1.product-title",
- "price": "span.price"
}, - "at": 1759759331000,
- "reason": "created",
- "coverage": 1
}
]
}
]
}, - "pagination": { }
}Save a parser as a preset
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Stores a parser (usually the one /scraper/parser/generate just returned) under a name. Scrape with presetId instead of an inline extract schema and every run is scored per field; when the recent success rate decays and autoHeal is on, the preset regenerates itself from sourceUrl and bumps its version. Ownership is server-side: a client-supplied tenant is ignored. Free to store.
Authorizations:
Request Body schema: application/jsonrequired
| name required | string <= 120 characters |
required | object (ExtractSchema) Examples: {"title":"h1","price":".price","image":{"selector":"img.hero","attr":"src"},"features":{"selector":"li.feature","all":true}} Non-empty, at most 25 fields. |
| sourceUrl | string <= 2048 characters Page the parser was learned from — self-healing refetches it. |
object field → description, so a heal can regenerate the same shape. | |
| render | boolean Default: false |
| autoHeal | boolean |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "name": "example-product",
- "parser": {
- "title": "h1.product-title",
- "price": "span.price"
}, - "fields": {
- "title": "product name",
- "price": "current price"
}, - "autoHeal": true
}Response samples
- 200
- 400
- 401
- 429
- 500
- 503
{- "type": "response",
- "message": "Preset created",
- "payload": {
- "id": "pst_7Qk3",
- "name": "example-product",
- "fields": {
- "title": "product name",
- "price": "current price"
}, - "render": false,
- "parser": {
- "title": "h1.product-title",
- "price": "span.price"
}, - "version": 1,
- "autoHeal": true,
- "createdAt": 1759759331000,
- "updatedAt": 1759759331000,
- "lastHealAt": null,
- "stats": {
- "runs": 0,
- "lastRunAt": null,
- "fields": { },
- "recent": [ ]
}, - "history": [
- {
- "version": 1,
- "parser": {
- "title": "h1.product-title",
- "price": "span.price"
}, - "at": 1759759331000,
- "reason": "created"
}
]
}, - "pagination": { }
}Read a preset
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Parser, stats and version history. A preset belonging to someone else answers 404. Free.
Authorizations:
path Parameters
| id required | string Example: pst_7Qk3 Preset id returned when it was created. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/parser/presets/pst_7Qk3');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Preset",
- "payload": {
- "id": "pst_7Qk3",
- "name": "example-product",
- "parser": {
- "title": "h1.product-title",
- "price": "span.price"
}, - "version": 1,
- "autoHeal": true,
- "createdAt": 1759759331000,
- "updatedAt": 1759759331000,
- "lastHealAt": null,
- "stats": {
- "runs": 12,
- "lastRunAt": 1759830000000,
- "fields": { },
- "recent": [ ]
}, - "history": [ ]
}, - "pagination": { }
}Update a preset
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Rename, replace the parser (bumps the version), toggle autoHeal, update fields/sourceUrl. Only the keys you send change. Free.
Authorizations:
path Parameters
| id required | string Example: pst_7Qk3 Preset id returned when it was created. |
Request Body schema: application/jsonrequired
| name | string |
object (ExtractSchema) Examples: {"title":"h1","price":".price","image":{"selector":"img.hero","attr":"src"},"features":{"selector":"li.feature","all":true}} Non-empty, at most 25 fields. | |
| autoHeal | boolean |
object | |
| sourceUrl | string |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "autoHeal": false
}Response samples
- 200
- 400
- 401
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Preset updated",
- "payload": {
- "id": "pst_7Qk3",
- "name": "example-product",
- "parser": {
- "title": "h1.product-title",
- "price": "span.price"
}, - "version": 1,
- "autoHeal": false,
- "createdAt": 1759759331000,
- "updatedAt": 1759840000000,
- "lastHealAt": null,
- "stats": {
- "runs": 12,
- "lastRunAt": 1759830000000,
- "fields": { },
- "recent": [ ]
}, - "history": [ ]
}, - "pagination": { }
}Delete a preset
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Removes the preset and its version history. Scrapes that still send its presetId answer 404 afterwards. Free.
Authorizations:
path Parameters
| id required | string Example: pst_7Qk3 Preset id returned when it was created. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
| payload required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/parser/presets/pst_7Qk3');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Preset deleted",
- "payload": {
- "ok": true
}, - "pagination": { }
}Regenerate a preset's parser now
Price: parser_generate $0.02 per call. parser_generate only when healed is true. (list of 2026-10-07)
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
The manual trigger of the repair that runs automatically when a preset decays: refetches sourceUrl, asks the model for fresh selectors and adopts them only if they extract more of the page than the current ones. force: true bypasses the cooldown between heals. Billed like a generation, and only when a new version was actually produced (healed: true).
Authorizations:
path Parameters
| id required | string Example: pst_7Qk3 Preset id returned when it was created. |
Request Body schema: application/jsonoptional
| force | boolean Default: false |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "force": false
}Response samples
- 200
- 400
- 401
- 402
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Preset healed",
- "payload": {
- "healed": true,
- "reason": "coverage improved",
- "version": 2,
- "coverageBefore": 0.5,
- "coverageAfter": 1,
- "parser": {
- "title": "h1[itemprop=name]",
- "price": "span.price-now"
}, - "usage": {
- "cost_usd": 0.02,
- "free_usd": 0.02,
- "paid_usd": 0
}
}, - "pagination": { }
}How well a preset still works
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Lifetime success rate per field, mean coverage over the recent window and whether the preset now counts as decayed (the signal that triggers self-healing). Free — it is the health check of a parser you already paid to build.
Authorizations:
path Parameters
| id required | string Example: pst_7Qk3 Preset id returned when it was created. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/parser/presets/pst_7Qk3/stats');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 404
- 429
- 500
- 503
{- "type": "response",
- "message": "Preset stats",
- "payload": {
- "id": "pst_7Qk3",
- "name": "example-product",
- "version": 2,
- "runs": 12,
- "lastRunAt": 1759830000000,
- "successRateByField": {
- "title": 1,
- "price": 0.917
}, - "recentCoverage": 0.96,
- "decayed": false,
- "autoHeal": true,
- "lastHealAt": 1759840000000
}, - "pagination": { }
}List your proxy plans
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Every proxy service on the account (residential basic/premium/private, ISP, premium ISP, datacenter, datacenter traffic, IPv6, mobile, mobile v2) with credentials, bandwidth left, expiry and the orderId the generate and whitelist endpoints take. Free; no Data API billing.
Authorizations:
query Parameters
| limit | integer <= 100 Default: 50 |
| offset | integer Default: 0 |
| planType | string Enum: "residentialbasic" "residentialpremium" "resiprivate" "isp" "isppremium" "datacenter" "datacentertraffic" "ipv6" "mobile" "mobile_v2" |
| active | string Enum: "true" "false" Filter by expiry; omit for all. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/public/proxies');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 400
- 401
- 429
- 500
{- "type": "response",
- "message": "Success",
- "payload": {
- "proxies": [
- {
- "id": "prx_1",
- "orderId": "ord_8c21",
- "planName": "Residential Premium 5 GB",
- "planType": "residentialpremium",
- "planTypeName": "Residential Premium",
- "username": "user_8c21",
- "password": "p4ssw0rd",
- "proxyId": "sub_19a",
- "bandwidth": 5,
- "bandwidthGB": 5,
- "bandwidthLeft": 3.2,
- "bandwidthLeftGB": 3.2,
- "bandwidthUsed": 1.8,
- "bandwidthUsedGB": 1.8,
- "bandwidthUsagePercent": 36,
- "isUnlimited": false,
- "expiry": "2026-11-06T00:00:00.000Z",
- "expiresAt": "2026-11-06T00:00:00.000Z",
- "isActive": true,
- "isExpired": false,
- "daysRemaining": 30,
- "hoursRemaining": 720,
- "ips": 0,
- "whitelistSlots": 0,
- "whitelistedIPs": [ ],
- "region": "Global",
- "speed": null,
- "highConcurrency": false,
- "highPriority": false,
- "createdAt": "2026-10-06T10:00:00.000Z"
}
], - "pagination": {
- "total": 1,
- "limit": 50,
- "offset": 0,
- "hasMore": false
}
}, - "pagination": { }
}Generate proxy strings for a plan
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Ready-to-use endpoint strings (credentials included) for one order, in HTTP or SOCKS5 and several formats, with the targeting the plan supports: country/state/city for residential and mobile, ISP code for Residential Premium and Mobile V2, ASN for Residential Basic and traffic-based Datacenter, static gateways for Datacenter. rotation: sticky keeps one IP for sessionTime minutes; static (IPv6 only) is a fixed session with no TTL. Mobile V2 can alternatively return the IP-auth proxy list for a whitelisted ip. Premium ISP orders still being provisioned answer 202 with pending: true. Which parameters apply depends on the plan type — unsupported ones are ignored, not rejected. Free; no Data API billing (the plan's own bandwidth is consumed when you use the proxies).
Authorizations:
Request Body schema: application/jsonrequired
| orderId required | string From GET /public/proxies. |
| protocol | string Default: "http" Enum: "http" "socks5" |
| format | string Default: "user:pass@host:port" Enum: "user:pass@host:port" "host:port:user:pass" "http://user:pass@host:port" "socks5://user:pass@host:port"
|
| quantity | integer [ 1 .. 10000 ] Default: 10 |
| country | string Lowercase country code (e.g. |
| state | string Region slug (Residential Premium / Mobile V2: from the location tree). Alias |
| city | string City slug. |
| rotation | string Default: "rotating" Enum: "rotating" "sticky" "static"
|
| sessionTime | integer [ 1 .. 1440 ] Default: 10 Sticky session minutes (Residential Basic / Datacenter traffic: min 3 enforced by the gateway). |
| isp | string ISP code (Residential Premium / Mobile V2) or carrier ASN (Mobile). |
| asn | string ASN, e.g. |
| strict | boolean Default: false Residential/Datacenter Basic: |
| filter | string Enum: "speed" "speed-quality" "quality" Residential Premium / Mobile V2 pool filter (default: max pool). |
| isExtension | boolean Default: false Rewrite hostnames with a unique prefix so a browser extension cannot cache the proxy (needs the wildcard DNS of the gateway). |
| ip | string Mobile V2: a whitelisted IP — returns the IP-auth proxy list instead of user:pass strings. |
| gateway | string Default: "ww" Enum: "ww" "us" "eu" "as" Mobile V2 region gateway. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "orderId": "ord_8c21",
- "protocol": "http",
- "format": "user:pass@host:port",
- "quantity": 5,
- "country": "us",
- "rotation": "sticky",
- "sessionTime": 10
}Response samples
- 200
- 202
- 400
- 401
- 404
- 429
- 500
- 502
{- "type": "response",
- "message": "Success",
- "payload": {
- "orderId": "ord_8c21",
- "quantity": 5,
- "protocol": "http",
- "format": "user:pass@host:port",
- "rotation": "sticky",
- "sessionTime": 10,
- "geoTargeting": {
- "country": "us",
- "state": null,
- "city": null
}, - "proxies": [
- "user_8c21-country-us-session-a1b2c3-time-10:p4ssw0rd@residential-ww.quantumproxies.io:9999",
- "user_8c21-country-us-session-d4e5f6-time-10:p4ssw0rd@residential-ww.quantumproxies.io:9999"
], - "bandwidth": 5,
- "bandwidthLeft": 3.2,
- "whitelist": [ ]
}, - "pagination": { }
}Geolocate an IP
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Country, region, city, coordinates, timezone, ISP and ASN of an IP address — useful to verify where a sticky session actually exits. Served by a third-party geolocation source with its own fair-use limit (about 45 lookups/minute shared). Free.
Authorizations:
query Parameters
| ip required | string Example: ip=203.0.113.7 |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/public/proxies/ip-info?ip=203.0.113.7');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 400
- 401
- 429
- 500
{- "type": "response",
- "message": "Success",
- "payload": {
- "ip": "203.0.113.7",
- "country": "United States",
- "countryCode": "US",
- "flag": "🇺🇸",
- "region": "California",
- "regionCode": "CA",
- "city": "Los Angeles",
- "zip": "90001",
- "lat": 34.05,
- "lon": -118.24,
- "timezone": "America/Los_Angeles",
- "isp": "Example Telecom",
- "org": "Example Telecom LLC",
- "as": "AS64496 Example Telecom"
}, - "pagination": { }
}List whitelisted IPs of an order
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
The IPs allowed to use an IP-auth plan without credentials. Mobile V2 plans also return the detailed upstream entries (ports, geo, sticky) under entries. Free.
Authorizations:
query Parameters
| orderId required | string |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/public/proxies/whitelist-ip?orderId=ORDERID');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 400
- 401
- 404
- 429
- 500
{- "type": "response",
- "message": "Success",
- "payload": {
- "orderId": "ord_8c21",
- "whitelist_ip": [
- "203.0.113.7"
]
}, - "pagination": { }
}Whitelist an IP
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Allows an IPv4 address to use the plan by IP authentication. Supported on Residential Basic, Datacenter (both kinds), ISP, IPv6 and Mobile V2; Residential Premium/Private authenticate by user:pass and answer 200 with whitelisted: false. Mobile V2 accepts extra port/targeting options and action: update to edit an existing entry. Free.
Authorizations:
Request Body schema: application/jsonrequired
| orderId required | string |
| ip required | string^(\d{1,3}\.){3}\d{1,3}$ IPv4 address. |
| action | string Default: "add" Enum: "add" "update" Mobile V2 only: |
| ports_count | integer [ 1 .. 1000 ] Mobile V2: ports to allocate. |
| protocol | string Enum: "HTTP" "SOCKS5" Mobile V2. |
| country | string Mobile V2 geo targeting for the allocated ports. |
| region | string Mobile V2. |
| city | string Mobile V2. |
| isp | string Mobile V2. |
| sticky | boolean Mobile V2: keep the same IP per port. |
| ttl | integer Mobile V2: sticky session TTL in seconds. |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "orderId": "ord_8c21",
- "ip": "203.0.113.7"
}Response samples
- 200
- 400
- 401
- 404
- 429
- 500
{- "type": "response",
- "message": "IP whitelisted successfully",
- "payload": {
- "ip": "203.0.113.7",
- "whitelisted": true,
- "whitelist_ip": [
- "203.0.113.7"
]
}, - "pagination": { }
}Remove a whitelisted IP
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Removes the IP from the plan's IP-auth list (Mobile V2 also accepts the entry id). Plans that authenticate by user:pass answer 200 with removed: false. Free.
Authorizations:
Request Body schema: application/jsonrequired
| orderId required | string |
| ip required | string |
| id | string Mobile V2 entry id (alternative handle). |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
| payload required | object |
| pagination | object Empty |
Request samples
- Payload
- PHP (curl)
{- "orderId": "ord_8c21",
- "ip": "203.0.113.7"
}Response samples
- 200
- 400
- 401
- 404
- 429
- 500
{- "type": "response",
- "message": "IP removed from whitelist",
- "payload": {
- "ip": "203.0.113.7",
- "removed": true,
- "whitelist_ip": [ ]
}, - "pagination": { }
}Per-day usage and cost
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Request counts (total and per query type), proxy bandwidth, AI token cost and billed vs free-tier spend per UTC day for the calling key's account, read from the daily aggregation. Free; not subject to the Data API kill switch.
Authorizations:
query Parameters
| days | integer [ 1 .. 90 ] Default: 30 |
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/usage');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 429
{- "type": "response",
- "message": "Scraper usage",
- "payload": {
- "days": [
- {
- "date": "2026-10-06",
- "requests": 143,
- "by_type": {
- "extract": 120,
- "google": 20,
- "map": 3
}, - "proxy_kb": 61230,
- "ai_cost_usd": 0,
- "billed_usd": 0,
- "free_usd": 0.0375
}
], - "totals": {
- "requests": 143,
- "by_type": {
- "extract": 120,
- "google": 20,
- "map": 3
}, - "proxy_kb": 61230,
- "billed_usd": 0,
- "free_usd": 0.0375
}, - "period_days": 30
}, - "pagination": { }
}Billing status and your price list
Price: No charge.
Rate limit: Per API key, by tier (see Rate limits and tiers).
Try it in the Playground · Markdown for this group
Current price list with your tier's discount applied (keyed like pricing.json), monthly free allowance and what is left of it, wallet balance, active tier, billing mode and the per-minute limits each mode carries. Lets a client or an agent budget its calls without a dashboard round-trip. Free; not subject to the Data API kill switch.
Authorizations:
Responses
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/scraper/billing');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer qp_live_YOUR_API_KEY'],
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
- 401
- 429
{- "type": "response",
- "message": "Billing status",
- "payload": {
- "billing_enabled": true,
- "billed": true,
- "balance": 12.5,
- "tier": {
- "key": "payg",
- "name": "Pay as you go",
- "discount_pct": 0,
- "rate_limit_per_min": 20
}, - "billing_mode": {
- "preference": "free_first",
- "effective": "free_first",
- "available": true,
- "free_first_rate_limit_per_min": 20,
- "balance_rate_limit_per_min": 300,
- "effective_rate_limit_per_min": 20
}, - "free_monthly_usd": 2,
- "free_remaining_usd": 1.62,
- "ai_token_markup": 2,
- "prices_usd": {
- "extract": 0.0002,
- "extract_render": 0.001,
- "serp": 0.0005,
- "serp_render": 0.002,
- "map": 0.0005,
- "seo_audit": 0.0012,
- "crawl_page": 0.0003,
- "batch_url": 0.0002,
- "collector_result": 0.002
}
}, - "pagination": { }
}No-key MCP trial settings
Price: No charge.
Rate limit: No rate limit.
Try it in the Playground · Markdown for this group
What the keyless trial of the hosted MCP endpoint allows right now for a brand: whether it is on, calls per client address per UTC day, calls across all addresses per day, and which tools it may run. Read by the hosted MCP servers once a minute; nothing secret in it, so it needs no API key and is cacheable for 60 s. The brand comes from ?brand= or, failing that, from the request host.
query Parameters
| brand | string Enum: "QP" "QD" QP = QuantumProxies, QD = QuanticData. Defaults to the brand of the host you call. |
Responses
| Cache-Control | string
|
Response Schema: application/json
| type required | string Value: "response" |
| message required | string |
required | object |
| pagination | object Empty |
Request samples
- PHP (curl)
<?php
$ch = curl_init('https://api.quantumproxies.io/v1/mcp/trial-config');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
]);
$raw = curl_exec($ch);
curl_close($ch);
$data = json_decode($raw, true);
if ($data['type'] !== 'response') { throw new RuntimeException($data['message']); }
print_r($data['payload']);Response samples
- 200
{- "type": "response",
- "message": "ok",
- "payload": {
- "brand": "QD",
- "enabled": true,
- "perIpPerDay": 5,
- "perDay": 300,
- "tools": [
- "scrape",
- "search",
- "search_and_read",
- "map",
- "seo_audit",
- "list_collectors",
- "collector_run_status",
- "proxy_locations"
]
}
}