# Update prices

> Change prices, names, descriptions, categories and brands of existing products by SKU, with a preview first.

Prices and product details are changed by **SKU**. Only the fields you send change; everything else stays as it is.

- Connector: `preview_catalog_update`, then `apply_catalog_update` (permission `catalog:write`).
- API: `POST /products/upsert` with `dry_run: true`, then the same body with `dry_run: false`.

## Steps

1. **Confirm the shop.** Connector: `whoami`. API: `GET /me`. Tell the owner the shop name.
2. **Read the current values** for the SKUs in the sheet: `find_products` or `GET /products?sku=TM-001,TM-002` (up to 500 per page with `limit`). This shows what will change and which SKUs don't exist yet.
3. **Preview.** Send the rows as a dry run. Show the owner the summary and every `error` row.
4. **Apply** after a clear yes. Report the summary and any `error` rows.

## Request

```json
{
  "dry_run": true,
  "products": [
    { "sku": "TM-001", "price": 139 },
    { "sku": "TM-002", "price": 159, "name": { "th": "รถบัสโทมิก้า", "en": "Tomica bus" } }
  ]
}
```

- `price` is in THB, 0 or more.
- `name`, `description` and `usage_information` take a string (the Thai text; the English text is kept) or `{ "th": "…", "en": "…" }` to set either or both.
- `category` must be one of the names from `list_categories` / `GET /categories` (any case). `brand` may be new: it is added to the shop's brand list.
- Don't send `stock` or `parent_sku` for an existing SKU: that row comes back as an error. Stock has [its own call](https://docs.sellersidekick.ai/update-stock).
- At most 500 rows per request. Each SKU once per request.

## Result

Each row gets a status:

| Status | Meaning |
|---|---|
| `updated` | changed; `changed` lists the fields, e.g. `["price"]` |
| `unchanged` | the values were already the same |
| `created` | the SKU was new and has been created (see [Add new products](https://docs.sellersidekick.ai/add-products)) |
| `error` | not applied; `error` says why |

In a dry run the statuses say what would happen and nothing is written. Sending the same rows again is safe: they come back `unchanged`.

## What changes where

The new price shows on your SellerSideKick store and the chat bot answers with it. **Marketplace listings keep their own prices**: change those in the Shopee, Lazada or TikTok seller center. When an owner asks for marketplace prices, say so plainly.
