MENU navbar-image

Introduction

This documentation aims to provide all the information you need to work with our API.

Base URL

https://dum-staging.aetherdigitaltherapy.com

Authenticating requests

This API is authenticated by sending an Authorization header with the value "Bearer {ACCESS_TOKEN}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

Main Aether API (api.aetherdigitaltherapy.com) is used to authorize requests to this API too. You can retrieve access token by calling the /api/login endpoint on main Aether API. Then use your access token same way as in main API. Requests from local network do not require any authorization.

BLADE data

Send BLADE data

requires authentication

Save BLADE data in JSON format to a file with timestamp in name. Files are stored in storage/app/blade/ which is not publicly accessible. Only SuperAdmin users can send BLADE data.

Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/blade-data" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"data\": \"[\\n                    {\\n                        \\\"extractor_name\\\": \\\"number_of_all_dum_dumps\\\",\\n                        \\\"extractor_arguments\\\": {\\n                            \\\"period\\\": \\\"0001-01-01 - 9999-12-31\\\",\\n                            \\\"dum_version\\\": \\\"all\\\"\\n                        },\\n                        \\\"extractor_category\\\": \\\"dum1a\\\",\\n                        \\\"result\\\": 10506\\n                    }\\n                ]\"
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/blade-data"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "data": "[\n                    {\n                        \"extractor_name\": \"number_of_all_dum_dumps\",\n                        \"extractor_arguments\": {\n                            \"period\": \"0001-01-01 - 9999-12-31\",\n                            \"dum_version\": \"all\"\n                        },\n                        \"extractor_category\": \"dum1a\",\n                        \"result\": 10506\n                    }\n                ]"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201, Success response):


{
    "message": "BLADE data saved successfully",
    "file": "blade_data_2025-10-05_12-07-07_09.json"
}
 

Request   

POST api/blade-data

Body Parameters

data  string  

BLADE data in JSON format. Must be a valid JSON string.

Get latest BLADE data

requires authentication

Retrieve the most recently saved BLADE data file. This is the only way to access BLADE data files - they are not publicly accessible.

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/blade-data" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/blade-data"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200, Success response):


{
    "data": [
        {
            "extractor_name": "number_of_all_dum_dumps",
            "extractor_arguments": {
                "period": "0001-01-01 - 9999-12-31",
                "dum_version": "all"
            },
            "result": 8537
        },
        {
            "extractor_name": "number_of_users_dumping_dum",
            "extractor_arguments": {
                "period": "0001-01-01 - 9999-12-31",
                "dum_version": "all"
            },
            "result": 530
        },
        {
            "extractor_name": "average_number_of_user_dum_dumps",
            "extractor_arguments": {
                "period": "0001-01-01 - 9999-12-31",
                "dum_version": "all"
            },
            "result": 16.10754716981132
        }
    ],
    "file": "blade_data_2025-10-05_12-07-07_09.json"
}
 

Request   

GET api/blade-data

Charts

Get chart breakdown

requires authentication

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/charts/grip/1" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"date_from\": \"2023-05-01\",
    \"date_to\": \"2023-05-10\",
    \"group\": \"grip\",
    \"grips\": [
        1,
        2,
        5
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/charts/grip/1"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "date_from": "2023-05-01",
    "date_to": "2023-05-10",
    "group": "grip",
    "grips": [
        1,
        2,
        5
    ]
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200, Success response):


[
    {
        "group_by": "1",
        "device_id": "66",
        "grip": "1",
        "instances": "158",
        "time": "62050",
        "percentage": "31.3492",
        "goal": "158"
    },
    {
        "group_by": "2",
        "device_id": "66",
        "grip": "2",
        "instances": "44",
        "time": "2524",
        "percentage": "8.7302",
        "goal": "44"
    },
    {
        "group_by": "3",
        "device_id": "66",
        "grip": "3",
        "instances": "6",
        "time": "24",
        "percentage": "1.1905",
        "goal": "6"
    },
    {
        "group_by": "4",
        "device_id": "66",
        "grip": "4",
        "instances": "44",
        "time": "8234",
        "percentage": "8.7302",
        "goal": "44"
    },
    {
        "group_by": "6",
        "device_id": "66",
        "grip": "6",
        "instances": "164",
        "time": "134904",
        "percentage": "32.5397",
        "goal": "164"
    },
    {
        "group_by": "7",
        "device_id": "66",
        "grip": "7",
        "instances": "52",
        "time": "8760",
        "percentage": "10.3175",
        "goal": "52"
    },
    {
        "group_by": "8",
        "device_id": "66",
        "grip": "8",
        "instances": "14",
        "time": "160",
        "percentage": "2.7778",
        "goal": "14"
    },
    {
        "group_by": "9",
        "device_id": "66",
        "grip": "9",
        "instances": "22",
        "time": "11746",
        "percentage": "4.3651",
        "goal": "22"
    }
]
 

Request   

GET api/charts/grip/{deviceId}

URL Parameters

deviceId  integer  

Device Id

Body Parameters

date_from  string  

Start date for data fetching. Default: current date. Must be a valid date. Must be a valid date in the format Y-m-d.

date_to  string optional  

End date for data fetching. Default: current date. Must be a valid date. Must be a valid date in the format Y-m-d. Must be a date after or equal to date_from.

group  string optional  

Thanks to grouping, you can divide the results into a type of grip or a period of time. Must be one of hourly, day, week, month, or grip.

grips  string[] optional  

Select specified grips to display in chart.

Get chart grasp count

requires authentication

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/charts/grip-count/12" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"date_from\": \"2023-05-01\",
    \"date_to\": \"2023-05-10\",
    \"group\": \"grip\",
    \"grips\": [
        1,
        2,
        5
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/charts/grip-count/12"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "date_from": "2023-05-01",
    "date_to": "2023-05-10",
    "group": "grip",
    "grips": [
        1,
        2,
        5
    ]
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200, Success response):


