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.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 channel3-sdk 4.2.0
File Size Uploaded
channel3_sdk-4.2.0.tar.gz 96.1 kB Details

Built distribution (wheel)

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

Total release size: 276.3 kB

Release files / channel3_sdk-4.2.0.tar.gz

Download URL channel3_sdk-4.2.0.tar.gz
Size 96.1 kB
Tags Source
SHA-256 checksum
How to use checksums
12d4171729e8ecbda28256723b1a0ced6efc049b35707f87847428894632de8d
BLAKE2b-256 checksum
How to use checksums
93fed5ccf1aa752ecad8dd422a6cce367bac48645c9607b272e836661e9281ce
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 Oct 13, 2026.

Transparency log

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

Download URL channel3_sdk-4.2.0-py3-none-any.whl
Size 180.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6a381c5186a3d0b00a24074a6806dc122b9927e93718654eb8c7ac256a01cf29
BLAKE2b-256 checksum
How to use checksums
4425d6b9b753b59ea26bd663d5e6bc65ffc81efe4c9937c16c066a48ec960487
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 Oct 13, 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