Chocodata

PyPI - Python 3.9+

Python SDK

Type-hinted async + sync clients with auto-retry, pagination helpers, and streaming batch results. Drop-in for FastAPI, Airflow, or any data pipeline.

Quick start

1. Install

pip install chocodata

2. Scrape your first product

from chocodata import Client

client = Client(api_key="cd_live_...")

product = client.products.get("B08N5KWBKK", domain="com")
print(product.title, product.price, product.rating)

3. Or async

import asyncio
from chocodata import AsyncClient

async def main():
    async with AsyncClient(api_key="cd_live_...") as client:
        product = await client.products.get("B08N5KWBKK")
        print(product.title)

asyncio.run(main())

How-to

Run a search

results = client.search.run(
    site="google",
    query="wireless earbuds",
    pages=3,           # paginate automatically
)
for r in results:
    print(r.position, r.title, r.url)

Bulk-scrape via async batch

asins = ["B08N5KWBKK", "B0DZ7871B8", ...]  # up to 1,000

batch = client.batch.create(
    asins=asins,
    domain="com",
    webhook_url="https://your.app/webhook",  # optional
)

# Poll, or wait for the webhook
results = client.batch.wait(batch.id, timeout=600)
print(f"got {len(results)} products")

Scrape across regions

for tld in ("com", "co.uk", "de", "co.jp"):
    p = client.products.get("B08N5KWBKK", domain=tld)
    print(tld, p.price, p.currency)

The same client works across all 237 targets - swap the endpoint for Walmart, Wikipedia, search engines and more. See /features.

Handle errors and retries

from chocodata import Client, RateLimitError, BlockedError

client = Client(api_key="cd_live_...", max_retries=3)  # retries built in

try:
    p = client.products.get("B08N5KWBKK")
except RateLimitError as e:
    print(f"hit limit, retry after {e.retry_after_ms}ms")
except BlockedError as e:
    print(f"upstream blocked, request_id={e.request_id}")

Why use the SDK over raw HTTP?

Type-safe responses

Every product field is a typed attribute. IDE autocomplete works. Mypy passes. Refactors are safe.

Built-in retries

Exponential backoff on 429 + 5xx. Configurable max attempts. Never charged for retries (only 2xx successes bill).

Pagination helpers

`client.search.run(pages=N)` returns a flat iterable of every result across pages. No manual pagination loop.

Async batch streaming

`async for r in client.batch.stream(batch_id):` yields results as they complete instead of waiting for the full batch.

Webhook signature verification

`Client.verify_webhook(headers, body)` checks the HMAC signature so you cannot accidentally trust a forged callback.

Test mode

Pass `mock=True` to short-circuit the real upstream call. Useful for unit tests, CI, and offline development.

Official resources

Pricing

Same rate across every integration. Monthly plans from $19 or pay-as-you-go at $0.90 per 1,000 successful requests. 1,000 free on signup.

Free

$0

Forever free on signup

  • check_circle1,000 requests / month (5,000 credits)
  • check_circle10 concurrent requests
  • check_circleAll 237 targets
  • check_circleFull dashboard + analytics
  • check_circleTop-up at $0.90 / 1k
  • check_circleCommunity support
Start free
Most popular

Vibe

$19 / month

$0.70 / 1k effective

  • check_circle27,000 requests / month (135,000 credits)
  • check_circle30 concurrent requests
  • check_circleAll 237 targets + content-language
  • check_circleCountry-matched residential IPs
  • check_circlePer-API-key usage tracking
  • check_circleTop-up at $0.90 / 1k
  • check_circleEmail support (1 business day)
Get Vibe

Pro

$49 / month

$0.60 / 1k effective

  • check_circle82,000 requests / month (410,000 credits)
  • check_circle50 concurrent requests
  • check_circlePriority routing queue
  • check_circleCountry-matched residential IPs
  • check_circleTeam seats (up to 5)
  • check_circleTop-up at $0.90 / 1k
  • check_circleEmail + chat support
Get Pro

Custom

$100-$2k / month

Flat $0.50 / 1k effective at every level

  • check_circle200k - 4M+ requests / month
  • check_circle100-500+ concurrent requests
  • check_circlePriority queue (highest)
  • check_circlePremium proxy pool + SLA on request
  • check_circleUnlimited team seats
  • check_circleWire / invoice / annual PO
  • check_circleDedicated Slack channel
Pick Custom level

Pay-as-you-go top-up

$0.90 / 1,000 successful requests

Available on every plan including Free. Top up any time when included credits run out. Only 2xx responses charged. Balance never expires.

Ship with Python today

1,000 free requests on signup. No credit card required.