Skip to main content
PATCH

Authorizations

x-api-key
string
header
required

Management API key; must include workspaceId as an allowed workspace with read, write, or manage permission.

Path Parameters

id
string<uuid>
required

Feedback record id (UUID). The dataset is resolved from the record itself, so the caller cannot choose which dataset it is authorized against. An id that is not a UUID answers 400, and an id whose dataset the API key cannot reach answers 403 rather than 404, so ids cannot be probed. The gateway caches the record→dataset lookup for 60 seconds, so for up to a minute after a delete the id is still authorized and the store answers 404; after that the same id answers 403.

Body

application/json

A partial update. Only the members sent are changed; an empty body is accepted and changes nothing. Provenance (tenant_id, source_*, field_*, submission_id, collected_at) is immutable.

value_text
string

New text answer. Changing it clears the server-generated enrichment members (sentiment, sentiment_score, emotions, value_text_translated, translation_lang_key), queues re-enrichment and re-embedding, and the response reflects the cleared state.

Maximum string length: 30000
value_id
string

New stable option id for a choice answer. Opaque, not validated.

Maximum string length: 255
value_number
number<double>

New numeric answer. Must be between -1e15 and +1e15.

Required range: -1000000000000000 <= x <= 1000000000000000
value_boolean
boolean

New yes / no answer.

value_date
string<date-time>

New date answer. Must be between 1970-01-01 and 2080-12-31.

language
string

New ISO language code. Changing it clears and re-queues the translation pair only.

Maximum string length: 10
user_id
string

New end-user identifier.

Maximum string length: 255
metadata
object | null

Replaces the stored metadata wholesale — it is not merged, so send every key you want to keep. Same value rules and 400 rejections as on create.

Response

Feedback record updated

One piece of feedback in the normalized Feedback Record shape. Field names are snake_case: the payload is the Hub's, passed through the API gateway unchanged. Optional members are absent (not null) when unset.

id
string<uuid>
required

UUIDv7 primary key.

tenant_id
string<cuid2>
required

The feedback dataset this record belongs to (the dataset id, as shown by the MCP list_feedback_datasets tool).

collected_at
string<date-time>
required

When the feedback was given.

created_at
string<date-time>
required

When the record was stored. Diverges from collected_at on a historical re-import.

updated_at
string<date-time>
required

When the record was last changed.

source_type
string
required

Type of feedback source, e.g. survey, review, feedback_form.

submission_id
string
required

Identifier of the logical submission this record belongs to (e.g. a response id). Records are unique per (tenant_id, submission_id, field_id).

field_id
string
required

Identifier of the question / field.

field_type
enum<string>
required

The type of a feedback field, which determines which value_* member carries the answer: textvalue_text (the only enrichable type), categoricalvalue_text + value_id, nps / csat / ces / rating / numbervalue_number, booleanvalue_boolean, datevalue_date.

Available options:
text,
categorical,
nps,
csat,
ces,
rating,
number,
boolean,
date
source_id
string

Reference to the survey / form / ticket the record came from.

source_name
string

Human-readable name of the source.

field_label
string

The question text.

field_group_id
string

Stable identifier grouping related fields (ranking, matrix and grid questions).

field_group_label
string

Human-readable question text for the group.

language
string

ISO language code the feedback was given in.

user_id
string

End-user identifier (e.g. an anonymous id or an email hash).

value_text
string

Text answer.

value_id
string

Stable id of the selected option in the source system (e.g. a survey choice id), stored alongside value_text so choice answers keep their identity across label edits and languages. Opaque. Absent for free-text and non-choice answers.

value_number
number<double>

Numeric answer (ratings, NPS scores, numbers).

value_boolean
boolean

Yes / no answer.

value_date
string<date-time>

Date answer.

metadata

Arbitrary context stored with the record and returned with equivalent values (key order and number formatting are normalized). Omitted when the record has no metadata; a record explicitly stored with a JSON null returns null. An object is the supported shape and the only one the write operations accept; the wider union exists so records written before that convention still deserialize.

sentiment
enum<string>

Sentiment polarity label inferred from value_text by the sentiment enrichment: five ordinal levels plus a distinct mixed. Server-generated and read-only.

Available options:
very_negative,
negative,
neutral,
positive,
very_positive,
mixed
sentiment_score
number<double>

Signed sentiment polarity from -1.0 (very negative) to 1.0 (very positive). Read-only; absent until the record is enriched.

Required range: -1 <= x <= 1
emotions
enum<string>[]

Emotions inferred from value_text; multi-label from a fixed set. Read-only, and never an empty array — the column is either absent or has at least one label. Absent covers two different states: not yet classified, and classified with no emotion detected. Do not read absence as "not enriched yet"; has_emotions=false selects both, and the enrichment-status endpoint is what distinguishes them.

Minimum array length: 1

A single emotion label inferred from value_text by the emotion enrichment (the six Ekman basic emotions). Emotions are multi-label, so a record carries zero or more of these; "mixed" is not a label, it is two or more present at once. Server-generated and read-only.

Available options:
joy,
anger,
sadness,
fear,
surprise,
disgust
value_text_translated
string

value_text translated into the dataset's configured target language. Read-only; absent until the record is enriched.

translation_lang_key
string

BCP-47 locale that value_text_translated was produced in. Read-only; absent until the record is enriched.

Maximum string length: 35