> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trychannel3.com/llms.txt
> Use this file to discover all available pages before exploring further.

# v4.0.0 — August 2026

The API is unchanged in this release. Every change below is in the SDKs, which are now generated by [Fern](https://buildwithfern.com).

`@channel3/sdk@4.0.0` is released. The Python SDK is in prerelease — `pip install channel3-sdk` still resolves to 3.5.0; reach the preview with `pip install channel3-sdk==4.0.0b2`.

**Newly available in the SDKs**

* Conversations — [`POST /v1/conversations`](/api-reference/v1/create-turn) for a buffered turn or an SSE event stream, and [`GET /v1/conversations/{conversation_id}`](/api-reference/v1/get-conversation) to page a thread's history. See [Conversations](/conversations)
* Client tokens — [`POST /v1/conversations/client_tokens`](/api-reference/v1/create-client-token) and [revoke](/api-reference/v1/revoke-client-token), for browser-safe tokens scoped to one conversation. See [Client tokens](/conversations/client-tokens)
* Reporting — [clicks](/api-reference/v1/reporting-clicks) and [transactions](/api-reference/v1/reporting-transactions)
* [`POST /v1/browse`](/api-reference/v1/browse) and `POST /v1/monetize`
* Typed variant selection on [`GET /v1/products/{product_id}`](/api-reference/v1/product-detail) — pass `selected_options` as a map of dimension name to value label

**Breaking: removed methods.** The methods deprecated in 3.5.x are gone. Use `products.search` instead of `search.perform`, `brands.search` instead of `brands.find`, `products.lookup` instead of `enrich.enrichURL` / `enrich_url`, `websites.retrieve` instead of `websites.find`, and `retrieveHistory` / `retrieve_history` instead of `getHistory` / `get_history`. The `search` and `enrich` resources no longer exist

**Breaking (TypeScript)**

* The default export is gone — `import { Channel3 } from "@channel3/sdk"`
* `ProductDetail` is now `Product`, and the variant types are top-level: `VariantOption`, `OptionValue`, `SelectedOption`. `PriceHistory` is now `PriceHistoryResponse`, kept as a deprecated alias until 5.0
* Pagination returns an iterable you must `await` first: `const page = await client.products.search({ query }); for await (const product of page) { ... }`
* Client options renamed — `baseURL` → `baseUrl`, `timeout` → `timeoutInSeconds`, `defaultHeaders` → `headers`, `defaultQuery` → `queryParams`, `logLevel` / `logger` → `logging`. `fetchOptions` has no equivalent

**Breaking (Python)**

* The base exception is `ApiError`, not `Channel3Error`. `AuthenticationError` is now `UnauthorizedError`; `status_code` is still on the exception
* The four per-call options (`extra_headers`, `extra_query`, `extra_body`, `timeout`) are replaced by a single `request_options`
* Renamed models: `ProductDetail` → `Product`, `PriceHistory` → `PriceHistoryResponse`, `Subscription` → `SubscriptionResponse`, `VariantsOption` → `VariantOption`, `VariantsOptionValue` → `OptionValue`, `VariantsSelected` → `SelectedOption`. **No compatibility aliases ship** — rename at the import site
* `search_by_image(base64_image=...)` is now `base64image` — a generator casing limitation, not a deliberate rename. The wire field and the TypeScript spelling are unchanged
* `NOT_GIVEN`, `NotGiven`, `Omit`, `Stream`, `AsyncStream` and `DefaultHttpxClient` are gone. Omitting an optional argument behaves as before

**Unchanged.** Field names keep their snake\_case spelling in both languages, client construction is the same, and the `CHANNEL3_*` locale environment variables still work.
