Receive individual question responses and clicks, with viewer and session IDs.
Receive one recorded answer, click, or other interaction. The top-level id identifies the event. parent_id identifies the authored question, button, or other annotation.
Use this webhook to store individual answers or connect a button click to an action in your application. See Webhooks for setup and delivery handling.
Example: a question response
Alex answered a multiple-choice question. type_of is reply, parent_type is question, and value contains the answer. This complete example uses fictional data.
{
"id": "70000000-0000-4000-8000-000000000001",
"video_title": "Workplace safety introduction",
"type_of": "reply",
"value": "Report the hazard",
"time": 30,
"finish": null,
"parent_id": "80000000-0000-4000-8000-000000000001",
"parent_type": "question",
"parent_value": "What should you do if you find a hazard?",
"click_action": null,
"click_value": null,
"viewer_name": "Alex Morgan",
"viewer_email": "[email protected]",
"viewer_phone": null,
"viewer_custom_id": "employee-1042",
"style": "multiple",
"answers": null,
"correct_answer": "Report the hazard",
"correct": true,
"view_id": "60000000-0000-4000-8000-000000000001",
"video_id": "40000000-0000-4000-8000-000000000001",
"url": "https://share.mindstamp.com/w/exampleVideo",
"viewer_id": "50000000-0000-4000-8000-000000000001",
"created_at": "2026-09-08T14:00:34.000Z",
"updated_at": "2026-09-08T14:00:34.000Z",
"group_id": "30000000-0000-4000-8000-000000000001",
"group_name": "New employee training",
"series_id": null,
"series_name": null,
"variables": {
"department": "Operations",
"course_id": "safety-intro"
},
"export_count": 0,
"video_owner_id": "20000000-0000-4000-8000-000000000001",
"response_time": null,
"internal_label": null
}
Example: a button click
Alex clicked the safety guide button. click_action is link, and click_value contains the destination URL.
{
"id": "70000000-0000-4000-8000-000000000002",
"video_title": "Workplace safety introduction",
"type_of": "click",
"value": "Open safety guide",
"time": 90,
"finish": null,
"parent_id": "80000000-0000-4000-8000-000000000002",
"parent_type": "button",
"parent_value": "Open safety guide",
"click_action": "link",
"click_value": "https://example.com/safety-guide",
"viewer_name": "Alex Morgan",
"viewer_email": "[email protected]",
"viewer_phone": null,
"viewer_custom_id": "employee-1042",
"style": null,
"answers": null,
"correct_answer": null,
"correct": null,
"view_id": "60000000-0000-4000-8000-000000000001",
"video_id": "40000000-0000-4000-8000-000000000001",
"url": "https://share.mindstamp.com/w/exampleVideo",
"viewer_id": "50000000-0000-4000-8000-000000000001",
"created_at": "2026-09-08T14:01:32.000Z",
"updated_at": "2026-09-08T14:01:32.000Z",
"group_id": "30000000-0000-4000-8000-000000000001",
"group_name": "New employee training",
"series_id": null,
"series_name": null,
"variables": {
"department": "Operations",
"course_id": "safety-intro"
},
"export_count": 0,
"video_owner_id": "20000000-0000-4000-8000-000000000001",
"response_time": null,
"internal_label": null
}
Use this payload
Use parent_id to map the event to a known question or button. Use viewer_custom_id to find a learner in your application. view_id links the event to its view webhook.
if (body.parent_type === 'question') {
const answer = {
mindstampInteractionId: body.id,
questionId: body.parent_id,
learnerId: body.viewer_custom_id,
response: body.value,
correct: body.correct,
recordedAt: body.created_at
};
// Insert using a unique constraint on mindstampInteractionId.
}
Keep false and null distinct: false is a wrong answer; null means no correctness result is stored. A button-click event confirms the click. It does not confirm that the destination loaded or that a purchase took place.
Field reference
The current player leaves some legacy fields empty. Do not require finish, answers, response_time, or internal_label. An answers value, when stored, is text in the current model.
| Field | JSON type | Description |
|---|---|---|
id | string | Mindstamp record ID. See the page introduction for its record type. |
video_title | string or null | Video title. |
type_of | string or null | Recorded event type. Examples: click, reply, comment, video, audio, image, or drawing. |
value | string or null | Response or clicked content. Media responses can contain an asset ID or URL. For a drawing value that contains base64, the serializer sends an empty string. |
time | integer or null | Playback position in seconds when the current player records the event. |
finish | integer or null | Stored finish time in seconds. The current player does not fill this field. |
parent_id | string or null | ID of the authored question, button, or other annotation. Use this to map the event to your application. Standalone events can use a placeholder parent ID. |
parent_type | string or null | Authored annotation type, such as question, button, hotspot, text, or image. |
parent_value | string or null | Question prompt or annotation content recorded with the event. |
click_action | string or null | Configured click action, such as link, jump, or collect. |
click_value | string or null | Parameter for the click action, such as a URL. |
viewer_name | string or null | Viewer name. An unidentified viewer can have an anonymous display name. |
viewer_email | string or null | Viewer email, when available. |
viewer_phone | string or null | Viewer phone, when available. |
viewer_custom_id | string or null | Your identifier for the viewer, when supplied. |
style | string or null | Question type for a question response, such as multiple, free, all, or rating. |
answers | string or null | Legacy stored answer-options text. The current player does not fill it. Do not require an array here. |
correct_answer | string or null | Recorded correct-answer value, when the question supplies one. |
correct | boolean or null | True means correct; false means incorrect. Null means no correctness result is stored. |
view_id | string or null | View ID. Matches id in a view webhook. |
video_id | string | Video ID. |
url | string or null | Recorded playback URL. The host and path depend on how the viewer opened the video. |
viewer_id | string or null | Viewer ID. Matches id in a lead webhook. Some older interactions use a user ID as a fallback. |
created_at | string or null | Record creation time as an ISO 8601 timestamp. |
updated_at | string or null | Record update time as an ISO 8601 timestamp. |
group_id | string or null | Group ID, when available. |
group_name | string or null | Group name, when available. |
series_id | string or null | Playlist ID. The field name uses the older term series. |
series_name | string or null | Recorded playlist name. |
variables | object or null | Stored variables. Values can have different JSON types. Privacy settings can remove values. The lowercase setting can change key names. |
export_count | integer | Stored legacy export counter. The interaction webhook sender does not increment this field. Do not use it to count deliveries. |
video_owner_id | string or null | ID of the video owner. |
response_time | integer or null | Legacy response-time value, documented in milliseconds. The current player does not fill this field. |
internal_label | string or null | Stored annotation label, when available. The current ingestion path does not retain this field from the player. Use parent_id for routing. |
Avoid duplicate actions
Store interaction IDs that your application has processed. If the same ID arrives again, return success without repeating the action. A view webhook can include the same interaction in its interactions array. Use the same ID constraint for both paths.
Media responses can contain an asset ID rather than a public file URL. Do not construct a download URL from value without checking the response type and the asset access method.