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
- PyPI package - install via pip
- GitHub repo - source + issues + changelog
- Product API reference - every field returned
- Search API reference
- Async batch API reference
- How to scrape Amazon Products (full guide)
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
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
Vibe
$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)
Pro
$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
Custom
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
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.