---
title: "response.completed"
method: POST
path: "response.completed"
tags: ["Webhooks"]
---

# response.completed

`POST response.completed` (webhook)

A participant completed a response

## Payload

- object
  - `id` string, required: Event ID. Retries of the same event reuse it, so dedupe on it.
  - `type` 'response.completed', required
  - `created_at` string, date-time, required
  - `data` object, required
    - `response` WebhookEventResponse: The response without its transcript. Read the transcript with GET /api/v1/responses/{response_id}.
      - `id` string, required: Response ID
      - `study_id` string, required: ID of the study
      - `distribution_id` string, nullable, required: ID of the distribution the participant came through. Null for a preview.
      - `segment_id` string, nullable, required: ID of the segment the participant was recruited for
      - `status` 'created' | 'opened' | 'incomplete' | 'completed' | 'in_progress', required: Where the response is in its lifecycle. `created`: the link was opened but the welcome screen was not passed. `opened`: the respondent passed the welcome screen. `in_progress`: the respondent answered at least one question. `completed`: the interview finished. `incomplete`: the respondent left before the end, or was screened out.
      - `status_reason` 'exited_welcome_screen' | 'exited_paused_screen' | 'started_interview' | 'screened_out' | 'interview_error' | 'spam' | 'hit_time_limit' | 'answered_all_questions' | 'content_filter' | 'inactive_timeout' | 'recording_stopped' | 'quota_full', nullable, required: Why the response has its status. `answered_all_questions` and `hit_time_limit` go with `completed`. `exited_welcome_screen`, `exited_paused_screen`, `screened_out`, `quota_full`, `inactive_timeout`, `recording_stopped`, `interview_error`, `content_filter` and `spam` go with `incomplete`. `started_interview` goes with `in_progress`.
      - `mode` 'preview' | 'production' | 'simulation', required: The environment the response was collected in. `production` responses come from real participants. `preview` responses come from the dashboard preview. `simulation` responses come from AI simulated participants. Previews and simulations do not count toward quotas, and only `production` responses fire webhooks.
      - `format` 'video' | 'audio' | 'chat' | 'audio_only' | 'chat_only', required: How the respondent answered the open-ended questions. `video` records the camera. `audio` and `audio_only` record the voice. `chat` and `chat_only` are typed. An `_only` value means the study offered no other input.
      - `language` string, required: ISO 639-1 code of the language the participant took the interview in
      - `custom_id` string, nullable, required: Your own participant ID, read from the `cid` query parameter of the study link
      - `query_params` union, required
        - string
        - number
        - boolean
        - Json[]
        - object
      - `seconds_elapsed` number, required: Seconds the participant spent in the interview
      - `quality_score` union, required
        - string
        - number
        - boolean
        - Json[]
        - object
      - `seq_num` integer, nullable, required: The response number shown in the dashboard. It counts up from 1 within the study.
      - `opened_at` string, date-time, nullable, required: When the participant passed the welcome screen
      - `first_message_at` string, date-time, nullable, required: When the participant answered the first question
      - `last_message_at` string, date-time, nullable, required: When the transcript last changed
      - `created_at` string, date-time, nullable, required: When the link was opened
      - `updated_at` string, date-time, nullable, required: When the response last changed

## Acknowledgement `2XX`

Return any 2xx status within 10 seconds to acknowledge the event.

---

[API](https://skmtc.dev/voicepanel/apis/voicepanel-api.md) - [All operations](https://skmtc.dev/voicepanel/apis/voicepanel-api/llms.txt) - [OpenAPI document](https://skmtc.dev/voicepanel/apis/voicepanel-api/revisions/ee41535c5694?raw)