[
    {
        "group_by": "1",
        "device_id": "75",
        "grip": "1",
        "instances": "324",
        "percentage": "36.7764",
        "goal": "9"
    },
    {
        "group_by": "2",
        "device_id": "75",
        "grip": "2",
        "instances": "6",
        "percentage": "0.6810",
        "goal": "3"
    },
    {
        "group_by": "3",
        "device_id": "75",
        "grip": "3",
        "instances": "11",
        "percentage": "1.2486",
        "goal": "2"
    },
    {
        "group_by": "6",
        "device_id": "75",
        "grip": "6",
        "instances": "374",
        "percentage": "42.4518",
        "goal": "9"
    },
    {
        "group_by": "7",
        "device_id": "75",
        "grip": "7",
        "instances": "24",
        "percentage": "2.7242",
        "goal": "6"
    },
    {
        "group_by": "8",
        "device_id": "75",
        "grip": "8",
        "instances": "1",
        "percentage": "0.1135",
        "goal": "1"
    },
    {
        "group_by": "12",
        "device_id": "75",
        "grip": "12",
        "instances": "141",
        "percentage": "16.0045",
        "goal": "5"
    }
]
 

Request   

GET api/charts/grip-count/{deviceId}

URL Parameters

deviceId  integer  

Device Id

Body Parameters

date_from  string  

Start date for data fetching. Default: current date. Must be a valid date. Must be a valid date in the format Y-m-d.

date_to  string optional  

End date for data fetching. Default: current date. Must be a valid date. Must be a valid date in the format Y-m-d. Must be a date after or equal to date_from.

group  string optional  

Thanks to grouping, you can divide the results into a type of grip or a period of time. Must be one of hourly, day, week, month, or grip.

grips  string[] optional  

Select specified grips to display in chart.

Get emg peak chart data

requires authentication

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/charts/emg-peak/1" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"period\": \"day\",
    \"date_from\": \"2023-05-01\",
    \"date_to\": \"2023-05-10\"
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/charts/emg-peak/1"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "period": "day",
    "date_from": "2023-05-01",
    "date_to": "2023-05-10"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200, Success response for full range):


[
    {
        "device_id": 1,
        "period": "all",
        "datetime_interval": "04:45:00",
        "count": "160"
    },
    {
        "device_id": 1,
        "period": "all",
        "datetime_interval": "05:00:00",
        "count": "792"
    },
    {
        "device_id": 1,
        "period": "all",
        "datetime_interval": "05:15:00",
        "count": "1112"
    },
    {
        "device_id": 1,
        "period": "all",
        "datetime_interval": "05:30:00",
        "count": "880"
    },
    {
        "device_id": 1,
        "period": "all",
        "datetime_interval": "05:45:00",
        "count": "848"
    }
]
 

Example response (200, Success response month):


[
	{
		"device_id": 1,
		"period": "month",
		"datetime_interval": "2022-07 18:45",
		"count": "2184"
	},
	{
		"device_id": 1,
		"period": "month",
		"datetime_interval": "2022-07 19:00",
		"count": "2800"
	},
	{
		"device_id": 1,
		"period": "month",
		"datetime_interval": "2022-07 19:15",
		"count": "1312"
	},
	{
		"device_id": 1,
		"period": "month",
		"datetime_interval": "2022-07 19:30",
		"count": "1064"
	},
]

 

Example response (200, Success response day):


[
    {
        "device_id": 1,
        "period": "day",
        "datetime_interval": "2022-07-27 15:00",
        "count": "304"
    },
    {
        "device_id": 1,
        "period": "day",
        "datetime_interval": "2022-07-27 15:15",
        "count": "2032"
    },
    {
        "device_id": 1,
        "period": "day",
        "datetime_interval": "2022-07-27 15:30",
        "count": "2296"
    },
    {
        "device_id": 1,
        "period": "day",
        "datetime_interval": "2022-07-27 15:45",
        "count": "2544"
    }
]
 

Request   

GET api/charts/emg-peak/{deviceId}

URL Parameters

deviceId  integer  

Device Id

Body Parameters

period  string  

The range over which the data will be grouped into charts. Must be one of day, month, or all.

date_from  string  

Start date for data fetching. Must be a valid date. Must be a valid date in the format Y-m-d.

date_to  string optional  

End date for data fetching. Must be a valid date. Must be a valid date in the format Y-m-d. Must be a date after or equal to date_from.

Get chart velocity level data

requires authentication

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/charts/velocity-level/16" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"date_from\": \"2023-05-01\",
    \"date_to\": \"2023-05-10\",
    \"group\": \"grip\",
    \"grips\": [
        1,
        2,
        5
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/charts/velocity-level/16"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "date_from": "2023-05-01",
    "date_to": "2023-05-10",
    "group": "grip",
    "grips": [
        1,
        2,
        5
    ]
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200, Success response):


[
    {
        "group_by": "15",
        "device_id": 1016,
        "grip": 1,
        "velocity_open_1": "127",
        "velocity_open_2": "127",
        "velocity_open_3": "0",
        "velocity_close_1": "508",
        "velocity_close_2": "0",
        "velocity_close_3": "0"
    },
    {
        "group_by": "15",
        "device_id": 1016,
        "grip": 2,
        "velocity_open_1": "3683",
        "velocity_open_2": "4826",
        "velocity_open_3": "5334",
        "velocity_close_1": "32131",
        "velocity_close_2": "2159",
        "velocity_close_3": "4445"
    },
    {
        "group_by": "15",
        "device_id": 1016,
        "grip": 6,
        "velocity_open_1": "4064",
        "velocity_open_2": "4572",
        "velocity_open_3": "6858",
        "velocity_close_1": "27178",
        "velocity_close_2": "1270",
        "velocity_close_3": "1651"
    },
    {
        "group_by": "15",
        "device_id": 1016,
        "grip": 7,
        "velocity_open_1": "254",
        "velocity_open_2": "889",
        "velocity_open_3": "0",
        "velocity_close_1": "1651",
        "velocity_close_2": "127",
        "velocity_close_3": "0"
    }
]
 

