Skip to main content
GET
Get a feedback record

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.

Response

Feedback record retrieved

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