01What is Ellie Care?
Ellie Care is a telecare platform for older adults. An older person wears a smartwatch on the wrist; Ellie continuously measures their vital signs and activity, detects risky situations (a fall, the help button, an abnormal heart rate, prolonged inactivity), and delivers that information to whoever needs to react: their family, the staff at a care home, or the system of the company providing the service.
Ellie does not make the watch and is not sold as a medical device. It's software running on a consumer smartwatch, and it operates as monitoring and wellness: signals and alerts are a decision aid, never a diagnosis.
This API is for the B2B side: the partner companies —telecare providers, insurers, care homes, health systems— that integrate Ellie's data into their own systems.
api.ellie.care), one contract, and one login. You integrate against the contract, which is stable. Today you test against the sandbox (synthetic data); production is enabled per zone as each company is provisioned.02The players
Six actors. Knowing who's who is half the mental model — the rest of the API falls into place once this is clear.
👵 Patient
The older adult being monitored. Lives at home or in a care home. They're the one who wears the watch. In FHIR, a Patient.
⌚ The watch
A consumer smartwatch running the Ellie app. It measures, detects, and alerts. It can be paired with extra devices (a scale, a blood-pressure cuff).
🏢 Your company
The organization providing the service and contracting Ellie: the tenant. All data is partitioned by company (empresa_id). You, the developer, integrate here.
🎧 Operators
The team that attends to patients from a web console (the monitoring center). They don't code: they work alerts and follow-ups.
👨👩👧 Support network
Family and caregivers. They get notified through channels like WhatsApp. They don't use the API, but they're the destination of many alerts.
👩💻 Developer
You integrate Ellie into your company's system: pull vitals, telecheckups, and events. You authenticate as the company and see only your patients.
03How it works
The telecare lifecycle in four steps; the API plugs you in at step 4. Underneath, a single door (api.ellie.care) authenticates you, isolates you by company and zone, and returns only what's yours.
04The watch: what it measures
The watch does three things: it measures continuous vitals while worn, runs on-demand checks, and detects safety events.
Continuous vitals — while the watch is worn
| Sign | Field | What it is and how it's measured | Maturity |
|---|---|---|---|
| Heart rate | heart_rate | Optical sensor (green light) on the wrist. Beats per minute, sampled every few seconds. It also has a per-minute aggregate endpoint (median/max/min). | Live |
| Skin temperature | skin_temperature | Infrared sensor against the skin. One value per minute, in °C. | Live |
| Steps | steps | Step count from the activity tracker. | Live |
| Calories | calories | Estimated calories burned. | Live |
| Blood oxygen | spo2 | Optical pulse oximetry. On the watch it's on demand (~30 s holding still), not continuous — treated as a telecheckup. | On demand |
| Heart-rate variability (HRV / IBI) | ibi | How much the time between heartbeats varies (ms). An indicator of physiological stress, recovery, and autonomic state. | Rolling out |
| Electrodermal activity (EDA) | eda | Tiny changes in the skin's conductance due to sweat; associated with stress or emotional arousal. | Rolling out |
| Actigraphy / motion | motion | Level of body movement over time. Lets you infer rest vs. activity and sleep patterns. | Rolling out |
| Raw waveforms | ppg, accel_raw | The unprocessed optical-sensor and accelerometer signal. Very high volume; for your own algorithms. Opt-in. | Roadmap |
Device signals — technical, not clinical
Delivered through the device.status channel and in GET /devices/{id}. Useful for adherence and operations.
| Signal | What it indicates | Maturity |
|---|---|---|
Worn / not worn (worn / not_worn) | Proximity sensor: whether the watch is on the wrist. Key for adherence and for enabling fall detection. | Live |
Charging · battery (charging, battery_level, low_battery) | Power state (0–100 %, charging, low battery). Battery is a technical signal, not a clinical vital. | Live |
Connectivity (wifi, cellular, offline) | How the watch is connected, and whether it went offline. | Live |
Location (location) | Approximate position. Operational data, not clinical. | Live |
Telecheckups — guided, on-demand measurements
Your system (or an operator) requests a measurement; the watch guides the patient, takes the sample, and returns a result with a status of done/failed/deferred.
| Check | What the patient is asked to do | Maturity |
|---|---|---|
Spot heart rate (hr_spot) | Hold still 15–30 s. | On demand |
Variability (hrv) | Breathe normally without moving 60–120 s. | On demand |
Spot temperature (skin_temp) | Cover the watch ~20–30 s. | On demand |
Blood oxygen (spo2) | Arm supported, still ~30 s. | On demand |
Body composition (bia) | Confirm weight/height/age/sex and rest two fingers on the side buttons (bioimpedance). Returns % fat/muscle/water. | On demand |
ECG (ecg) | Rest a finger on the button and hold still 30 s. Single-lead rhythm. Subject to regulatory approval per country. | On demand |
| Functional tests (gait, balance, sit-to-stand, respiratory) | Guided mobility tests to gauge frailty and fall risk. Defined in the contract; the watch doesn't run them yet. | Roadmap |
Life safety
🚨 Fall detection Live
The accelerometer feeds an AI model on the watch itself that infers falls. It's delivered as a critical event (boolean), low-latency; the raw signal isn't sent. It's disabled when the watch isn't worn.
🆘 SOS button Live
The patient long-presses the button (or taps SOS on screen). A countdown starts, cancelable, before escalating the alert to family / the monitoring center.
GET /alerts. The emotional check (anxiety/depression, GAD-7/PHQ-9) is a platform feature that comes from a voice assessment, not the watch — exposed as a FHIR QuestionnaireResponse.05Signal vs. alert
The distinction that avoids misunderstandings: Ellie sends you raw signals, not clinical verdicts.
📈 Signal
Telemetry and states: HR above its baseline, temperature, low battery, watch not worn. They feed your metrics. They're not an emergency on their own — you (or your rules) decide what they mean.
🚨 Life alert
A real event that demands a reaction: a fall or an SOS button. Few, prioritized, and critical. Delivered separately (GET /alerts).
That's why the contract separates clinical events (clinical.event), device status (device.status), and alerts (life). Ellie avoids pre-judging: it gives you the signal so your system can apply its own clinical logic.
06What you can do with the API
Everything is scoped to your company (from the token) and your patients. In business terms:
| You can… | How | What it's for |
|---|---|---|
| See your patients and their devices | GET /patients, GET /devices/{id} | Who you monitor, the watch's state, and its capabilities. |
| Read vitals and trends | GET /vitals, GET /patients/{id}/vitals/heart-rate | Raw telemetry or per-minute aggregated HR for charts. |
| See sleep | GET /patients/{id}/sleep-sessions | Sleep windows with averaged signals. Roadmap |
| See and request telecheckups | GET /patients/{id}/telecheckups, POST /telecheckups:request | Read results or trigger a new measurement. |
| Query life alerts | GET /alerts | History of falls and SOS. |
| Receive events in real time | POST /subscriptions (webhooks) or GET /events | Signals and states the moment they happen, signed with HMAC. |
| Adjust the watch's config | PATCH /patients/{id}/config | Device settings (opt-in, requires a write scope). |
| Consume in a standard format | GET /fhir/Observation?… | Clinical data as FHIR R4 (Bundle). |
07First steps and Quickstart
From zero to your first data point, with no real data. The map first, then the code.
ellie_sandbox_br / ellie_sandbox_us, secret sandbox.POST /oauth/token. Your company and zone go inside the token.# sandbox base (synthetic data) BASE=https://api-sandbox.ellie.care # 1) OAuth2 token (empresa_id + zone go inside the token) TOKEN=$(curl -s -X POST $BASE/oauth/token \ -d grant_type=client_credentials \ -d client_id=ellie_sandbox_br -d client_secret=sandbox \ -d scope="read:patients read:vitals telecheckup:read" \ | jq -r .access_token) # 2) your first call — no company parameter (comes from the token) curl -s $BASE/v1/patients -H "Authorization: Bearer $TOKEN" curl -s "$BASE/v1/vitals?patient_id=pat_test_001&type=heart_rate" -H "Authorization: Bearer $TOKEN"
Prefer to explore without writing code? Open the interactive reference (try-it against the sandbox).
08Authentication
OAuth 2.0 client-credentials (app-to-app). You register an app → client_id + client_secret. The token is short-lived and carries your empresa_id, your zone, and your scopes.
| Scope | Allows |
|---|---|
read:patients | List and read your patients |
read:devices | Devices, config, and capabilities |
read:vitals | Telemetry (vitals, actigraphy) |
read:alerts | Alert history |
telecheckup:read | Read telecheckups |
telecheckup:request | Request a telecheckup |
subscribe:events | Webhooks and event polling |
write:config | Adjust the device config (opt-in) |
09Health data: endpoints
Telemetry and telecheckups are served in two forms: raw REST or standard FHIR R4. The edge abstracts away where they come from.
- Telemetry —
GET /v1/vitals?patient_id=&type=heart_rate&since=. Types:heart_rate,spo2,skin_temperature,ibi,eda,motion(ENMO actigraphy),steps,calories,ppg/ppg_ir/ppg_red,accel_raw. High volume → cursor +since. - Per-minute aggregated heart rate —
GET /v1/patients/{id}/vitals/heart-rate?start=&end=. Median, max, min, and sample count per minute. Window ≤ 30 days per query; for more, paginate. - Sleep sessions —
GET /v1/patients/{id}/sleep-sessions. Sleep window with averaged signals (HR, EDA, HRV, temperature, actigraphy). Roadmap - Telecheckups —
GET /v1/patients/{id}/telecheckups; requested withPOST /v1/telecheckups:request. They always report a status (done/failed/deferred). - FHIR —
GET /v1/fhir/Observation?patient=&code=8867-4(LOINC). Returns an R4Bundle. Emotional telecheckup asQuestionnaireResponse.
10Events (webhooks)
You register your URL yourself (self-serve) and Ellie pushes you the raw events (signals, not pre-judged alerts) as CloudEvents. Every delivery is signed with HMAC in X-Ellie-Signature: ALWAYS verify the signature. No-endpoint alternative: polling GET /v1/events (omit since the first time; after that ?since=<next_cursor>).
GET /v1/alerts.| Event | Tier | What it is |
|---|---|---|
clinical.event | Clinical | Clinical signal: sleep_hint_start/end, HR ↑/↓ baseline, low SpO2, skin temp (field kind) |
device.status | Normal | Operational state: worn/not_worn, charging, low battery, connectivity, offline (state) |
telecheckup.completed / .failed / .deferred | Lifecycle | A telecheckup's lifecycle |
# 1) register your URL → returns the secret ONCE (save it) curl -s -X POST $BASE/v1/subscriptions -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"url":"https://tu-endpoint/hooks","event_types":["clinical.event","device.status"]}' # → 201 { "id":"sub_…", "secret":"whsec_…", "status":"active", … } # 2) test the signed delivery end-to-end (literal colon, don't URL-encode it) curl -s -X POST "$BASE/v1/subscriptions/sub_…:test" -H "Authorization: Bearer $TOKEN" # → 202 { "status":"delivered", "response_status":200 }
const mac = crypto.createHmac("sha256", WEBHOOK_SECRET).update(rawBody).digest("hex"); if (`sha256=${mac}` !== req.header("X-Ellie-Signature")) return res.status(401).end();
Manage your subscriptions with GET /v1/subscriptions and DELETE /v1/subscriptions/{id}.
11Tenancy, zones, and privacy
Your empresa_id comes from the token — you never send it via query or body, which is why you only see your own patients. Each company has a residency zone and its health data doesn't leave its region.
🌎 LATAM
Data hosted in the Brazil region (São Paulo). Companies from AR, BR, UY, PE. Complies with LGPD (BR), Law 25.326 (AR), and equivalents.
🇺🇸 US
Data hosted in a United States region. Complies with HIPAA (BAA per customer). Not mixed with LATAM.
- A single host (
api.ellie.care) routes you to your region based on the token. - Requesting a
patient_idfrom another tenant returns404. You only see what's yours. - The sandbox uses 100% synthetic data (zero real PHI).
12Real use cases
What companies build on top of Ellie. Each one combines a handful of endpoints.
📊 Live monitoring dashboard
Vitals and device status for all your patients in your panel: who's fine, who isn't wearing the watch, whose battery is low. HR + device.status + /patients.
📞 Route alerts to your center
Receive falls and SOS via webhook and open a case or a call in your system. Webhooks + /alerts.
⌚ Watch-wearing adherence
Detect who stopped wearing the watch or let it die, and notify the family. worn/not_worn signals + battery.
🩺 On-demand checks
An operator triggers a telecheckup (HR, ECG) from your app and receives the result. telecheckups:request + webhook.
📈 Early deterioration detection
Track trends (per-minute HR, out-of-baseline events) to anticipate a problem. Aggregated HR + clinical.event.
🏥 EHR integration
Export vitals, sleep, and telecheckups as FHIR R4 into the clinical system. /fhir/Observation.
13Sandbox → Production
It's the same API. Going to prod isn't reprogramming: you change 2 values (host + credentials).
| Sandbox | Production | |
|---|---|---|
| Host | api-sandbox.ellie.care | api.ellie.care |
| Credentials | sandbox client | your real company's client |
| Endpoints · scopes · payloads | identical | identical |
| Data | synthetic | Real PHI — only your patients |
14Errors and pagination
Errors arrive as RFC 9457 (application/problem+json), parseable. Pagination is always cursor-based (next_cursor), never offset.
{ "type": "https://api.ellie.care/errors/insufficient-scope",
"title": "Missing scope read:vitals", "status": 403,
"detail": "Your token does not include read:vitals." }15Frequently asked questions
Do I need a physical watch to develop?
Can I see patients from other companies?
empresa_id comes from the token and filters everything: you only see your patients. Requesting another company's patient ID returns 404.Does Ellie decide whether something is an emergency?
What happens if the watch runs out of battery or signal?
device.status (low battery, charging, offline) so you can react.Does health data leave my country or region?
Is this a medical device? Does it diagnose?
When do I get production access?
What formats and languages are available?
16Glossary
| Term | What it is |
|---|---|
| Patient | The older adult being monitored. In FHIR, a Patient (patient_id). |
| Device / watch | The consumer smartwatch running the Ellie app. |
Company / tenant (empresa_id) | Ellie's customer organization. Everything partitioned by this ID, which comes from the token. |
| Operator | A person at your company who attends to patients from the web console. |
| Signal | Raw telemetry or state. Feeds metrics; not an emergency on its own. |
| Life alert | A real event that demands a reaction: fall or SOS button. |
| Telecheckup | A guided, on-demand measurement (physical on the watch, or emotional via voice). |
| Event | Something that happened and is pushed to you via webhook: clinical.event, device.status, telecheckup lifecycle. |
Zone (latam / us) | The company's data-residency region. Comes from the token; doesn't cross regions. |
| Scope | A permission in the token (e.g. read:vitals). |
| PHI | Protected health information. In prod it's real data; in sandbox, synthetic. |
| FHIR R4 | A health-interoperability standard. |
Ready for the endpoint-by-endpoint detail? Open the interactive reference and try it against the sandbox.