Skip to main content
GET
List feedback records

Authorizations

x-api-key
string
header
required

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

Query Parameters

tenant_id
string<cuid2>
required

The feedback dataset to operate on (the dataset id, as shown by the MCP list_feedback_datasets tool). Required by the gateway on this operation: a missing or malformed value answers 400 before the request reaches the feedback store, and a dataset the API key's workspace is not assigned to answers 403. The two POST operations take the same value in the request body instead, and the single-record operations derive it from the record.

submission_id
string[]

Records belonging to any of these logical submissions (e.g. response ids).

Maximum array length: 100
Maximum string length: 255
source_type
string[]

Records from any of these source types, e.g. survey, review.

Maximum array length: 100
Maximum string length: 255
source_id
string[]

Records from any of these sources (e.g. survey ids).

Maximum array length: 100
Maximum string length: 255
source_name
string[]

Records whose source display name is any of these. Prefer source_id where records carry one: a name can be edited or translated, the id is stable.

Maximum array length: 100
Maximum string length: 255
field_id
string[]

Every answer to any of these questions.

Maximum array length: 100
Maximum string length: 255
field_group_id
string[]

Records in any of these field groups (ranking / matrix questions).

Maximum array length: 100
Maximum string length: 255
field_type
enum<string>[]

Records of any of these field types. An empty value is ignored, so ?field_type= equals omitting the filter.

Maximum array length: 9

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
value_id
string[]

Records whose selected option id is any of these (e.g. every pick of one survey choice).

Maximum array length: 100
Maximum string length: 255
user_id
string[]

Everything any of these end users submitted.

Maximum array length: 100
Maximum string length: 255
language
string[]

Records given in any of these languages (ISO codes).

Maximum array length: 100
Maximum string length: 10
since
string<date-time>

collected_at >= since (ISO 8601, inclusive). Must be between 1970-01-01 and 2080-12-31.

until
string<date-time>

collected_at <= until (ISO 8601, inclusive).

created_since
string<date-time>

created_at >= created_since (ISO 8601, inclusive). created_at is when the record was stored; collected_at (see since) is when the feedback was given. They diverge on a historical re-import, so this is the filter for "what did this import bring in".

created_until
string<date-time>

created_at <= created_until (ISO 8601, inclusive).

value_number_min
number<double>

value_number >= value_number_min (inclusive), e.g. NPS promoters with value_number_min=9. Records without a numeric answer are excluded. A max below the min answers 400.

value_number_max
number<double>

value_number <= value_number_max (inclusive). Paired with the min it selects a band: 9..10 promoters, 0..6 detractors.

value_date_min
string<date-time>

value_date >= value_date_min (inclusive) — bounds the answer to a date question, not when the feedback was collected.

value_date_max
string<date-time>

value_date <= value_date_max (inclusive).

sentiment
enum<string>[]

Records carrying any of these sentiment labels. An empty value is ignored.

Maximum array length: 6

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
emotions
enum<string>[]

Records tagged with any of these emotions: a record tagged {joy} and one tagged {joy, anger} both match ?emotions=joy&emotions=anger. There is no "all of them" form.

Maximum array length: 6

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
sentiment_score_min
number<double>

sentiment_score >= sentiment_score_min (inclusive). The score is continuous where the label is bucketed, so this is the filter for "the most negative feedback".

Required range: -1 <= x <= 1
sentiment_score_max
number<double>

sentiment_score <= sentiment_score_max (inclusive).

Required range: -1 <= x <= 1
has_sentiment
boolean

true selects enriched records (a sentiment label is present), false the not-yet-enriched ones. Omit for no constraint.

has_emotions
boolean

true selects records carrying emotion labels, false those without. Note false covers both "not yet classified" and "classified, no emotion detected".

has_translation
boolean

true selects translated records, false untranslated ones. Omit for no constraint.

sort
enum<string>
default:collected_at

Column to order by. Only columns that are non-null and immutable after insert are offered: a mutable sort key would let a row move across the cursor between pages and be skipped.

Available options:
collected_at,
created_at
order
enum<string>
default:desc

Sort direction. Rows tied on the sort column are ordered by id ascending.

Available options:
asc,
desc
limit
integer
default:100

Page size. Out-of-range and non-numeric values are rejected — -5 and 1001 answer 400 — with one exception: limit=0 is indistinguishable from omitting the parameter, so it is accepted and the default of 100 applies. Send no limit rather than 0 if you are computing it. The search operations behave differently again: they clamp instead of rejecting.

Required range: 1 <= x <= 1000
cursor
string

Opaque keyset cursor returned as next_cursor by the previous page. Omit on the first request. A cursor is a position within one specific ordering: presenting it with a different sort or order answers 400 — restart without a cursor instead.

Response

Feedback records retrieved successfully

data
object[]
required
limit
integer
required

The page size that was applied.

next_cursor
string

Opaque keyset cursor for the next page. Present only when there may be more results; absent on the last page. Pass it back unchanged as cursor, with the same sort and order.