Interaction Webhooks

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.

FieldJSON typeDescription
idstringMindstamp record ID. See the page introduction for its record type.
video_titlestring or nullVideo title.
type_ofstring or nullRecorded event type. Examples: click, reply, comment, video, audio, image, or drawing.
valuestring or nullResponse 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.
timeinteger or nullPlayback position in seconds when the current player records the event.
finishinteger or nullStored finish time in seconds. The current player does not fill this field.
parent_idstring or nullID 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_typestring or nullAuthored annotation type, such as question, button, hotspot, text, or image.
parent_valuestring or nullQuestion prompt or annotation content recorded with the event.
click_actionstring or nullConfigured click action, such as link, jump, or collect.
click_valuestring or nullParameter for the click action, such as a URL.
viewer_namestring or nullViewer name. An unidentified viewer can have an anonymous display name.
viewer_emailstring or nullViewer email, when available.
viewer_phonestring or nullViewer phone, when available.
viewer_custom_idstring or nullYour identifier for the viewer, when supplied.
stylestring or nullQuestion type for a question response, such as multiple, free, all, or rating.
answersstring or nullLegacy stored answer-options text. The current player does not fill it. Do not require an array here.
correct_answerstring or nullRecorded correct-answer value, when the question supplies one.
correctboolean or nullTrue means correct; false means incorrect. Null means no correctness result is stored.
view_idstring or nullView ID. Matches id in a view webhook.
video_idstringVideo ID.
urlstring or nullRecorded playback URL. The host and path depend on how the viewer opened the video.
viewer_idstring or nullViewer ID. Matches id in a lead webhook. Some older interactions use a user ID as a fallback.
created_atstring or nullRecord creation time as an ISO 8601 timestamp.
updated_atstring or nullRecord update time as an ISO 8601 timestamp.
group_idstring or nullGroup ID, when available.
group_namestring or nullGroup name, when available.
series_idstring or nullPlaylist ID. The field name uses the older term series.
series_namestring or nullRecorded playlist name.
variablesobject or nullStored variables. Values can have different JSON types. Privacy settings can remove values. The lowercase setting can change key names.
export_countintegerStored legacy export counter. The interaction webhook sender does not increment this field. Do not use it to count deliveries.
video_owner_idstring or nullID of the video owner.
response_timeinteger or nullLegacy response-time value, documented in milliseconds. The current player does not fill this field.
internal_labelstring or nullStored 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.