---
title: "Create Collection"
method: POST
path: "/v1/collections"
tags: ["collections"]
---

# Create Collection

`POST /v1/collections`

## Request

- Base URL: `https://api.trychannel3.com`
- URL: `https://api.trychannel3.com/v1/collections`
- Auth: API key in header `x-api-key`

Create a collection. Clauses are optional so an empty collection can be curated later.

Invalid brand_ids, category_ids, or website_ids return 422.

## Request body

- CreateCollectionRequest
  - `name` string, nullable: Display name. Defaults to 'Collection {n}' for this account or user.
  - `description` string, nullable: Optional vendor-facing notes for this collection.
  - `user_id` string, nullable: 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` CollectionClauseInput[]: 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.
    - `brand_ids` string[], nullable: OR within this list (any slot). AND with the clause's other lists. OR against other clauses.
    - `website_ids` string[], nullable: 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` string[], nullable: OR within this list. AND with the clause's other lists.
    - `product_ids` string[], nullable

## Response `200`

Successful Response

- CollectionResponse
  - `collection_id` string, required
  - `name` string, required
  - `description` string, nullable
  - `user_id` string, nullable
  - `clauses` CollectionClause[], required
    - `brand_ids` string[], nullable: OR within this list (any slot). AND with the clause's other lists. OR against other clauses.
    - `website_ids` string[], nullable: 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` string[], nullable: OR within this list. AND with the clause's other lists.
    - `product_ids` string[], nullable
    - `clause_id` string, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required

## Other responses

- `401`: Unauthorized - Invalid or missing authentication
- `402`: Payment required
- `422`: Validation error or invalid brand_ids / category_ids / website_ids
- `500`: Internal Server Error

## Changes

- **2026-10-16** `93329818bdf4`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/channel3-ai/apis/channel3-typescript-api/changes/v1/collections/post.md)

---

[API](https://skmtc.dev/channel3-ai/apis/channel3-typescript-api.md) - [All operations](https://skmtc.dev/channel3-ai/apis/channel3-typescript-api/llms.txt) - [OpenAPI document](https://skmtc.dev/channel3-ai/apis/channel3-typescript-api/revisions/f9f7b422ab5d?raw)