Request   

GET api/charts/velocity-level/{deviceId}

URL Parameters

deviceId  integer  

Device Id

Body Parameters

date_from  string  

Start date for data fetching. Must be a valid date. Must be a valid date in the format Y-m-d.

date_to  string optional  

End date for data fetching. Default: current date. Must be a valid date. Must be a valid date in the format Y-m-d. Must be a date after or equal to date_from.

group  string optional  

Thanks to grouping, you can divide the results into a type of grip or a period of time. Default: none. Must be one of hourly, day, week, month, grip, or none.

grips  string[] optional  

Select specified grips to display in chart.

Get chart active and passive time spent

requires authentication

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/charts/time-spent/13" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"date_from\": \"2023-05-01\",
    \"date_to\": \"2023-05-10\",
    \"group\": \"day\"
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/charts/time-spent/13"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "date_from": "2023-05-01",
    "date_to": "2023-05-10",
    "group": "day"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200, Success response for day group):


[
    {
        "passive_time": 0,
        "active_time": 0,
        "group_by": "2023-12-03"
    },
    {
        "passive_time": 0,
        "active_time": 0,
        "group_by": "2023-12-04"
    },
    {
        "passive_time": 0,
        "active_time": 0,
        "group_by": "2023-12-05"
    },
    {
        "passive_time": 0,
        "active_time": 0,
        "group_by": "2023-12-06"
    },
    {
        "passive_time": 25128,
        "active_time": 0,
        "group_by": "2023-12-07"
    },
    {
        "passive_time": 86022,
        "active_time": 377,
        "group_by": "2023-12-08"
    },
    {
        "passive_time": 86399,
        "active_time": 0,
        "group_by": "2023-12-09"
    }
]
 

Example response (200, Success response for all data):


{
    "passive_time": 38600,
    "active_time": 1000,
    "percentage_passive_time": 97.47,
    "percentage_active_time": 2.52,
    "group_by": "none"
}
 

Request   

GET api/charts/time-spent/{deviceId}

URL Parameters

deviceId  integer  

Device Id

Body Parameters

date_from  string  

The start date for the data range. Should be in YYYY-MM-DD format. Must be a valid date. Must be a valid date in the format Y-m-d.

date_to  string optional  

The end date for the data range and must be the same as or after the date_from. Should be in YYYY-MM-DD format. Must be a valid date. Must be a valid date in the format Y-m-d. Must be a date after or equal to date_from. Must be a date before or equal to now.

group  string optional  

The category or classification of the data. Allowed values are day or none. Must be one of day or none.

Clean data

Save EMG peak

requires authentication

Request body should look like:


