---
title: "Update a product."
method: PATCH
path: "/api/v1/products/{id}"
tags: ["Products"]
---

# Update a product.

`PATCH /api/v1/products/{id}`

## Request

- Base URL: `https://app.tracepass.eu`
- URL: `https://app.tracepass.eu/api/v1/products/{id}`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://app.tracepass.eu/api/oauth/authorize`, token URL `https://app.tracepass.eu/api/oauth/token`, scopes: `passports:write`)

Patch one or more product fields. Send only the keys you
want to change — omitted fields stay untouched.

`imageUrls` REPLACES the existing array (deliberate — your
CMS stays canonical). To append a single image without
rewriting the list, use the multipart upload endpoint.
`description: null` clears the description (distinct from
omitting the key).

## Headers

- `Idempotency-Key` string

## Request body

- UpdateProductInput: Send only the keys you want to change. `imageUrls` REPLACES the existing array. `description: null` clears the description.
  - `name` string
  - `model` string
  - `description` string, nullable
  - `defaultFieldValues` object: Seed values for passports created from this product, keyed by template field. Each value is checked against the template: a numeric string for a number field is stored as a number, and any other value the template rejects answers 400 `Invalid default field values` with `details` (in a batch, that item's result is an error).
  - `imageUrls` string[]
  - `status` 'active' | 'archived'
  - `sourceLocale` string

## Response `200`

Product updated.

- Product
  - `_id` string: MongoDB ObjectId hex string (24 chars).
  - `name` string
  - `model` string
  - `category` string
  - `templateId` string: MongoDB ObjectId hex string (24 chars).
  - `defaultFieldValues` object: Seed values for passports created from this product, keyed by template field. Each value is checked against the template: a numeric string for a number field is stored as a number, and any other value the template rejects answers 400 `Invalid default field values` with `details` (in a batch, that item's result is an error).
  - `imageUrls` string[]
  - `passportCount` integer
  - `status` 'active' | 'archived'
  - `sourceLocale` string
  - `createdAt` string, date-time
  - `updatedAt` string, date-time

## Other responses

- `400`: Validation error or malformed request.
- `401`: Missing or invalid API key.
- `404`: Resource doesn't exist or is in a different workspace.
- `409`: Conflict — duplicate model on a product, GTIN registered to a different tenant, serial collision within a GTIN.
- `422`: Idempotency-Key reused with a different request body. Use a new key for the new request, or reuse the original body.
- `429`: Daily v1 write or passport-read budget exhausted. Resets at 00:00 UTC.

---

[API](https://skmtc.dev/tracepass/apis/tracepass-api.md) · [All operations](https://skmtc.dev/tracepass/apis/tracepass-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tracepass/apis/tracepass-api/revisions/60ddeb25638b?raw)
