NeuroLup Response Data Reference
- Activity Response Data: Response data for participant activity completions
- Exercises: Per-exercise response formats and their schema versions
- Assessment Response Data: Legacy format, superseded by activities (deprecated)
- Form Response Data: Legacy format, superseded by activities (deprecated)
Introduction
An activity is an assessment composed of one or more response units, i.e., the building blocks a participant completes. A response unit is either an exercise (a cognitive task such as DSST or Finger Tapping) or a questionnaire (form). This unified model replaces the earlier separate result formats for Assessments and Forms; those sections of this documentation remain available for previously recorded data but will be deprecated once this model is live.
When a participant completes an activity, the system generates an activity response: a JSON object with two top-level parts:
-
activity_metadata: Who, what, when, and on which device -
response_units: The recorded data for each exercise and questionnaire in the activity
Exercise response data is versioned per exercise: each exercise unit declares a schema_version, and one activity result may contain different exercises at different schema versions. See Exercise Response Units.
Example Activity Result
{
"activity_metadata": {
"participant_id": "participant@example.com",
"mode": "program",
"program_name": "Test All Exercises",
"activity_name": "DSST",
"occurrence_number": 2,
"admin": "admin@example.com",
"created_at": "2026-06-22T14:44:12.354000",
"updated_at": "2026-06-22T14:44:12.354000",
"device_info": {
"manufacturer": "Apple",
"model_name": "iPhone 14 Pro",
"system_name": "iOS",
"system_version": "26.5",
"type": "iPhone",
"app_info": {
"id": "com.relup.dev",
"language": "en-US",
"version": "26.4.0"
}
}
},
"response_units": {
"iBvg06QuAN": {
"type": "exercise",
"offlineMode": false,
"startedAt": "2026-06-22T14:40:03.000Z",
"completedAt": "2026-06-22T14:42:41.000Z",
"data": {
"schema_version": 1,
"exercise_id": "exercise06",
"exercise_version": 2,
"exercise_metadata": { "...": "see the exercise's documentation" },
"exercise_result": [1, 0, 1, 1],
"exercise_response": { "events": ["..."] }
}
},
"k2VqPzXw9L": {
"type": "form",
"offlineMode": false,
"startedAt": "2026-06-22T14:43:10.000Z",
"completedAt": "2026-06-22T14:44:05.000Z",
"data": [
{ "index": 0, "fieldType": "section", "questionsIdx": [1, 2] },
{ "index": 1, "fieldType": "question", "questionType": "singleSelectMCQ",
"answer": "Yes", "isOtherAnswer": false },
{ "index": 2, "fieldType": "question", "questionType": "number", "answer": 7 }
]
}
}
} Activity Metadata
Contextual information about the completed activity.
| Field | Type | Description |
|---|---|---|
participant_id |
string | Identifies the participant who completed the activity. |
mode |
string | How the activity was administered, e.g. program. |
program_name |
string | Name of the program the activity belongs to. |
activity_name |
string | Name of the activity as configured in the program. |
occurrence_number |
number | Indicates the position in the sequence of occurrences in the activity schedule. |
admin |
string | Email address identifying the admin |
created_at |
date (ISO 8601) | When the response record was created. |
updated_at |
date (ISO 8601) | When the response record was last updated. |
device_info |
object | The device the activity was completed on. See Device Info. |
Device Info
All top-level fields are optional and recorded on a best-efforts basis.
| Field | Type | Description |
|---|---|---|
manufacturer |
string | [Optional] Device manufacturer, e.g. Apple. |
model_name |
string | [Optional] Device model, e.g. iPhone 14 Pro. |
system_name |
string | [Optional] Operating system, e.g. iOS. |
system_version |
string | [Optional] OS version, e.g. 26.5. |
type |
string | [Optional] Device type, e.g. iPhone. |
app_info |
object | [Optional] NeuroLup app information. See App Info. |
App Info
| Field | Type | Description |
|---|---|---|
id |
string | Bundle/application identifier of the NeuroLup app. |
language |
string | Language the app ran in (IETF tag, e.g. en-US). |
version |
string | App version that recorded the result. |
Response Units
response_units is a map (not an array). Each key is a unit ID identifying what was completed, and each value describes one completed unit.
- For exercise units, the key is the NeuroLup exercise ID (see the table in Exercise Response Units). Example:
iBvg06QuANis Exercise 6 (DSST). - For form units, the key is the ID of the published form the participant filled in.
Every unit carries the following fields:
| Field | Type | Description |
|---|---|---|
type |
string | exercise or form. Determines the shape of data. |
offlineMode |
boolean | Whether the unit was completed while the device was offline and uploaded later. |
startedAt |
date (ISO 8601) | When the participant started the unit. |
completedAt |
date (ISO 8601) | When the participant completed the unit. |
data |
object | array | The recorded response. An object for exercises, an array of answered fields for forms. |
Exercise Response Units
For units with type: "exercise", data is an object, documented using Exercises.
Form Response Units
For units with type: "form", data is an array of fields in display order. Each form field is a section header or a question. Object representation of a form field:
| Field | Type | Description |
|---|---|---|
index |
number | Position of the field in the form. |
fieldType |
string | Denotes the field type: section or question. |
questionsIdx |
array | Available if field_type: section. Lists index positions for questions belonging to the section. |
questionType |
string | Available if field_type: question. One of the types noted in Form Question Responses. |
answer |
union of types mentioned in Form Question Responses | Available if field_type: question. The participant’s answer. See Form Question Responses for details. |
isOtherAnswer |
boolean | Available if field_type: question and questionType is singleSelectMCQ or multipleSelectMCQ. This flag indicates whether the user selected to enter a free-text (other) answer. |
Form Question Responses
Answer format by question type:
questionType |
Answer Field Type | Description |
|---|---|---|
singleSelectMCQ |
string | Single-select multiple-choice question. The answer is the selected option’s text. When the participant chooses the free-text “Other” option, isOtherAnswer is true and the answer is the text they entered. |
multipleSelectMCQ |
array <string> | Multiple-select multiple-choice question. The answer lists every selected option’s text; a free-text “Other” entry is included when isOtherAnswer is true. |
dropdown |
string | Dropdown selection. The answer is the selected option’s text. |
textShort |
string | Short free-text answer (single line). |
textLong |
string | Long free-text answer (multi-line). |
email |
string | Email address entered by the participant. |
number |
number | Numeric answer. |
date |
date (ISO 8601 date) | Calendar date selected by the participant. |
time |
string (HH:MM:SS) |
Time of day in 24-hour format, e.g. 13:35:53. |
duration |
string (HH:MM:SS) |
Elapsed-time answer between 00:00:00 and 24:00:00. |
dateRange |
object { "start": date, "end": date } |
A date range with ISO 8601 start and end dates. |
- Introduction
- Exercise 1: Scripted Speech with Stroop Effect
- Exercise 2: Say “Ah”
- Exercise 3: Grid Match
- Exercise 4: Finger Tapping Test
- Exercise 5: Tracing of a Line
- Exercise 6: DSST (Digit Symbol Substitution Test)
- Exercise 7: Procedural Stroop Test
- Exercise 8: Picture Description
- Exercise 9: Unstructured Voice Tasks (Verbal Fluency)
- Exercise 10: Orientation Questions
- Exercise 11: Unstructured Voice Tasks (Open-Ended Questions)
- Exercise 12: Reaction Time Exercise
- Exercise 13: Smiles and Surprises
- Exercise 14: Picture Description with Facial Recording
- Exercise 15: Go/No-Go
- Exercise 16: Picture Recall Task
The exercise-specific subsections provide an overview of each exercise and explain the response data gathered, accompanied by an illustrative object that represents the exercise result in battery results.
It is important to emphasize that the primary goal of this document is to provide a comprehensive understanding of the data associated with NeuroLup battery results. As a result, this document focuses on the technical aspects, including rules of the exercises and the response data collected for the exercises.
- Introduction
- Exercise 1: Scripted Speech with Stroop Effect
- Exercise 2: Say “Ah”
- Exercise 3: Grid Match
- Exercise 4: Finger Tapping Test
- Exercise 5: Tracing of a Line
- Exercise 6: DSST (Digit Symbol Substitution Test)
- Exercise 7: Procedural Stroop Test
- Exercise 8: Picture Description
- Exercise 9: Unstructured Voice Tasks (Verbal Fluency)
- Exercise 10: Orientation Questions
- Exercise 11: Unstructured Voice Tasks (Open-Ended Questions)
- Exercise 12: Reaction Time Exercise
- Exercise 13: Smiles and Surprises
- Exercise 14: Picture Description with Facial Recording
- Exercise 15: Go/No-Go
- Exercise 16: Picture Recall Task
With NeuroLup 26.4.0, response data collection is revamped for the following initial batch of exercises:
| ID | Exercise |
|---|---|
| exercise06 | DSST (Digit Symbol Substitution Test) |
| exercise08 | Picture Description |
| exercise09 | Unstructured Voice Tasks (Verbal Fluency) |
| exercise12 | Reaction Time |
| exercise15 | Go/No-Go |
| exercise16 | Picture Recall |
Previously, each exercise response contained three fields, exercise_id, exercise_metadata and exercise_result, and the data captured was limited. The new schema introduced with data revamp updates exercise_metadata details and adds a new field, exercise_response, which contains a structured, event-based record of what the participant actually did.
Note: For the revamped exercises, the system continues to record the exercise_result data. However, the goal with data revamp is to replace it with exercise_response, which records data in detail. exercise_result is marked for deprecation and will be removed at some point in the future.
Top-level structure
Every exercise response unit payload now has the following top-level fields.
| Field | Description |
|---|---|
schema_version |
0 for the original (pre-26.4.0) schema, 1 for the new schema, incremental values for future schema updates. |
exercise_version |
The version of the exercise itself. |
exercise_id |
The exercise identifier (e.g. "exercise06"). |
exercise_metadata |
Provides context for the participant response, including display dimensions, stimuli, controls, timing, etc. |
exercise_response |
New. The participant’s response, recorded as a timestamped list of events. |
exercise_result |
(Deprecated) Unchanged from schema version 0. |
exercise_metadata
Provides context for the participant response. Which sub-fields are present depends on the exercise (see the exercise-specific pages), but the shapes below are uniform wherever they appear.
device_display (always present)
The reference frame for every coordinate in the payload (taps, stimulus bounds, control bounds, zoom areas). Recorded at the exercise level rather than the assessment level, because a participant can switch devices between exercises.
"device_display": { "width": 150, "height": 100 }
stimuli
A map keyed by stimulus_id. Each entry describes one stimulus; the exercise-specific attributes differ (see the exercise-specific pages for details). A stimulus may carry:
url: Location of the stimulus asset (placeholder for now).coord_bounds: On-screen bounds as{ top_left: [x, y], bottom_right: [x, y] }.- Plus exercise-specific fields such as
target_digit,category,is_go, oris_practice.
controls
A map keyed by control_id describing the UI components a participant can use to respond (e.g. the digit buttons in DSST, the grid cell in Go/No-Go). A control may carry:
coord_bounds:{ top_left, bottom_right }.grid_position:{ row, col }, 1-indexed, where a control sits in a grid.
time_limit
A uniform interface for time-bounded exercises: { min_ms?, max_ms? }. A fixed-duration exercise sets min_ms == max_ms; a flexible one sets a range.
"time_limit": { "min_ms": 20000, "max_ms": 300000 }
trial
Trial configuration for relevant exercises. Common fields:
count: Number of trials.timeout_ms: Per-trial response window.random_delay_range_ms:[min, max]delay before each stimulus appears.
Plus exercise-specific fields such as early_tap_limit, go_count, no_go_count.
exercise_response
Currently contains a single field, events: an ordered, timestamped list of every significant moment in the exercise.
Every event carries:
| Field | Type | Description |
|---|---|---|
type |
string | The event type (see the catalog below). |
timestamp |
string | ISO 8601 timestamp of when the event occurred. |
Depending on the event type, an event may also carry:
| Field | Type | Description |
|---|---|---|
tag |
string | A free-text label identifying what the event refers to, e.g. "[button]: Continue", "[screen]: instructions", or "early_tap". |
coords |
array | The [x, y] position of a tap, expressed in the device_display reference frame. |
stimulus_id |
string | The stimulus the event relates to — a key into exercise_metadata.stimuli. |
control_id |
string | The control the event relates to — a key into exercise_metadata.controls. |
trial_index |
number | The trial the event belongs to, for trial-based exercises. |
set_index |
number | Defined in the shared schema for future use; not currently emitted by the revamped exercises. A set will represent an optional grouping of trials. |
Event catalog
Lifecycle
Lifecycle events carry no fields beyond the common ones (screen_displayed identifies the screen via tag).
| Event | Meaning |
|---|---|
exercise_started / exercise_completed |
Start and end of the whole exercise. |
screen_displayed |
A screen was shown (tag identifies it, e.g. instructions, response session, done). |
demo_started / demo_completed |
Optional demo walkthrough. |
practice_session_started / practice_session_completed |
Optional practice phase before the scored session. |
response_session_started / response_session_completed |
The actual response session. |
timer_started / timer_expired |
A single global countdown, for time-bounded exercises. |
Interaction
| Event | Fields | Meaning |
|---|---|---|
tap |
coords; may carry tag, stimulus_id, control_id, trial_index |
A tap. Taps on non-buttons, or before a stimulus appears, are also recorded. |
stimulus_displayed |
stimulus_id; trial_index for trial-based exercises |
A stimulus appeared on screen. |
zoom |
method, action, zoom_level, stage, area, stimulus_id |
A zoom or pan gesture on a stimulus image. Field details below. |
message_displayed |
tag |
An in-session prompt to the participant (the prompt text is in tag, e.g. “Please continue to describe more details.”). |
alert_displayed / alert_closed |
tag |
A modal alert opened/closed (the alert title is in tag, e.g. “Abort Exercise?”, “Are you finished?”). |
Each zoom event carries:
| Field | Type | Description |
|---|---|---|
method |
string | How the gesture was made: "pinch" or "button". |
action |
string | "in", "out", or "pan". |
zoom_level |
number | The zoom level (0 to 400%) after the gesture. |
stage |
string | Progress of the gesture: "start", "in-progress", or "end". |
area |
object | The visible region: { center_point: [x, y], width, height }, in the device_display reference frame. |
stimulus_id |
string | The image the gesture was performed on. |
response
Represents the core responses by participants for the tasks the exercise prompts them to complete. Its shape varies by exercise and is the main point of divergence:
- Tap-based (DSST, Reaction Time, Go/No-Go):
reaction_time_ms,timeout, and where relevantanswered_digit/is_correct. - Audio-based (Picture Description, Verbal Fluency, Picture Recall):
recording_time_ms,timeout,audio_url, and optionalaudio_input_source(best-effort, e.g. “iPhone Mic”).
See each exercise’s page for its exact fields.
Overview
In this exercise, participants are required to read a short paragraph aloud. If there are colored words in the paragraph, participants should say the color, not the word. The Stroop effect is included primarily to divert attention away from articulation, aiding to unmask any speech difficulties otherwise attenuated with concentration.
The exercise process is outlined as follows:
- Instructions for the exercise are displayed. Participants can click the “Next” button to proceed.

