object: "product". Every field on every response is documented below.
Example
Identifiers
string
required
Always
"product". Lets you distinguish object types when piping mixed
responses through generic handlers.string (uuid)
required
Stable UUID. Generated by Awardee on
POST. Use this for all subsequent
reads, updates, and deletes.string
required
Operator-facing product name. Free-form. Not required to be unique. Defaults
to an empty string on
POST if omitted — set one for any product you want to
recognize in the dashboard.string | null
GS1 Global Trade Item Number. Always GTIN-14, left-padded with zeros. On write, the input must be exactly 8, 12, 13, or 14 digits — GTIN-8, GTIN-12 (UPC-A), GTIN-13 (EAN-13), or GTIN-14. Any other length is rejected with Pass
400 invalid_payload. Input is normalized to GTIN-14 before storage.null to clear, or omit on PATCH to leave untouched.string | null
Free-form description. Operator-facing only — not rendered to scanning
consumers.
Destination
object
required
The routing target for GS1 scans of this product’s GTIN. Always present as an object; the inner fields are mutually exclusive — exactly one of
chatbot, page, knowledge_base, or url is non-null when type is set.Knowledge
Knowledge linked to this product itself, on top of the chatbot’s own. When a visitor scans it and lands on a chatbot, the chatbot searches its own knowledge plus these articles and folders, so item-specific content (the manual for the TV in one room) lives here instead of on the shared chatbot. See Scan-specific knowledge.string[]
required
UUIDs of Articles linked to this product. Write the desired set with
article_ids and the join is fully replaced.string[]
required
UUIDs of Article Categories linked to this product. Every article inside a linked category and its sub-categories (now and in future) is included.
Status
string
required
One of
unconfigured, active, inactive, archived.Metadata
object
required
Free-form JSON object (
Record<string, unknown>). Returned verbatim. Use it for integration-owned fields that don’t deserve a column — vintage, ABV, internal SKU codes, feature flags, anything.Replaces wholesale on PATCH. Defaults to {} on create.Stats
integer
required
Lifetime count of resolved GS1 scans for this product. Increments on every
product.scanned event. Read-only.string (datetime) | null
ISO 8601 timestamp of the most recent resolved scan, or
null if never
scanned. Read-only.Timestamps
string (datetime)
required
When the row was inserted. ISO 8601.
string (datetime)
required
When the row last changed. ISO 8601. Updates on every
PATCH and on internal
mutations (e.g. scan stamps).Properties
Products support a satellite key/value list — list withGET /products/{id}/properties, replace as a set with PUT /products/{id}/properties. Each property has its own shape:
string
required
Property name. Free-form; case-sensitive. Operator-defined.
string
required
Property value, always serialized as a string. Convert client-side if you need
typed values.
integer
required
Display order. Awardee stores properties as a sorted list —
PUT preserves
the order you send.
