{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"servers":[{"url":"https://api.trychannel3.com","description":"Production"}],"paths":{"/v0/health":{"get":{"tags":["channel3-api"],"summary":"Health Check","description":"Health check endpoint.\n\nReturns unhealthy (503) if the event loop lag exceeds 1 second,\nindicating the server is too busy to handle requests promptly.\n\nThis endpoint also records availability metrics for status page integration.","operationId":"health_check_v0_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Check V0 Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"example":{"detail":"Internal Server Error"}}}}}}},"/v0/websites":{"get":{"tags":["channel3-api"],"summary":"Websites","description":"Resolve a website URL to its ID and best_commission_rate.\n\nDeprecated: `GET /v1/websites/{website_id}` accepts the same domains\nalongside website ids and returns the same fields, and\n`GET /v1/websites/search` finds a website by retailer name.","operationId":"find_website_by_url_v0_websites_get","deprecated":true,"security":[{"APIKeyHeader":[]}],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","title":"Query"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CountryCode"},{"type":"null"}],"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset.","title":"Country"},"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/Website"},{"type":"null"}],"title":"Response Find Website By Url V0 Websites Get"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Website not found","content":{"application/json":{"example":{"detail":"No website found matching 'acme'"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/search":{"post":{"tags":["v1"],"summary":"Search","description":"Search for products with pagination support.\n\nAt least one of `query`, `image_url`, `base64_image`, or `page_token` must be\nprovided; requests with none of these will return 422.","operationId":"search_v1_search_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"x-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response.","title":"X-User-Id"},"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"example":{"detail":"You have used all of your free credits. Add a payment method to continue."},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation error — e.g., the request body provides none of 'query', 'image_url', 'base64_image', or 'page_token'.","content":{"application/json":{"example":{"detail":[{"type":"value_error","loc":["body"],"msg":"Value error, At least one of 'query', 'image_url', 'base64_image', or 'page_token' must be provided."}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"detail":"Could not fetch image from image_url. Ensure the URL is valid, publicly accessible, and points to a supported image (jpg, png, webp, gif, avif, heic)."},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"504":{"description":"Timed out fetching the provided image_url","content":{"application/json":{"example":{"detail":"Timed out after 5s fetching image from image_url. Ensure the URL is publicly accessible and responds promptly."},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/browse":{"post":{"tags":["v1"],"summary":"Browse","description":"List and page through products for a set of filters.\n\nUseful for a static, grid view of products for a brand, website, or category.\n\nAt least one of `filters.brand_ids`, `filters.category_ids`, or\n`filters.website_ids` must be provided, unless `config.collection_id` is set.\n\nPagination is capped at 5 pages per browse; `next_page_token` is null on\nthe final page. Contact support@trychannel3.com for deeper paging.","operationId":"browse_v1_browse_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"x-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response.","title":"X-User-Id"},"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation error — at least one of 'filters.brand_ids', 'filters.category_ids', or 'filters.website_ids' must be provided, unless 'config.collection_id' is set; or the page token is past page 5.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/image-search":{"post":{"tags":["v1"],"summary":"Image Search","description":"Search the catalog by image (URL or base64), with pagination support.\n\nProvide exactly one of ``image_url`` or ``base64_image``. For text or\ntext+image search, use ``POST /v1/search``.","operationId":"image_search_v1_image_search_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"x-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response.","title":"X-User-Id"},"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageSearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"example":{"detail":"You have used all of your free credits. Add a payment method to continue."},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Must provide exactly one of image_url or base64_image","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"detail":"Could not fetch image from image_url. Ensure the URL is valid, publicly accessible, and points to a supported image (jpg, png, webp, gif, avif, heic)."},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"504":{"description":"Timed out fetching the provided image_url","content":{"application/json":{"example":{"detail":"Timed out after 5s fetching image from image_url. Ensure the URL is publicly accessible and responds promptly."},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/similar":{"post":{"tags":["v1"],"summary":"Similar Products","description":"Find products similar to a given product.\n\nResults are pinned to the seed product's category. Consider setting\n``filters`` to narrow further (gender, brand, price). Pass\n``config.collection_id`` to keep neighbors inside a saved collection.","operationId":"similar_v1_similar_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"x-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response.","title":"X-User-Id"},"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimilarProductsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"example":{"detail":"You have used all of your free credits. Add a payment method to continue."},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Product not found","content":{"application/json":{"example":{"detail":"Product not found"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/products/{product_id}":{"get":{"tags":["v1"],"summary":"Product Detail","description":"Get detailed information about a specific product by its ID.","operationId":"get_product_detail_v1_products__product_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}},{"name":"website_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Optional list of website IDs to constrain the buy URL to, relevant if multiple merchants exist. Accepts website IDs or domains (e.g. \"nike.com\").","title":"Website Ids"},"description":"Optional list of website IDs to constrain the buy URL to, relevant if multiple merchants exist. Accepts website IDs or domains (e.g. \"nike.com\")."},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LanguageCode"},{"type":"null"}],"description":"ISO 639-1 language code. Matches any language when unset; defaults to 'en' only when country and currency are also unset.","title":"Language"},"description":"ISO 639-1 language code. Matches any language when unset; defaults to 'en' only when country and currency are also unset."},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CountryCode"},{"type":"null"}],"description":"ISO 3166-1 alpha-2 country code. Matches any country when unset; defaults to 'US' only when language and currency are also unset.","title":"Country"},"description":"ISO 3166-1 alpha-2 country code. Matches any country when unset; defaults to 'US' only when language and currency are also unset."},{"name":"currency","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CurrencyCode"},{"type":"null"}],"description":"ISO 4217 currency code. When unset, inferred from `country` (e.g. GB -> GBP); falls back to 'USD' only when all three locale fields are unset.","title":"Currency"},"description":"ISO 4217 currency code. When unset, inferred from `country` (e.g. GB -> GBP); falls back to 'USD' only when all three locale fields are unset."},{"name":"length_unit","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LengthUnit"},{"type":"null"}],"description":"Preferred unit for length dimensions (length/width/height). When unset, dimensions are returned in the unit the merchant stated.","title":"Length Unit"},"description":"Preferred unit for length dimensions (length/width/height). When unset, dimensions are returned in the unit the merchant stated."},{"name":"weight_unit","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/WeightUnit"},{"type":"null"}],"description":"Preferred unit for weight dimensions. When unset, weight is returned in the unit the merchant stated.","title":"Weight Unit"},"description":"Preferred unit for weight dimensions. When unset, weight is returned in the unit the merchant stated."},{"name":"x-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response.","title":"X-User-Id"},"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Product not found","content":{"application/json":{"example":{"detail":"Product not found"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"429":{"description":"Product detail limit exceeded. If your use-case needs an increase, reach out to support@trychannel3.com.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/lookup":{"post":{"tags":["v1"],"summary":"Lookup Product","description":"Retrieve product information for any product URL.\n\nReturns the same Product model as GET /v1/products/{product_id}.\nThe product_id in the response can be used with the Product Detail endpoint.\nProducts from merchants outside the Channel3 catalog resolve for display\npurposes, but are not available to other endpoints (e.g. /v1/similar,\nprice tracking).","operationId":"lookup_product_v1_lookup_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"x-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response.","title":"X-User-Id"},"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LookupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LookupResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"URL is not a product page (e.g. category listing, search results, homepage) or is on an explicitly disallowed domain","content":{"application/json":{"example":{"detail":"URL is not a product page"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Unable to extract product data from the given URL","content":{"application/json":{"example":{"detail":"Product extraction failed"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Product not found","content":{"application/json":{"example":{"detail":"Product not found"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"504":{"description":"Timeout","content":{"application/json":{"example":{"detail":"Request timed out"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/monetize":{"post":{"tags":["v1"],"summary":"Monetize URL","description":"Return monetizable offers (with max commission rate) for a product URL.\n\nAccess to this endpoint is restricted. If you think your use-case requires it, please contact us. Usually, developers actually want search. This is helpful for migrating to Channel3.","operationId":"monetize_url_v1_monetize_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"x-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response.","title":"X-User-Id"},"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonetizeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonetizeResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"403":{"description":"Monetize access not enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"504":{"description":"Timeout","content":{"application/json":{"example":{"detail":"Request timed out"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}},"x-hidden":true}},"/v1/reporting/clicks":{"get":{"tags":["v1"],"summary":"List Clicks","description":"List clicks for your account over a datetime window.\n\nDefaults to the last 30 days ending now. Maximum window is 90 days.\nPass an offset-aware ISO datetime to express local time (e.g. last 6 hours).\nReturns a summary plus a paginated list of click events (most recent first).","operationId":"list_clicks_v1_reporting_clicks_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Inclusive start of the window (ISO 8601 datetime with optional offset, e.g. 2026-08-01T00:00:00-04:00). Offset-aware values are converted to UTC; naive values are treated as UTC.","title":"Start Date"},"description":"Inclusive start of the window (ISO 8601 datetime with optional offset, e.g. 2026-08-01T00:00:00-04:00). Offset-aware values are converted to UTC; naive values are treated as UTC."},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Inclusive end of the window (ISO 8601 datetime with optional offset, e.g. 2026-08-01T23:59:59-04:00). Offset-aware values are converted to UTC; naive values are treated as UTC.","title":"End Date"},"description":"Inclusive end of the window (ISO 8601 datetime with optional offset, e.g. 2026-08-01T23:59:59-04:00). Offset-aware values are converted to UTC; naive values are treated as UTC."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed).","default":1,"title":"Page"},"description":"Page number (1-indexed)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (max 100).","default":20,"title":"Limit"},"description":"Items per page (max 100)."},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter results to clicks or transactions for this user.","title":"User Id"},"description":"Filter results to clicks or transactions for this user."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClicksResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"400":{"description":"Invalid date range","content":{"application/json":{"example":{"detail":"Date range cannot exceed 90 days"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/reporting/transactions":{"get":{"tags":["v1"],"summary":"List Transactions","description":"List transactions for your account over a datetime window.\n\nDefaults to the last 30 days ending now. Maximum window is 90 days.\nPass an offset-aware ISO datetime to express local time (e.g. last 6 hours).\nReturns a summary of net commission (after take rate) plus a paginated list\nof transactions (most recent first). Network-approved commissions appear as\npending.","operationId":"list_transactions_v1_reporting_transactions_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Inclusive start of the window (ISO 8601 datetime with optional offset, e.g. 2026-08-01T00:00:00-04:00). Offset-aware values are converted to UTC; naive values are treated as UTC.","title":"Start Date"},"description":"Inclusive start of the window (ISO 8601 datetime with optional offset, e.g. 2026-08-01T00:00:00-04:00). Offset-aware values are converted to UTC; naive values are treated as UTC."},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Inclusive end of the window (ISO 8601 datetime with optional offset, e.g. 2026-08-01T23:59:59-04:00). Offset-aware values are converted to UTC; naive values are treated as UTC.","title":"End Date"},"description":"Inclusive end of the window (ISO 8601 datetime with optional offset, e.g. 2026-08-01T23:59:59-04:00). Offset-aware values are converted to UTC; naive values are treated as UTC."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed).","default":1,"title":"Page"},"description":"Page number (1-indexed)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page (max 100).","default":20,"title":"Limit"},"description":"Items per page (max 100)."},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter results to clicks or transactions for this user.","title":"User Id"},"description":"Filter results to clicks or transactions for this user."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionsResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"400":{"description":"Invalid date range","content":{"application/json":{"example":{"detail":"Date range cannot exceed 90 days"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/categories/search":{"get":{"tags":["v1"],"summary":"Search Categories","description":"Search categories by keyword match and semantic similarity.","operationId":"search_categories_public_v1_categories_search_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"Free-text query (e.g. 'sofas', 'yoga mats').","title":"Query"},"description":"Free-text query (e.g. 'sofas', 'yoga mats')."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Maximum number of categories to return.","default":5,"title":"Limit"},"description":"Maximum number of categories to return."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchCategoriesResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/categories":{"get":{"tags":["v1"],"summary":"List Categories","description":"Paginated list of all categories.","operationId":"list_categories_public_v1_categories_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"roots_only","in":"query","required":false,"schema":{"type":"boolean","description":"If true, return only top-level (root) categories.","default":false,"title":"Roots Only"},"description":"If true, return only top-level (root) categories."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"1-indexed page number.","default":1,"title":"Page"},"description":"1-indexed page number."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page.","default":20,"title":"Page Size"},"description":"Items per page."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedListCategoriesResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/categories/{slug}":{"get":{"tags":["v1"],"summary":"Category Detail","description":"Look up a category by slug.","operationId":"get_category_public_v1_categories__slug__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Category not found","content":{"application/json":{"example":{"detail":"No category found matching 'foo'"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/brands/search":{"get":{"tags":["v1"],"summary":"Search Brands","description":"Search brands by free-text query, optionally within categories.\n\nCategory filtering matches within each category's top 1,000 brands.","operationId":"search_brands_public_v1_brands_search_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"Free-text query (e.g. 'Nike', 'lululemon').","title":"Query"},"description":"Free-text query (e.g. 'Nike', 'lululemon')."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Maximum number of brands to return.","default":5,"title":"Limit"},"description":"Maximum number of brands to return."},{"name":"category_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"If provided, only brands selling in these categories will be matched. Accepts category slugs. Categories that do not exist, or that are not available for search, are rejected with a 422.","title":"Category Ids"},"description":"If provided, only brands selling in these categories will be matched. Accepts category slugs. Categories that do not exist, or that are not available for search, are rejected with a 422."},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CountryCode"},{"type":"null"}],"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset.","title":"Country"},"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchBrandsResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/brands":{"get":{"tags":["v1"],"summary":"List Brands","description":"Paginated list of brands, capped at the top 5,000.\n\nWith `category_ids`, lists the brands selling those categories — best\nfirst, each category contributing at most its top 1,000.","operationId":"list_brands_public_v1_brands_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max items per page (1-100).","default":20,"title":"Limit"},"description":"Max items per page (1-100)."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor returned by a prior call. Omit for the first page.","title":"Cursor"},"description":"Pagination cursor returned by a prior call. Omit for the first page."},{"name":"category_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"If provided, only brands selling in these categories will be returned. Accepts category slugs. Categories that do not exist, or that are not available for search, are rejected with a 422.","title":"Category Ids"},"description":"If provided, only brands selling in these categories will be returned. Accepts category slugs. Categories that do not exist, or that are not available for search, are rejected with a 422."},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CountryCode"},{"type":"null"}],"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset.","title":"Country"},"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedListBrandsResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/brands/{brand_id}":{"get":{"tags":["v1"],"summary":"Brand Detail","description":"Get detailed information about a specific brand by its ID.","operationId":"get_brand_detail_public_v1_brands__brand_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"brand_id","in":"path","required":true,"schema":{"type":"string","title":"Brand Id"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CountryCode"},{"type":"null"}],"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset.","title":"Country"},"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brand"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Brand not found","content":{"application/json":{"example":{"detail":"Brand not found"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/websites/search":{"get":{"tags":["v1"],"summary":"Search Websites","description":"Search websites by retailer name or domain, optionally within categories.\n\nCategory filtering matches within each category's top 1,000 websites.","operationId":"search_websites_public_v1_websites_search_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"Free-text query (e.g. 'Nordstrom', 'nike.com').","title":"Query"},"description":"Free-text query (e.g. 'Nordstrom', 'nike.com')."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Maximum number of websites to return.","default":5,"title":"Limit"},"description":"Maximum number of websites to return."},{"name":"category_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"If provided, only websites selling in these categories will be matched. Accepts category slugs. Categories that do not exist, or that are not available for search, are rejected with a 422.","title":"Category Ids"},"description":"If provided, only websites selling in these categories will be matched. Accepts category slugs. Categories that do not exist, or that are not available for search, are rejected with a 422."},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CountryCode"},{"type":"null"}],"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset.","title":"Country"},"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchWebsitesResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/websites":{"get":{"tags":["v1"],"summary":"List Websites","description":"Paginated list of websites, capped at the top 5,000.\n\nWith `category_ids`, lists the websites selling those categories — best\nfirst, each category contributing at most its top 1,000.","operationId":"list_websites_public_v1_websites_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max items per page (1-100).","default":20,"title":"Limit"},"description":"Max items per page (1-100)."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor returned by a prior call. Omit for the first page.","title":"Cursor"},"description":"Pagination cursor returned by a prior call. Omit for the first page."},{"name":"category_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"If provided, only websites selling in these categories will be returned. Accepts category slugs. Categories that do not exist, or that are not available for search, are rejected with a 422.","title":"Category Ids"},"description":"If provided, only websites selling in these categories will be returned. Accepts category slugs. Categories that do not exist, or that are not available for search, are rejected with a 422."},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CountryCode"},{"type":"null"}],"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset.","title":"Country"},"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedListWebsitesResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/websites/{website_id}":{"get":{"tags":["v1"],"summary":"Website Detail","description":"Get detailed information about a specific website by its ID or domain.","operationId":"get_website_detail_public_v1_websites__website_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"website_id","in":"path","required":true,"schema":{"type":"string","title":"Website Id"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CountryCode"},{"type":"null"}],"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset.","title":"Country"},"description":"ISO 3166-1 alpha-2 country code that `best_commission_rate` is scoped to. Defaults to 'US' when unset."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Website"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Website not found","content":{"application/json":{"example":{"detail":"Website not found"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/conversations":{"post":{"tags":["v1"],"summary":"Create Turn","description":"Run one conversation turn. Omit `conversation_id` to create the thread with this turn; pass it to continue an existing thread.","operationId":"create_turn_v1_conversations_post","security":[{"APIKeyHeader":[]},{"Bearer":[]}],"parameters":[{"name":"x-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response.","title":"X-User-Id"},"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTurnRequest"}}}},"responses":{"200":{"description":"`text/event-stream` of `TurnEvent` objects (one `data:` JSON frame each), terminated by `data: [DONE]`. With `stream: false`, a buffered `TurnResult` JSON body instead.","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/TurnEvent"}},"application/json":{"schema":{"$ref":"#/components/schemas/TurnResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"422":{"description":"Request validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"404":{"description":"Conversation not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"409":{"description":"Turn already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"503":{"description":"All model providers unavailable; retryable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}}}}},"/v1/conversations/client_tokens":{"post":{"tags":["v1"],"summary":"Create Client Token","description":"Mint a short-lived, browser-safe token. With ``conversation_id`` the token continues and reads that thread; without it, the token's first turn creates the thread and binds the token to it.","operationId":"create_client_token_v1_conversations_client_tokens_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateClientTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientTokenResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}}}}},"422":{"description":"Request validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"503":{"description":"Client token service temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/conversations/client_tokens/revoke":{"post":{"tags":["v1"],"summary":"Revoke Client Token","description":"Revoke a client token immediately. The token travels in the request body, not the URL, so it stays out of access logs; only the minting vendor can revoke it.","operationId":"revoke_client_token_route_v1_conversations_client_tokens_revoke_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeClientTokenRequest"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}}}}},"422":{"description":"Request validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"503":{"description":"Client token service temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/conversations/{conversation_id}":{"get":{"tags":["v1"],"summary":"Get Conversation","description":"Thread metadata plus one page of its message history. Paginate `items` with `limit` and `cursor`.","operationId":"get_conversation_v1_conversations__conversation_id__get","security":[{"APIKeyHeader":[]},{"Bearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Request validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"400":{"description":"Invalid cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"404":{"description":"Conversation not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}}}}},"/v1/collections":{"post":{"tags":["collections"],"summary":"Create Collection","description":"Create a collection. Clauses are optional so an empty collection can be curated later.\n\nInvalid brand_ids, category_ids, or website_ids return 422.","operationId":"create_collection_v1_collections_post","security":[{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCollectionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation error or invalid brand_ids / category_ids / website_ids","content":{"application/json":{"example":{"detail":"Collection was not created. Invalid brand_ids: 'brand_nike_abc123'"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}},"get":{"tags":["collections"],"summary":"List Collections","description":"List collections, optionally filtered to one partner user.","operationId":"list_collections_v1_collections_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional partner user id. When provided, returns only that user's collections. When omitted, returns all collections for this API key.","title":"User Id"},"description":"Optional partner user id. When provided, returns only that user's collections. When omitted, returns all collections for this API key."},{"name":"page_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque token from a previous list response.","title":"Page Token"},"description":"Opaque token from a previous list response."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCollectionsResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/collections/{collection_id}":{"get":{"tags":["collections"],"summary":"Get Collection","description":"Get a collection. Merged brand ids are rewritten to the surviving brand.","operationId":"get_collection_v1_collections__collection_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"collection_id","in":"path","required":true,"schema":{"type":"string","title":"Collection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"example":{"detail":"Collection not found"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}},"patch":{"tags":["collections"],"summary":"Patch Collection","description":"Rename a collection and/or add, replace, or remove clauses by id.","operationId":"patch_collection_v1_collections__collection_id__patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"collection_id","in":"path","required":true,"schema":{"type":"string","title":"Collection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchCollectionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation error or invalid brand_ids / category_ids / website_ids","content":{"application/json":{"example":{"detail":"Collection was not created. Invalid brand_ids: 'brand_nike_abc123'"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"example":{"detail":"Collection not found"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}},"delete":{"tags":["collections"],"summary":"Delete Collection","description":"Delete a collection.","operationId":"delete_collection_v1_collections__collection_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"collection_id","in":"path","required":true,"schema":{"type":"string","title":"Collection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"example":{"detail":"Collection not found"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/experimental/find-products-in-image":{"post":{"tags":["v1"],"summary":"Find products in an image","description":"Name objects in a scene image, localize them, and search the catalog per crop.\n\nCharges 1 credit for the call plus 1 credit per detected thing. ``filters``\napply to every per-thing search. ``limit`` is per thing, not across the\nwhole response.","operationId":"find_products_in_image_experimental_find_products_in_image_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"x-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response.","title":"X-User-Id"},"description":"Optional user identifier to attribute clicks and sales to a user in your system. Channel3 appends it to buy URLs in the response."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindProductsInImageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindProductsInImageResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"example":{"detail":"You have used all of your free credits. Add a payment method to continue."},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"example":{"detail":"Must provide exactly one of image_url or base64_image."},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"502":{"description":"Upstream detection failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"504":{"description":"Timed out fetching the image or detecting objects in it","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}},"x-fern-availability":{"status":"alpha","message":"Billed at 1 credit per call plus 1 credit per detected thing. Subject to change."}}},"/experimental/sticker":{"post":{"tags":["v1"],"summary":"Get a product sticker","description":"Cut a catalog product's best image into a transparent-background sticker.\n\nTakes a product page ``url`` or a ``product_id`` for a product already in\nthe Channel3 catalog. Charges 1 credit per call.","operationId":"get_sticker_experimental_sticker_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StickerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StickerResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}}}}},"402":{"description":"Payment required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"422":{"description":"The product's images cannot be cut into a sticker","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"example":{"detail":"Internal Server Error"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"404":{"description":"The product is not in the Channel3 catalog","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}},"503":{"description":"The sticker renderer is unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__error_responses__ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}],"x-fern-availability":{"status":"alpha","message":"Billed at 1 credit per call. Subject to change."}}},"/v0/price-tracking/start":{"post":{"tags":["price-tracking"],"summary":"Start Tracking","description":"Start tracking prices for a canonical product.","operationId":"start_tracking_v0_price_tracking_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartTrackingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}}}}},"402":{"description":"Payment required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"example":{"detail":"Internal Server Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"example":{"detail":"Canonical product xyz123 not found"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v0/price-tracking/stop":{"post":{"tags":["price-tracking"],"summary":"Stop Tracking","description":"Stop tracking prices for a canonical product.","operationId":"stop_tracking_v0_price_tracking_stop_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StopTrackingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}}}}},"402":{"description":"Payment required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"example":{"detail":"Internal Server Error"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"},"example":{"detail":"No active subscription for canonical product xyz123"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v0/price-tracking/history/{canonical_product_id}":{"get":{"tags":["price-tracking"],"summary":"Get Price History","description":"Get price history for a canonical product.","operationId":"get_price_history_v0_price_tracking_history__canonical_product_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"canonical_product_id","in":"path","required":true,"schema":{"type":"string","title":"Canonical Product Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"Number of days of history to fetch (default 90, max 90)","default":90,"title":"Days"},"description":"Number of days of history to fetch (default 90, max 90)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceHistoryResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"example":{"detail":"Canonical product xyz123 not found"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v0/price-tracking/subscriptions":{"get":{"tags":["price-tracking"],"summary":"List Subscriptions","description":"List your active price tracking subscriptions.","operationId":"list_subscriptions_v0_price_tracking_subscriptions_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor","title":"Cursor"},"description":"Pagination cursor"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results (1-100)","default":20,"title":"Limit"},"description":"Max results (1-100)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSubscriptionsResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/product-subscriptions":{"post":{"tags":["product-subscriptions"],"summary":"Create Product Subscription","description":"Subscribe to a canonical product's offer events; an identical active subscription returns the existing one. A selection that picks another product (e.g. another color) subscribes to that product, returned as `product_id`.","operationId":"create_product_subscription_v1_product_subscriptions_post","security":[{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProductSubscriptionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductSubscriptionResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Invalid event types, domains, or selection","content":{"application/json":{"examples":{"invalid_domain":{"summary":"Invalid domain","value":{"detail":"Invalid domain: 'nike'. Pass bare domains like 'nike.com'."}},"invalid_selection":{"summary":"Value not offered for the product","value":{"detail":"'XXL' is not a value of option 'Size'; values: ['S', 'M', 'L', 'XL']"}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"example":{"detail":"Canonical product cp_123 not found"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}},"get":{"tags":["product-subscriptions"],"summary":"List Product Subscriptions","description":"List your product subscriptions by status.","operationId":"list_product_subscriptions_v1_product_subscriptions_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ProductSubscriptionStatus","description":"Filter by status (\"active\" or \"cancelled\", default \"active\")","default":"active"},"description":"Filter by status (\"active\" or \"cancelled\", default \"active\")"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor","title":"Cursor"},"description":"Pagination cursor"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results (1-100)","default":20,"title":"Limit"},"description":"Max results (1-100)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProductSubscriptionsResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/v1/product-subscriptions/{subscription_id}":{"get":{"tags":["product-subscriptions"],"summary":"Get Product Subscription","description":"Get one of your product subscriptions.","operationId":"get_product_subscription_v1_product_subscriptions__subscription_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductSubscriptionResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"example":{"detail":"Subscription not found"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}},"delete":{"tags":["product-subscriptions"],"summary":"Cancel Product Subscription","description":"Cancel a product subscription. No events are sent for it after this returns.","operationId":"cancel_product_subscription_v1_product_subscriptions__subscription_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductSubscriptionResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication","content":{"application/json":{"examples":{"missing_key":{"summary":"Missing API Key","value":{"detail":"Unauthorized. Missing authentication key. Make sure to attach an x-api-key with your request. Need help? Reach out to support@trychannel3.com."}},"invalid_key":{"summary":"Invalid API Key","value":{"detail":"API key was provided but is invalid. Need help? Reach out to support@trychannel3.com."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"402":{"description":"Payment required","content":{"application/json":{"examples":{"credits_exhausted":{"summary":"API key out of credits","value":{"detail":"You have used all of your free credits. Add a payment method to continue."}},"mpp_challenge":{"summary":"MPP Tempo payment required","value":{"detail":"Payment required. Satisfy the MPP Tempo challenge in WWW-Authenticate."}}},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"example":{"detail":[{"loc":["body","query"],"msg":"field required","type":"value_error.missing"}]},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"detail":"Internal Server Error"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"example":{"detail":"Subscription not found"},"schema":{"$ref":"#/components/schemas/app__routers__utils__ErrorResponse"}}}}}}},"/stripe-projects/provisioning/health":{"get":{"tags":["stripe-projects"],"summary":"Health","operationId":"health_stripe_projects_provisioning_health_get","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Health Stripe Projects Provisioning Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stripe-projects/provisioning/services":{"get":{"tags":["stripe-projects"],"summary":"List Services","operationId":"list_services_stripe_projects_provisioning_services_get","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Services Stripe Projects Provisioning Services Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stripe-projects/provisioning/account_requests":{"post":{"tags":["stripe-projects"],"summary":"Account Requests","operationId":"account_requests_stripe_projects_provisioning_account_requests_post","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Account Requests Stripe Projects Provisioning Account Requests Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stripe-projects/provisioning/resources":{"post":{"tags":["stripe-projects"],"summary":"Provision Resource","operationId":"provision_resource_stripe_projects_provisioning_resources_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Provision Resource Stripe Projects Provisioning Resources Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stripe-projects/provisioning/resources/{resource_id}":{"get":{"tags":["stripe-projects"],"summary":"Get Resource","operationId":"get_resource_stripe_projects_provisioning_resources__resource_id__get","parameters":[{"name":"resource_id","in":"path","required":true,"schema":{"type":"string","title":"Resource Id"}},{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Resource Stripe Projects Provisioning Resources  Resource Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stripe-projects/provisioning/resources/{resource_id}/update_service":{"post":{"tags":["stripe-projects"],"summary":"Update Resource","operationId":"update_resource_stripe_projects_provisioning_resources__resource_id__update_service_post","parameters":[{"name":"resource_id","in":"path","required":true,"schema":{"type":"string","title":"Resource Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}},{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Resource Stripe Projects Provisioning Resources  Resource Id  Update Service Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stripe-projects/provisioning/resources/{resource_id}/remove":{"post":{"tags":["stripe-projects"],"summary":"Remove Resource","operationId":"remove_resource_stripe_projects_provisioning_resources__resource_id__remove_post","parameters":[{"name":"resource_id","in":"path","required":true,"schema":{"type":"string","title":"Resource Id"}},{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Resource Stripe Projects Provisioning Resources  Resource Id  Remove Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stripe-projects/provisioning/resources/{resource_id}/rotate_credentials":{"post":{"tags":["stripe-projects"],"summary":"Rotate Credentials","operationId":"rotate_credentials_stripe_projects_provisioning_resources__resource_id__rotate_credentials_post","parameters":[{"name":"resource_id","in":"path","required":true,"schema":{"type":"string","title":"Resource Id"}},{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rotate Credentials Stripe Projects Provisioning Resources  Resource Id  Rotate Credentials Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stripe-projects/provisioning/deep_links":{"post":{"tags":["stripe-projects"],"summary":"Create Deep Link","operationId":"create_deep_link_stripe_projects_provisioning_deep_links_post","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api-Version"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Deep Link Stripe Projects Provisioning Deep Links Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/ucp":{"get":{"tags":["ucp-well-known"],"summary":"Channel3 UCP catalog profile","description":"Return the catalog UCP profile.","operationId":"get_ucp_profile__well_known_ucp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/ucp/{version}":{"get":{"tags":["ucp-well-known"],"summary":"Channel3 UCP catalog profile (versioned)","description":"Return the catalog UCP profile for a specific protocol version.","operationId":"get_ucp_profile_version__well_known_ucp__version__get","parameters":[{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ucp/agent-profiles/{version}/buyer.json":{"get":{"tags":["ucp-profile"],"summary":"Channel3 buyer agent UCP profile","description":"Return the buyer agent profile for outbound merchant negotiation.","operationId":"get_buyer_agent_profile_ucp_agent_profiles__version__buyer_json_get","parameters":[{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"webhooks":{"price.changed":{"post":{"summary":"Price Changed","description":"Triggered when the price changes for a product you're tracking.","operationId":"priceChanged","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceChangedEvent"}}},"required":true}}},"offer.price.changed":{"post":{"summary":"Offer Price Changed","description":"The offer's price changed (any `Price` field, including `compare_at_price`).","operationId":"offerPriceChanged","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferPriceChangedEvent"}}},"required":true}}},"offer.availability.changed":{"post":{"summary":"Offer Availability Changed","description":"The offer's availability flipped; for the pinned configuration when the subscription has a `selection`.","operationId":"offerAvailabilityChanged","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferAvailabilityChangedEvent"}}},"required":true}}},"offer.created":{"post":{"summary":"Offer Created","description":"An offer entered the subscription's view.","operationId":"offerCreated","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferCreatedEvent"}}},"required":true}}},"offer.deleted":{"post":{"summary":"Offer Deleted","description":"An offer left the subscription's view.","operationId":"offerDeleted","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferDeletedEvent"}}},"required":true}}}},"components":{"schemas":{"Age":{"type":"string","enum":["newborn","infant","toddler","kids","adult"],"title":"Age"},"ApiProductImageType":{"type":"string","enum":["hero","lifestyle","on_model","detail","scale_reference","angle_view","flat_lay","in_use","packaging","size_chart","product_information","merchant_information"],"title":"ApiProductImageType","description":"Product image type classification for API responses."},"AssistantMessage":{"properties":{"role":{"type":"string","const":"assistant","title":"Role","default":"assistant"},"parts":{"items":{"oneOf":[{"$ref":"#/components/schemas/TextPart"},{"$ref":"#/components/schemas/ToolPart"}],"discriminator":{"propertyName":"type","mapping":{"text":"#/components/schemas/TextPart","tool":"#/components/schemas/ToolPart"}}},"type":"array","title":"Parts"},"suggestions":{"items":{"type":"string"},"type":"array","title":"Suggestions","description":"Tap-ready follow-up messages offered after this reply."}},"type":"object","title":"AssistantMessage"},"BaseConfig":{"properties":{"language":{"anyOf":[{"$ref":"#/components/schemas/LanguageCode"},{"type":"null"}],"description":"ISO 639-1 language code. When unset, inferred from ``country`` (preferred) then ``currency``, defaulting to ``en``."},"country":{"anyOf":[{"$ref":"#/components/schemas/CountryCode"},{"type":"null"}],"description":"ISO 3166-1 alpha-2 country code. May stay unset for pan-region storefronts (e.g. ``currency=EUR`` with no specific country)."},"currency":{"anyOf":[{"$ref":"#/components/schemas/CurrencyCode"},{"type":"null"}],"description":"ISO 4217 currency code. When unset, inferred from ``country`` (e.g. ``GB`` → ``GBP``), defaulting to ``USD``."},"length_unit":{"anyOf":[{"$ref":"#/components/schemas/LengthUnit"},{"type":"null"}],"description":"Preferred unit for length dimensions (length/width/height) in responses. A request dimension filter's unit for the field takes precedence; when neither is set, the merchant's stated unit is returned."},"weight_unit":{"anyOf":[{"$ref":"#/components/schemas/WeightUnit"},{"type":"null"}],"description":"Preferred unit for weight dimensions in responses. A request dimension filter's weight unit takes precedence; when neither is set, the merchant's stated unit is returned."},"collection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collection Id","description":"Optional saved collection to scope this request. Clauses are ORed. Within a clause, brand/website/category lists are ORed inside each list and ANDed across lists. Request filters further narrow results but cannot widen the collection scope."},"offer_refresh_timeout_ms":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":2000.0},{"type":"null"}],"title":"Offer Refresh Timeout Ms","description":"Check each returned offer against the merchant's live site, waiting up to this many milliseconds (2000-10000). Offers whose page or variant is gone are dropped and offers found out of stock are returned as out of stock. Adds up to this much latency.","x-hidden":true}},"additionalProperties":false,"type":"object","title":"BaseConfig","description":"Shared request config: locale, optional collection scope, and optional\nreal-time offer refresh."},"Brand":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"best_commission_rate":{"type":"number","title":"Best Commission Rate","description":"The maximum commission rate for the brand in the requested country (default 'US'), as a percentage","default":0.0}},"type":"object","required":["id","name"],"title":"Brand"},"BrowseRequest":{"properties":{"filters":{"$ref":"#/components/schemas/SearchFilters","description":"Filters to browse by. At least one of `brand_ids`, `category_ids`, or `website_ids` must be provided, unless `config.collection_id` is set.","default":{"conditions":["new"],"availability":["InStock"]}},"limit":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Limit","description":"Optional limit on the number of results. Default is 20, max is 30.","default":20},"page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token","description":"Opaque token from a previous browse response to fetch the next page. Browsing is limited to 5 pages; `next_page_token` is null on the final page."},"config":{"$ref":"#/components/schemas/BaseConfig","description":"Optional configuration."}},"additionalProperties":false,"type":"object","title":"BrowseRequest","description":"Filter-driven product listing with pagination (no free-text query)."},"CatalogDisplayPayload":{"properties":{"products":{"items":{"$ref":"#/components/schemas/Product"},"type":"array","title":"Products"},"things":{"items":{"$ref":"#/components/schemas/CatalogThingGroup"},"type":"array","title":"Things"},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token"},"api_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Call Id"}},"additionalProperties":true,"type":"object","title":"CatalogDisplayPayload","description":"Client-facing catalog tool result shown on the stream and on ``ToolPart``."},"CatalogThingGroup":{"properties":{"thing":{"type":"string","title":"Thing"},"matches":{"items":{"$ref":"#/components/schemas/Product"},"type":"array","title":"Matches"}},"type":"object","required":["thing"],"title":"CatalogThingGroup","description":"One detected object from find-products-in-image and its catalog matches."},"CatalogToolError":{"properties":{"error":{"type":"string","title":"Error"},"is_error":{"type":"boolean","const":true,"title":"Is Error","default":true},"products":{"items":{"$ref":"#/components/schemas/Product"},"type":"array","title":"Products"}},"type":"object","required":["error"],"title":"CatalogToolError"},"Category":{"properties":{"slug":{"type":"string","title":"Slug","description":"URL-friendly slug (e.g. 'sofas')"},"title":{"type":"string","title":"Title","description":"Human-readable category title"},"path":{"items":{"$ref":"#/components/schemas/CategoryRef"},"type":"array","title":"Path","description":"Hierarchical path as a structured list, root first; the last entry is this category itself"},"has_children":{"type":"boolean","title":"Has Children","description":"Whether this category has subcategories"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Natural-language description of products in this category"},"children":{"items":{"$ref":"#/components/schemas/CategoryRef"},"type":"array","title":"Children","description":"Direct subcategories only (one level)"},"attributes":{"items":{"$ref":"#/components/schemas/CategoryAttribute"},"type":"array","title":"Attributes","description":"Structured attributes applicable to this category, with their allowed values. Usable as keys in `SearchFilters.attributes`. Includes the variant axes ('color', 'size', 'shoe-size') where the category defines them; those match against each offer's variant options."}},"type":"object","required":["slug","title","has_children"],"title":"Category","description":"Full category representation used in detail responses."},"CategoryAttribute":{"properties":{"slug":{"type":"string","title":"Slug","description":"URL-friendly identifier (e.g. 'color', 'frame-color')"},"name":{"type":"string","title":"Name","description":"Human-readable attribute name (e.g. 'Color')"},"values":{"items":{"type":"string"},"type":"array","title":"Values","description":"Allowed values for this attribute. May be empty when no enumerated value set is defined."}},"type":"object","required":["slug","name"],"title":"CategoryAttribute","description":"A structured attribute (e.g. Color, Size) applicable to a category."},"CategoryRef":{"properties":{"slug":{"type":"string","title":"Slug","description":"URL-friendly slug (e.g. 'sofas')"},"title":{"type":"string","title":"Title","description":"Human-readable category title"}},"type":"object","required":["slug","title"],"title":"CategoryRef","description":"Lean reference to a category, used in path and children arrays."},"CategorySummary":{"properties":{"slug":{"type":"string","title":"Slug","description":"URL-friendly slug (e.g. 'sofas')"},"title":{"type":"string","title":"Title","description":"Human-readable category title"},"path":{"items":{"$ref":"#/components/schemas/CategoryRef"},"type":"array","title":"Path","description":"Hierarchical path as a structured list, root first; the last entry is this category itself"},"has_children":{"type":"boolean","title":"Has Children","description":"Whether this category has subcategories"}},"type":"object","required":["slug","title","has_children"],"title":"CategorySummary","description":"Lean category representation used in search hits and list rows."},"Click":{"properties":{"id":{"type":"string","title":"Id","description":"Click event ID."},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"When the click occurred, returned with a UTC offset (Z)."},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"Partner-supplied user identifier from the buy URL, if provided."},"product":{"anyOf":[{"$ref":"#/components/schemas/ReportingProduct"},{"type":"null"}],"description":"Matched product, if known."},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City","description":"Click city, if available."},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Click country, if available."}},"type":"object","required":["id","timestamp"],"title":"Click","description":"A single click event."},"ClicksResponse":{"properties":{"summary":{"$ref":"#/components/schemas/ClicksSummary"},"items":{"items":{"$ref":"#/components/schemas/Click"},"type":"array","title":"Items"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)."},"limit":{"type":"integer","title":"Limit","description":"Page size."},"total_count":{"type":"integer","title":"Total Count","description":"Total matching clicks in the date range."},"has_more":{"type":"boolean","title":"Has More","description":"Whether more pages are available."},"start_date":{"type":"string","format":"date-time","title":"Start Date","description":"Inclusive start of the resolved query window."},"end_date":{"type":"string","format":"date-time","title":"End Date","description":"Inclusive end of the resolved query window."}},"type":"object","required":["summary","items","page","limit","total_count","has_more","start_date","end_date"],"title":"ClicksResponse","description":"Paginated clicks for a vendor over a date range."},"ClicksSummary":{"properties":{"total_clicks":{"type":"integer","title":"Total Clicks","description":"Total clicks in the date range."}},"type":"object","required":["total_clicks"],"title":"ClicksSummary","description":"Aggregate click stats for the requested date range."},"ClientTokenResponse":{"properties":{"token":{"type":"string","title":"Token"},"token_id":{"type":"string","title":"Token Id"},"expires_at":{"type":"integer","title":"Expires At"},"token_type":{"type":"string","const":"Bearer","title":"Token Type","default":"Bearer"}},"type":"object","required":["token","token_id","expires_at"],"title":"ClientTokenResponse"},"CollectionClause":{"properties":{"brand_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Brand Ids","description":"OR within this list (any slot). AND with the clause's other lists. OR against other clauses."},"website_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Website Ids","description":"Merchant ids; OR within this list (any matching offer). AND with the clause's other lists. Domains are accepted on write and stored as merchant ids."},"category_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Category Ids","description":"OR within this list. AND with the clause's other lists."},"product_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Product Ids"},"clause_id":{"type":"string","title":"Clause Id"}},"additionalProperties":false,"type":"object","required":["clause_id"],"title":"CollectionClause","description":"Persisted clause with a stable server-minted id."},"CollectionClauseInput":{"properties":{"brand_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Brand Ids","description":"OR within this list (any slot). AND with the clause's other lists. OR against other clauses."},"website_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Website Ids","description":"Merchant ids; OR within this list (any matching offer). AND with the clause's other lists. Domains are accepted on write and stored as merchant ids."},"category_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Category Ids","description":"OR within this list. AND with the clause's other lists."},"product_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Product Ids"}},"additionalProperties":false,"type":"object","title":"CollectionClauseInput","description":"Clause payload for create / add_clauses (server mints clause_id)."},"CollectionResponse":{"properties":{"collection_id":{"type":"string","title":"Collection Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"clauses":{"items":{"$ref":"#/components/schemas/CollectionClause"},"type":"array","title":"Clauses"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["collection_id","name","clauses","created_at","updated_at"],"title":"CollectionResponse"},"ColorMatch":{"type":"string","enum":["strict","standard","loose"],"title":"ColorMatch","description":"How tightly a product's colors must match the requested palette."},"Condition":{"type":"string","enum":["new","used"],"title":"Condition","description":"Offer condition. 'refurbished' is deprecated: rejected as a filter value,\ncoerced to None on responses."},"ConversationContext":{"properties":{"user_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Context","description":"Who the conversation is with (profile, preferences, session facts)."},"application_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Application Context","description":"What platform or surface is hosting this conversation."}},"type":"object","title":"ConversationContext","description":"Partner-supplied context pinned to the top of a conversation thread."},"ConversationDetail":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"integer","title":"Created At"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"context":{"anyOf":[{"$ref":"#/components/schemas/ConversationContext"},{"type":"null"}]},"items":{"items":{"oneOf":[{"$ref":"#/components/schemas/UserMessage"},{"$ref":"#/components/schemas/AssistantMessage"}],"discriminator":{"propertyName":"role","mapping":{"assistant":"#/components/schemas/AssistantMessage","user":"#/components/schemas/UserMessage"}}},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Pass as ``cursor`` to fetch the next page. Null when no more items."},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["id","created_at","items"],"title":"ConversationDetail","description":"Thread metadata plus one page of its message history."},"CountryCode":{"type":"string","enum":["US","GB","EU","AU","CA","IE","DE","AT","FR","BE","IT","ES","NL","SE","FI","PT","CZ","GR","RO","CH","PL"],"title":"CountryCode","description":"ISO 3166-1 alpha-2 country code (plus the pan-region ``EU``)."},"CreateClientTokenRequest":{"properties":{"conversation_id":{"anyOf":[{"type":"string","maxLength":256,"minLength":1},{"type":"null"}],"title":"Conversation Id"},"ttl_seconds":{"type":"integer","maximum":7200.0,"minimum":60.0,"title":"Ttl Seconds","default":1800}},"type":"object","title":"CreateClientTokenRequest"},"CreateCollectionRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Display name. Defaults to 'Collection {n}' for this account or user."},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Optional vendor-facing notes for this collection."},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"Optional partner user id. Scopes the collection to one end user and serves as the default x-user-id on collection-scoped search, browse, and conversation requests when the caller omits that header."},"clauses":{"items":{"$ref":"#/components/schemas/CollectionClauseInput"},"type":"array","title":"Clauses","description":"OR across clauses. Within a clause, brand_ids, website_ids, and category_ids are ORed inside each list and ANDed across lists. Empty is allowed so a collection can be created before any items are added."}},"additionalProperties":false,"type":"object","title":"CreateCollectionRequest"},"CreateProductSubscriptionRequest":{"properties":{"product_id":{"type":"string","title":"Product Id","description":"Canonical product ID, as returned by /v1/products or /v1/lookup. Lookup IDs are canonicalized automatically. When `selection` picks another product (e.g. another color), the subscription is created on that product"},"events":{"items":{"type":"string","enum":["offer.price.changed","offer.availability.changed","offer.created","offer.deleted"]},"type":"array","minItems":1,"title":"Events","description":"Offer event types to receive."},"domains":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Domains","description":"Restrict events to offers on these merchant domains (e.g. nike.com, max 25). Omitted = every offer."},"selection":{"anyOf":[{"items":{"$ref":"#/components/schemas/SelectedOption"},"type":"array","minItems":1},{"type":"null"}],"title":"Selection","description":"Pin the subscription to one variant configuration: {name, label} pairs from `variants.selected` or `variants.options` on the product detail response; `variants.selected` can be passed as is. A value that is its own product (e.g. another color) subscribes you to that product, and the response's `product_id` is that product."}},"type":"object","required":["product_id","events"],"title":"CreateProductSubscriptionRequest","description":"What to subscribe to: a canonical product's offer events, optionally narrowed by merchant domains and a variant selection."},"CreateTurnRequest":{"properties":{"message":{"$ref":"#/components/schemas/UserMessage"},"conversation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Id","description":"Existing thread to continue. When omitted, a new thread is created and its id returned."},"filters":{"anyOf":[{"$ref":"#/components/schemas/SearchFilters"},{"type":"null"}],"description":"Pinned catalog filters applied to every product search in this turn."},"config":{"$ref":"#/components/schemas/SearchConfig","description":"Optional search configuration."},"context":{"anyOf":[{"$ref":"#/components/schemas/ConversationContext"},{"type":"null"}]},"stream":{"type":"boolean","title":"Stream","description":"Stream turn events over SSE (default) or return the assembled turn as JSON.","default":true}},"type":"object","required":["message"],"title":"CreateTurnRequest","description":"Run one turn. Without ``conversation_id`` a new thread is created first."},"CurrencyCode":{"type":"string","enum":["USD","CAD","AUD","GBP","EUR","SEK","CZK","RON","CHF","PLN"],"title":"CurrencyCode","description":"ISO 4217 currency code."},"DetectedThing":{"properties":{"thing":{"type":"string","title":"Thing","description":"Visual noun used for detection, e.g. 'desk'."},"bbox":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Bbox","description":"Axis-aligned box [x1, y1, x2, y2] in `image_size` pixels."},"category_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Category Ids","description":"Category slugs applied to this thing's catalog search. Same values as `filters.category_ids` on `/v1/search`."},"gender":{"anyOf":[{"$ref":"#/components/schemas/Gender"},{"type":"null"}],"description":"Gender filter applied to this thing's catalog search, same values as `filters.gender` on `/v1/search`. Taken from the visual noun's wearer when present."},"matches":{"items":{"$ref":"#/components/schemas/Product"},"type":"array","title":"Matches","description":"Catalog matches for this thing, descending score."},"masks":{"anyOf":[{"items":{"$ref":"#/components/schemas/ThingMask"},"type":"array"},{"type":"null"}],"title":"Masks","description":"With `return_masks`: one mask per physical object, several when the thing is a pair (e.g. two shoes)."}},"type":"object","required":["thing"],"title":"DetectedThing"},"Dimensions":{"properties":{"length":{"anyOf":[{"$ref":"#/components/schemas/LengthDimension"},{"type":"null"}]},"width":{"anyOf":[{"$ref":"#/components/schemas/LengthDimension"},{"type":"null"}]},"height":{"anyOf":[{"$ref":"#/components/schemas/LengthDimension"},{"type":"null"}]},"weight":{"anyOf":[{"$ref":"#/components/schemas/WeightDimension"},{"type":"null"}]}},"type":"object","title":"Dimensions","description":"Physical dimensions of a product offer. Members are null when unknown.\n\nValues are standardized to the supported unit set; a merchant-stated value\nwhose unit is not one of those units is omitted rather than shown."},"FindProductsInImageRequest":{"properties":{"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Publicly accessible URL of the image."},"base64_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base64 Image","description":"Base64 encoded image bytes (no data URI prefix)."},"limit":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Limit","description":"Max catalog matches per detected thing.","default":10},"filters":{"$ref":"#/components/schemas/SearchFilters","description":"Applied identically to every per-thing catalog search."},"config":{"$ref":"#/components/schemas/BaseConfig","description":"Locale and optional collection scope."},"max_things":{"type":"integer","maximum":6.0,"minimum":1.0,"title":"Max Things","description":"Cap on named objects to detect and search.","default":6},"return_masks":{"type":"boolean","title":"Return Masks","description":"Include each thing's segmentation mask in `masks`. `masks` is null when the detector produced no mask for a thing.","default":false}},"additionalProperties":false,"type":"object","title":"FindProductsInImageRequest","description":"Find purchasable products in a scene image, grouped by detected thing."},"FindProductsInImageResponse":{"properties":{"things":{"items":{"$ref":"#/components/schemas/DetectedThing"},"type":"array","title":"Things"},"image_size":{"items":{"type":"integer"},"type":"array","title":"Image Size","description":"[width, height] of the image the boxes are relative to."}},"type":"object","required":["things","image_size"],"title":"FindProductsInImageResponse"},"Gender":{"type":"string","enum":["male","female"],"title":"Gender","description":"Product gender. 'unisex' is deprecated: coerced to None on input, never emitted."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImagePart":{"properties":{"type":{"type":"string","const":"image","title":"Type","default":"image"},"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"ImagePart","description":"An image by URL. ``data:`` URIs are uploaded and rewritten server-side."},"ImageSearchInput":{"properties":{"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"}},"type":"object","title":"ImageSearchInput"},"ImageSearchRequest":{"properties":{"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Publicly accessible URL of the image to search with."},"base64_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base64 Image","description":"Base64 encoded image bytes (no data URI prefix)."},"limit":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Limit","description":"Optional limit on the number of results. Default is 20, max is 30.","default":20},"filters":{"$ref":"#/components/schemas/SearchFilters","description":"Optional filters. Search will only consider products that match all of the filters.","default":{"conditions":["new"],"availability":["InStock"]}},"config":{"$ref":"#/components/schemas/BaseConfig","description":"Optional configuration."},"page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token","description":"Opaque token from a previous image-search response to fetch the next page of results."},"segment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment","description":"Image segmentation mode. None (default) disables segmentation. \"AUTO\" segments and crops the main product automatically. A custom string (e.g. \"shoe\", \"mug\") segments the specified object."}},"additionalProperties":false,"type":"object","title":"ImageSearchRequest","description":"Image-only search request."},"LanguageCode":{"type":"string","enum":["en","de","fr","it","es","nl","sv","fi","pt","cs","el","ro","pl"],"title":"LanguageCode","description":"ISO 639-1 language code."},"LengthDimension":{"properties":{"number":{"type":"number","title":"Number"},"unit":{"$ref":"#/components/schemas/LengthUnit","description":"The unit from the request's dimension filters when one was given (the value is converted to it); otherwise the unit the merchant stated."}},"type":"object","required":["number","unit"],"title":"LengthDimension","description":"A length measurement, in one of the supported length units."},"LengthUnit":{"type":"string","enum":["mm","cm","m","in","ft"],"title":"LengthUnit"},"LookupRequest":{"properties":{"url":{"type":"string","title":"Url","description":"The URL of the product to look up"},"max_staleness_hours":{"type":"integer","minimum":1.0,"title":"Max Staleness Hours","description":"Maximum age (in hours) of cached product data before forcing a fresh lookup. Defaults to 3 hours.","default":3},"realtime_fetch":{"type":"boolean","title":"Realtime Fetch","description":"Fetch the product page live when the URL is not in the Channel3 catalog or its data is older than max_staleness_hours. When false, only catalog products are returned: stale data is returned as-is, and URLs not in the catalog return 404.","default":true}},"additionalProperties":false,"type":"object","required":["url"],"title":"LookupRequest"},"LookupResponse":{"properties":{"product":{"$ref":"#/components/schemas/Product"}},"type":"object","required":["product"],"title":"LookupResponse","description":"Response from the /v1/lookup endpoint."},"MaskRle":{"properties":{"size":{"items":{"type":"integer"},"type":"array","title":"Size","description":"Mask resolution as [height, width]."},"counts":{"type":"string","title":"Counts","description":"Space-separated column-major run lengths alternating 0 and 1, starting with a 0-run."}},"type":"object","required":["size","counts"],"title":"MaskRle","description":"A binary mask as COCO uncompressed run-length encoding."},"MonetizeOffer":{"properties":{"url":{"type":"string","title":"Url","description":"buy.trychannel3.com deeplink. Clicks are tracked and routed through the highest-paying affiliate network for the merchant."},"domain":{"type":"string","title":"Domain","description":"Merchant domain, e.g. nordstrom.com"},"max_commission_rate":{"type":"number","title":"Max Commission Rate","description":"Maximum post-take-rate commission for the merchant, as a decimal (0.05 = 5%). 'Max' because the realized rate may be lower.","default":0.0}},"type":"object","required":["url","domain"],"title":"MonetizeOffer"},"MonetizeRequest":{"properties":{"url":{"type":"string","title":"Url","description":"The URL of the product to monetize"}},"additionalProperties":false,"type":"object","required":["url"],"title":"MonetizeRequest"},"MonetizeResponse":{"properties":{"offers":{"items":{"$ref":"#/components/schemas/MonetizeOffer"},"type":"array","title":"Offers","description":"Monetizable offers, sorted by max_commission_rate descending."}},"type":"object","title":"MonetizeResponse","description":"Response from the /v1/monetize endpoint — just the list of offers."},"OfferAvailabilityChangedData":{"properties":{"subscription_id":{"type":"string","title":"Subscription Id","description":"The subscription this event matched."},"subject":{"$ref":"#/components/schemas/OfferSubject"},"previous":{"$ref":"#/components/schemas/OfferAvailabilityStatus"},"current":{"$ref":"#/components/schemas/OfferAvailabilityStatus"}},"type":"object","required":["subscription_id","subject","previous","current"],"title":"OfferAvailabilityChangedData"},"OfferAvailabilityChangedEvent":{"properties":{"id":{"type":"string","title":"Id","description":"Stable across redeliveries; dedup on it."},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"When the change was committed."},"type":{"type":"string","const":"offer.availability.changed","title":"Type","default":"offer.availability.changed"},"data":{"$ref":"#/components/schemas/OfferAvailabilityChangedData"}},"type":"object","required":["id","timestamp","data","type"],"title":"OfferAvailabilityChangedEvent","description":"The offer's availability flipped; for the pinned configuration when the subscription has a `selection`."},"OfferAvailabilityStatus":{"type":"string","enum":["InStock","OutOfStock"],"title":"OfferAvailabilityStatus","description":"The two availability values the public API emits on offers.\n\nInternal ``AvailabilityStatus`` values are collapsed to these via\n``AvailabilityStatus.to_api()``."},"OfferCreatedEvent":{"properties":{"id":{"type":"string","title":"Id","description":"Stable across redeliveries; dedup on it."},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"When the change was committed."},"type":{"type":"string","const":"offer.created","title":"Type","default":"offer.created"},"data":{"$ref":"#/components/schemas/OfferLifecycleData"}},"type":"object","required":["id","timestamp","data","type"],"title":"OfferCreatedEvent","description":"An offer entered the subscription's view."},"OfferDeletedEvent":{"properties":{"id":{"type":"string","title":"Id","description":"Stable across redeliveries; dedup on it."},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"When the change was committed."},"type":{"type":"string","const":"offer.deleted","title":"Type","default":"offer.deleted"},"data":{"$ref":"#/components/schemas/OfferLifecycleData"}},"type":"object","required":["id","timestamp","data","type"],"title":"OfferDeletedEvent","description":"An offer left the subscription's view."},"OfferLifecycleData":{"properties":{"subscription_id":{"type":"string","title":"Subscription Id","description":"The subscription this event matched."},"subject":{"$ref":"#/components/schemas/OfferSubject"},"offer":{"$ref":"#/components/schemas/OfferSnapshot","description":"Current on `created`, last known on `deleted`."}},"type":"object","required":["subscription_id","subject","offer"],"title":"OfferLifecycleData"},"OfferPriceChangedData":{"properties":{"subscription_id":{"type":"string","title":"Subscription Id","description":"The subscription this event matched."},"subject":{"$ref":"#/components/schemas/OfferSubject"},"previous":{"$ref":"#/components/schemas/Price"},"current":{"$ref":"#/components/schemas/Price"}},"type":"object","required":["subscription_id","subject","previous","current"],"title":"OfferPriceChangedData"},"OfferPriceChangedEvent":{"properties":{"id":{"type":"string","title":"Id","description":"Stable across redeliveries; dedup on it."},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"When the change was committed."},"type":{"type":"string","const":"offer.price.changed","title":"Type","default":"offer.price.changed"},"data":{"$ref":"#/components/schemas/OfferPriceChangedData"}},"type":"object","required":["id","timestamp","data","type"],"title":"OfferPriceChangedEvent","description":"The offer's price changed (any `Price` field, including `compare_at_price`)."},"OfferSnapshot":{"properties":{"url":{"type":"string","title":"Url","description":"Buy URL for the offer."},"domain":{"type":"string","title":"Domain"},"price":{"$ref":"#/components/schemas/Price"},"availability":{"$ref":"#/components/schemas/OfferAvailabilityStatus","description":"The pinned configuration's availability when the subscription has a `selection`, else the listing's."},"condition":{"anyOf":[{"$ref":"#/components/schemas/Condition"},{"type":"null"}]}},"type":"object","required":["url","domain","price","availability"],"title":"OfferSnapshot","description":"The offer as `/v1/products/{id}` returns it in the subscription's view."},"OfferSubject":{"properties":{"product_id":{"type":"string","title":"Product Id"},"domain":{"type":"string","title":"Domain","description":"Merchant domain, e.g. nordstrom.com. Matches `domain` on the product's offers."},"locale":{"$ref":"#/components/schemas/WebhookLocale"},"selection":{"anyOf":[{"items":{"$ref":"#/components/schemas/SelectedOption"},"type":"array","minItems":1},{"type":"null"}],"title":"Selection","description":"The pinned configuration, in the shape of `variants.selected`; null for the offer as a whole."}},"type":"object","required":["product_id","domain","locale"],"title":"OfferSubject","description":"The offer or configuration the event is about."},"OptionValue":{"properties":{"label":{"type":"string","title":"Label","description":"The display value of the option value (e.g. 'Blue')"},"exists":{"type":"boolean","title":"Exists","description":"Whether the option value exists on the product, or is a configuration only present on another variant of the same product. For example, a shirt that comes in multiple colors, but only one color is available in Size XL."},"available":{"anyOf":[{"$ref":"#/components/schemas/OfferAvailabilityStatus"},{"type":"null"}],"description":"The availability status of the option value. None when returned on search results, hydrated only on get product detail requests."},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"For options that reference different products, this is the URL of the thumbnail image for the option value. E.g., a shoe that comes in multiple colors will have an OptionValue for each color with a thumbnail_url set."},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id","description":"The product id that represents this value. Variants that point to different products will have this field set, as well as thumbnail_url for displaying selector icons."}},"type":"object","required":["label","exists"],"title":"OptionValue","description":"One value of one variant option (e.g. 'Blue' under 'Color')"},"PaginatedCollectionsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CollectionResponse"},"type":"array","title":"Items"},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token"}},"type":"object","required":["items"],"title":"PaginatedCollectionsResponse"},"PaginatedListBrandsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Brand"},"type":"array","title":"Items","description":"List of brands"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Cursor to fetch the next page of results. Null if no more results."}},"type":"object","required":["items"],"title":"PaginatedListBrandsResponse"},"PaginatedListCategoriesResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CategorySummary"},"type":"array","title":"Items","description":"Categories in this page"},"page":{"type":"integer","title":"Page","description":"1-indexed page number returned"},"page_size":{"type":"integer","title":"Page Size","description":"Number of items per page"},"total":{"type":"integer","title":"Total","description":"Total number of categories matching the query"}},"type":"object","required":["items","page","page_size","total"],"title":"PaginatedListCategoriesResponse"},"PaginatedListWebsitesResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Website"},"type":"array","title":"Items","description":"List of websites"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Cursor to fetch the next page of results. Null if no more results."}},"type":"object","required":["items"],"title":"PaginatedListWebsitesResponse"},"PaginatedProductSubscriptionsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProductSubscriptionResponse"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"PaginatedProductSubscriptionsResponse"},"PaginatedSubscriptionsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SubscriptionResponse"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["items"],"title":"PaginatedSubscriptionsResponse"},"PatchCollectionRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"add_clauses":{"anyOf":[{"items":{"$ref":"#/components/schemas/CollectionClauseInput"},"type":"array"},{"type":"null"}],"title":"Add Clauses"},"replace_clauses":{"anyOf":[{"items":{"$ref":"#/components/schemas/CollectionClause"},"type":"array"},{"type":"null"}],"title":"Replace Clauses","description":"Replace existing clauses in place by clause_id. Position in the clauses list is unchanged."},"remove_clause_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Remove Clause Ids"}},"additionalProperties":false,"type":"object","title":"PatchCollectionRequest"},"Price":{"properties":{"price":{"type":"number","title":"Price","description":"The current price of the product, including any discounts."},"compare_at_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Compare At Price","description":"The original price of the product before any discounts."},"currency":{"type":"string","title":"Currency","description":"The currency code of the product, like USD, EUR, GBP, etc."}},"type":"object","required":["price","currency"],"title":"Price"},"PriceChangedEvent":{"properties":{"type":{"type":"string","const":"price.changed","title":"Type","default":"price.changed"},"canonical_product_id":{"type":"string","title":"Canonical Product Id"},"domain":{"type":"string","title":"Domain","description":"Domain of the offer whose price changed, e.g. nordstrom.com. Matches `domain` on the product's offers."},"old_price":{"type":"number","title":"Old Price"},"new_price":{"type":"number","title":"New Price"},"currency":{"type":"string","title":"Currency"},"buy_url":{"type":"string","title":"Buy Url"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["canonical_product_id","domain","old_price","new_price","currency","buy_url","timestamp","type"],"title":"PriceChangedEvent","description":"Triggered when the price changes for a product you're tracking."},"PriceHistoryPoint":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"price":{"type":"number","title":"Price"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["timestamp","price","currency"],"title":"PriceHistoryPoint"},"PriceHistoryResponse":{"properties":{"canonical_product_id":{"type":"string","title":"Canonical Product Id"},"product_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Title"},"history":{"items":{"$ref":"#/components/schemas/PriceHistoryPoint"},"type":"array","title":"History","default":[]},"statistics":{"anyOf":[{"$ref":"#/components/schemas/PriceStatistics"},{"type":"null"}]}},"type":"object","required":["canonical_product_id"],"title":"PriceHistoryResponse"},"PriceStatistics":{"properties":{"mean":{"type":"number","title":"Mean"},"std_dev":{"type":"number","title":"Std Dev"},"min_price":{"type":"number","title":"Min Price"},"max_price":{"type":"number","title":"Max Price"},"current_price":{"type":"number","title":"Current Price"},"current_status":{"$ref":"#/components/schemas/PriceStatus"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["mean","std_dev","min_price","max_price","current_price","current_status","currency"],"title":"PriceStatistics"},"PriceStatus":{"type":"string","enum":["low","typical","high"],"title":"PriceStatus"},"Product":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"brands":{"items":{"$ref":"#/components/schemas/ProductBrand"},"type":"array","title":"Brands","description":"Ordered list of brands."},"images":{"items":{"$ref":"#/components/schemas/ProductImage"},"type":"array","title":"Images","default":[]},"category":{"anyOf":[{"$ref":"#/components/schemas/CategorySummary"},{"type":"null"}],"description":"The single category this product belongs to, as a structured `CategorySummary` (slug, title, path, has_children)."},"gender":{"anyOf":[{"$ref":"#/components/schemas/Gender"},{"type":"null"}]},"age":{"anyOf":[{"$ref":"#/components/schemas/Age"},{"type":"null"}],"description":"Target age group. Age-agnostic products are typically returned as 'adult'."},"materials":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Materials"},"key_features":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Key Features"},"colors":{"items":{"$ref":"#/components/schemas/ProductColor"},"type":"array","title":"Colors","description":"Colors of the cleaned main product image, ordered by pixel share (descending). Empty when the product has no cleaned image palette."},"offers":{"items":{"$ref":"#/components/schemas/ProductOffer"},"type":"array","title":"Offers","description":"All merchant offers for this product in the requested locale."},"variants":{"anyOf":[{"$ref":"#/components/schemas/Variants"},{"type":"null"}],"description":"Variant interaction state — options, selected. Absent when the product has no variations."},"structured_attributes":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Structured Attributes","description":"Structured attributes extracted for this product, keyed by attribute handle (e.g. 'color', 'material'). Values are the canonical allowed values for that handle."},"ratings":{"anyOf":[{"$ref":"#/components/schemas/ProductRatings"},{"type":"null"}],"description":"Cross-merchant rating rollup. Null when no merchant has a usable product rating."}},"type":"object","required":["id","title"],"title":"Product","description":"Product with detailed information."},"ProductBrand":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"ProductBrand"},"ProductColor":{"properties":{"hex":{"type":"string","title":"Hex","description":"sRGB hex string, e.g. '#a1b2c3'"},"percentage":{"type":"number","title":"Percentage","description":"Fraction of foreground pixels in [0, 1]; 1.0 is 100%."}},"type":"object","required":["hex","percentage"],"title":"ProductColor","description":"A color of the cleaned main product image; visual share, not composition or the Color variant axis."},"ProductIdsInput":{"properties":{"product_ids":{"items":{"type":"string"},"type":"array","title":"Product Ids"}},"type":"object","title":"ProductIdsInput"},"ProductImage":{"properties":{"url":{"type":"string","title":"Url"},"cleaned_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cleaned Url","description":"Background-removed square image on Channel3 CDN when available. Use for product grids; ``url`` is the regular hosted shot."},"is_main_image":{"type":"boolean","title":"Is Main Image","default":false},"shot_type":{"anyOf":[{"$ref":"#/components/schemas/ApiProductImageType"},{"type":"null"}]},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text"}},"type":"object","required":["url"],"title":"ProductImage","description":"Product image with metadata."},"ProductOffer":{"properties":{"url":{"type":"string","title":"Url"},"domain":{"type":"string","title":"Domain"},"price":{"$ref":"#/components/schemas/Price"},"availability":{"$ref":"#/components/schemas/OfferAvailabilityStatus"},"condition":{"anyOf":[{"$ref":"#/components/schemas/Condition"},{"type":"null"}],"description":"Condition of this merchant offer (new or used). Null when condition is unknown."},"max_commission_rate":{"type":"number","title":"Max Commission Rate","description":"The maximum commission rate for the merchant, as a decimal fraction: 0 is no commission, 0.5 is 50% commission. 'Max' because the actual commission rate may be lower due to vendor-specific affiliate rules.","default":0.0},"dimensions":{"anyOf":[{"$ref":"#/components/schemas/Dimensions"},{"type":"null"}],"description":"Physical dimensions of this offer. Null when unknown."}},"type":"object","required":["url","domain","price","availability"],"title":"ProductOffer"},"ProductRatings":{"properties":{"value":{"type":"number","title":"Value","description":"Average on a 0–5 scale, weighted by each merchant's review count."},"count":{"type":"integer","title":"Count","description":"Total review count after collapsing identical merchant pools."},"source_count":{"type":"integer","title":"Source Count","description":"Distinct merchant rating pools that contributed."}},"type":"object","required":["value","count","source_count"],"title":"ProductRatings","description":"Count-weighted rating rollup across merchants that sell this product."},"ProductSubscriptionResponse":{"properties":{"subscription_id":{"type":"string","title":"Subscription Id"},"product_id":{"type":"string","title":"Product Id","description":"The product subscribed to. Differs from the requested `product_id` when the selection picked another product."},"events":{"items":{"type":"string","enum":["offer.price.changed","offer.availability.changed","offer.created","offer.deleted"]},"type":"array","title":"Events"},"domains":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Domains"},"selection":{"anyOf":[{"items":{"$ref":"#/components/schemas/StoredSelection"},"type":"array"},{"type":"null"}],"title":"Selection","description":"The selection the subscription was created with; null for the whole product."},"locale":{"$ref":"#/components/schemas/WebhookLocale"},"status":{"$ref":"#/components/schemas/ProductSubscriptionStatus","description":"Lifecycle status: \"active\" or \"cancelled\""},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["subscription_id","product_id","events","locale","status","created_at"],"title":"ProductSubscriptionResponse","description":"A product subscription's scope and lifecycle state."},"ProductSubscriptionStatus":{"type":"string","enum":["active","cancelled"],"title":"ProductSubscriptionStatus"},"PublicTransactionStatus":{"type":"string","enum":["pending","paid"],"title":"PublicTransactionStatus","description":"Vendor-facing transaction status (approved is surfaced as pending)."},"ReportingProduct":{"properties":{"id":{"type":"string","title":"Id","description":"Canonical product ID."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Product title."},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Product image URL."}},"type":"object","required":["id"],"title":"ReportingProduct","description":"Compact product reference on click/transaction items."},"RevokeClientTokenRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"RevokeClientTokenRequest"},"Sale":{"type":"string","enum":["on_sale"],"title":"Sale"},"SearchBrandsResponse":{"properties":{"brands":{"items":{"$ref":"#/components/schemas/Brand"},"type":"array","title":"Brands","description":"Brands matching the query, ordered by relevance."}},"type":"object","required":["brands"],"title":"SearchBrandsResponse"},"SearchCategoriesResponse":{"properties":{"categories":{"items":{"$ref":"#/components/schemas/CategorySummary"},"type":"array","title":"Categories","description":"Categories matching the query, ordered by relevance."}},"type":"object","required":["categories"],"title":"SearchCategoriesResponse"},"SearchColorsFilter":{"properties":{"palette":{"items":{"$ref":"#/components/schemas/SearchFilterColor"},"type":"array","title":"Palette","description":"Colors required in matching products. Treated as an AND condition."},"match":{"$ref":"#/components/schemas/ColorMatch","description":"How tightly colors must match: 'strict', 'standard', or 'loose'.","default":"standard"}},"additionalProperties":false,"type":"object","required":["palette"],"title":"SearchColorsFilter","description":"[Beta] Color filter wrapper. Holds required colors and optional match mode."},"SearchConfig":{"properties":{"language":{"anyOf":[{"$ref":"#/components/schemas/LanguageCode"},{"type":"null"}],"description":"ISO 639-1 language code. When unset, inferred from ``country`` (preferred) then ``currency``, defaulting to ``en``."},"country":{"anyOf":[{"$ref":"#/components/schemas/CountryCode"},{"type":"null"}],"description":"ISO 3166-1 alpha-2 country code. May stay unset for pan-region storefronts (e.g. ``currency=EUR`` with no specific country)."},"currency":{"anyOf":[{"$ref":"#/components/schemas/CurrencyCode"},{"type":"null"}],"description":"ISO 4217 currency code. When unset, inferred from ``country`` (e.g. ``GB`` → ``GBP``), defaulting to ``USD``."},"length_unit":{"anyOf":[{"$ref":"#/components/schemas/LengthUnit"},{"type":"null"}],"description":"Preferred unit for length dimensions (length/width/height) in responses. A request dimension filter's unit for the field takes precedence; when neither is set, the merchant's stated unit is returned."},"weight_unit":{"anyOf":[{"$ref":"#/components/schemas/WeightUnit"},{"type":"null"}],"description":"Preferred unit for weight dimensions in responses. A request dimension filter's weight unit takes precedence; when neither is set, the merchant's stated unit is returned."},"collection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collection Id","description":"Optional saved collection to scope this request. Clauses are ORed. Within a clause, brand/website/category lists are ORed inside each list and ANDed across lists. Request filters further narrow results but cannot widen the collection scope."},"offer_refresh_timeout_ms":{"anyOf":[{"type":"integer","maximum":10000.0,"minimum":2000.0},{"type":"null"}],"title":"Offer Refresh Timeout Ms","description":"Check each returned offer against the merchant's live site, waiting up to this many milliseconds (2000-10000). Offers whose page or variant is gone are dropped and offers found out of stock are returned as out of stock. Adds up to this much latency.","x-hidden":true},"mode":{"$ref":"#/components/schemas/SearchMode","description":"Search strategy. `default` (recommended) combines lexical + semantic search and is right for most use cases. `keyword` is lexical only — use it for real-time, low-latency needs like ad targeting. `agentic` uses an LLM to plan multiple structured sub-searches for complex queries, with higher latency than the other modes.","default":"default"}},"additionalProperties":false,"type":"object","title":"SearchConfig","description":"Search request config: ``BaseConfig`` plus ``mode``."},"SearchFilterColor":{"properties":{"hex":{"type":"string","title":"Hex","description":"sRGB hex string, e.g. '#a1b2c3'"},"percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percentage","description":"Percentage of color, where 1.0 is 100%"}},"type":"object","required":["hex"],"title":"SearchFilterColor","description":"A single color requirement for the color filter."},"SearchFilterDimensions":{"properties":{"length":{"anyOf":[{"$ref":"#/components/schemas/SearchFilterLengthDimension"},{"type":"null"}]},"width":{"anyOf":[{"$ref":"#/components/schemas/SearchFilterLengthDimension"},{"type":"null"}]},"height":{"anyOf":[{"$ref":"#/components/schemas/SearchFilterLengthDimension"},{"type":"null"}]},"weight":{"anyOf":[{"$ref":"#/components/schemas/SearchFilterWeightDimension"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"SearchFilterDimensions","description":"Physical-dimension range filters, matched against the same offer.\n\nMatching products have at least one offer satisfying every provided\nrange (alongside any locale/price/availability filters). Values are\ncompared with a small relative tolerance. An offer with no dimension data\nfor a filtered field does not match; note that when a single merchant on a\nproduct reports a dimension it is shared across that product's offers, so a\nmatching offer may not itself surface that dimension in the response."},"SearchFilterLengthDimension":{"properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min","description":"Minimum value, in `unit`. Inclusive."},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max","description":"Maximum value, in `unit`. Inclusive."},"unit":{"$ref":"#/components/schemas/LengthUnit","description":"Unit that min/max are expressed in"}},"additionalProperties":false,"type":"object","required":["unit"],"title":"SearchFilterLengthDimension"},"SearchFilterPrice":{"properties":{"min_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Price","description":"Minimum price, in dollars and cents"},"max_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Price","description":"Maximum price, in dollars and cents"}},"additionalProperties":false,"type":"object","title":"SearchFilterPrice","description":"Price filter for search. Values are inclusive."},"SearchFilterWeightDimension":{"properties":{"min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min","description":"Minimum value, in `unit`. Inclusive."},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max","description":"Maximum value, in `unit`. Inclusive."},"unit":{"$ref":"#/components/schemas/WeightUnit","description":"Unit that min/max are expressed in"}},"additionalProperties":false,"type":"object","required":["unit"],"title":"SearchFilterWeightDimension"},"SearchFilters":{"properties":{"brand_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Brand Ids","description":"If provided, only products from these brands will be returned"},"gender":{"anyOf":[{"$ref":"#/components/schemas/Gender"},{"type":"null"}]},"conditions":{"items":{"$ref":"#/components/schemas/Condition"},"type":"array","minItems":1,"title":"Conditions","description":"Offer conditions to match (OR). Defaults to ['new'], which also matches offers whose condition is unknown. Pass every value to disable condition filtering."},"age":{"anyOf":[{"items":{"$ref":"#/components/schemas/Age"},"type":"array"},{"type":"null"}],"title":"Age","description":"Filter by age group. Age-agnostic products are treated as adult products."},"price":{"anyOf":[{"$ref":"#/components/schemas/SearchFilterPrice"},{"type":"null"}],"description":"If provided, only products within this price range will be returned"},"availability":{"items":{"$ref":"#/components/schemas/OfferAvailabilityStatus"},"type":"array","minItems":1,"title":"Availability","description":"Offer availability statuses to match (OR). Defaults to ['InStock']. An offer with no availability data counts as 'InStock'. Pass every value to disable availability filtering."},"sale":{"anyOf":[{"$ref":"#/components/schemas/Sale"},{"type":"null"}],"description":"If 'on_sale', only products with at least one on-sale offer (priced below its compare-at price) for the requested locale are returned. If omitted, no filter."},"website_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Website Ids","description":"If provided, only products from these websites will be returned. Accepts website IDs or domains (e.g. \"nike.com\")."},"category_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Category Ids","description":"If provided, only products from these categories will be returned. Accepts category slugs. Categories that do not exist, or that are not available for search, are rejected with a 422."},"exclude_brand_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exclude Brand Ids","description":"If provided, products from these brands will be excluded from the results"},"exclude_website_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exclude Website Ids","description":"If provided, products from these websites will be excluded from the results. Accepts website IDs or domains (e.g. \"nike.com\")."},"exclude_category_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exclude Category Ids","description":"If provided, products in these categories (or their descendants) will be excluded from the results. Accepts category slugs. Categories that do not exist are rejected with a 422."},"colors":{"anyOf":[{"$ref":"#/components/schemas/SearchColorsFilter"},{"type":"null"}],"description":"[Beta: filter is experimental and may be changed] If provided, find products containing all of these colors."},"attributes":{"anyOf":[{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Attributes","description":"If provided, only products matching these key/value constraints will be returned. Keys are attribute handles (e.g. 'color', 'material') and values are lists of allowed values (OR within a key, AND across keys). When a category filter is also supplied, all keys must be valid attributes of at least one of the requested categories. See `Category.attributes` for the valid keys and values per category."},"dimensions":{"anyOf":[{"$ref":"#/components/schemas/SearchFilterDimensions"},{"type":"null"}],"description":"If provided, only products with at least one offer whose physical dimensions satisfy every given range will be returned. Offer dimensions in responses are converted to the units used here."}},"additionalProperties":false,"type":"object","title":"SearchFilters","description":"Search filters for the search API."},"SearchMode":{"type":"string","enum":["keyword","default","agentic"],"title":"SearchMode","description":"Search strategy.\n\n``default`` (recommended) combines lexical and semantic search and is the\nright choice for most use cases. ``keyword`` runs lexical search only — use\nit for real-time, low-latency needs such as ad targeting. ``agentic`` uses\nan LLM to plan multiple structured sub-searches for complex queries, with\nhigher latency than the other modes."},"SearchProductsInput":{"properties":{"query":{"type":"string","title":"Query","default":""}},"type":"object","required":["query"],"title":"SearchProductsInput"},"SearchRequest":{"properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query","description":"Search query. At least one of `query`, `image_url`, `base64_image`, or `page_token` must be provided."},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Image URL. At least one of `query`, `image_url`, `base64_image`, or `page_token` must be provided."},"base64_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base64 Image","description":"Base64 encoded image. At least one of `query`, `image_url`, `base64_image`, or `page_token` must be provided."},"limit":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Limit","description":"Optional limit on the number of results. Default is 20, max is 30.","default":20},"filters":{"$ref":"#/components/schemas/SearchFilters","description":"Optional filters. Search will only consider products that match all of the filters.","default":{"conditions":["new"],"availability":["InStock"]}},"config":{"$ref":"#/components/schemas/SearchConfig","description":"Optional configuration","default":{"mode":"default"}},"page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token","description":"Opaque token from a previous search response to fetch the next page of results."}},"additionalProperties":false,"type":"object","title":"SearchRequest","description":"Search request with pagination support."},"SearchResponse":{"properties":{"products":{"items":{"$ref":"#/components/schemas/Product"},"type":"array","title":"Products"},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Token to fetch the next page. Null when no more results."}},"type":"object","required":["products"],"title":"SearchResponse","description":"v1 paginated search response."},"SearchWebsitesResponse":{"properties":{"websites":{"items":{"$ref":"#/components/schemas/Website"},"type":"array","title":"Websites","description":"Websites matching the query, ordered by relevance."}},"type":"object","required":["websites"],"title":"SearchWebsitesResponse"},"SelectedOption":{"properties":{"name":{"type":"string","title":"Name","description":"The name of the selected option (e.g. 'Color', 'Size')"},"label":{"type":"string","title":"Label","description":"The display value of the selected option (e.g. 'Blue', 'XL')"}},"type":"object","required":["name","label"],"title":"SelectedOption","description":"One effective selection on a product, post server-side relaxation."},"SimilarProductsInput":{"properties":{"product_ids":{"items":{"type":"string"},"type":"array","title":"Product Ids"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"}},"type":"object","title":"SimilarProductsInput"},"SimilarProductsRequest":{"properties":{"product_id":{"type":"string","title":"Product Id","description":"Canonical product ID to find similar products for."},"limit":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Limit","description":"Optional limit on the number of results. Default is 20, max is 30.","default":20},"filters":{"$ref":"#/components/schemas/SearchFilters","description":"Optional filters. Search will only consider products that match all of the filters.","default":{"conditions":["new"],"availability":["InStock"]}},"config":{"$ref":"#/components/schemas/BaseConfig","description":"Optional configuration."},"page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token","description":"Opaque token from a previous similar response to fetch the next page of results."}},"additionalProperties":false,"type":"object","required":["product_id"],"title":"SimilarProductsRequest","description":"Find products similar to a given product."},"StartTrackingRequest":{"properties":{"canonical_product_id":{"type":"string","title":"Canonical Product Id"}},"type":"object","required":["canonical_product_id"],"title":"StartTrackingRequest"},"StickerRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Product page URL of a product already in the Channel3 catalog."},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id","description":"Channel3 product ID."}},"additionalProperties":false,"type":"object","title":"StickerRequest","description":"Identify a product already in the Channel3 catalog to render as a sticker."},"StickerResponse":{"properties":{"product_id":{"type":"string","title":"Product Id","description":"Channel3 product ID the sticker shows."},"source_image_url":{"type":"string","title":"Source Image Url","description":"Product image the sticker was cut from."},"sticker_url":{"type":"string","title":"Sticker Url","description":"Transparent-background WebP of the product, tight-cropped with a small transparent margin."}},"type":"object","required":["product_id","source_image_url","sticker_url"],"title":"StickerResponse"},"StopTrackingRequest":{"properties":{"canonical_product_id":{"type":"string","title":"Canonical Product Id"}},"type":"object","required":["canonical_product_id"],"title":"StopTrackingRequest"},"StoredSelection":{"properties":{"name":{"type":"string","title":"Name"},"label":{"type":"string","title":"Label"},"value_key":{"type":"string","title":"Value Key"}},"type":"object","required":["name","label","value_key"],"title":"StoredSelection","description":"One selected option value (e.g. Size = L); `value_key` is the standardized identifier for the value, or the page label itself for a page selection."},"SubscriptionResponse":{"properties":{"canonical_product_id":{"type":"string","title":"Canonical Product Id"},"subscription_status":{"$ref":"#/components/schemas/SubscriptionStatus"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["canonical_product_id","subscription_status","created_at"],"title":"SubscriptionResponse"},"SubscriptionStatus":{"type":"string","enum":["active","cancelled"],"title":"SubscriptionStatus"},"TextPart":{"properties":{"type":{"type":"string","const":"text","title":"Type","default":"text"},"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"TextPart"},"ThingMask":{"properties":{"bbox":{"items":{"type":"integer"},"type":"array","title":"Bbox","description":"Box [x1, y1, x2, y2] in `image_size` pixels the mask covers."},"rle":{"$ref":"#/components/schemas/MaskRle","description":"COCO uncompressed RLE at the detector's resolution; stretch `size` [h, w] onto `bbox`."}},"type":"object","required":["bbox","rle"],"title":"ThingMask","description":"One object's segmentation mask over its box."},"ToolPart":{"properties":{"type":{"type":"string","const":"tool","title":"Type","default":"tool"},"tool_call_id":{"type":"string","title":"Tool Call Id"},"tool_name":{"type":"string","title":"Tool Name"},"input":{"anyOf":[{"$ref":"#/components/schemas/SearchProductsInput"},{"$ref":"#/components/schemas/ProductIdsInput"},{"$ref":"#/components/schemas/UrlLookupInput"},{"$ref":"#/components/schemas/ImageSearchInput"},{"$ref":"#/components/schemas/SimilarProductsInput"}],"title":"Input"},"output":{"anyOf":[{"$ref":"#/components/schemas/CatalogDisplayPayload"},{"$ref":"#/components/schemas/CatalogToolError"},{"type":"null"}],"title":"Output"}},"type":"object","required":["tool_call_id","tool_name"],"title":"ToolPart","description":"One catalog tool call and its display payload from an assistant turn."},"Transaction":{"properties":{"id":{"type":"string","title":"Id","description":"Transaction ID."},"order_amount":{"type":"number","title":"Order Amount","description":"Order amount in the transaction currency."},"commission_amount":{"type":"number","title":"Commission Amount","description":"Vendor net commission (after Channel3 take rate)."},"status":{"$ref":"#/components/schemas/PublicTransactionStatus","description":"pending (includes network-approved) or paid."},"purchased_at":{"type":"string","format":"date-time","title":"Purchased At","description":"Purchase timestamp, returned with a UTC offset (Z)."},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"Partner-supplied user identifier from the originating click, if provided."},"product":{"anyOf":[{"$ref":"#/components/schemas/ReportingProduct"},{"type":"null"}],"description":"Matched product, if known."},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name","description":"Brand name, if known."},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City","description":"Purchase city, if available."},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Purchase country, if available."}},"type":"object","required":["id","order_amount","commission_amount","status","purchased_at"],"title":"Transaction","description":"A single CPA transaction."},"TransactionsResponse":{"properties":{"summary":{"$ref":"#/components/schemas/TransactionsSummary"},"items":{"items":{"$ref":"#/components/schemas/Transaction"},"type":"array","title":"Items"},"page":{"type":"integer","title":"Page","description":"Current page (1-indexed)."},"limit":{"type":"integer","title":"Limit","description":"Page size."},"total_count":{"type":"integer","title":"Total Count","description":"Total matching transactions in the date range."},"has_more":{"type":"boolean","title":"Has More","description":"Whether more pages are available."},"start_date":{"type":"string","format":"date-time","title":"Start Date","description":"Inclusive start of the resolved query window. Always returned with a UTC offset (Z); request values with other offsets are converted."},"end_date":{"type":"string","format":"date-time","title":"End Date","description":"Inclusive end of the resolved query window. Always returned with a UTC offset (Z); request values with other offsets are converted."}},"type":"object","required":["summary","items","page","limit","total_count","has_more","start_date","end_date"],"title":"TransactionsResponse","description":"Paginated transactions for a vendor over a date range."},"TransactionsSummary":{"properties":{"total_count":{"type":"integer","title":"Total Count","description":"Total transactions in the date range."},"total_commission":{"type":"number","title":"Total Commission","description":"Sum of vendor net commission (pending + paid) for the date range."},"pending_commission":{"type":"number","title":"Pending Commission","description":"Vendor net commission still pending payout."},"paid_commission":{"type":"number","title":"Paid Commission","description":"Vendor net commission already paid out."}},"type":"object","required":["total_count","total_commission","pending_commission","paid_commission"],"title":"TransactionsSummary","description":"Aggregate transaction stats for the requested date range."},"TurnResult":{"properties":{"conversation_id":{"type":"string","title":"Conversation Id"},"turn_id":{"type":"string","title":"Turn Id"},"usage":{"$ref":"#/components/schemas/TurnUsage"},"message":{"$ref":"#/components/schemas/AssistantMessage"}},"type":"object","required":["conversation_id","turn_id","usage","message"],"title":"TurnResult","description":"Buffered equivalent of a streamed turn (``stream: false``)."},"TurnUsage":{"properties":{"credits_charged":{"type":"integer","title":"Credits Charged","description":"API credits charged for this turn: 1 for the turn plus each catalog tool billed at its public-API rate."},"searches_run":{"type":"integer","title":"Searches Run","description":"Catalog searches executed during this turn."}},"type":"object","required":["credits_charged","searches_run"],"title":"TurnUsage"},"UrlLookupInput":{"properties":{"url":{"type":"string","title":"Url","default":""}},"type":"object","title":"UrlLookupInput"},"UserMessage":{"properties":{"role":{"type":"string","const":"user","title":"Role","default":"user"},"parts":{"items":{"oneOf":[{"$ref":"#/components/schemas/TextPart"},{"$ref":"#/components/schemas/ImagePart"}],"discriminator":{"propertyName":"type","mapping":{"image":"#/components/schemas/ImagePart","text":"#/components/schemas/TextPart"}}},"type":"array","title":"Parts"}},"type":"object","title":"UserMessage"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ValidationErrorDetail":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Loc"},"msg":{"type":"string","title":"Msg"},"type":{"type":"string","title":"Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationErrorDetail","description":"Individual validation error detail."},"VariantOption":{"properties":{"name":{"type":"string","title":"Name","description":"The name of the option (e.g. 'Color', 'Size')"},"values":{"items":{"$ref":"#/components/schemas/OptionValue"},"type":"array","title":"Values","description":"The values of the option (e.g. ['Blue', 'Red', 'Green'])"}},"type":"object","required":["name","values"],"title":"VariantOption","description":"One dimension of a product family (e.g. 'Color', 'Size')."},"Variants":{"properties":{"options":{"items":{"$ref":"#/components/schemas/VariantOption"},"type":"array","title":"Options"},"selected":{"items":{"$ref":"#/components/schemas/SelectedOption"},"type":"array","title":"Selected"}},"type":"object","required":["options","selected"],"title":"Variants","description":"Wrapper for variant-interaction state on a Product.\n\nHolds `options` and `selected`. `options` represent all of the\nconfiguration options for the product. `selected` represents the\ncurrently selected option values."},"WebhookLocale":{"properties":{"language":{"$ref":"#/components/schemas/LanguageCode"},"country":{"anyOf":[{"$ref":"#/components/schemas/CountryCode"},{"type":"null"}]},"currency":{"$ref":"#/components/schemas/CurrencyCode"}},"type":"object","required":["language","currency"],"title":"WebhookLocale","description":"The locale the subscription reads the product in."},"Website":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"url":{"type":"string","title":"Url"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"best_commission_rate":{"type":"number","title":"Best Commission Rate","description":"The maximum commission rate for the website in the requested country (default 'US'), as a percentage","default":0.0},"countries":{"items":{"$ref":"#/components/schemas/CountryCode"},"type":"array","title":"Countries","description":"Countries where this website has offers indexed in the catalog. Pass one in the X-Channel3-Country header to get this website's products there. Empty when the website has no products indexed yet."}},"type":"object","required":["id","url"],"title":"Website"},"WeightDimension":{"properties":{"number":{"type":"number","title":"Number"},"unit":{"$ref":"#/components/schemas/WeightUnit","description":"The unit from the request's dimension filters when one was given (the value is converted to it); otherwise the unit the merchant stated."}},"type":"object","required":["number","unit"],"title":"WeightDimension","description":"A weight measurement, in one of the supported weight units."},"WeightUnit":{"type":"string","enum":["mg","g","kg","oz","lb"],"title":"WeightUnit"},"app__models__error_responses__ErrorResponse":{"properties":{"detail":{"type":"string","title":"Detail"}},"type":"object","required":["detail"],"title":"ErrorResponse","description":"Standard error response model."},"app__routers__utils__ErrorResponse":{"properties":{"detail":{"anyOf":[{"type":"string"},{"items":{"additionalProperties":true,"type":"object"},"type":"array"}],"title":"Detail"}},"type":"object","required":["detail"],"title":"ErrorResponse"},"TurnEvent":{"discriminator":{"mapping":{"error":"#/components/schemas/TurnErrorEvent","part.completed":"#/components/schemas/PartCompletedEvent","part.delta":"#/components/schemas/PartDeltaEvent","part.started":"#/components/schemas/PartStartedEvent","turn.completed":"#/components/schemas/TurnCompletedEvent","turn.started":"#/components/schemas/TurnStartedEvent"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/TurnStartedEvent"},{"$ref":"#/components/schemas/PartStartedEvent"},{"$ref":"#/components/schemas/PartDeltaEvent"},{"$ref":"#/components/schemas/PartCompletedEvent"},{"$ref":"#/components/schemas/TurnCompletedEvent"},{"$ref":"#/components/schemas/TurnErrorEvent"}]},"PartCompletedEvent":{"description":"Final state of the part at ``part_index``; replace any streamed state.","properties":{"type":{"const":"part.completed","default":"part.completed","title":"Type","type":"string"},"part_index":{"title":"Part Index","type":"integer"},"part":{"discriminator":{"mapping":{"text":"#/components/schemas/TextPart","tool":"#/components/schemas/ToolPart"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/TextPart"},{"$ref":"#/components/schemas/ToolPart"}],"title":"Part"}},"required":["part_index","part"],"title":"PartCompletedEvent","type":"object"},"PartDeltaEvent":{"description":"Append ``delta`` to the text of the part at ``part_index``.","properties":{"type":{"const":"part.delta","default":"part.delta","title":"Type","type":"string"},"part_index":{"title":"Part Index","type":"integer"},"delta":{"title":"Delta","type":"string"}},"required":["part_index","delta"],"title":"PartDeltaEvent","type":"object"},"PartStartedEvent":{"description":"A new part began at ``part_index``; ``part`` is its initial state.","properties":{"type":{"const":"part.started","default":"part.started","title":"Type","type":"string"},"part_index":{"title":"Part Index","type":"integer"},"part":{"discriminator":{"mapping":{"text":"#/components/schemas/TextPart","tool":"#/components/schemas/ToolPart"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/TextPart"},{"$ref":"#/components/schemas/ToolPart"}],"title":"Part"}},"required":["part_index","part"],"title":"PartStartedEvent","type":"object"},"TurnCompletedEvent":{"description":"Terminal event of a successful turn.","properties":{"type":{"const":"turn.completed","default":"turn.completed","title":"Type","type":"string"},"message":{"$ref":"#/components/schemas/AssistantMessage"},"usage":{"$ref":"#/components/schemas/TurnUsage"}},"required":["message","usage"],"title":"TurnCompletedEvent","type":"object"},"TurnErrorCode":{"enum":["invalid_request","unauthorized","insufficient_credits","conversation_not_found","turn_conflict","rate_limited","model_unavailable","token_not_found","service_unavailable","internal"],"title":"TurnErrorCode","type":"string"},"TurnErrorEvent":{"properties":{"type":{"const":"error","default":"error","title":"Type","type":"string"},"code":{"$ref":"#/components/schemas/TurnErrorCode"},"message":{"title":"Message","type":"string"},"retryable":{"default":false,"title":"Retryable","type":"boolean"}},"required":["code","message"],"title":"TurnErrorEvent","type":"object"},"TurnStartedEvent":{"description":"First event of every turn; carries the ids clients need to correlate.","properties":{"type":{"const":"turn.started","default":"turn.started","title":"Type","type":"string"},"conversation_id":{"title":"Conversation Id","type":"string"},"turn_id":{"title":"Turn Id","type":"string"},"message_id":{"title":"Message Id","type":"string"}},"required":["conversation_id","turn_id","message_id"],"title":"TurnStartedEvent","type":"object"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"x-api-key"},"Bearer":{"type":"http","scheme":"bearer","x-fern-bearer":{"name":"token","env":"CHANNEL3_TOKEN"}}}}}