- An example is displayed to help participants understand the exercise. Participants can click the “Start Recording” button when they are ready.

- The paragraph to read will appear. Participants can record a response and click “Done” when finished.

- Participants can choose to re-record their response (“Redo”), listen to what they have recorded (“Play to check”), or move on to the next activity (“Next”).

Response Data
The speech response is recorded using a single 32-bit, mono, .wav audio file with 22050Hz sample rate.
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise01",
"exercise_metadata": {
"question_text": "Roses are red.",
"expected_answer_text": "Roses are blue."
},
"exercise_result": {
"file_path": "path/to/the/audio/file"
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 1 is exercise01.
exercise_metadata (object)
The exercise metadata contains the following fields:
question_text(string): Paragraph text provided for the participant to readexpected_answer_text(string): Paragraph text expected in the participant response
Please note that the question text and the expected answer text will differ because participants are required to state the color of the word in the case of colored words. For example, if the paragraph presented for the participant to read is “Roses are red”, and the word “red” is colored blue, the expected participant response would be “Roses are blue”.
exercise_result (object)
This object contains the result using the following fields:
file_path(string): Path to the location of the audio file with speech response
Overview
In this exercise, participants are required to vocalize the sound ‘Ah’ continuously for 5 seconds. Sustained intonation has been utilized as a language-agnostic indicator of movement disorders.
The exercise process is outlined as follows:
- Instructions for the exercise are displayed. Participants can click the “Start recording” button to record a response.

- Participants have 5 seconds to record a response.

- Participants can click “Next” to move on to the next activity.

Response data
The speech response is recorded using a single 32-bit, mono, .wav audio file with 22050Hz sample rate.
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise02",
"exercise_metadata": {},
"exercise_result": {
"file_path": "path/to/the/audio/file"
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 2 is exercise02.
exercise_metadata (object)
Currently, there is no additional information required to process the recorded results for this exercise. Thus, an empty object is present here.
exercise_result (object)
This object contains the result using the following fields:
file_path(string): Path to the location of the audio file with speech response
Overview
In this exercise, participants are presented with a 3×3 grid where images are placed in various cells. Their task is to replicate this image arrangement on the grid within a specified time frame. The exercise is divided into three distinct trials, each progressively more challenging. The table below outlines the number of questions, the number of images per question, and the time limit per question for each trial.
| Trial | Number of Questions | Images per Question | Time Limit per Question |
|---|---|---|---|
| 1 | 5 | 1 | 10 seconds |
| 2 | 10 | 3 | 30 seconds |
| 3 | 10 | 5 | 60 seconds |
This is a measure of visual working memory. There is evidence that APOE ε4 carriers perform better than non-carriers in certain visual working memory tasks. There is evidence that individuals with MCI (Mild Cognitive Impairment) have reduced hippocampal activation during high working memory load and increased hippocampal activation during low load in comparison to healthy controls. This effect may be captured as this exercise becomes more challenging in trials 2 and 3.
The exercise process is outlined as follows:
- Exercise instructions are displayed. Participants can watch a demo with the “Watch Demo” button or click the “Start” button to begin the exercise trials.

- Trial 1 consists of 5 questions with a 10-second time limit to answer a question.
- For each question, participants are presented with a 3×3 grid with a single image placed in a random cell. The display lasts for 3 seconds. An example is shown below:

- Participants are presented with an empty grid with the question image(s) on the left-hand side. The timer in the top right corner displays the time remaining to drag the image(s) to the correct location(s) on the grid. The button in the bottom right corner of the screen allows participants to proceed to the next question.

- For each question, participants are presented with a 3×3 grid with a single image placed in a random cell. The display lasts for 3 seconds. An example is shown below:
- Trial 2 consists of 10 questions with a 30-second time limit to answer a question.
- For each question, participants are presented with a 3×3 grid with 3 images placed in random cells. The display lasts for 3 seconds. An example is shown below:

- Participants are presented with an empty grid with the question image(s) on the left-hand side. The timer in the top right corner displays the time remaining to drag the image(s) to the correct location(s) on the grid. The button in the bottom right corner of the screen allows participants to proceed to the next question.

- For each question, participants are presented with a 3×3 grid with 3 images placed in random cells. The display lasts for 3 seconds. An example is shown below:
- Trial 3 consists of 10 questions with a 60-second time limit to answer a question.
- For each question, participants are presented with a 3×3 grid with 5 images placed in random cells. The display lasts for 3 seconds. An example is shown below:

- Participants are presented with an empty grid with the question image(s) on the left-hand side. The timer in the top right corner displays the time remaining to drag the image(s) to the correct location(s) on the grid. The button in the bottom right corner of the screen allows participants to proceed to the next question.

- For each question, participants are presented with a 3×3 grid with 5 images placed in random cells. The display lasts for 3 seconds. An example is shown below:
- After completing all three trials, the following screen is displayed. Participants can click the “Next” button for the next activity.

Response data
Across all three trials, for every question, the following information is collected per image:
- Target grid position
- Recorded position values are shown below
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
- Answered grid position
- If the image was skipped
- Recorded grid position value = 0
- If there was a timeout before an answer could be provided for the image
- Recorded grid position value = -1
- If an answer is provided for the image
- Recorded position values are shown below
- If the image was skipped
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise03",
"exercise_metadata": {},
"exercise_result": {
"trial1": [
{
"answered_pos": [9],
"target_pos": [9]
},
{
"answered_pos": [3],
"target_pos": [3]
},
{
"answered_pos": [3],
"target_pos": [3]
},
{
"answered_pos": [-1],
"target_pos": [4]
},
{
"answered_pos": [0],
"target_pos": [6]
}
],
"trial2": [
{
"answered_pos": [6, 7, -1],
"target_pos": [6, 7, 8]
},
{
"answered_pos": [1, 0, 0],
"target_pos": [1, 2, 4]
},
{
"answered_pos": [-1, -1, -1],
"target_pos": [5, 7, 9]
},
{
"answered_pos": [0, 0, 0],
"target_pos": [1, 4, 5]
},
{
"answered_pos": [2, 3, 5],
"target_pos": [2, 3, 5]
},
{
"answered_pos": [5, 6, 9],
"target_pos": [5, 6, 9]
},
{
"answered_pos": [1, 2, 0],
"target_pos": [1, 2, 5]
},
{
"answered_pos": [1, 2, 3],
"target_pos": [9, 4, 2]
},
{
"answered_pos": [4, 6, 8],
"target_pos": [4, 6, 8]
},
{
"answered_pos": [4, 5, 9],
"target_pos": [4, 5, 9]
}
],
"trial3": [
{
"answered_pos": [2, 4, 5, 6, 7],
"target_pos": [2, 4, 5, 6, 7]
},
{
"answered_pos": [2, 3, 6, 8, 9],
"target_pos": [2, 3, 6, 8, 9]
},
{
"answered_pos": [2, 5, 6, 8, 9],
"target_pos": [9, 8, 6, 5, 1]
},
{
"answered_pos": [1, 2, 4, 5, 9],
"target_pos": [1, 2, 4, 5, 9]
},
{
"answered_pos": [1, 6, 7, 8, 9],
"target_pos": [1, 6, 7, 8, 9]
},
{
"answered_pos": [2, 3, 4, 5, 6],
"target_pos": [3, 2, 4, 5, 6]
},
{
"answered_pos": [1, 2, 4, 7, 8],
"target_pos": [1, 2, 4, 7, 8]
},
{
"answered_pos": [2, 3, 4, 7, 8],
"target_pos": [3, 2, 4, 7, 8]
},
{
"answered_pos": [1, 2, 6, 7, 8],
"target_pos": [1, 2, 6, 8, 7]
},
{
"answered_pos": [2, 3, 6, 8, 9],
"target_pos": [2, 3, 6, 8, 9]
}
]
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 3 is exercise03.
exercise_metadata (object)
Currently, there is no additional information required to process the recorded results for this exercise. Thus, an empty object is present here.
exercise_result (object)
This object contains the result using the following fields:
trial1(list): List of objects containing the answers for trial 1 questions. Each object in the list has the following fields:answered_pos(list): Image position(s) provided by the participantstarget_pos(list): Target image position(s)
trial2(list): List of objects containing the answers for trial 2 questions. Each object in the list has the following fields:answered_pos(list): Image position(s) provided by the participantstarget_pos(list): Target image position(s)
trial3(list): List of objects containing the answers for trial 3 questions. Each object in the list has the following fields:answered_pos(list): Image position(s) provided by the participantstarget_pos(list): Target image position(s)
Overview
In this exercise, participants are expected to tap a button as many times as they can within a 10-second time interval using their right or left index finger. This is a measure of neuropsychomotor speed. Performance abnormalities in this exercises area associated with many diseases and disorders, such as MCI, pMCI (progressive Mild Cognitive Impairment) and AD (Alzheimer’s Disease).
The exercise process is outlined as follows:
- Exercise instructions are displayed. Participants can click the “Start” button to begin the exercise.

- In the first trial of the exercise, participants are expected to use their right index finger. If their right index finger is injured, missing or otherwise cannot be used, the participant has the option to skip the current trial with the grey “Skip” button. The following screen is displayed, where a 3 second countdown timer starts once the “Start” button is tapped. After the countdown ends, participants then have 10 seconds to tap the green button as many times as possible.

- After the 10-second interval, the next screen is displayed. Participants can click “Start Trial 2” for the next trial.

- Instructions for trial 2 are displayed. Participants can click the “Start” button to start the trial.

- In the second trial of the exercise, participants are expected to use their left index finger. If their left index finger is injured, missing or otherwise cannot be used, the participant has the option to skip the current trial with the grey “Skip” button. The following screen is displayed, where a 3 second countdown timer starts once the “Start” button is tapped. After the countdown ends, participants then have 10 seconds to tap the green button as many times as possible.

- After the 10-second interval, the next screen is displayed. Participants can click “Next” for the next activity.

- The final screen indicates that the exercise is completed. Participants can click “Next” for the next activity.

Response data
The response data for this exercise comprises records of finger taps for the right index finger and the left index finger, collected in 10-second intervals. Each finger tap is associated with a timestamp, measured in milliseconds and starting from 0.
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise04",
"exercise_metadata": {
"incomplete_response_reasons":{
"exercise_result":{
"right_index_finger_taps":"Missing or injured right index finger"
}
}
},
"exercise_result": {
"right_index_finger_taps": null,
"left_index_finger_taps": [15, 35, 55, 75, 93, 115, 132, 152, 170, 188, 206, 222, 240, 259, 279, 299, 317, 337, 355, 377, 397, 417, 435, 457, 474, 494, 515, 532, 552, 570, 589, 609, 630, 650, 670, 690, 712, 732, 752, 774, 795, 814, 834, 854, 872, 894, 912, 930, 952, 972, 992]
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 4 is exercise04.
exercise_metadata (object)
This object will be empty if no trial was skipped. If either of the trials were skipped, then this object will be filled with a reason indicator for why that trial was skipped.
incomplete_response_reasons(object):exercise_result(object):right_index_finger_taps(String): Contains the reason for why this trial was skipped. The current only response is: “Missing or injured right index finger”left_index_finger_taps(String): Contains the reason for why this trial was skipped. The current only response is: “Missing or injured left index finger”
exercise_result (object)
This object contains the result using the following fields:
right_index_finger_taps(list or null): Contains the timestamps for the right index finger taps or null if this trial was skippedleft_index_finger_taps(list or null): Contains the timestamps for the left index finger taps or null if this trial was skipped
Overview
In this exercise, participants are expected to trace a reference line on the screen using either their right or left hand in the specified direction. This is a simple measure to quantify motor control and stability.
The exercise is divided into two trials, as follows:
- Instructions for the exercise are displayed. Participants should keep their device steady and then click the “Start” button to begin the first trial.

- Trial 1 (Using the left hand):
- Participants are asked to trace a line from left to right.

- Once finished, participants can click “Next” to proceed.

- Participants are asked to trace a line from right to left.

- Once finished, participants can click “Start Trial 2” to begin the second trial.

- Participants are asked to trace a line from left to right.
- Trial 2 (Using the right hand):
- Participants are asked to trace a line from left to right.

- Once finished, participants can click “Next” to proceed.

- Participants are asked to trace a line from right to left.

- Once finished, participants can click “Next” to move to the next activity.

- Participants are asked to trace a line from left to right.
Response data
Response data for this exercise includes the following:
- The device display size
- Width and height
- For the reference line:
- (x, y) coordinates of the start and end point of the line
- For the lines drawn by participants:
- (x, y) coordinates of the points recorded for the lines
The unit of measurement used for the response data is Points (pt). It is an abstract unit of measurement. A device display with an 844 pt width and 390 pt height can be thought of as an 844×390 grid of Points. The (x, y) coordinates recorded for any point represent its location on the grid. The size of the device display may vary with devices.
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise05",
"exercise_metadata": {
"device_display": {
"width": 844,
"height": 390
},
"ref_line_coords": {
"start": [97, 246],
"end": [747, 246]
}
},
"exercise_result": {
"left2right_left_hand":[[115, 230], [125, 226], [130, 226], [136, 226], [146, 226], [158, 226], [173, 228], [189, 230], [207, 230], [226, 230], [245, 230], [264, 227], [282, 222], [301, 217], [319, 213], [336, 209], [350, 206], [361, 205], [370, 204], [377, 203], [384, 203], [390, 203], [396, 203], [401, 203], [407, 203], [413, 202], [419, 202], [426, 201], [434, 200], [443, 200], [453, 198], [462, 195], [473, 192], [483, 188], [493, 186], [502, 184], [510, 182], [518, 181], [526, 180], [535, 179], [544, 178], [553, 178], [562, 178], [570, 178], [579, 179], [587, 180], [594, 180], [601, 181], [608, 181], [613, 181], [618, 181], [623, 181], [627, 181], [632, 181], [638, 181], [643, 181], [649, 181], [655, 181], [662, 181], [668, 181], [674, 181], [680, 181], [687, 180], [693, 178], [698, 176], [703, 174], [708, 172], [713, 171], [717, 170], [720, 169], [723, 168]],
"right2left_left_hand":[[722, 230], [716, 244], [713, 252], [708, 261], [703, 270], [698, 277], [694, 284], [691, 288], [688, 289], [686, 289], [684, 289], [680, 289], [677, 289], [672, 289], [666, 289], [658, 289], [648, 289], [638, 289], [627, 289], [615, 289], [604, 289], [592, 289], [580, 289], [567, 289], [554, 287], [539, 286], [524, 285], [508, 284], [493, 284], [477, 283], [463, 282], [449, 280], [436, 278], [424, 276], [413, 275], [403, 274], [393, 272], [385, 270], [378, 268], [371, 266], [364, 261], [358, 256], [351, 251], [345, 246], [338, 244], [332, 241], [325, 241], [317, 241], [308, 241], [301, 241], [295, 242], [291, 242], [289, 241], [287, 238], [285, 233], [283, 230], [279, 226], [273, 224], [266, 223], [258, 222], [250, 222], [242, 220], [233, 217], [225, 213], [220, 211], [208, 205], [200, 200], [192, 195], [184, 191], [175, 187], [167, 184], [157, 181], [147, 179], [138, 176], [129, 174], [120, 171], [113, 169], [106, 166], [101, 164], [98, 161], [97, 159]],
"left2right_right_hand":[[113, 230], [126, 232], [139, 232], [155, 233], [175, 234], [198, 235], [222, 235], [246, 238], [270, 242], [291, 247], [311, 253], [331, 257], [351, 258], [370, 258], [389, 257], [407, 253], [424, 249], [440, 245], [455, 239], [470, 232], [487, 224], [503, 215], [519, 206], [535, 198], [549, 191], [563, 186], [575, 183], [586, 182], [598, 181], [608, 179], [619, 177], [629, 176], [639, 175], [648, 174], [657, 174], [666, 174], [674, 174], [682, 174], [690, 173], [698, 172], [705, 172], [711, 172], [718, 172], [724, 172]],
"right2left_right_hand":[[736, 217], [726, 215], [721, 213], [715, 210], [705, 205], [693, 199], [681, 194], [669, 189], [656, 184], [642, 180], [628, 175], [615, 169], [602, 164], [590, 161], [578, 157], [568, 154], [559, 153], [550, 152], [540, 150], [528, 148], [510, 145], [490, 141], [469, 137], [448, 133], [429, 130], [412, 127], [397, 125], [384, 125], [371, 125], [361, 125], [352, 125], [343, 128], [336, 130], [328, 132], [321, 134], [313, 136], [306, 137], [299, 140], [291, 143], [283, 145], [276, 148], [268, 151], [259, 155], [250, 159], [240, 163], [231, 170], [222, 177], [213, 186], [204, 194], [195, 204], [186, 212], [177, 221], [168, 229], [160, 237], [152, 246], [144, 252], [137, 261], [130, 269], [123, 278], [117, 286], [111, 294], [105, 301], [100, 307], [95, 312]]
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 5 is exercise05.
exercise_metadata (object)
The exercise metadata contains the following fields:
device_display(object): Information about the display sizewidth(int): Display width, measured in Points (pt)height(int): Display height, measured in Points (pt)
ref_line_coords(object): (x, y) coordinates of the start and end point of the reference linestart(list): (x, y) coordinates of the starting point, measured in Points (pt)end(list): (x, y) coordinates of the ending point, measured in Points (pt)
exercise_result (object)
This object contains the result using the following fields:
left2right_left_hand(list): List of (x, y) coordinates of the points recorded for the line drawn with the left hand from left to right. Each point measured in Points (pt).right2left_left_hand(list): List of (x, y) coordinates of the points recorded for the line drawn with the left hand from right to left. Each point measured in Points (pt).left2right_right_hand(list): List of (x, y) coordinates of the points recorded for the line drawn with the right hand from left to right. Each point measured in Points (pt).right2left_right_hand(list): List of (x, y) coordinates of the points recorded for the line drawn with the right hand from right to left. Each point measured in Points (pt).
Overview
In this exercise, participants are shown a reference set of symbols on the screen with a random number associated with each image. For each question in the exercise, a random symbol from the set is displayed on the screen. Participants are presented with the available number options used for the reference set and are expected to select the number that corresponds to the symbol in the reference set. Participants have 90 seconds to complete this task for as many symbols as possible. Low scores on the DSST are associated with AD, Parkinson’s disease, stroke, disability and depression among other disordres.
The exercise process is outlined as follows:
- Exercise instructions are displayed. Participants can watch a demo with the “Watch Demo” button or click the “Start” button to begin the exercise.

- During the exercise, the reference symbol set (legend) is displayed on the top half of the screen and the question symbols along with the numbers for answer options are displayed on the bottom half of the screen. Participants should tap the number corresponding to the symbol in the reference set (legend). The timer on in the top right corner shows the remaining time.

- The timer stops after 90 seconds and the following screen is displayed. Participants can click “Next” for the next activity.

Response Data
Response data for this exercise includes the following:
- Number of questions answered
- Answer value for each question
- Correct answer value = 1
- Incorrect answer value = 0
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise06",
"exercise_metadata": {},
"exercise_result": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 6 is exercise06.
exercise_metadata (object)
Currently, there is no additional information required to process the recorded results for this exercise. Thus, an empty object is present here.
exercise_result (list)
Contains the answers to the exercise questions (values: 1 = correct answer, 0 = incorrect answer). The length of this list is equal to the number of questions answered.
Response Data
Payloads in this version utilize the shared response format, which documents top-level fields, metadata shapes, and the event catalog, including the deprecation of exercise_result. Exercise-specific details are documented below.
Top-level values
| Field | Type | Description |
|---|---|---|
schema_version |
number | 1 |
exercise_version |
number | Exercise version (changes with each configuration update from the admin portal). |
exercise_id |
string | "exercise06" |
exercise_metadata |
object | See below |
exercise_response |
object | The participant’s response, recorded as a timestamped list of events (details below). |
exercise_result |
array | (Deprecated) Same as schema version 0. |
exercise_metadata
| Field | Type | Description |
|---|---|---|
device_display |
object | Shared shape (see the shared response format). |
time_limit |
object | { "min_ms": 90000, "max_ms": 90000 }: A fixed 90-second task. |
controls |
object | The digit buttons, keyed by control_id "1"–"9". Each entry carries coord_bounds only. |
stimuli |
object | The symbols shown during the exercise, keyed by stimulus_id. Entry fields below. |
stimuli
| Field | Type | Description |
|---|---|---|
target_digit |
number | The correct number for this symbol. |
control_id |
string | The button representing the correct answer for this symbol. |
url |
string | (Optional) Location of the symbol asset. Note: The support for this added to be future-compatible. It is optional at the moment and may be absent from the collected response data. |
exercise_response
DSST emits the following event types (see the shared event catalog for their meanings): exercise_started / exercise_completed, screen_displayed, demo_started / demo_completed, response_session_started / response_session_completed, timer_started / timer_expired, alert_displayed / alert_closed, stimulus_displayed, tap, and response.
The exercise is trial-based: Each trial is a stimulus_displayed, the participant’s tap(s), and a response, sharing a trial_index. A trial still in progress when the timer expires produces no response event.
Each response event carries:
| Field | Type | Description |
|---|---|---|
answered_digit |
number | The digit of the button the participant tapped. |
is_correct |
boolean | Whether answered_digit matches the stimulus’s target_digit. |
reaction_time_ms |
number | Time (milliseconds) from the symbol being displayed to the response. |
exercise_result (deprecated)
| Field | Type | Description |
|---|---|---|
exercise_result |
array | (Deprecated) Same as schema version 0. |
Overview
This exercise is divided into three trials. For each trial, participants are expected to tap a checkmark or a cross symbol based on the instructions displayed on the screen. Questions across all trials use words that represent color names (for example: red, green, blue). The words themselves are colored. However, the color of a word may or may not match the word itself. Evidence exists linking head trauma and AD to increased Stroop effect.
The following is a brief introduction of the instructions for the three trials:
- Trial 1:
- Contains 5 questions
- For each question, participants should
- Tap the checkmark as soon as a word appears
- Participants have 6 seconds to answer a question
- Trial 2:
- Contains 20 questions
- For each question, participants should
- Tap the checkmark if the word displayed matches its color
- Tap the cross if the word displayed does not match its color
- Participants have 6 seconds to answer a question
- Trial 3:
- Contains 20 questions
- For each question, participants should
- Tap the checkmark if the word displayed does not match its color
- Tap the cross if the word displayed matches its color
- Participants have 6 seconds to answer a question
The exercise process is outlined as follows:
- Instructions for trial 1 are displayed. Participants can click “Start” to start the trial.

- Questions for trial 1 are displayed sequentially. The timer in the top right corner of the screen displays the remaining time for a question.

- After trial 1 is completed, participants can click “Next Trial 2/3” to go to the next trial.

- Instructions for trial 2 are displayed. Participants can click “Next” to start the trial.

- Questions for trial 2 are displayed sequentially. The timer in the top right corner of the screen displays the remaining time for a question.

- After trial 2 is completed, participants can click “Next Trial 3/3” to go to the next trial.

- Instructions for trial 3 are displayed. Participants can click “Next” to start the trial.

- Questions for trial 3 are displayed sequentially. The timer in the top right corner of the screen displays the remaining time for a question.

- After trial 3 is completed, participants can click “Next” to go to the next activity.

Response data
Response data for this exercise includes the following:
- For each question:
- Answer
- Correct answer value = 1
- Incorrect answer value = 0
- Answer value if there was a timeout before an answer could be provided = -1
- Reaction time, measured in milliseconds and starting from 0
- Answer
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise07",
"exercise_metadata": {},
"exercise_result": {
"trial1": [
{"answer": 1, "reaction_time": 2507},
{"answer": 0, "reaction_time": 1423},
{"answer": -1, "reaction_time": 6000},
{"answer": 1, "reaction_time": 3567},
{"answer": 1, "reaction_time": 1157}
],
"trial2": [
{"answer": 1, "reaction_time": 2507},
{"answer": 1, "reaction_time": 1423},
{"answer": 1, "reaction_time": 1281},
{"answer": 1, "reaction_time": 3567},
{"answer": 1, "reaction_time": 1157},
{"answer": 1, "reaction_time": 2206},
{"answer": 1, "reaction_time": 2442},
{"answer": 1, "reaction_time": 4523},
{"answer": 1, "reaction_time": 1328},
{"answer": 1, "reaction_time": 862},
{"answer": 1, "reaction_time": 1055},
{"answer": 1, "reaction_time": 965},
{"answer": 1, "reaction_time": 909},
{"answer": 1, "reaction_time": 1414},
{"answer": 1, "reaction_time": 1027},
{"answer": 1, "reaction_time": 1221},
{"answer": 1, "reaction_time": 1276},
{"answer": 1, "reaction_time": 2478},
{"answer": 1, "reaction_time": 1324},
{"answer": 1, "reaction_time": 1242}
],
"trial3": [
{"answer": 1, "reaction_time": 1241},
{"answer": 1, "reaction_time": 2840},
{"answer": 1, "reaction_time": 1729},
{"answer": 1, "reaction_time": 1226},
{"answer": 1, "reaction_time": 945},
{"answer": 1, "reaction_time": 1303},
{"answer": 0, "reaction_time": 1042},
{"answer": 1, "reaction_time": 941},
{"answer": 1, "reaction_time": 1010},
{"answer": 1, "reaction_time": 789},
{"answer": 1, "reaction_time": 1417},
{"answer": 1, "reaction_time": 1120},
{"answer": 1, "reaction_time": 1379},
{"answer": 1, "reaction_time": 1043},
{"answer": 1, "reaction_time": 1613},
{"answer": 1, "reaction_time": 2281},
{"answer": 1, "reaction_time": 2224},
{"answer": 1, "reaction_time": 5134},
{"answer": 1, "reaction_time": 1281},
{"answer": 1, "reaction_time": 1944}
]
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 7 is exercise07.
exercise_metadata (object)
Currently, there is no additional information required to process the recorded results for this exercise. Thus, an empty object is present here.
exercise_result (object)
This object contains the result using the following fields:
trial1(list): List containing answer objects for trial 1 with the following fields:answer(int): Answer for a question (values: 1 = correct answer, 0 = incorrect answer, -1 = timeout)reaction_time(int): Time taken to answer the question, measured in milliseconds and starting from 0
trial2(list): List containing answer objects for trial 2 with the following fields:answer(int): Answer for a question (values: 1 = correct answer, 0 = incorrect answer, -1 = timeout)reaction_time(int): Time taken to answer the question, measured in milliseconds and starting from 0
trial3(list): List containing answer objects for trial 3 with the following fields:answer(int): Answer for a question (values: 1 = correct answer, 0 = incorrect answer, -1 = timeout)reaction_time(int): Time taken to answer the question, measured in milliseconds and starting from 0
Overview
In this exercise, participants are presented with a picture and asked to describe what is happening in the picture in detail within a 5-minute time limit. The picture used will be a randomly selected one from a set of pictures determined by the program admin. Admins can also import their own custom images to be included within the pool of random images. Picture description tasks can be used to analyze both the acoustic and linguistic features of speech, providing insight into one’s cognitive health.
The following is a subset of images from the default image set:
1. Beach Scene:
2. Candy Theft:
3. Park Scene:
4. Urban Scene:
5. Farm Scene:
6. Candy Theft 2:

The example image used for testing the zooming feature is the following image:

The exercise process is outlined as follows:
- Exercise instructions are displayed. Participants can click “Next” to move on.

- Participants are first presented with an example image that they can use to practice zooming into the image. Participants can pinch the image with their fingers to zoom into the image up to 400% zoom into the image. Participants can click “Start recording” to start the exercise.

- Participants are presented with a picture and asked to describe the picture out loud. The timer in the bottom right corner of the screen displays the remaining time. All zooming actions on the image are tracked. Participants can record their response here and click “Done” to proceed to the next activity.

Response data
The speech response is recorded using a single 32-bit, mono, .wav audio file with 22050Hz sample rate.
The zooming activity that the participant performed during the recording of the exercise is also recorded. This includes what kind of zooming action was performed, how much the image was zoomed to, where it was performed on the screen and the timestamp.
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise08",
"exercise_metadata": {
"reference_picture_path": "path/to/the/reference/picture/file"
},
"exercise_result": {
"file_path": "path/to/the/audio/file",
"zooming_activity":[{
"action":"in",
"method":"pinch",
"area":{
"width":1,
"height":1,
"center_point":[0.5, 0.5]
},
"zoom_level":"100",
"timestamp":"2025-12-12T00:00:00.000Z",
"event_type":"start"
}, {
"action":"in",
"method":"button",
"area":{
"width":0.8,
"height":0.8,
"center_point":[0.5, 0.5]
},
"zoom_level":"125",
"timestamp":"2025-12-12T00:00:00.000Z",
"event_type":"start"
}]
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 8 is exercise08.
exercise_metadata (object)
This object contains some additional information about the exercise results using the following fields:
reference_picture_path(string): Path to the picture used for the question
exercise_result (object)
This object contains the result using the following fields:
file_path(string): Path to the location of the audio file with speech responsezooming_activity(list): A list of objects tracking the participant’s zooming activity history. Each object represents the participant’s zooming activity at a particular moment using the following fields:- event_type (string): A string value from the following: [“start”, “in-progress”, “end”]
- method (string): A string value from one of the following methods used: [“pinch”, “button”]
- action (string): A string value from the following: [“in”, “out”, “pan”] (Note: “pan” indicates swiping activity)
- zoom_level (float number): A number representing the zoom level in percentage after the zoom action is complete
- timestamp (timestamp): Zoom action timestamp (ISO 8601)
- area (list): This field represents the portion of the image currently visible to the participant.
- width (float number): A number indicating the fraction of the picture width being displayed. Example: 0.5 means 50% of the picture width is visible.
- height (float number): A number indicating the fraction of the picture height being displayed. Example: 0.5 means 50% of the picture height is visible.
- center_point (list): (x, y) values representing which point of the picture is currently in the center point of the image pane/viewport. Example: (0.45, 0.50) means the picture point currently in the center of the image pane is located at 45% of the picture width and 50% of the height, starting from the bottom-left corner of the picture.
Response data
Payloads in this version utilize the shared response format, which documents top-level fields, metadata shapes, and the event catalog, including the deprecation of exercise_result. Exercise-specific details are documented below.
Top-level values
| Field | Type | Description |
|---|---|---|
schema_version |
number | 1 |
exercise_version |
number | Exercise version (changes with each configuration update from the admin portal). |
exercise_id |
string | "exercise08" |
exercise_metadata |
object | See below |
exercise_response |
object | The participant’s response, recorded as a timestamped list of events (details below). |
exercise_result |
object | (Deprecated) Same as schema version 0. |
exercise_metadata
| Field | Type | Description |
|---|---|---|
device_display |
object | Shared shape (see the shared response format). |
time_limit |
object | { "min_ms": 20000, "max_ms": 300000 }: A flexible window — the participant must record for at least 20 seconds and may record up to 5 minutes. |
stimuli |
object | The pictures involved in the exercise, keyed by stimulus_id. Stimulus "0" is the example image used for zoom practice; stimulus "1" is the picture the participant describes. Object details below. |
stimuli
| Field | Type | Description |
|---|---|---|
coord_bounds |
object | Where the image sits on screen (shared shape). |
is_practice |
boolean | Whether this is the example image used for zoom practice (true) or the picture to be described (false). |
url |
string | Link to the source image. |
exercise_response
Picture Description emits the following event types (see the shared event catalog for their meanings): exercise_started / exercise_completed, screen_displayed, practice_session_started / practice_session_completed, response_session_started / response_session_completed, alert_displayed / alert_closed, message_displayed, stimulus_displayed, tap, zoom, and response.
The exercise has a practice session before the response session, where the participant practices zooming on the example image (stimulus "0"). Zoom and pan gestures are recorded as zoom events during both sessions. Tapping “Done” too early triggers the “Please continue to describe more details.” prompt (message_displayed); a completed Done tap opens the “Are you finished?” confirmation (alert_displayed / alert_closed) before the response is recorded.
Each response event carries:
| Field | Type | Description |
|---|---|---|
audio_url |
string | Link to the speech recording (e.g. a .flac file). |
recording_time_ms |
number | Duration of the recording in milliseconds. |
timeout |
boolean | Whether the maximum recording time was reached. |
audio_input_source |
string | (Optional) The audio input device, e.g. "iPhone Microphone". |
exercise_result (deprecated)
| Field | Type | Description |
|---|---|---|
exercise_result |
object | (Deprecated) Same as schema version 0. |
Overview
In this exercise assessing verbal fluency, participants asked to say as many unique words as possible for a given category within a 1-minute time limit.
The exercise process is outlined as follows:
- Exercise instructions are displayed. Participants can click “Start game” to start the exercise.

- Participants are presented with a category and asked to say as many unique words as possible for the given category. The timer in the top right corner of the screen displays the remaining time.

- After the 1-minute time limit, participants can click “Done” to go to the next activity.

Response data
The speech response is recorded using a single 32-bit, mono, .wav audio file with 22050Hz sample rate.
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise09",
"exercise_metadata": {
"question_category": "sample_category_name"
},
"exercise_result": {
"file_path": "path/to/the/audio/file"
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 9 is exercise09.
exercise_metadata (object)
This object contains some additional information about the exercise results using the following fields:
question_category(string): The category for the question
exercise_result (object)
This object contains the result using the following fields:
file_path(string): Path to the location of the audio file with speech response
Response Data
Payloads in this version utilize the shared response format, which documents top-level fields, metadata shapes, and the event catalog, including the deprecation of exercise_result. Exercise-specific details are documented below.
Top-level values
| Field | Type | Description |
|---|---|---|
schema_version |
number | 1 |
exercise_version |
number | Exercise version (changes with each configuration update from the admin portal). |
exercise_id |
string | "exercise09" |
exercise_metadata |
object | See below |
exercise_response |
object | The participant’s response, recorded as a timestamped list of events (details below). |
exercise_result |
object | (Deprecated) Same as schema version 0. |
exercise_metadata
| Field | Type | Description |
|---|---|---|
device_display |
object | Shared shape (see the shared response format). |
time_limit |
object | { "min_ms": 60000, "max_ms": 60000 }: A fixed 60-second task. |
stimuli |
object | The category prompt shown during the exercise, keyed by stimulus_id. Entry fields below. |
stimuli
| Field | Type | Description |
|---|---|---|
coord_bounds |
object | Where the prompt sits on screen (shared shape). |
category |
string | The category the participant must produce words for, e.g. "Animal".Note: Under schema version 0 this value was stored at metadata level as question_category; it now lives on the stimulus as category. |
exercise_response
Verbal Fluency emits the following event types (see the shared event catalog for their meanings): exercise_started / exercise_completed, screen_displayed, response_session_started / response_session_completed, timer_started / timer_expired, alert_displayed / alert_closed, stimulus_displayed, tap, and response.
Recording, the 60-second timer, and the stimulus all begin only when the participant taps “Start Recording” — response_session_started is recorded at that point, not when the response screen is first shown. Taps on the response-session screen before recording starts are still recorded.
Each response event carries:
| Field | Type | Description |
|---|---|---|
category |
string | The category the words were produced for (matches the stimulus’s category). |
audio_url |
string | Link to the speech recording (e.g. a .flac file). |
recording_time_ms |
number | Duration of the recording in milliseconds. |
audio_input_source |
string | (Optional) The audio input device, e.g. "iPhone Microphone". |
exercise_result (deprecated)
| Field | Type | Description |
|---|---|---|
exercise_result |
object | (Deprecated) Same as schema version 0. |
Overview
In this exercise, participants are asked to answer a series of questions that elicit brief speech responses. Participants have 90 seconds to answer each question.
The exercise process is outlined as follows:
- Exercise instructions are displayed. Participants can click “Start game” to start the exercise.

- Exercise questions are displayed sequentially. The timer in the top right corner displays the time remaining to record the response for a question. Participants can click “Next” to go to the next question.

- After completing the last question, participants can click “Done” for the next activity.

Response data
The speech response is recorded using a single 32-bit, mono, .wav audio file with 22050Hz sample rate. Along with the speech response, timestamps separating different answers in the speech response are also recorded. Timestamps are measured in milliseconds and starting from 0.
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise10",
"exercise_metadata": {
"questions": ["sample_question1", "sample_question_2", "sample_question_3", "sample_question_4"]
},
"exercise_result": {
"file_path": "path/to/the/audio/file",
"answers_timestamps": [3527, 6222, 9978, 13504]
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 10 is exercise10.
exercise_metadata (object)
This object contains some additional information about the exercise results using the following fields:
questions(list): List of questions used for the exercise
exercise_result (object)
This object contains the result using the following fields:
file_path(string): Path to the location of the audio file with speech responseanswers_timestamps(list): List of timestamps for the different answers in the recorded speech response
Overview
In this exercise, participants are asked an open-ended question about their daily routine or a general activity. A random question is selected from a set of questions each time. A short speech recording is expected in response. Participants have a 90-second time limit to record their response.
The exercise process is outlined as follows:
- Exercise instructions are displayed. Participants can click “Start game” to start the exercise.

- The exercise question is displayed on the screen. Participants have 90 seconds to record their answer. The timer in the top right corner of the screen displays the remaining time. Participants can click “Done” when they have finished responding.

Response data
The speech response is recorded using a single 32-bit, mono, .wav audio file with 22050Hz sample rate.
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise11",
"exercise_metadata": {
"question": "sample_question"
},
"exercise_result": {
"file_path": "path/to/the/audio/file"
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 11 is exercise11.
exercise_metadata (object)
This object contains some additional information about the exercise results using the following fields:
question(list): The question used
exercise_result (object)
This object contains the result using the following fields:
file_path(string): Path to the location of the audio file with speech response
Overview
This exercise requires participants to tap a flag as soon as it appears on the screen, and this flag-based task is repeated 20 times.
The exercise process is outlined as follows:
- Exercise instructions are displayed. Participants can click “Start game” to start the exercise.

- During the exercise, a flag randomly appears on the screen. Participants have a 5-second time limit to tap the flag, after which it disappears, and a new flag takes its place after a brief interval.

- If participants tap the screen three times when there is no flag on the screen, the exercise becomes paused. A popup warning is shown to the user to ask them to not touch the screen until the flag has appeared. The timer for the next flag restarts when the exercise resumes.

- After finishing the exercise, participants can click “Done” to exit the exercise.

Response data
For each flag task, the following information is recorded
- Whether there was a tap or not. No tap in this exercise is equivalent to a timeout. The answer values recorded are:
- If there was a tap = 1
- If there was a timeout/no tap = -1
- Reaction time measured in milliseconds starting from 0
- In case of a timeout, the reaction time value will be 5000 because the time limit for each flag is 5 seconds
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise12",
"exercise_metadata": {},
"exercise_result": [
{"answer": 1, "reaction_time": 531},
{"answer": 1, "reaction_time": 627},
{"answer": 1, "reaction_time": 655},
{"answer": 1, "reaction_time": 673},
{"answer": 1, "reaction_time": 537},
{"answer": 1, "reaction_time": 711},
{"answer": 1, "reaction_time": 503},
{"answer": 1, "reaction_time": 537},
{"answer": 1, "reaction_time": 603},
{"answer": 1, "reaction_time": 570},
{"answer": 1, "reaction_time": 5000},
{"answer": -1, "reaction_time": 5000},
{"answer": -1, "reaction_time": 5000},
{"answer": -1, "reaction_time": 5000},
{"answer": -1, "reaction_time": 5000},
{"answer": -1, "reaction_time": 5000},
{"answer": -1, "reaction_time": 5000},
{"answer": -1, "reaction_time": 5000},
{"answer": -1, "reaction_time": 5000},
{"answer": -1, "reaction_time": 5000}
]
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 12 is exercise12.
exercise_metadata (object)
Currently, there is no additional information required to process the recorded results for this exercise. Thus, an empty object is present here.
exercise_result (list)
This list contains responses for each question using objects with the following fields:
answer(int): Answer value for a question (values: 1 = tap, -1 = timeout/no tap)reaction_time(int): Reaction time for the question, measured in milliseconds and starting from 0
Response Data
Payloads in this version utilize the shared response format, which documents top-level fields, metadata shapes, and the event catalog, including the deprecation of exercise_result. Exercise-specific details are documented below.
Top-level values
| Field | Type | Description |
|---|---|---|
schema_version |
number | 1 |
exercise_version |
number | Exercise version (changes with each configuration update from the admin portal). |
exercise_id |
string | "exercise12" |
exercise_metadata |
object | See below |
exercise_response |
object | The participant’s response, recorded as a timestamped list of events (details below). |
exercise_result |
array | (Deprecated) Same as schema version 0. |
exercise_metadata
| Field | Type | Description |
|---|---|---|
device_display |
object | Shared shape (see the shared response format). |
stimuli |
object | The flag, keyed by stimulus_id. Each entry carries coord_bounds only (where on screen the flag appears). |
trial |
object | The trial configuration. Entry fields below. |
trial
| Field | Type | Description |
|---|---|---|
count |
number | The number of flag tasks, e.g. 20. |
timeout_ms |
number | The per-flag response window in milliseconds, e.g. 5000. |
random_delay_range_ms |
array | The [min, max] random delay in milliseconds before each flag appears. |
early_tap_limit |
number | The number of taps with no flag showing that triggers the “Exercise Paused” warning, e.g. 3. |
exercise_response
Reaction Time emits the following event types (see the shared event catalog for their meanings): exercise_started / exercise_completed, screen_displayed, response_session_started / response_session_completed, alert_displayed / alert_closed, stimulus_displayed, tap, and response.
The exercise is trial-based: A normal trial is a stimulus_displayed, the tap on the flag (tagged [stimulus]: 1), and a response. A missed trial produces a response with timeout: true and no preceding flag tap. Taps made while no flag is showing are recorded with the tag early_tap; reaching the early-tap limit raises the “Exercise Paused” alert (alert_displayed / alert_closed), and the trial restarts after it is dismissed.
Each response event carries:
| Field | Type | Description |
|---|---|---|
reaction_time_ms |
number | Time (milliseconds) from the flag appearing to the tap; equals timeout_ms on a timeout. |
timeout |
boolean | true when no tap occurred within the per-flag response window. |
exercise_result (deprecated)
| Field | Type | Description |
|---|---|---|
exercise_result |
array | (Deprecated) Same as schema version 0. |
Overview
This exercise requires participants to record themselves while holding a specified facial expression. There are two tasks and both of them are repeated 3 times. Task one requires the participant to hold a smile for 3 seconds. Task two requires the participant to hold a surprised face (raised eyebrows and mouth open as if surprised) for 3 seconds.
The exercise process is outlined as follows:
- Exercise instructions are displayed. Participants can click “Continue” to start the exercise.

- On the task 1 screen, participants are shown the following screen and asked to hold the “smile” expression shown using the emoji for 3 seconds. Participants can click the “Start recording trial” button to record their responses.

- When the recording is completed after 3 seconds, participants can click “Next” to continue.

- Once the three repetitions of task 1 are completed, the following screen is displayed, where participants are informed that they can click “Continue” to move on to the next facial expression (task 2).

- On the task 2 screen, participants are shown the following screen and asked to hold the “surprise” expression shown using the emoji for 3 seconds. Participants can click the “Start recording trial” button to record their responses. Participants have to complete this task three times, similar to task 1.

Response data
A .mp4 video file is recorded for each response. Total 6 files are recorded.
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise13",
"exercise_metadata": {},
"exercise_result": {
"smile_videos": [
"path/to/the/video/file/1",
"path/to/the/video/file/2",
"path/to/the/video/file/3"
],
"surprise_face_videos": [
"path/to/the/video/file/1",
"path/to/the/video/file/2",
"path/to/the/video/file/3"
]
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 13 is exercise13.
exercise_metadata (object)
Currently, there is no additional information required to process the recorded results for this exercise. Thus, an empty object is present here.
exercise_result (list)
This list contains responses for each question using objects with the following fields:
smile_videos(list): List of file paths for the recorded video responses for task 1 (“smile” expression)surprise_face_videos(list): List of file paths for the recorded video responses for task 2 (“surprise” expression)
Overview
In this exercise, participants are presented with a picture and asked to describe what is happening in the picture in detail within a 5-minute time limit. The picture used will be a randomly selected one from a set of pictures determined by the program admin. Admins can also import their own custom images to be included within the pool of random images. Picture description tasks can be used to analyze both the acoustic and linguistic features of speech, providing insight into one’s cognitive health.
The only difference between this exercise and exercise 8 is that this exercise records the participant’s video as they complete the exercise.
The following is a subset of images from the default image set:
1. Beach Scene:
2. Candy Theft:
3. Park Scene:
4. Urban Scene:
5. Farm Scene
6. Candy Theft 2
The example image used for testing the zooming feature is the following image:

The exercise process is outlined as follows:
- Exercise instructions are displayed. Participants can click “Continue” to start the exercise.


- Participants are first presented with an example image that they can use to practice zooming into the image. Participants can pinch the image with their fingers to zoom into the image up to 400% zoom into the image. Participants can click “Start recording” to start the exercise.

- The following screen is displayed for the participants to ensure that their face is in the frame. Participants can click “Start recording” when they are ready.

- Participants are presented with a picture and asked to describe the picture out loud. The timer in the top right corner of the screen displays the remaining time. Participants can record their response here and click “Done” to proceed to the next screen.

- The final screen allows the participant to play the video to check their response, retake it, or click “Done” to submit their response.

Response data
The video is captured using a .mp4 file. The speech response is recorded using a single 32-bit, mono, .wav audio file with a 22050Hz sample rate.
The zooming activity that the participant performed during the recording of the exercise is also recorded. This includes what kind of zooming action was performed, how much the image was zoomed to, where it was performed on the screen and the timestamp.
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise14",
"exercise_metadata": {
"reference_picture_path": "path/to/the/reference/picture"
},
"exercise_result": {
"audio": "path/to/the/audio/file",
"video": "path/to/the/video/file",
"zooming_activity":[{
"action":"in",
"method":"pinch",
"area":{
"width":1,
"height":1,
"center_point":[0.5, 0.5]
},
"zoom_level":"100",
"timestamp":"2025-12-12T00:00:00.000Z",
"event_type":"start"
}, {
"action":"in",
"method":"button",
"area":{
"width":0.8,
"height":0.8,
"center_point":[0.5, 0.5]
},
"zoom_level":"125",
"timestamp":"2025-12-12T00:00:00.000Z",
"event_type":"start"
}]
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 14 is exercise14.
exercise_metadata (object)
This object contains some additional information about the exercise results using the following fields:
reference_picture_path(string): Path to the picture used for the question
exercise_result (object)
This object contains the result using the following fields:
audio(string): Path to the location of the recorded audio filevideo(string): Path to the location of the recorded video filezooming_activity(list): A list of objects tracking the participant’s zooming activity history. Each object represents the participant’s zooming activity at a particular moment using the following fields:- event_type (string): A string value from the following: [“start”, “in-progress”, “end”]
- method (string): A string value from one of the following methods used: [“pinch”, “button”]
- action (string): A string value from the following: [“in”, “out”, “pan”] (Note: “pan” indicates swiping activity)
- zoom_level (float number): A number representing the zoom level in percentage after the zoom action is complete
- timestamp (timestamp): Zoom action timestamp (ISO 8601)
- area (list): This field represents the portion of the image currently visible to the participant.
- width (float number): A number indicating the fraction of the picture width being displayed. Example: 0.5 means 50% of the picture width is visible.
- height (float number): A number indicating the fraction of the picture height being displayed. Example: 0.5 means 50% of the picture height is visible.
- center_point (list): (x, y) values representing which point of the picture is currently in the center point of the image pane/viewport. Example: (0.45, 0.50) means the picture point currently in the center of the image pane is located at 45% of the picture width and 50% of the height, starting from the bottom-left corner of the picture
Overview
This exercise introduces a cognitive testing method that assesses impulse control and response inhibition. It is commonly used to measure executive function.
In its simplest form, it asks the participant to do something when shown one thing, and not to do something when shown another. Specifically, the exercise presents a 3×3 grid where images appear randomly in different locations. Participants are instructed to tap the screen when a “go” image appears and to refrain from tapping when a “no-go” image is shown.
The exercise process is outlined as follows:
- Exercise instructions are displayed. Participants can watch a demo with the “Watch Demo” button or click the “Start” button to begin the exercise.

- Currently, the grey and yellow bananas are the only available stimulus images being used for this exercise, where the grey bananas are the ‘go image’ and the yellow bananas are the ‘no-go image.’ In the image below, a yellow banana is shown and thus should not be tapped on. If an image is not tapped on, then the image will disappear after a few seconds and a new trial will begin.

- In the next trial shown below, a grey banana is shown and should be tapped on as quickly as possible. The image is placed in a random location, but the tapping can be recorded by tapping on any part of the screen. Once the image is tapped, it disappears and there is a short delay before the next trial image appears.

- There are 20 trials in total = 5 no-go + 15 go. These trials occur in random order. For each trial, all taps (answer tap and any extra taps) provided by the participant should be recorded.
Response data
The response data for this exercise includes the following:
For each trial:
- Type of stimulus:
- Either “no-go” or “go”
- Answer:
- 1 = Correct response: participant tapped for go, or did not tap for no-go
- 0 = Incorrect response: participant did not tap for go, or tapped for no-go
- The display time that the image of this trial appeared from the start of the entire exercise in milliseconds.
- The number of the current trial
- A list of this trial’s tap history since each tap is recorded. For teach tap:
- Whether this tap contributed to the trial answer, regardless of whether the participant was meant to tap or not.
- The (x, y) coordinate of where the tap occurred on the screen.
- The timestamp of when the tap occurred from the start of the entire exercise in milliseconds.
- The display location of the image within the grid using a two character code. This code is equal to a combination of two of the following positions:
- T = Top, B = Bottom, R = Right, L = Left, C = center (Horizontal), M = Middle (vertical)
- These are the 9 valid display locations:
| TL | TC | TR |
| ML | MC | MR |
| BL | BC | BR |
As well as timestamps to detail the time from the start of the exercise to the end:
- When the participant entered the assessment and was able to read the instructions
- When the participant starts the first trial
- When the participant finishes the last trial
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise15",
"exercise_metadata": {
"device_display": {
"width": 400,
"height": 870
},
"grid_specs": {
"width": 250,
"height": 250,
"top_left_coords": [312, 66]
},
"stim_info": {
"go_stim": {
"name": "grayBanana",
"file_path": "path/to/the/image/file"
},
"no_go_stim":{
"name": "yellowBanana",
"file_path": "path/to/the/image/file"
},
exercise_number: 1
}
},
"exercise_result": {
"trials": [ {
"tap_history": [ {
"answer_tap": true,
"tap_timestamp": 2863,
"tap_coords": [402, 220]
}, ... ]
"stimulus_type": "go",
"answer": 1,
"display_location": "ML,
"displayed_at": 1995,
"trial_number": 1 }, ... ]
"instructed_at": "2025-12-31T01:14:36.649Z",
"started_at": "2025-12-31T01:14:40.649Z",
"completed_at":"2025-12-31T01:14:42.649Z"
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 15 is exercise15.
exercise_metadata (object)
This object contains some additional information about the exercise results using the following fields:
device_display(string): An object containing information about the display size- width (int): Display width, measured in Points (pt)
- height (int): Display height, measured in Points (pt)
exercise_number(int): Represents the index of the exercise within the assessmentgrid_specs(object): An object containing information about the displayed grid- width (int): Display width, measured in Points (pt)
- height (int): Display height, measured in Points (pt)
- top_left_coords (list): Coordinates of the top left grid corner on the device display, in (x, y) format
stim_info(object): Information on the stimulus images used- go_stim (object): Information on the go-stim
- name (string): Name of the go-stim
- file_path (string): Path to the image used for the go-stim
- no_go_stim (object): Information on the no-go-stim
- name (string): Name of the no-go-stim
- file_path (string): Path to the image used for the no-go-stim
- go_stim (object): Information on the go-stim
exercise_result (object)
This object contains the result using the following fields:
trials(list<object>): A list of objects, with each objectcontaining the following properties for a trial
- stimulus_type (string): A string value from the following, representing the trial type:“go” or “no-go”
- answer (int): Participant response values (0 | 1)
- 1 = Correct response: tap for go, no tap for no-go
- 0 = Incorrect response: no tap for go, tap for no-go
- display_location (string): Stimulus display location on the grid
- “TL”, “TC”, “TR”, “ML”, “MC”, “MR”, “BL”, “BC”, “BR”
- The letters stand for Top, Middle, Bottom, Left, Center, and Right
- trial_number (int): The trial number
- tap_history (list <object>): A list of objects containing the following information for all participant taps for the displayed stimulus
- answer_tap (bool): Boolean value (true | false) indicating if this tap contributed to the trial answer (e.g., If the participant taps for a “no-go” stimulus, it defines the trial answer as incorrect)
- tap_timestamp (int): Tap timestamp (ms)
- tap_coords (list): (x, y) coordinates for the tap location with respect to the device display
instructed_at(date): The timestamp (ISO 8601) indicating when the participant chooses to begin the exercise session, i.e., when instructions are first shownstarted_at(date): The timestamp (ISO 8601) indicating when the participant starts recording their response, i.e., when the first trial beginscompleted_at(date): The timestamp (ISO 8601) indicating when the participant finishes recording their response, i.e., clicks the last ‘Done’ button
Response Data
Payloads in this version utilize the shared response format, which documents top-level fields, metadata shapes, and the event catalog, including the deprecation of exercise_result. Exercise-specific details are documented below.
Top-level values
| Field | Type | Description |
|---|---|---|
schema_version |
number | 1 |
exercise_version |
number | Exercise version (changes with each configuration update from the admin portal). |
exercise_id |
string | "exercise15" |
exercise_metadata |
object | See below |
exercise_response |
object | The participant’s response, recorded as a timestamped list of events (details below). |
exercise_result |
object | (Deprecated) Same as schema version 0. |
exercise_metadata
| Field | Type | Description |
|---|---|---|
device_display |
object | Shared shape (see the shared response format). |
trial |
object | The trial configuration. Entry fields below. |
controls |
object | The 3×3 grid cells, keyed by control_id "1"–"9". Each entry carries coord_bounds and grid_position (row / col, 1-indexed). Replaces the grid_specs object of schema version 0. |
stimuli |
object | The stimulus images, keyed by stimulus_id. Replaces the stim_info object of schema version 0; go/no-go is now carried by is_go rather than by the key name. Entry fields below. |
trial
| Field | Type | Description |
|---|---|---|
count |
number | The total number of trials, e.g. 30. |
go_count |
number | The number of go trials, e.g. 21. |
no_go_count |
number | The number of no-go trials, e.g. 9. |
timeout_ms |
number | The per-trial window in milliseconds before a no-tap is recorded, e.g. 1500. |
random_delay_range_ms |
array | The [min, max] random delay in milliseconds before each stimulus appears. |
stimuli
| Field | Type | Description |
|---|---|---|
is_go |
boolean | Whether this is the go image (true) or the no-go image (false). |
url |
string | Link to the stimulus image. |
exercise_response
Go/No-Go emits the following event types (see the shared event catalog for their meanings): exercise_started / exercise_completed, screen_displayed, demo_started / demo_completed, response_session_started / response_session_completed, alert_displayed / alert_closed, stimulus_displayed, tap, and response.
The exercise is trial-based: Each trial is a stimulus_displayed carrying the control_id of the grid cell the stimulus appeared in, the participant’s tap(s) if any, and a response, sharing a trial_index. Taps made before a stimulus appears carry only the trial_index (no stimulus_id / control_id yet).
Each response event carries:
| Field | Type | Description |
|---|---|---|
is_correct |
boolean | Whether the trial was answered correctly: a tap for a go stimulus, or no tap for a no-go stimulus. |
timeout |
boolean | true when no tap occurred within the trial window. For a no-go stimulus, timing out is the correct answer (timeout: true, is_correct: true). |
reaction_time_ms |
number | Time (milliseconds) from the stimulus appearing to the tap; equals timeout_ms on a timeout. |
exercise_result (deprecated)
| Field | Type | Description |
|---|---|---|
exercise_result |
object | (Deprecated) Same as schema version 0. |
Overview
This exercise is a follow-up to the picture description exercise, asking a participant to recall as much detail as they can for the picture they just described earlier, but this time without being able to see the picture. The participant has a maximum of 5 minutes to answer.
This exercise has a prerequisite: the picture description task must be completed before starting this exercise. Whether this exercise is included in an assessment or not will be controlled from the NeuroLup admin portal.
The exercise process is outlined as follows:
- Exercise instructions are displayed. Participants can click “Start Recording” to start the exercise.
- The participant will only see the a blank recording screen as they will need to remember and describe the picture that was used during the picture description task that they performed beforehand. The participant will have a maximum of 5 minutes to answer.

- The participant must record for at least 20 seconds. If the participant tries to end before, a message is displayed notifying the participant: “Please continue to describe more details.” After 20 seconds, the participant can press the end button to finish the assessment.

Response data
The speech response is recorded using a single 32-bit, mono, .wav audio file with 22050Hz sample rate.
Three dates are recorded at certain times during this exercise:
- When the participant entered the assessment and was able to read the instructions
- When the participant starts recording
- When the participant finishes recording
Exercise Result
The following example shows the JSON object structure used for this exercise result:
{
"exercise_id": "exercise16",
"exercise_metadata": {},
"exercise_result": {
"file_path": "path/to/the/audio/file",
"instructed_at": "2025-12-31T01:14:36.649Z",
"started_at": "2025-12-31T01:14:40.649Z",
"completed_at":"2025-12-31T01:14:42.649Z"
}
}
Let’s try to understand the results recorded for this exercise using the fields of this JSON object.
exercise_id (string)
The default exercise_id value for exercise 16 is exercise16.
exercise_metadata (object)
Currently, there is no additional information required to process the recorded results for this exercise. Thus, an empty object is present here.
exercise_result (object)
This object contains the result using the following fields:
file_path(string): Path to the location of the audio file with speech responseinstructed_at(date): The timestamp (ISO 8601) indicating when the participant chooses to begin the exercise session, i.e., when instructions are first shownstarted_at(date): The timestamp (ISO 8601) indicating when the participant starts recording their response, i.e., when the timer startscompleted_at(date): The timestamp (ISO 8601) indicating when the participant finishes recording their response, i.e., when the ‘End’ button was pressed
Response Data
Payloads in this version utilize the shared response format, which documents top-level fields, metadata shapes, and the event catalog, including the deprecation of exercise_result. Exercise-specific details are documented below.
Top-level values
| Field | Type | Description |
|---|---|---|
schema_version |
number | 1 |
exercise_version |
number | Exercise version (changes with each configuration update from the admin portal). |
exercise_id |
string | "exercise16" |
exercise_metadata |
object | See below |
exercise_response |
object | The participant’s response, recorded as a timestamped list of events (details below). |
exercise_result |
object | (Deprecated) Same as schema version 0. |
exercise_metadata
| Field | Type | Description |
|---|---|---|
device_display |
object | Shared shape (see the shared response format). |
time_limit |
object | { "min_ms": 20000, "max_ms": 300000 }: A flexible window — the participant must record for at least 20 seconds and may record up to 5 minutes. |
Note: There is no stimuli or controls field — no picture is displayed during this exercise, since the participant recalls the image (shown during Picture Description) from memory.
exercise_response
Picture Recall emits the following event types (see the shared event catalog for their meanings): exercise_started / exercise_completed, screen_displayed, response_session_started / response_session_completed, alert_displayed / alert_closed, message_displayed, tap, and response.
Recording begins when the participant taps “Start Recording” (response_session_started). Tapping “End” before the 20-second minimum triggers the “Please continue to describe more details.” prompt (message_displayed); once past the minimum, the End tap finishes the recording. There are no stimulus_displayed events.
Each response event carries:
| Field | Type | Description |
|---|---|---|
audio_url |
string | Link to the speech recording (e.g. a .flac file). |
recording_time_ms |
number | Duration of the recording in milliseconds. |
timeout |
boolean | Whether the maximum recording time was reached. |
audio_input_source |
string | (Optional) The audio input device, e.g. "iPhone Microphone". |
exercise_result (deprecated)
| Field | Type | Description |
|---|---|---|
exercise_result |
object | (Deprecated) Same as schema version 0. |
Introduction
This document is a guide to understanding the battery results recorded using NeuroLup.
NeuroLup offers various cognitive assessments, known colloquially as “brain games” or “cognitive exercises”. NeuroLup also provides the flexibility to create custom test batteries by selecting any combination of these exercises. When a participant successfully finishes a battery, the system generates a comprehensive battery result. This battery result is a collection of results for exercises available within that specific battery.
A battery result is represented using a JSON object. Here is an example of a battery result:
{
"battery_metadata": {
"participant_id": "email_or_username",
"mode": "program",
"program_name": "sample_program_name",
"battery_name": "sample_battery_name",
"admin": "admin_email",
"created_at": "creation_date_and_time",
"updated_at": "updation_date_and_time",
"device_info": {
"manufacturer":"Apple",
"model_name":"iPhone",
"system_name":"iOS",
"system_version":"17.1.1",
"type":"iPhone",
"app_info":{
"id":"com.dev.relup",
"version":"1.0.0",
"language":"en-US"
}
}
},
"battery_result": {
"exercise02": {
"exercise_id": "exercise02",
"exercise_metadata": {},
"exercise_result": {
"file_path": "path/to/the/audio/file"
}
},
"exercise04": {
"exercise_id": "exercise04",
"exercise_metadata": {},
"exercise_result": {
"right_index_finger_taps": [17, 38, 58, 81, 102, 127, 147, 169, 192, 212],
"left_index_finger_taps": [15, 35, 55, 75, 93, 115, 132, 152, 170, 188, 2062]
}
}
}
}
The rest of this document explains the different fields used here and their values.
Battery Result Explanation
Let’s try to understand the battery results recorded for NeuroLup by examining the fields of the JSON object example presented above.
A battery result JSON object contains the battery results and certain information about the battery, including the participant identifier, program name, and battery name. It consists of two fields:
battery_metadata (object)
This object contains information about the battery results using the following fields:
participant_id(string): Participant identifiermode(string): Indicates the NeuroLup mode used to collect the battery results (values:program,on-demand)program_name(string): Program name (optional, applicable for the program mode)battery_name(string): Battery nameproduct_code(string): Product code (optional, applicable for the on-demand mode)admin(string): Email address identifying the admin (optional, applicable for the program mode)assistant(string): Email address identifying the assistant (optional, applicable for the on-demand mode)created_at(string): Creation time for the battery resultsupdated_at(string): Updation time for the battery results (if applicable)device_info(object): Available information about the device used to complete the battery exercises in akey:valueformat
battery_result (object)
This object contains the results for the exercises available with the battery in a key:value format. Each key refers to an exercise, and each value is an object representing the exercise response data.
key (string):
Each exercise is identified with a key in the format exerciseXX, where XX represents the exercise number. For example, the JSON object above shows that the battery_result object contains results for exercises 2 and 4, identified by the keys exercise02 and exercise04.
value (object):
This object represents exercise results using the following nested fields:
exercise_id(string): Exercise ID (same as the key)exercise_metadata(object): Additional information required for the exercise results, which is exercise-specific (for more details, please refer to the Exercises documentation)exercise_result(object): Exercise-specific results (for more details, please refer to the Exercises documentation)
Introduction
This document is a guide to understanding the form results recorded using NeuroLup.
NeuroLup offers various cognitive assessments, known colloquially as “brain games” or “cognitive exercises”. NeuroLup also provides the flexibility to create custom forms by selecting any combination of questions and sections. When a participant successfully finishes a form, the system generates a comprehensive form result. This form result is a collection of results for the questions available within that specific form.
A form result is represented using a JSON object. Here is an example of a form result:
{
"form_metadata": {
"participant_id": "email_or_username",
"mode": "program",
"program_name": "sample_program_name",
"form_name": "sample_form_name",
"admin": "admin_email",
"created_at": "creation_date_and_time",
"updated_at": "updation_date_and_time",
"occurrence_number": "occurrence_number",
"device_info": {
"manufacturer":"Apple",
"model_name":"iPhone",
"system_name":"iOS",
"system_version":"17.1.1",
"type":"iPhone"
}
}
"form_response": [
{
"index":0,
"fieldType":"question",
"question_type":"singleSelectMCQ",
"answer":"My single selection"
},
{
"index":1,
"fieldType":"section",
"questions_idx":[2]
},
{
"index":2,
"field_type":"question",
"question_type":"multipleSelectMCQ",
"answer":["Selected Multiple", "This is an other answer"],
"is_other_answer": true
}
]
}
The rest of this document explains the different fields used here and their values.
Form Result Explanation
Let’s try to understand the battery results recorded for NeuroLup by examining the fields of the JSON object example presented above.
A form result JSON object contains the form responses and certain information about the form, including the participant identifier, program name, and form name. It consists of two fields:
form_metadata (object)
This object contains information about the form results using the following fields:
-
participant_id(string): Participant identifier -
mode(string): Indicates the mode used to collect the form results (currently program mode only) -
program_name(string): Program name -
form_name(string): Form name -
admin(string): Email address identifying the admin -
created_at(string): Creation time for the form results -
updated_at(string): Updation time for the form results (if applicable) -
occurrence_number(integer): The specific occurrence number of this form result -
device_info(object): Available information about the device used to complete the form in akey:valueformat
form_response (array)
form_response is an array of form fields in display order. Each form field is a section header or a question. Object representation of a form field:
| Field | Type | Description |
|---|---|---|
index |
number | Position of the field in the form. |
fieldType |
string | Denotes the field type: section or question. |
questionsIdx |
array | Available if field_type: section. Lists index positions for questions belonging to the section. |
questionType |
string | Available if field_type: question. One of the types noted in Form Question Responses. |
answer |
union of types mentioned in Form Question Responses | Available if field_type: question. The participant’s answer. See Form Question Responses for details. |
isOtherAnswer |
boolean | Available if field_type: question and questionType is singleSelectMCQ or multipleSelectMCQ. This flag indicates whether the user selected to enter a free-text (other) answer. |
Form Question Responses
Answer format by question type:
questionType |
Answer Field Type | Description |
|---|---|---|
singleSelectMCQ |
string | Single-select multiple-choice question. The answer is the selected option’s text. When the participant chooses the free-text “Other” option, isOtherAnswer is true and the answer is the text they entered. |
multipleSelectMCQ |
array <string> | Multiple-select multiple-choice question. The answer lists every selected option’s text; a free-text “Other” entry is included when isOtherAnswer is true. |
dropdown |
string | Dropdown selection. The answer is the selected option’s text. |
textShort |
string | Short free-text answer (single line). |
textLong |
string | Long free-text answer (multi-line). |
email |
string | Email address entered by the participant. |
number |
number | Numeric answer. |
date |
date (ISO 8601 date) | Calendar date selected by the participant. |
time |
string (HH:MM:SS) |
Time of day in 24-hour format, e.g. 13:35:53. |
duration |
string (HH:MM:SS) |
Elapsed-time answer between 00:00:00 and 24:00:00. |
dateRange |
object { "start": date, "end": date } |
A date range with ISO 8601 start and end dates. |
