Ellie Care · Developers
B2B API · spec-first

Connect your system to Ellie Care

Telecare for older adults, in a single API. Here you have everything on one page: what Ellie is, what the watch measures, and how to integrate it — from the concept to your first call. You authenticate with OAuth2 M2M; your company and your zone come from the token. You start in the sandbox (synthetic data, zero PHI) — it's already live.

B2B telecareOpenAPI 3.1 OAuth2 client-credentialsWebhooks + HMACFHIR R4Zones LATAM · US

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.

The API's promise: one URL (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.

Person

👵 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.

Hardware

⌚ 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).

B2B customer

🏢 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.

People at your company

🎧 Operators

The team that attends to patients from a web console (the monitoring center). They don't code: they work alerts and follow-ups.

Around the patient

👨‍👩‍👧 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.

You

👩‍💻 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.

Wear
The older adult wears the watch in daily life. The Ellie app runs in the background.
Monitor
The watch measures vitals and activity and sends them continuously while it's worn.
Detect
Events are detected: a fall (an AI model on the watch itself), the SOS button, out-of-range HR, an unworn watch.
React
The right party is notified: operators in the console, family via WhatsApp, and your system via webhooks / API.
⌚ Watch
Measures and sends
Ellie platform
Telemetry, events, FHIR and metadata · per zone
🚪 api.ellie.care
Login + isolation by company/zone
🏢 Your system
You consume the API

04The watch: what it measures

The watch does three things: it measures continuous vitals while worn, runs on-demand checks, and detects safety events.

Live available today, end-to-end On demand / rolling out shipping by watch version Roadmap defined in the contract, not yet on the device

Continuous vitals — while the watch is worn

SignFieldWhat it is and how it's measuredMaturity
Heart rateheart_rateOptical 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 temperatureskin_temperatureInfrared sensor against the skin. One value per minute, in °C.Live
StepsstepsStep count from the activity tracker.Live
CaloriescaloriesEstimated calories burned.Live
Blood oxygenspo2Optical 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)ibiHow much the time between heartbeats varies (ms). An indicator of physiological stress, recovery, and autonomic state.Rolling out
Electrodermal activity (EDA)edaTiny changes in the skin's conductance due to sweat; associated with stress or emotional arousal.Rolling out
Actigraphy / motionmotionLevel of body movement over time. Lets you infer rest vs. activity and sleep patterns.Rolling out
Raw waveformsppg, accel_rawThe 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.

SignalWhat it indicatesMaturity
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.

CheckWhat the patient is asked to doMaturity
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.

Today, life alerts (fall and SOS) are read via 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…HowWhat it's for
See your patients and their devicesGET /patients, GET /devices/{id}Who you monitor, the watch's state, and its capabilities.
Read vitals and trendsGET /vitals, GET /patients/{id}/vitals/heart-rateRaw telemetry or per-minute aggregated HR for charts.
See sleepGET /patients/{id}/sleep-sessionsSleep windows with averaged signals. Roadmap
See and request telecheckupsGET /patients/{id}/telecheckups, POST /telecheckups:requestRead results or trigger a new measurement.
Query life alertsGET /alertsHistory of falls and SOS.
Receive events in real timePOST /subscriptions (webhooks) or GET /eventsSignals and states the moment they happen, signed with HMAC.
Adjust the watch's configPATCH /patients/{id}/configDevice settings (opt-in, requires a write scope).
Consume in a standard formatGET /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.

Sandbox access
Test credentials: ellie_sandbox_br / ellie_sandbox_us, secret sandbox.
Request a token
POST /oauth/token. Your company and zone go inside the token.
Your first call
List patients or read one's HR. No company param: it comes from the token.
Subscribe to events
Register your webhook and verify the HMAC signature.
Go to production
Swap host + credentials. The code doesn't change.
bash · sandbox
# 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.

client_id + secret
Your credential
POST /oauth/token
The edge validates the secret
access_token (JWT)
Carries empresa_id · zone · scope
GET /v1/…
The edge filters by the token's company+zone
ScopeAllows
read:patientsList and read your patients
read:devicesDevices, config, and capabilities
read:vitalsTelemetry (vitals, actigraphy)
read:alertsAlert history
telecheckup:readRead telecheckups
telecheckup:requestRequest a telecheckup
subscribe:eventsWebhooks and event polling
write:configAdjust 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.

  • TelemetryGET /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 rateGET /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 sessionsGET /v1/patients/{id}/sleep-sessions. Sleep window with averaged signals (HR, EDA, HRV, temperature, actigraphy). Roadmap
  • TelecheckupsGET /v1/patients/{id}/telecheckups; requested with POST /v1/telecheckups:request. They always report a status (done/failed/deferred).
  • FHIRGET /v1/fhir/Observation?patient=&code=8867-4 (LOINC). Returns an R4 Bundle. Emotional telecheckup as QuestionnaireResponse.
