# Products

> The Product resource represents a sellable item in your Flowkiwi catalog.

A **Product** is a sellable item in your catalog. Each product can carry channel-, country- and time-aware pricing through its variants, and can be assigned to collections and categories. Products are the parent of [Variants](/api/product-management/variants/) and own a set of [Options](/api/product-management/options/) that define their variant matrix.

## The Product object

## Common workflows

- **Sync a catalog from your ERP.** Use [`POST /products`](/api/product-management/products/create/) to create products in bulk, then patch them as inventory shifts. The `updatedAt[after]` filter on [`GET /products`](/api/product-management/products/list/) lets you poll only the products that changed since your last sync.
- **Surface prices for a specific channel.** Pass `resolveContext[channel]`, `resolveContext[country]` and `resolveContext[at]` to [`GET /products`](/api/product-management/products/list/) so each variant's `resolvedPrice` reflects what a buyer in that channel and country would see at that moment.
- **Take a product down without losing its history.** [`DELETE /products/{id}`](/api/product-management/products/delete/) removes the product from active channels but preserves its audit trail.

## Conventions

These conventions apply to every endpoint on this resource.

### Authentication and headers

All requests require an OAuth 2.0 bearer token:

```
Authorization: Bearer <token>
```

And the organization scope header:

```
X-Flowkiwi-Organization-Id: <organization-id>
```

For localized fields, set the active locale and (optionally) a fallback:

```
X-Flowkiwi-Locale: fr-FR
X-Flowkiwi-Locale-Fallback: en-US
```

### Resolve context

Three query parameters control how prices and channel-specific fields are computed on read endpoints:

- `resolveContext[channel]` - channel identifier
- `resolveContext[country]` - ISO 3166-1 alpha-2 country code
- `resolveContext[at]` - ISO 8601 UTC timestamp

All three must be set together, or none. When set, embedded variants gain a `resolvedPrice` field.

### Pagination

List endpoints accept `page` (1-based) and `itemsPerPage`. Defaults follow the standard Hydra collection contract.

### Partial updates

`PATCH` uses [JSON Merge Patch](https://datatracker.ietf.org/doc/html/rfc7396) with `Content-Type: application/merge-patch+json`. To clear a field, pass `null`; to leave it untouched, omit it.
