V3 Feedback Records

Update a feedback record

Changed on

Changes the answer, language, user_id or metadata of one record. Only the members sent are changed; provenance (tenant_id, source_*, field_*, submission_id, collected_at) is immutable. Requires an API key with write permission (or higher) on a workspace the record's dataset is assigned to, and the dataset must be assigned to exactly one workspace — see the delete operation for why.

Two behaviours are silent and worth knowing: metadata is replaced, not merged; and changing value_text clears the enrichment members (sentiment, sentiment_score, emotions, value_text_translated, translation_lang_key) and queues re-enrichment and re-embedding — the response shows them absent until that completes. Changing language clears and re-queues the translation pair only.

patch/api/v3/feedbackRecords/{id}

Request

  • Base URL
    https://app.formbricks.com
  • URL
    https://app.formbricks.com/api/v3/feedbackRecords/{id}
  • Auth
    API key in header x-api-key

Path parameters

idstring 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.

Request body

value_textstring

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.

value_idstring

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

value_numbernumber double

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

value_booleanboolean

New yes / no answer.

value_datestring date-time

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

languagestring

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

user_idstring

New end-user identifier.

metadataobject nullable

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

idstring uuid required

UUIDv7 primary key.

tenant_idstring cuid2 required

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

collected_atstring date-time required

When the feedback was given.

created_atstring date-time required

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

updated_atstring date-time required

When the record was last changed.

source_typestring required

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

source_idstring

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

source_namestring

Human-readable name of the source.

submission_idstring 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_idstring required

Identifier of the question / field.

field_labelstring

The question text.

field_group_idstring

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

field_group_labelstring

Human-readable question text for the group.

field_type'text' | 'categorical' | 'nps' | 'csat' | 'ces' | 'rating' | 'number' | 'boolean' | 'date' required

The type of a feedback field, which determines which value_* member carries the answer: text → value_text (the only enrichable type), categorical → value_text + value_id, nps / csat / ces / rating / number → value_number, boolean → value_boolean, date → value_date.

languagestring

ISO language code the feedback was given in.

user_idstring

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

value_textstring

Text answer.

value_idstring

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_numbernumber double

Numeric answer (ratings, NPS scores, numbers).

value_booleanboolean

Yes / no answer.

value_datestring date-time

Date answer.

sentiment'very_negative' | 'negative' | 'neutral' | 'positive' | 'very_positive' | 'mixed'

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

sentiment_scorenumber double

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

emotionsFeedbackRecordEmotion[]

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.

value_text_translatedstring

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

translation_lang_keystring

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

Changes