Update a product
Edits catalog metadata. Scope: products:write.
pos_refis never editable - POS mappings are owned by the synclocation_idis immutable - create a separate entry at the other location- No DELETE: archive with
is_active: false(historical line items keep resolving)
Editing a POS-synced product’s name/category is allowed but the next full POS sync may overwrite them - prefer editing at the POS for synced entries.
Authorizations
Your secret API key as a Bearer token: Authorization: Bearer vxn_sk_.... Keys are created and scoped in the dashboard - see Authentication.
Headers
Recommended on PATCH and DELETE for safe retries.
8 - 255Path Parameters
Product identifier (prd_ prefix).
^prd_[A-Za-z0-9]+$Body
Editable fields. pos_ref is never editable (owned by the sync); location_id is immutable (create a new entry at the other location). Archive with is_active: false - there is no DELETE.
New display name - plain string or per-language object (SET semantics on the whole value).
1 - 200"Flat White"
New correlation key (unique per location) - or null to clear.
1 - 64New category, or null to clear.
1 - 100Replacement tag list (SET semantics).
New reference price, or null to clear. Maximum 100,000,000,000.
0 <= x <= 100000000000False archives the product (stays resolvable on historical line items).
Response
Updated product.
A catalog entry for correlating transaction line items to real products. Catalogs are per-location (each location can run a different POS with a different menu), unified under the organization: list org-wide, filter by location_id.
This is a loyalty correlation catalog, not an inventory system - no variants, modifiers, or stock levels.
Product identifier, prd_ prefix. Stable forever - line items resolve to it.
^prd_[A-Za-z0-9]+$"prd_01HW9R7T2CD8N8MTX1RVPRDFW1"
Always "product".
"product"The location this catalog entry belongs to. The same drink sold at two locations is two Product records (each mapped to its own POS).
^loc_[A-Za-z0-9]+$"loc_01HW9R4P2ZK7N8MTX1RVLOCS01"
Display name - plain string or per-language object, the same localization pattern as Card.name. POS-synced entries arrive with the till's single-language name; supply per-language names on manual/API entries when your audience is multilingual (border stores, tourist areas). Notifications and future product-facing surfaces resolve the name in the customer's language.
1 - 200"Flat White"
Where this catalog entry originated. Known values: pos (synced from the location's connected POS), manual (dashboard), api (created via POST /v1/products). Server-stamped - treat as an open set.
"pos"
False = archived (delisted from the POS or manually retired). Archived products stay resolvable on historical line items - there is no hard delete.
true
Unix seconds.
1750000000
Your stable key, unique per location (two locations may both use FW-12). This is what transaction line items correlate on.
1 - 64"FW-12"
Free-form category for basket analytics.
1 - 100"drinks"
Merchant-owned filing aid, and part of the search haystack alongside the name. NEVER populated by POS sync: no POS system sends tags, so a source: "pos" entry arrives untagged. You can tag one yourself with PATCH /v1/products/{id} (tags are an overlay field, unlike pos_ref and source, which sync owns), and it becomes findable by that tag immediately. Sending [] clears them and removes them from the search haystack.
Reference price in minor units. Informational - the POS bill is authoritative at transaction time.
x >= 0350
The POS mapping for this location's adapter. Read-only, owned by the sync - never editable via API. Null for manual/API entries. The POS vendor name is never surfaced.
null
Unix seconds of last change.
1750000000