# List the store's products

```http
GET /v1/products
```

Source: https://docs.tryyoursize.com/api/reference/operations/listcatalogproducts/

**Key scopes:** `products:read`. A secret key (`sk_`) has every scope; a restricted key (`rk_`) needs the scopes listed.

Newest first, cursor-paginated. `sku` finds one product by its SKU / style ID.

## Authentication

Secret key (`sk_…`) or restricted key (`rk_…`) from your server: `Authorization: Bearer sk_…`.

## Parameters

- `sku` (query, `string`, optional): Only the product with this SKU / style ID.
- `limit` (query, `integer`, optional): Page size (list convention). Default 20, at most 100.
- `cursor` (query, `string`, optional): Opaque cursor from the previous page's `next_cursor` (list convention). Omit it for the first page.

## Responses

### 200

OK (`ProductPage`)

- `data` (`Product[]`, required)
  - `id` (`string (uuid)`, required)
  - `external_id` (`string`, required): The brand's SKU or style ID (unique per brand).
  - `name` (`string`, required)
  - `category` (`"tshirt" | "shirt" | "sweater" | "jacket" | "dress" | "skirt" | "jeans" | "trousers" | "shorts" | "leggings" | "polo" | "hoodie"`, required): The garment type; it sets which POMs are needed.
  - `published_version` (`integer`, optional): Garment version shoppers are fitted against, if any.
  - `draft_version` (`integer`, optional): Garment version being edited, if any.
  - `created_at` (`string (date-time)`, required)
  - `updated_at` (`string (date-time)`, required)
  - `fit_group_id` (`string (uuid)`, optional): The fit group whose garment this product uses (absent until grouped).
  - `brand_id` (`string (uuid)`, optional): The brand the product belongs to; every store of the brand sees it.
  - `home_store_id` (`string (uuid)`, optional): The store the product was created in.
  - `retired_at` (`string (date-time)`, optional): Set when the product is retired; shoppers no longer get a size for it.
  - `available` (`boolean`, optional): Whether the store it was read through offers it (false in the brand list, see `stores`).
- `has_more` (`boolean`, required)
- `next_cursor` (`string`, optional)

### 400

Invalid request (`Error`)

### 401

Missing or invalid credentials (`Error`)

### 403

Not allowed (`Error`)

## Example

```bash
curl -X GET https://api.tryyoursize.com/v1/products \
  -H "Authorization: Bearer $TRYYOURSIZE_SECRET_KEY" \
  -H "TYS-Version: 2026-10-25"
```

## In the SDKs

- Node.js: [`tys.products.list()`](https://docs.tryyoursize.com/reference/node/products-list.md)
- Python: [`tys.products.list()`](https://docs.tryyoursize.com/reference/python/products-list.md)
