Skip to main content
A Product is returned as a JSON object with 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 400 invalid_payload. Input is normalized to GTIN-14 before storage.
Pass 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.
article_ids and category_ids are replace-only. Send the full desired set every time; omit a field to leave it untouched; pass [] to detach everything. Every id must belong to your organization, or the request is rejected with 422 unprocessable. Linked knowledge only applies while this product sends visitors to a chatbot.

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 with GET /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.

Images

Images are documented in detail under Images on the overview. The wire shape: