Skip to main content

quanticdata — Python SDK for the QuanticData API

Scrape any page to clean Markdown, run structured Google/Bing/DuckDuckGo searches, crawl and map whole sites, run 74 ready-made Collectors (Amazon, Google Maps, LinkedIn jobs, app stores…), build datasets from a plain-language prompt — everything through QuanticData' residential proxy network with real-browser TLS fingerprints. Pay per successful call; blocked pages cost nothing.

pip install quanticdata

Quickstart

from quanticdata import QuanticData

client = QuanticData()  # reads QUANTICDATA_API_KEY from the environment

page = client.scrape("https://example.com")
print(page["title"], page["engine"])
print(page["content"])          # the page as clean Markdown

Get a free API key at quanticdata.io — every account includes free monthly usage, no card required. Set it once:

export QUANTICDATA_API_KEY=qd_live_your_key_here

What's in the box

Every REST endpoint, one method each — responses come back with the API envelope already unwrapped:

# Structured search — 3 engines, 17 verticals, SerpApi-compatible JSON
serp = client.search("best espresso machine", country="us", num=20)
for r in serp["organic"]:
    print(r["rank"], r["title"], r["link"])

# SERP → citation-ready Markdown context for an AI prompt
ctx = client.search_and_read("latest EU AI act status", top_n=3)

# Map a site's URLs in seconds (sitemaps + homepage links)
urls = client.map("https://stripe.com", search="/blog")

# Async crawl — wait=True polls until it settles and returns the pages
job = client.crawl("https://docs.python.org", limit=30, depth=2, wait=True)

# Batch-scrape known URLs
job = client.batch(["https://a.example", "https://b.example"], wait=True)

# CSS/AI extraction on one page
data = client.scrape(
    "https://books.toscrape.com",
    extract={"titles": {"selector": "h3 a", "attr": "title", "all": True}},
)

# Learn selectors once with an LLM, then scrape the same layout for free
parser = client.generate_parser(
    "https://news.ycombinator.com",
    fields={"titles": "every story title, as a list"},
)

# 74 ready-made Collectors — semantic input instead of URLs
places = client.run_collector(
    "google_maps_places", keyword="dentist", location="Austin, TX", max_results=20
)

# Dataset from a prompt (validated rows, budget-capped)
ds = client.create_dataset(
    "coffee roasters in Portland with email and phone",
    limits={"max_rows": 50, "max_cost_usd": 2},
    wait=True,
)

# Proxy endpoints of every type — residential, mobile, datacenter, ISP, IPv6
plans = client.list_proxies(active=True)
proxies = client.generate_proxies(plans["proxies"][0]["orderId"], country="us", quantity=5)

Web Unlocker

unlock() replays any HTTP request — method, headers, body — through a residential exit with a real browser TLS fingerprint, retries on a fresh IP when the target blocks it, and escalates a blocked GET to a real browser. You get the raw response back: status, headers, body, finalUrl.

r = client.unlock("https://www.example-shop.com/item/42", country="us")
if r["blocked"]:
    print(r["blockClass"], r.get("vendor"), r.get("blockReason"))  # e.g. "waf", "cloudflare"
else:
    print(r["status"], r["body"][:200])

# Force a real browser render and wait for the price to appear
page = client.unlock(
    "https://www.example-shop.com/item/42",
    render="html", wait_for_selector=".price", wait_ms=1500,
)

A still-blocked page is never returned as a silent 200: it comes flagged with blocked: true (pass fail_on_block=True to get an error instead). Interactive captchas are not solved — they arrive with blockClass: "captcha". Billed per GB of the tier's prepaid unlocker balance (usage in the response).

Errors and retries

Failures raise QuanticDataError with .status, .message and .payload. Connection errors and HTTP 429 are retried with backoff; billable calls are never re-sent after a response was received, so nothing gets double-billed behind your back.

from quanticdata import QuanticData, QuanticDataError

try:
    QuanticData(api_key="qd_live_wrong").scrape("https://example.com")
except QuanticDataError as err:
    print(err.status, err.message)

Also available

MIT licensed.

Metadata

Release files for quanticdata 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for quanticdata 0.2.0
File Size Uploaded
quanticdata-0.2.0.tar.gz 11.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for quanticdata 0.2.0
File Interpreter ABI Platform
quanticdata-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 23.2 kB

Release files / quanticdata-0.2.0.tar.gz

Download URL quanticdata-0.2.0.tar.gz
Size 11.2 kB
Tags Source
SHA-256 checksum
How to use checksums
766444d44ed53d2a98d0d3877d894985872f3b6a7604b3e818d8d73f97d153a2
BLAKE2b-256 checksum
How to use checksums
000a27f712075d79bb5b2b8fd3537e6881b944bb8c4fc3c28369595c86c5b4ac
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.6

Release files / quanticdata-0.2.0-py3-none-any.whl

Download URL quanticdata-0.2.0-py3-none-any.whl
Size 12.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ebb322de13adf110098280d16c47222e76658cafc748097dd5df8e9def84563c
BLAKE2b-256 checksum
How to use checksums
8b171d272cbd826c9156463edba67f60e55dab6bb97601d7fb6404fcf68020a5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.6

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page