Skip to main content

SDK usage report

Available starting SDK 2.3.0

The Data SDK sends a usage report to the Corsano cloud for the bracelet that is connected at that moment. It tells Corsano which bracelet, firmware and SDK version your app runs, when the bracelet last synced, its battery state and how long it has been worn.

There is nothing to integrate: no API to call, nothing to configure in DataSdk.Config, and no manifest change. The report is scheduled by DataSdk.initialize() and cannot be turned off.

When a report is sent​

  • Every 12 hours, through a background WorkManager job.
  • A report needs a licence key, a connected bracelet, and one completed download from that bracelet. While any of these is missing the report is not sent and does not fail: it stays pending and goes out as soon as the missing piece arrives — when the licence key check returns, when subscribeDeviceForDownload() subscribes a bracelet, when a bracelet connects, or when a download completes. So the first report is sent within seconds of the bracelet being put on, rather than up to 12 hours later.
  • Once a report has been sent, the 12-hour schedule sets the pace again; restarting the app does not send an extra report.
  • If the request fails (any non-2xx response), WorkManager retries it with backoff.

The report is sent to:

POST https://api.health.cloud.corsano.com/app-sdk/devices

If your app restricts network traffic (a network security configuration, or a firewall or MDM allowlist on managed devices), make sure this host is reachable.

What is sent​

{
"serial_number": "2B41234567",
"license_key": "your-licence-key",
"plan": "5",
"last_sync_date": "2026-09-01T09:14:32.118+02:00",
"first_pairing_date": "2026-06-17T11:02:07.000+02:00",
"fw_version": "2.1.60",
"sdk_version": "2.3.0",
"battery_percentage": 78,
"worn_minutes": 12480,
"is_charging": false
}
FieldTypeDescription
serial_numberstringSerial number, read from the connected bracelet.
license_keystringThe licence key the SDK was initialized with.
planstringBracelet plan id, read from the connected bracelet. "-1" when it is unknown or could not be read.
last_sync_datestringWhen the last download from this bracelet completed.
first_pairing_datestringWhen the SDK completed its first download from this bracelet.
fw_versionstringFirmware version, read from the connected bracelet.
sdk_versionstringAndroid SDK version.
battery_percentageintBattery level, 0–100, read from the bracelet.
is_chargingboolWhether the bracelet is charging.
worn_minutesintTotal minutes this bracelet has been worn since the SDK started counting. It only grows.

Dates use yyyy-MM-dd'T'HH:mm:ss.SSSXXX (milliseconds and the local offset), always with Gregorian years and ASCII digits, whatever language the phone is set to.

Sync dates, identity and worn minutes are kept per bracelet, so when a user switches bracelets one bracelet's history is never reported under another's serial number. A second bracelet's worn_minutes starts from zero.

Upgrading from 2.2.x or earlier: the SDK only starts recording when it is updated. first_pairing_date is the first download completed after the upgrade, not the bracelet's original pairing, and worn_minutes counts from the upgrade. Reinstalling the app or wiping its database also resets worn_minutes to 0.

Privacy​

  • The report contains no health measurements.
  • Neither the request body nor the response body is written to the SDK logs, because the logs can be exported by your app and the report carries the licence key and serial number. Only non-identifying fields and the HTTP response code are logged.

Replaces the per-download device update​

Before 2.3.0, the SDK sent a device update to the same endpoint after each download. That call has been removed: the usage report now owns this endpoint, because running both made them overwrite each other's last_sync_date and first_pairing_date. The report sends everything the old update did except frequency, and adds battery_percentage and is_charging. The BraceletInfo row a download writes to the local database is unchanged.