# Update a product (PATCH /v1/catalog/products/{id})

> PATCH /v1/catalog/products/{id}: Update a product. border.bot API reference (Catalogue).

Source: https://border.bot/docs/api/update-catalog-product

> Documentation index: https://border.bot/llms.txt. Every page is Markdown at its URL + `.md`.

`PATCH https://api.border.bot/v1/catalog/products/{id}`

Requires an API key (`Authorization: Bearer bb_live_…`).

Changes the fields given, its items (by id or SKU, others added) and its content list. Every change is kept in the product’s history with its actor. Free.

API key scope: `catalog`.

## Parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string (uuid) | yes | The product’s id. |

## Request body (JSON)

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `title` | string | no |  |
| `description` | string \| null | no |  |
| `brand` | string \| null | no |  |
| `manufacturerName` | string \| null | no |  |
| `manufacturerCountry` | string \| null | no |  |
| `category` | string \| null | no |  |
| `materialSummary` | string \| null | no |  |
| `tags` | string[] | no |  |
| `imageUrls` | string[] | no |  |
| `productUrl` | string \| null | no |  |
| `slug` | string \| null | no |  |
| `originCountry` | string \| null | no |  |
| `originBasis` | string \| null | no |  |
| `originEvidence` | object \| null | no |  |
| `preferentialClaims` | object[] | no |  |
| `attributes` | object[] | no |  |
| `markets` | array \| null | no |  |
| `quantityUnit` | string \| null | no |  |
| `supplementaryUnits` | object[] | no |  |
| `extra` | object | no |  |
| `status` | "draft" \| "active" | no |  |
| `items` | object[] | no |  |
| `components` | object[] | no |  |

## Responses

- `200`: The product as it is now. (`CatalogProductResponse`)
- `400`: Invalid input (`invalid_input`). (`Error`)
- `401`: Missing, invalid, revoked or expired API key (`unauthorized`). (`Error`)
- `403`: The API key doesn’t have the `catalog` scope (`forbidden`, `details.reason: "missing_scope"`). (`Error`)
- `404`: No such product in your catalogue (`not_found`). (`Error`)
- `409`: A SKU is taken, or the product is archived (`conflict`). (`Error`)
- `429`: Rate limited (`rate_limited`). Retry after `Retry-After` seconds; `RateLimit` says which limit was hit (`r=0`, `t` seconds until its window ends) and `RateLimit-Policy` its quota. (`Error`)
- `500`: Unexpected error (`internal`). (`Error`)

## Example

```bash
curl -X PATCH 'https://api.border.bot/v1/catalog/products/{id}' \
  -H 'Authorization: Bearer bb_live_...' \
  -H 'Content-Type: application/json' \
  -d '{"originCountry":"VN","items":[{"sku":"BOTTLE-750","unitValue":21.5}]}'
```
