Skip to main content

Channel3 Python SDK

fern shield pypi

The official Python SDK for the Channel3 API — a universal product database powering AI shopping apps and agents.

Documentation

Full API documentation and guides are available at channel3.docs.buildwithfern.com.

Runtime Compatibilities

Requirement Version
Python >= 3.10
HTTP client httpx >= 0.21.2
Async backend aiohttp >= 3.13.4 (optional extra)
Pydantic >= 1.9.2 (v1 and v2 supported)
OS Linux, macOS, Windows
Typing Fully typed — py.typed marker included

Installation

pip install channel3-sdk
# or
poetry add channel3-sdk

For async support with aiohttp:

pip install "channel3-sdk[aiohttp]"

Authentication

The SDK authenticates via an x-api-key header. Pass your key when initializing the client:

from channel3 import Channel3Client

client = Channel3Client(api_key="YOUR_API_KEY")

Async client

from channel3 import AsyncChannel3Client

client = AsyncChannel3Client(api_key="YOUR_API_KEY")

Usage

Search products

response = client.products.search(query="organic cotton t-shirt", limit=10)

for product in response.products:
    print(product.title, product.offers[0].price if product.offers else None)

Paginate through results

Search responses include a next_page_token for cursor-based pagination:

page_token = None

while True:
    response = client.products.search(query="sneakers", page_token=page_token)
    for product in response.products:
        print(product.title)

    page_token = response.next_page_token
    if not page_token:
        break

Visual search by image

response = client.products.image_search(
    image_url="https://example.com/photo.jpg",
)

Find similar products

response = client.products.similar(product_id="prod-12345")

Look up a product by URL

product = client.products.lookup(url="https://example.com/product/abc")

Browse brands and categories

Cursor-paginated listing:

brands = client.brands.list(limit=50)
print(brands.items)         # list[Brand]
print(brands.next_cursor)   # pass as `cursor` for the next page

categories = client.categories.list(page_size=50)

Track prices

# Start tracking
client.price_tracking.start(canonical_product_id="prod-12345")

# Get price history
history = client.price_tracking.get_history("prod-12345")

# List active subscriptions
subs = client.price_tracking.list_subscriptions()

# Stop tracking
client.price_tracking.stop(canonical_product_id="prod-12345")

Type Intellisense

All types are importable from the top-level channel3 package:

from channel3 import Channel3Client, SearchResponse, Product, Brand

# Full autocomplete in your IDE
response: SearchResponse = client.products.search(query="headphones")
product: Product = response.products[0]

Resource clients are accessible via dot notation — type client. in your editor to discover:

Accessor Methods
client.products search, image_search, similar, lookup, retrieve, enrich
client.brands list, search, get
client.categories list, search
client.price_tracking start, stop, get_history, list_subscriptions
client.websites list

Error Handling

The SDK raises typed exceptions per HTTP status code:

from channel3.errors import UnauthorizedError, PaymentRequiredError, BadRequestError

try:
    client.products.search(query="test")
except UnauthorizedError:
    print("Invalid API key")
except PaymentRequiredError:
    print("Upgrade your plan")
except BadRequestError as e:
    print(e.body)  # parsed error response

Advanced

Retries

Automatic exponential backoff on 5xx and network errors (default: 2 retries):

response = client.products.search(
    query="shoes",
    request_options={"max_retries": 5},
)

Timeouts

Default timeout is 60 seconds. Override per-client or per-request:

client = Channel3Client(api_key="YOUR_API_KEY", timeout=30.0)

# Per-request
response = client.products.search(
    query="shoes",
    request_options={"timeout_in_seconds": 10},
)

Raw Response Access

Access HTTP headers and status alongside parsed data:

response = client.products.with_raw_response.search(query="shoes")
print(response.status_code)
print(response.headers)
print(response.data)  # parsed SearchResponse

Custom HTTP Client

Pass your own httpx client for proxies, custom certs, or connection pooling:

import httpx
from channel3 import Channel3Client

client = Channel3Client(
    api_key="YOUR_API_KEY",
    httpx_client=httpx.Client(proxy="http://proxy:8080"),
)

Reference

See the full API reference in reference.md.

Contributing

See CONTRIBUTING.md for development setup and guidelines.

Metadata

Release files for channel3-sdk 4.1.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 channel3-sdk 4.1.0
File Size Uploaded
channel3_sdk-4.1.0.tar.gz 91.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for channel3-sdk 4.1.0
File Interpreter ABI Platform
channel3_sdk-4.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 260.4 kB

Release files / channel3_sdk-4.1.0.tar.gz

Download URL channel3_sdk-4.1.0.tar.gz
Size 91.2 kB
Tags Source
SHA-256 checksum
How to use checksums
2a636427502f2bf61581c51bda0226dd92e73b2b55cbc802e48f466988529bcb
BLAKE2b-256 checksum
How to use checksums
56ab5927aa1e3e6e67c6f765a9550d2f80a43f3befee56aef72896b7ea45b018
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 22, 2026.

Transparency log

Release files / channel3_sdk-4.1.0-py3-none-any.whl

Download URL channel3_sdk-4.1.0-py3-none-any.whl
Size 169.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3b126789c071a5c16324f2f23ff9dd8ef1efb0ebf50a75b7378bd2ca7b26ed64
BLAKE2b-256 checksum
How to use checksums
eca61bb225e6067880e1fa906fe064e1c18e572899ecb33b72f6145ac896f719
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 22, 2026.

Transparency log
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