Skip to main content

Exporting Health Data via Our APIs

This page shows the reliable way to for you to export data.

Portal Realtime Data​

App Chart

In the portal.corsano.com, you can access real-time patient data for a specific department.

To retrieve this information via the API, use the following endpoint:

Endpoint: GET v1/groups/:groupCode/patients?with_latest_values=1&token={RESEARCHER_TOKEN}

This endpoint returns the list of patients associated with the specified groupCode, along with their current real-time data.

Example Request:​

curl --request GET \
--location 'https://api.study-integration.corsano.health/v1/groups/{GROUP_CODE}/patients?with_latest_values=1&token={RESEARCHER_TOKEN}' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json'

Example Output:​

App Chart

The output contains the lastest vital values picked up from the bracelet as well as patient information.

Portal Raw Data​

App Chart

You can view raw vital data directly on the patient page. To retrieve this data programmatically via the API, there are two available methods — each serving a different purpose. Both require a valid researcher token.

Retrieve Raw Data Using a Researcher Token​

You can use the following endpoint to export raw data:

POST https://public-api.corsano.health/v1/create-export/{UUID}/{raw_metric_type}?token={RESEARCHER_TOKEN}

You can find detailed example on this page.

Retrieve Raw Data Using a Health Token​

You also can access raw data through the health API:

GET https://api.health.cloud.corsano.health/v2/raw-metrics/{raw_metric_type}

To use this method, you must first obtain the patient’s health token by calling:

https://public-api.corsano.health/v1/patients/{uuid}/health-token?token={RESEARCHER_TOKEN}

Use the returned token in the request header as follows:

Authorization: Bearer {HEALTH_TOKEN}

Difference Between Two Methods​

The first POST method runs in the background and can handle very large data sets, but is limited to 1 per user (UUID) every 5 minutes. (If you want to increase the limit for each UUID, please contact devsupport@corsano.com)

The GET option returns data immediately but is meant for smaller requests (e.g., fetching the last few hours of activity data for display or analysis).

Data in Corsano App​

App Chart

In the Corsano Mobile App, vital signs such as pulse rate, SpO₂, respiration rate, and other key metrics are displayed.

You can access the same data via the API:

GET https://public-api.corsano.health/v1/groups/{GROUP_CODE}/summaries?token={RESEARCHER_TOKEN}&date={DATE}

You can pass optional parameter include_slots=1 to get the slots in each summary object.

About summary data​

The summary data provides an overview of a patient’s vital signs throughout a given day.

  • It includes 5-minute and 30-minute slots for heart rate, SpO₂, respiration rate, and temperature.
  • Blood pressure is provided in 30-minute slots.
  • Summary data also contains steps of the current day and sleep data since last night.
  • Slot values are updated shortly after new data points become available, ensuring near real-time accuracy.