{
    "device_id": 1,
    "data": [
        {"sensor": 0, "emg_peak": 92, "datetime": "2022-05-30 12:00:00"},
        {"sensor": 1, "emg_peak": 50, "datetime": "2022-05-30 12:00:00"}
    ]
}
Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/emg-peaks" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"device_id\": 1,
    \"data\": [
        {
            \"sensor\": 1,
            \"emg_peak\": 92,
            \"datetime\": \"2022-05-30 12:00:00\"
        }
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/emg-peaks"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "device_id": 1,
    "data": [
        {
            "sensor": 1,
            "emg_peak": 92,
            "datetime": "2022-05-30 12:00:00"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "message": "Saved 100 entries"
}
 

Request   

POST api/clean-data/emg-peaks

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

data  object[] optional  

data[].sensor  integer  

Sensor number.

data[].emg_peak  integer  

EMG peak value.

data[].datetime  string  

Entry datetime. Must be a valid date in the format Y-m-d H:i:s.

Save grasp count

requires authentication

Request body should look like:


{
    "device_id": 1,
    "data": [
        {"grip": 1, "grasp_count": 5, "datetime": "2022-05-30 12:00:00"},
        {"grip": 2, "grasp_count": 30, "datetime": "2022-05-30 12:00:00"}
    ]
}
Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/grasp-count" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"device_id\": 1,
    \"data\": [
        {
            \"grip\": 1,
            \"grasp_count\": 5,
            \"datetime\": \"2022-05-30 12:00:00\"
        }
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/grasp-count"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "device_id": 1,
    "data": [
        {
            "grip": 1,
            "grasp_count": 5,
            "datetime": "2022-05-30 12:00:00"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "message": "Saved 100 entries"
}
 

Request   

POST api/clean-data/grasp-count

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

data  object[] optional  

data[].grip  integer  

Grip.

data[].grasp_count  integer  

Grasp count.

data[].datetime  string  

Entry datetime. Must be a valid date in the format Y-m-d H:i:s.

Save grip switches

requires authentication

Request body should look like:


{
    "device_id": 1,
    "data": [
        {
            "switched_from_grip": 1,
            "n_switches_to_1": 1,
            "n_switches_to_2": 0,
            "n_switches_to_3": 0,
            "n_switches_to_4": 0,
            "n_switches_to_5": 1,
            "n_switches_to_6": 0,
            "n_switches_to_7": 3,
            "n_switches_to_8": 1,
            "n_switches_to_9": 1,
            "datetime": "2022-05-30 00:00:00"
        },
        {
            "switched_from_grip": 2,
            "n_switches_to_1": 1,
            "n_switches_to_2": 0,
            "n_switches_to_3": 0,
            "n_switches_to_4": 11,
            "n_switches_to_5": 1,
            "n_switches_to_6": 5,
            "n_switches_to_7": 3,
            "n_switches_to_8": 1,
            "n_switches_to_9": 1,
            "datetime": "2022-05-30 00:00:00"
        },
    ]
}
Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/grip-switches" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"device_id\": 1,
    \"data\": [
        {
            \"switched_from_grip\": 1,
            \"n_switches_to_1\": 1,
            \"n_switches_to_2\": 1,
            \"n_switches_to_3\": 1,
            \"n_switches_to_4\": 1,
            \"n_switches_to_5\": 1,
            \"n_switches_to_6\": 1,
            \"n_switches_to_7\": 1,
            \"n_switches_to_8\": 1,
            \"n_switches_to_9\": 1,
            \"datetime\": \"2022-05-30 12:00:00\"
        }
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/grip-switches"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "device_id": 1,
    "data": [
        {
            "switched_from_grip": 1,
            "n_switches_to_1": 1,
            "n_switches_to_2": 1,
            "n_switches_to_3": 1,
            "n_switches_to_4": 1,
            "n_switches_to_5": 1,
            "n_switches_to_6": 1,
            "n_switches_to_7": 1,
            "n_switches_to_8": 1,
            "n_switches_to_9": 1,
            "datetime": "2022-05-30 12:00:00"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "message": "Saved 100 entries"
}
 

Request   

POST api/clean-data/grip-switches

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

data  object[] optional  

data[].switched_from_grip  integer  

Previous grip.

data[].n_switches_to_1  integer  

Number of switches to grip 1.

data[].n_switches_to_2  integer  

Number of switches to grip 2.

data[].n_switches_to_3  integer  

umber of switches to grip 3.

data[].n_switches_to_4  integer  

Number of switches to grip 4.

data[].n_switches_to_5  integer  

Number of switches to grip 5.

data[].n_switches_to_6  integer  

Number of switches to grip 6.

data[].n_switches_to_7  integer  

Number of switches to grip 7.

data[].n_switches_to_8  integer  

Number of switches to grip 8.

data[].n_switches_to_9  integer  

Number of switches to grip 9.

data[].datetime  string  

Entry datetime. Must be a valid date in the format Y-m-d H:i:s.

Save grip transitions

requires authentication

Request body should look like:


{
    "device_id": 1,
    "data": [
        {"grip": 1, "time_spent": "26.5", "datetime": "2022-05-30 12:00:00"},
        {"grip": 7, "time_spent": "15.0", "datetime": "2022-05-30 12:23:00"}
    ]
}
Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/grip-transitions" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"device_id\": 1,
    \"data\": [
        {
            \"grip\": 1,
            \"time_spent\": 100,
            \"datetime\": \"2022-05-30 12:00:00\"
        }
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/grip-transitions"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "device_id": 1,
    "data": [
        {
            "grip": 1,
            "time_spent": 100,
            "datetime": "2022-05-30 12:00:00"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "message": "Saved 100 entries"
}
 

Request   

POST api/clean-data/grip-transitions

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

data  object[] optional  

data[].grip  integer  

Grip.

data[].time_spent  number  

Time spent in seconds.

data[].datetime  string  

Entry datetime. Must be a valid date in the format Y-m-d H:i:s.

Save motor currents

requires authentication

Request body should look like:


{
    "device_id": 1,
    "data": [
        {"avg_current_motor_1": 220, "avg_current_motor_2": 199, "avg_current_motor_3": 185, "avg_current_motor_4": 195, "avg_current_motor_5": 201, "datetime": "2022-05-30 12:00:00"},
        {"avg_current_motor_1": 201, "avg_current_motor_2": 195, "avg_current_motor_3": 220, "avg_current_motor_4": 185, "avg_current_motor_5": 199, "datetime": "2022-05-30 13:00:00"}
    ]
}
Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/motor-currents" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"device_id\": 1,
    \"data\": [
        {
            \"avg_current_motor_1\": 220,
            \"avg_current_motor_2\": 220,
            \"avg_current_motor_3\": 220,
            \"avg_current_motor_4\": 220,
            \"avg_current_motor_5\": 220,
            \"datetime\": \"2022-05-30 12:00:00\"
        }
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/motor-currents"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "device_id": 1,
    "data": [
        {
            "avg_current_motor_1": 220,
            "avg_current_motor_2": 220,
            "avg_current_motor_3": 220,
            "avg_current_motor_4": 220,
            "avg_current_motor_5": 220,
            "datetime": "2022-05-30 12:00:00"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "message": "Saved 100 entries"
}
 

Request   

POST api/clean-data/motor-currents

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

data  object[] optional  

data[].avg_current_motor_1  integer  

Motor 1 average current.

data[].avg_current_motor_2  integer  

Motor 2 average current.

data[].avg_current_motor_3  integer  

Motor 3 average current.

data[].avg_current_motor_4  integer  

Motor 4 average current.

data[].avg_current_motor_5  integer  

Motor 5 average current.

data[].datetime  string  

Entry datetime. Must be a valid date in the format Y-m-d H:i:s.

Save open close cycles

requires authentication

Request body should look like:


{
    "device_id": 1,
    "data": [
       {"grip_type": 1, "n_open_cycles": 10, "n_close_cycles": 8, "datetime": "2022-05-30 12:00:00"},
       {"grip_type": 5, "n_open_cycles": 15, "n_close_cycles": 18, "datetime": "2022-05-30 12:00:00"}
    ]
}
Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/oc-cycles" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"device_id\": 1,
    \"data\": [
        {
            \"grip_type\": 1,
            \"n_open_cycles\": 10,
            \"n_close_cycles\": 8,
            \"datetime\": \"2022-05-30 12:00:00\"
        }
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/oc-cycles"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "device_id": 1,
    "data": [
        {
            "grip_type": 1,
            "n_open_cycles": 10,
            "n_close_cycles": 8,
            "datetime": "2022-05-30 12:00:00"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "message": "Saved 100 entries"
}
 

Request   

POST api/clean-data/oc-cycles

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

data  object[] optional  

data[].grip_type  integer  

Grip.

data[].n_open_cycles  integer  

Number of open cycles.

data[].n_close_cycles  integer  

Number of close cycles.

data[].datetime  string  

Entry datetime. Must be a valid date in the format Y-m-d H:i:s.

Save stall times

requires authentication

Request body should look like:


{
    "device_id": 1,
    "data": [
        {"stall_time_motor_1": 10, "stall_time_motor_2": 10, "stall_time_motor_3": 10, "stall_time_motor_4": 10, "stall_time_motor_5": 10, "datetime": "2022-05-30 12:00:00"},
        {"stall_time_motor_1": 10, "stall_time_motor_2": 10, "stall_time_motor_3": 10, "stall_time_motor_4": 10, "stall_time_motor_5": 10, "datetime": "2022-05-30 13:00:00"}
    ]
}
Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/stall-times" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"device_id\": 1,
    \"data\": [
        {
            \"stall_time_motor_1\": 10,
            \"stall_time_motor_2\": 10,
            \"stall_time_motor_3\": 10,
            \"stall_time_motor_4\": 10,
            \"stall_time_motor_5\": 10,
            \"datetime\": \"2022-05-30 12:00:00\"
        }
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/stall-times"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "device_id": 1,
    "data": [
        {
            "stall_time_motor_1": 10,
            "stall_time_motor_2": 10,
            "stall_time_motor_3": 10,
            "stall_time_motor_4": 10,
            "stall_time_motor_5": 10,
            "datetime": "2022-05-30 12:00:00"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "message": "Saved 100 entries"
}
 

Request   

POST api/clean-data/stall-times

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

data  object[] optional  

data[].stall_time_motor_1  integer  

Motor 1 stall time.

data[].stall_time_motor_2  integer  

Motor 2 stall time.

data[].stall_time_motor_3  integer  

Motor 3 stall time.

data[].stall_time_motor_4  integer  

Motor 4 stall time.

data[].stall_time_motor_5  integer  

Motor 5 stall time.

data[].datetime  string  

Entry datetime. Must be a valid date in the format Y-m-d H:i:s.

Save velocity levels

requires authentication

Request body should look like:


{
    "device_id": 1,
    "data": [
        {
            "grip": 1,
            "t_open_velocity_1": 1024, "t_open_velocity_2": 256, "t_open_velocity_3": 0,
            "t_close_velocity_1": 1024, "t_close_velocity_2": 256, "t_close_velocity_3": 0,
            "t_powermode": 35, "datetime": "2022-05-30 12:00:00"
        },
        {
            "grip": 2,
            "t_open_velocity_1": 1024, "t_open_velocity_2": 256, "t_open_velocity_3": 0,
            "t_close_velocity_1": 1024, "t_close_velocity_2": 256, "t_close_velocity_3": 0,
            "t_powermode": 35, "datetime": "2022-05-30 12:00:00"
        }
    ]
}
Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/velocity-levels" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"device_id\": 1,
    \"data\": [
        {
            \"grip\": 1,
            \"t_open_velocity_1\": 1024,
            \"t_open_velocity_2\": 768,
            \"t_open_velocity_3\": 512,
            \"t_close_velocity_1\": 1024,
            \"t_close_velocity_2\": 512,
            \"t_close_velocity_3\": 256,
            \"t_powermode\": 35,
            \"datetime\": \"2022-05-30 12:00:00\"
        }
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/velocity-levels"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "device_id": 1,
    "data": [
        {
            "grip": 1,
            "t_open_velocity_1": 1024,
            "t_open_velocity_2": 768,
            "t_open_velocity_3": 512,
            "t_close_velocity_1": 1024,
            "t_close_velocity_2": 512,
            "t_close_velocity_3": 256,
            "t_powermode": 35,
            "datetime": "2022-05-30 12:00:00"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "message": "Saved 100 entries"
}
 

Request   

POST api/clean-data/velocity-levels

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

data  object[] optional  

data[].grip  integer  

Grip.

data[].t_open_velocity_1  integer  

Open velocity 1 usage time.

data[].t_open_velocity_2  integer  

Open velocity 2 usage time.

data[].t_open_velocity_3  integer  

Open velocity 3 usage time.

data[].t_close_velocity_1  integer  

Close velocity 1 usage time.

data[].t_close_velocity_2  integer  

Close velocity 2 usage time.

data[].t_close_velocity_3  integer  

Close velocity 3 usage time.

data[].t_powermode  integer  

Power mode.

data[].datetime  string  

Entry datetime. Must be a valid date in the format Y-m-d H:i:s.

Save data errors

requires authentication

Request body should look like:


{
    "device_id": 1,
    "data": [
        {"error_code": 256, "datetime": "2022-05-30 12:00:00"},
        {"error_code": 30, "datetime": "2022-05-30 13:00:00"}
    ]
}
Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/errors" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"device_id\": 1,
    \"data\": [
        {
            \"error_code\": 256,
            \"datetime\": \"2022-05-30 12:00:00\"
        }
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/errors"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "device_id": 1,
    "data": [
        {
            "error_code": 256,
            "datetime": "2022-05-30 12:00:00"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "message": "Saved 100 entries"
}
 

Request   

POST api/clean-data/errors

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

data  object[] optional  

data[].error_code  integer  

Error code.

data[].datetime  string  

Entry datetime. Must be a valid date in the format Y-m-d H:i:s.

Save active time

requires authentication

Request body should look like:


{
    "device_id": 1,
    "data": [
        {"active_time": 7, "datetime": "2022-06-30 12:00:00"},
        {"active_time": 30, "datetime": "2022-06-30 12:23:00"}
    ]
}
Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/active-time" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"device_id\": 1,
    \"data\": [
        {
            \"active_time\": 30,
            \"datetime\": \"2022-06-30 12:00:00\"
        }
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/active-time"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "device_id": 1,
    "data": [
        {
            "active_time": 30,
            "datetime": "2022-06-30 12:00:00"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "message": "Saved 100 entries"
}
 

Request   

POST api/clean-data/active-time

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

data  object[] optional  

data[].active_time  integer  

Active time in seconds.

data[].datetime  string  

Entry datetime. Must be a valid date in the format Y-m-d H:i:s.

Save power ups/downs

requires authentication

Request body should look like:


{
    "device_id": 1,
    "data": [
        {"power": 1, "datetime": "2022-06-30 12:00:00"},
        {"power": 0, "datetime": "2022-06-30 12:30:00"}
    ]
}
Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/power" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"device_id\": 1,
    \"data\": [
        {
            \"power\": 1,
            \"datetime\": \"2022-06-30 12:00:00\"
        }
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/power"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "device_id": 1,
    "data": [
        {
            "power": 1,
            "datetime": "2022-06-30 12:00:00"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "message": "Saved 100 entries"
}
 

Request   

POST api/clean-data/power

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

data  object[] optional  

data[].power  integer  

Device turn on/off status (0 - turn off, 1 - turn on). Must be one of 0 or 1.

data[].datetime  string  

Entry datetime. Must be a valid date in the format Y-m-d H:i:s.

Save wear time

requires authentication

Request body should look like:


{
    "device_id": 1,
    "data": [
        {"wear_time": 112, "datetime": "2024-04-12 12:00:00"},
        {"wear_time": 212, "datetime": "2024-04-13 12:00:00"}
    ]
}
Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/wear-time" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"device_id\": 1,
    \"data\": [
        {
            \"wear_time\": 30,
            \"datetime\": \"2022-06-30 12:00:00\"
        }
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/wear-time"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "device_id": 1,
    "data": [
        {
            "wear_time": 30,
            "datetime": "2022-06-30 12:00:00"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "message": "Saved 100 entries"
}
 

Request   

POST api/clean-data/wear-time

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

data  object[] optional  

data[].wear_time  integer  

Wear time in seconds.

data[].datetime  string  

Entry datetime. Must be a valid date in the format Y-m-d H:i:s.

Save grip transitions (V2)

requires authentication

Request body should look like:


{
    "device_id": 1,
    "data": [
        {"grip": 1, "transitions": 50, "time_spent": "26.5", "datetime": "2022-05-30 12:00:00"},
        {"grip": 7, "transitions": 30, "time_spent": "15.0", "datetime": "2022-05-30 12:23:00"}
    ]
}
Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/grip-transitions/v2" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"device_id\": 1,
    \"data\": [
        {
            \"grip\": 1,
            \"transitions\": 30,
            \"time_spent\": 100,
            \"datetime\": \"2022-05-30 12:00:00\"
        }
    ]
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/grip-transitions/v2"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "device_id": 1,
    "data": [
        {
            "grip": 1,
            "transitions": 30,
            "time_spent": 100,
            "datetime": "2022-05-30 12:00:00"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "message": "Saved 100 entries"
}
 

Request   

POST api/clean-data/grip-transitions/v2

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

data  object[] optional  

data[].grip  integer  

Grip.

data[].transitions  integer  

Number of grip transitions per hour.

data[].time_spent  number  

Time spent in seconds.

data[].datetime  string  

Entry datetime. Must be a valid date in the format Y-m-d H:i:s.

Get latest grip transition (V2)

requires authentication

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/grip-transition/v2/18" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/clean-data/grip-transition/v2/18"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "id": 36024,
    "device_id": 132,
    "grip": 7,
    "transitions": 874,
    "time_spent": 177.2,
    "datetime": "2006-03-24T12:13:24.000000Z"
}
 

Example response (403, Insufficient permission):


{
    "message": "Insufficient permission"
}
 

Example response (404, No grip transitions for given device):


{
    "message": "No grip transitions (V2) for given device"
}
 

Request   

GET api/clean-data/grip-transition/v2/{id}

URL Parameters

id  integer  

Device ID

Endpoints

Authenticate the request for channel access.

requires authentication

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/broadcasting/auth" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/broadcasting/auth"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 600
x-ratelimit-remaining: 599
vary: Origin
 

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImtpZCI6Ii1JRElSdy42bGVMeUEifQ.eyJpYXQiOjE3NTU3OTE4NTcsImV4cCI6MTc1NTgyMDY1NywieC1hYmx5LWNsaWVudElkIjpudWxsLCJ4LWFibHktY2FwYWJpbGl0eSI6IntcInB1YmxpYzoqXCI6W1wic3Vic2NyaWJlXCIsXCJoaXN0b3J5XCIsXCJjaGFubmVsLW1ldGFkYXRhXCJdfSJ9.Eh_x8EXXy6pGwNB1M4cmjaRoB3-uTdJYVBMChTQuOE8"
}
 

Request   

GET api/broadcasting/auth

POST api/broadcasting/auth

Goals

Get goals status

requires authentication

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/goals/status" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"devices\": [
        1
    ],
    \"date_from\": \"2023-05-01\",
    \"date_to\": \"2023-05-10\"
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/goals/status"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "devices": [
        1
    ],
    "date_from": "2023-05-01",
    "date_to": "2023-05-10"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 600
x-ratelimit-remaining: 598
vary: Origin
 

{
    "grips": [],
    "switches": [],
    "total": {
        "grips": 0,
        "switches": 0,
        "time": 0
    }
}
 

Request   

GET api/goals/status

Body Parameters

devices  integer[] optional  

Device ID.

date_from  string optional  

Start date for data fetching. Default: current date. Must be a valid date.

date_to  string optional  

End date for data fetching. Default: current date. Must be a valid date. Must be a date after or equal to date_from.

Raw data

Send raw file

requires authentication

Save raw file with DUM data to process later

Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/raw-data" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "device_id=1" \
    --form "type=fetching" \
    --form "platform=ios" \
    --form "upload_date=1979-08-04 21:51:24" \
    --form "file=@/tmp/phpacCzz7" 
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/raw-data"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('device_id', '1');
body.append('type', 'fetching');
body.append('platform', 'ios');
body.append('upload_date', '1979-08-04 21:51:24');
body.append('file', document.querySelector('input[name="file"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "id": 15885,
    "device_id": 534,
    "file": "/tmp/fakerjg1ZLt",
    "status": 0,
    "is_corrupted": 0,
    "version": null,
    "type": "fetching",
    "platform": "android",
    "upload_date": "1986-05-26 15:05:36",
    "created_at": "2025-08-21T15:57:37.000000Z",
    "updated_at": "2025-08-21T15:57:37.000000Z"
}
 

Request   

POST api/raw-data

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

file  file  

Raw file to upload. Must be a file. Must not be greater than 10240 kilobytes.

type  string  

Raw file type. Must be one of fetching, background, or manual.

platform  string optional  

Raw file origin platform. Must be one of ios or android.

upload_date  string  

Date and time of raw file upload. Must be a valid date in the format Y-m-d H:i:s.

Download raw file

requires authentication

Download raw file with DUM data to process. Once fetched data is marked as processed and will not be available on this endpoint anymore.

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/raw-data" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/raw-data"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "id": 15886,
    "device_id": 64,
    "file": "/tmp/faker1NaPBl",
    "status": 0,
    "is_corrupted": 0,
    "version": null,
    "type": "background",
    "platform": "android",
    "upload_date": "2008-11-26 20:39:48",
    "created_at": "2025-08-21T15:57:37.000000Z",
    "updated_at": "2025-08-21T15:57:37.000000Z"
}
 

Example response (404, No data to process):


{
    "message": "No data to process"
}
 

Request   

GET api/raw-data

Show all raw files

requires authentication

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/raw-files?order=asc&perpage=20&page=1" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/raw-files"
);

const params = {
    "order": "asc",
    "perpage": "20",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "paginator": {
        "total": 2,
        "count": 2,
        "perpage": 20,
        "current_page": 1,
        "last_page": 1
    },
    "items": [
        {
            "id": 15887,
            "device_id": 369,
            "file": "/tmp/fakerNg0hAR",
            "status": 0,
            "is_corrupted": 0,
            "version": null,
            "type": "manual",
            "platform": "ios",
            "upload_date": "2023-03-27 13:19:48",
            "created_at": "2025-08-21T15:57:37.000000Z",
            "updated_at": "2025-08-21T15:57:37.000000Z"
        },
        {
            "id": 15888,
            "device_id": 309,
            "file": "/tmp/fakersVIbZD",
            "status": 0,
            "is_corrupted": 0,
            "version": null,
            "type": "background",
            "platform": "ios",
            "upload_date": "1991-01-09 00:28:17",
            "created_at": "2025-08-21T15:57:37.000000Z",
            "updated_at": "2025-08-21T15:57:37.000000Z"
        }
    ]
}
 

Request   

GET api/raw-files

Query Parameters

order  string optional  

Order elements by date in given direction (asc or desc). By default, results are sorted from oldest (asc).

perpage  integer optional  

Elements per page (Default: 20).

page  integer optional  

Page number (Default: 1).

Update raw file information

requires authentication

Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/raw-file/1" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"is_corrupted\": 0,
    \"version\": \"release\\/1.6.0\"
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/raw-file/1"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "is_corrupted": 0,
    "version": "release\/1.6.0"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "id": 15891,
    "device_id": 117,
    "file": "/tmp/fakerAMPChN",
    "status": 0,
    "is_corrupted": 0,
    "version": null,
    "type": "background",
    "platform": "android",
    "upload_date": "2015-01-13 23:38:40",
    "created_at": "2025-08-21T15:57:37.000000Z",
    "updated_at": "2025-08-21T15:57:37.000000Z"
}
 

Example response (404, File not found):


{
    "message": "File not found"
}
 

Request   

POST api/raw-file/{id}

URL Parameters

id  integer  

The ID of the raw file.

Body Parameters

is_corrupted  integer  

File is corrupted. Must be one of 0 or 1.

version  string optional  

Release version on which file was converted (for example: release/1.6.0).

Send raw file (V2)

requires authentication

Save raw file with DUM data to process later

Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/raw-data/v2" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "device_id=1" \
    --form "type=fetching" \
    --form "platform=ios" \
    --form "upload_date=1986-05-08 05:32:15" \
    --form "file=@/tmp/phpitoj9O" 
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/raw-data/v2"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('device_id', '1');
body.append('type', 'fetching');
body.append('platform', 'ios');
body.append('upload_date', '1986-05-08 05:32:15');
body.append('file', document.querySelector('input[name="file"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "id": 8028,
    "device_id": 379,
    "file": "/tmp/fakerz5g3Dz",
    "status": 0,
    "is_corrupted": 0,
    "version": null,
    "type": "manual",
    "platform": "android",
    "upload_date": "1980-06-14 06:06:05",
    "created_at": "2025-08-21T15:57:37.000000Z",
    "updated_at": "2025-08-21T15:57:37.000000Z"
}
 

Request   

POST api/raw-data/v2

Body Parameters

device_id  integer  

Device ID. Must be at least 1.

file  file  

Raw file to upload. Must be a file. Must not be greater than 10240 kilobytes.

type  string  

Raw file type. Must be one of fetching, background, or manual.

platform  string optional  

Raw file origin platform. Must be one of ios or android.

upload_date  string  

Date and time of raw file upload. Must be a valid date in the format Y-m-d H:i:s.

Download raw file (V2)

requires authentication

Download raw file with DUM data to process. Once fetched data is marked as processed and will not be available on this endpoint anymore.

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/raw-data/v2" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/raw-data/v2"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "id": 8029,
    "device_id": 793,
    "file": "/tmp/fakerAOiv4n",
    "status": 0,
    "is_corrupted": 0,
    "version": null,
    "type": "background",
    "platform": "ios",
    "upload_date": "1973-03-27 15:23:33",
    "created_at": "2025-08-21T15:57:37.000000Z",
    "updated_at": "2025-08-21T15:57:37.000000Z"
}
 

Example response (404, No data to process):


{
    "message": "No data to process"
}
 

Request   

GET api/raw-data/v2

Show all raw files (V2)

requires authentication

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/raw-files/v2?order=asc&perpage=20&page=1" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/raw-files/v2"
);

const params = {
    "order": "asc",
    "perpage": "20",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "paginator": {
        "total": 2,
        "count": 2,
        "perpage": 20,
        "current_page": 1,
        "last_page": 1
    },
    "items": [
        {
            "id": 8030,
            "device_id": 370,
            "file": "/tmp/fakerSOxW7q",
            "status": 0,
            "is_corrupted": 0,
            "version": null,
            "type": "background",
            "platform": "ios",
            "upload_date": "1993-07-13 09:57:03",
            "created_at": "2025-08-21T15:57:37.000000Z",
            "updated_at": "2025-08-21T15:57:37.000000Z"
        },
        {
            "id": 8031,
            "device_id": 557,
            "file": "/tmp/fakerVDdUvk",
            "status": 0,
            "is_corrupted": 0,
            "version": null,
            "type": "manual",
            "platform": "ios",
            "upload_date": "1986-06-15 08:24:09",
            "created_at": "2025-08-21T15:57:37.000000Z",
            "updated_at": "2025-08-21T15:57:37.000000Z"
        }
    ]
}
 

Request   

GET api/raw-files/v2

Query Parameters

order  string optional  

Order elements by date in given direction (asc or desc). By default, results are sorted from oldest (asc).

perpage  integer optional  

Elements per page (Default: 20).

page  integer optional  

Page number (Default: 1).

Update raw file information (V2)

requires authentication

Example request:
curl --request POST \
    "https://dum-staging.aetherdigitaltherapy.com/api/raw-file/v2/sed" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"is_corrupted\": 0,
    \"version\": \"release\\/1.6.0\"
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/raw-file/v2/sed"
);

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "is_corrupted": 0,
    "version": "release\/1.6.0"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "id": 8032,
    "device_id": 311,
    "file": "/tmp/fakerBQT4AY",
    "status": 0,
    "is_corrupted": 0,
    "version": null,
    "type": "background",
    "platform": "android",
    "upload_date": "2001-01-04 21:39:42",
    "created_at": "2025-08-21T15:57:37.000000Z",
    "updated_at": "2025-08-21T15:57:37.000000Z"
}
 

Example response (404, File not found):


{
    "message": "File not found"
}
 

Request   

POST api/raw-file/v2/{id}

URL Parameters

id  string  

The ID of the v2.

Body Parameters

is_corrupted  integer  

File is corrupted. Must be one of 0 or 1.

version  string optional  

Release version on which file was converted (for example: release/1.6.0).

Get all raw files for device

requires authentication

Example request:
curl --request GET \
    --get "https://dum-staging.aetherdigitaltherapy.com/api/raw-files/1?order=asc&perpage=20&page=1" \
    --header "Authorization: Bearer {ACCESS_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"type\": \"fetching\"
}"
const url = new URL(
    "https://dum-staging.aetherdigitaltherapy.com/api/raw-files/1"
);

const params = {
    "order": "asc",
    "perpage": "20",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "type": "fetching"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "paginator": {
        "total": 2,
        "count": 2,
        "perpage": 20,
        "current_page": 1,
        "last_page": 1
    },
    "items": [
        {
            "id": 15889,
            "device_id": 468,
            "file": "/tmp/fakerN1b3eE",
            "status": 0,
            "is_corrupted": 0,
            "version": null,
            "type": "manual",
            "platform": "ios",
            "upload_date": "2004-05-10 09:18:23",
            "created_at": "2025-08-21T15:57:37.000000Z",
            "updated_at": "2025-08-21T15:57:37.000000Z"
        },
        {
            "id": 15890,
            "device_id": 685,
            "file": "/tmp/fakerF4eMty",
            "status": 0,
            "is_corrupted": 0,
            "version": null,
            "type": "fetching",
            "platform": "android",
            "upload_date": "2000-10-28 13:18:41",
            "created_at": "2025-08-21T15:57:37.000000Z",
            "updated_at": "2025-08-21T15:57:37.000000Z"
        }
    ]
}
 

Request   

GET api/raw-files/{deviceId}

URL Parameters

deviceId  integer  

Query Parameters

order  string optional  

Order elements by date in given direction (asc or desc). By default, results are sorted from oldest (asc).

perpage  integer optional  

Elements per page (Default: 20).

page  integer optional  

Page number (Default: 1).

Body Parameters

type  string optional  

Type of upload files. Allowed values are fetching, background or manual. Must be one of fetching, background, or manual.