Clinical PHI: telecheckups are sensitive health data. In production they require a clinical scope + consent per zone. In sandbox everything is synthetic.

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>).

Life alerts (fall, SOS) are currently delivered through a legacy channel and will migrate to this contract later — that's why they're not in this list yet. The history of evaluated alerts is at GET /v1/alerts.
EventTierWhat it is
clinical.eventClinicalClinical signal: sleep_hint_start/end, HR ↑/↓ baseline, low SpO2, skin temp (field kind)
device.statusNormalOperational state: worn/not_worn, charging, low battery, connectivity, offline (state)
telecheckup.completed / .failed / .deferredLifecycleA telecheckup's lifecycle
bash · register your webhook (self-serve)
# 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 }
node · verify the signature
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_id from another tenant returns 404. 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

⏳ Production per zone: you integrate and test against sandbox now. The contract is identical, so the cutover doesn't change your code — it's enabled per company/zone once the gates are met.

It's the same API. Going to prod isn't reprogramming: you change 2 values (host + credentials).

🧪 Integrate in sandbox
Synthetic data, zero PHI. Test token, reads, webhooks + signature.
✅ Gates
BAA/LGPD signed · your company provisioned in prod · webhook verified.
🔑 Prod credential
Ellie issues a new client_id/secret for your real company + zone.
🚀 Cutover
Change host + credentials. Nothing else.
SandboxProduction
Hostapi-sandbox.ellie.careapi.ellie.care
Credentialssandbox clientyour real company's client
Endpoints · scopes · payloadsidenticalidentical
DatasyntheticReal PHI — only your patients
Credentials are not shared across environments. The zone is set by your company (it's in the token), you don't choose it.

14Errors and pagination

Errors arrive as RFC 9457 (application/problem+json), parseable. Pagination is always cursor-based (next_cursor), never offset.

application/problem+json
{ "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?
No. The sandbox serves realistic synthetic data; you can integrate and test the whole flow (token, reads, webhooks, signature) without any real watch or patient.
Can I see patients from other companies?
No. Your 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?
Ellie delivers signals (telemetry, states) and life alerts (fall, SOS). The clinical interpretation and the decision to act are made by your system or your team. Ellie is monitoring and wellness, not diagnosis.
What happens if the watch runs out of battery or signal?
You receive those states as device.status (low battery, charging, offline) so you can react.
Does health data leave my country or region?
No. Each company has a residency zone (LATAM or US) and health data is safeguarded in that region. The zone is set by your company and travels in the token.
Is this a medical device? Does it diagnose?
No. Ellie is a monitoring and wellness layer on top of a consumer smartwatch. Signals and alerts are a decision aid, never a diagnosis.
When do I get production access?
Production is enabled per company and per zone once the requirements are met (data agreements, your company provisioned, your webhook verified). Meanwhile you integrate against the sandbox — the contract is identical.
What formats and languages are available?
Clinical data is served in native REST and in standard FHIR R4. This documentation is available in Spanish, English, and Portuguese.

16Glossary

TermWhat it is
PatientThe older adult being monitored. In FHIR, a Patient (patient_id).
Device / watchThe consumer smartwatch running the Ellie app.
Company / tenant (empresa_id)Ellie's customer organization. Everything partitioned by this ID, which comes from the token.
OperatorA person at your company who attends to patients from the web console.
SignalRaw telemetry or state. Feeds metrics; not an emergency on its own.
Life alertA real event that demands a reaction: fall or SOS button.
TelecheckupA guided, on-demand measurement (physical on the watch, or emotional via voice).
EventSomething 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.
ScopeA permission in the token (e.g. read:vitals).
PHIProtected health information. In prod it's real data; in sandbox, synthetic.
FHIR R4A health-interoperability standard.

Ready for the endpoint-by-endpoint detail? Open the interactive reference and try it against the sandbox.