Example response:​
"date": "2025-10-08",
"activity": {
"avg_gait_asymmetry": 0,
"avg_gait_speed": 0,
"avg_gait_var": 0,
"slots_five_minutes": [
{
"timestamp": 1759874400000,
"date": "00:00",
"step_count": 0
},
//...
],
"date": "2025-10-08",
"total_steps": 0,
"daily_percent": 0,
"distance": 0,
"calories": 2,
"workouts": 0,
"active_minutes": 0,
"move_every_hour": 0,
"total_glasses": 0
},
"corsano_sleep": {},
"heart_rate": {
"date": "2025-10-08",
"avg_daily_heart_rate": 78,
"max_daily_heart_rate": 79,
"rest_daily_heart_rate": 0,
"daily_percent": 0,
"all_time": 0,
"max_time": 0,
"performance_time": 0,
"endurance_time": 0,
"fat_burn_time": 0,
"warm_up_time": 0,
"rest_time": 600,
"slots": [
// ...
]
},
"non_invasive_blood_pressure": {
"daily_average_systolic_pressure": 0,
"daily_average_diastolic_pressure": 0,
"sleeping_average_systolic_pressure": 0,
"sleeping_average_diastolic_pressure": 0,
"awaken_average_systolic_pressure": 0,
"awaken_average_diastolic_pressure": 0,
"date": "2025-10-08",
"slots": [
{
"systolic_pressure_combine": 0,
"diastolic_pressure_combine": 0,
"start_timestamp": 1759874400000,
"end_timestamp": 1759881599000,
"start_date": "00:00",
"end_date": "01:59"
},
//...
]
},
"recovery": {
"date": "2025-10-08",
"value": 58.41383,
"avg_rmssd_past_60_days": 67.46498,
"avg_rmssd_today": 61.11304,
"resting_bpm_today": 47,
"resting_bpm_past_60_days": 44.91071,
"age_gender_factor": 35.2,
"resting_bpm_delta": null,
"recovery_rhr_score": null,
"avg_hrv_delta": null,
"avg_hrv_delta_factor": null,
"recovery_hrv_score": null,
"temperature_deviation": null,
"temperature_deviation_factor": null,
"avg_temperature_today": null,
"avg_temperature_past_7_days": null,
"avg_rmssd_past_7_days": null,
"sleep_score": null
},
"respiration_rate": {
"slots_five_minutes": [
{
"is_wearing": true,
"is_charging": false,
"is_low_battery": false,
"timestamp": 1759874400000,
"date": "00:00",
"respiration_rate": 0,
"quality": 0
},
//...
],
"date": "2025-10-08",
"avg_respiration_rate": 22,
"start_timestamp": 1759874400000,
"end_timestamp": 1759960799999
},
"sleep": {
"heart_rate": 47,
"heart_rate_quality": 4,
"time_to_sleep": 5,
"time_to_wake_up": 29,
"start_session_original_ph": "2025-10-07T23:15:00.000+02:00",
"stop_session_original_ph": "2025-10-08T07:15:00.000+02:00",
"date": "2025-10-08",
"sleep_duration": 27540,
"daily_percent": 0,
"awake_time": 5426,
"rem_time": 4800,
"light_time": 17100,
"deep_time": 5640,
"performance": 95,
"tranquility": 4,
"consistency": 70,
"start_date": "2025-10-07T22:16:00.000+02:00",
"end_date": "2025-10-08T07:28:00.000+02:00"
},
"spo2": {
"slots_five_minutes": [
{
"is_wearing": true,
"is_charging": false,
"is_low_battery": false,
"timestamp": 1759874400000,
"date": "00:00",
"spo2": 0,
"spo2_q": 0
},
// ...
],
"date": "2025-10-08",
"avg_spo2": 98,
"start_timestamp": 1759874400000,
"end_timestamp": 1759960799999
},
"stress": {
"avg_si": 63.65794392523368,
"avg_si_n": 38.28953271028037,
"avg_mrr": 1123.1563427846575,
"avg_sdnn": 69.55296413207189,
"avg_rmssd": 61.113039704170625,
"avg_pnn50": 35.40321333374745,
"avg_vlf": 1866.856136276255,
"avg_vlf_percent": 34.99171603455206,
"avg_lf": 1893.9942326321818,
"avg_lf_percent": 40.20052057964455,
"avg_hf": 1004.8005107213288,
"avg_hf_percent": 24.807763385803412,
"avg_hrv": 61.11299065420559,
"avg_mo": 1114.4859813084113,
"avg_amo": 34.93318575715573,
"date": "2025-10-08"
},
"stress_continuous": {
"avg_si": 62.10517857142859,
"avg_si_n": 37.907142857142865,
"avg_mrr": 1102.891691551374,
"avg_sdnn": 70.47300956620685,
"avg_rmssd": 62.40363534448105,
"avg_pnn50": 35.34735273251205,
"avg_vlf": 1849.9863184056433,
"avg_vlf_percent": 34.34462711730475,
"avg_lf": 1944.15671155884,
"avg_lf_percent": 40.9686900688872,
"avg_hf": 1025.782292476689,
"avg_hf_percent": 24.68668281380806,
"avg_hrv": 62.403571428571404,
"avg_mo": 1093.75,
"avg_amo": 33.91715561986022,
"date": "2025-10-08"
},
"temperature": {
"slots_five_minutes": [
{
"is_wearing": true,
"is_charging": false,
"is_low_battery": false,
"timestamp": 1759874400000,
"date": "00:00",
"temp_sk1": 0,
"temp_sk2": 0
},
//...
],
"date": "2025-10-08",
"avg_temp_sk1": 36.89,
"avg_temp_sk2": 0,
"max_temp_sk1": 36.89,
"max_temp_sk2": 0,
"start_timestamp": 1759874400000,
"end_timestamp": 1759960799999
}