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.com/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://api.integration.corsano.com/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.com/v2/raw-metrics/{raw_metric_type}

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

https://api.integration.corsano.com/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://api.integration.corsano.com/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
}