Submit a signal
Create a private feedback signal for the brand behind a scanned product. Requires an authenticated (social-auth) consumer. category and sentiment are stable codes, never labels. contact_email (if given) must be one of the consumer’s own verified addresses.
Abuse & safety baseline (C-3316 / C-3400): rate-limited per identity — a low daily cap (~3/day) plus an hourly anti-flood cap and a per-year ceiling — and per IP. Feedback is a rare action, so the caps are deliberately tight; exceeding any of them returns 429 with a friendly message and creates no records. Identical rapid resubmits are deduped (return the original, no duplicate). A banned identity is rejected with 403. An oversized body returns 422. Profanity/abuse heuristics flag the signal for review but never block it.
Authorizations
Body
Payload to submit a new signal (consumer-facing).
GTIN of the product the signal is about, from the resolution context.
Category code the consumer picked (e.g. quality_issue). Must be a known signal-category code — stable and language-independent, never a translated label.
Freeform feedback text. May be empty for a voice-only signal.
Optional consumer-declared sentiment code (positive / neutral / negative). Omit or null if the consumer declined — Closient never infers sentiment.
Optional batch/lot identifier (GS1 AI 10) from the scan; matched to a known lot of the product.
URL-safe 22-character shortuuid encoding of the row's UUID primary key. Stable across the row's lifetime; suitable for sharing in URLs, log lines, and external SDK clients. Accepted on input as either the shortuuid form or the canonical UUID form (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$Explicit opt-in to be contacted by the brand about this feedback.
Email address the consumer agrees to be contacted at. Must be one of the consumer's own verified account email addresses. Required-shaped only when contact_consent is true.
Response
Created
A signal as the consumer (submitter) sees it.
Carries the full set of consumer-owned fields. category and
sentiment are stable codes, never labels. Identifier context
(gtin / batch / serial) is surfaced as the human-facing
identifier string, not the internal row id.
Public short-UUID identifier of the signal.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$GTIN of the product this signal is about (the product's GTIN-14 string).
Consumer-picked category as a stable, language-independent code (e.g. quality_issue, packaging_problem). Never a translated label — translation is display-side only.
Freeform feedback text the consumer wrote (may be empty for voice-only signals).
Lifecycle code: active or revoked.
Whether the consumer opted in to be contacted by the brand about this feedback.
True when a voice capture session backs this signal (audio handled out-of-band; not exposed here).
ISO-8601 timestamp the signal was submitted.
ISO-8601 timestamp the signal was last modified.
Batch/lot identifier (GS1 AI 10) carried from the scan context, or null if the scan carried none.
Serialized-unit context carried from the scan, or null. Currently the linked serial pool's public id when a serialized scan was wired through; bare-API submissions leave this null (serial linkage is set by the scan/voice pipeline, C-3314).
Optional consumer-declared sentiment as a stable code (positive / neutral / negative), or null if the consumer declined to declare one. Never inferred by Closient.