Older adults
For geriatric practices, GUIDE-style dementia programmes and aging services: an older patient's falls risk tier (CDC STEADI) and falls-prevention programmes, physical function (Katz ADL / Lawton IADL only where the deployment holds the licence), medication burden for review (count, anticholinergic burden, sedatives; never advice), your care dyads (consent status, never the caregiver's contact details) with a staff contact log, the sleep-apnoea pathway and CPAP use (an unlogged night is unknown, not missed), the five fillable dementia risk factors (never a risk score) and the hospice review status (never an eligibility answer). Webhook: older_adults.falls_tier_raised.
- Who calls it
- Core for Older adults & caregiving programmes
- Before production
- Treating practices; each read follows the patient's sharing choices.
- Sandbox
- Build against synthetic members first. What each sandbox holds
- Standards
- CDC STEADI; Katz ADL / Lawton IADL only where licensed
Markets that use this family
Scopes
| Scope | Allows |
|---|---|
older_adults.read | Read an older patient's falls risk tier (CDC STEADI) and falls-prevention programmes, physical function (Katz ADL / Lawton IADL only where this deployment holds the licence and the patient completed them), medication burden for medication review (count, anticholinergic burden, sedatives; never advice), your care dyads (caregiver link and consent status, never the caregiver's contact details), the sleep-apnoea pathway and CPAP adherence (an unlogged night is unknown, not missed), the status of the five fillable dementia risk factors (never a risk score) and the hospice review status (never an eligibility answer); each under the patient's sharing choices (treating practices only). |
older_adults.write | Log a contact with one of your care dyads (navigator check-in, care-plan review, education, support line, respite arranged, referral), attributed to a named member of your staff; no free text (treating practices only). |
Endpoints
An older patient's falls risk tier, mobility checks and falls-prevention programmes
The newest CDC STEADI self-check as codes (tier, screen positive, falls in the past year, which gait / strength / balance tests flagged; fields the algorithm filled from earlier checks are named in autofilled_from), the latest SPPB, gait speed, Timed Up and Go and chair stand, and the patient's enrolments in named falls-prevention programmes with each programme's own completion threshold and fidelity. A check never done is null, never low. The patient must share their medical history with you. Subscribe to older_adults.falls_tier_raised for a tier that went up.
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
All responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s "https://norvya.fly.dev/v1/patients/$MEMBER_REF/older-adults/falls" \
-H "Authorization: Bearer $TOKEN"import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
resp = requests.get(
f"{BASE}/v1/patients/{member_ref}/older-adults/falls",
headers={"Authorization": f"Bearer {TOKEN}"},
timeout=30,
)
resp.raise_for_status()
print(resp.json())// Node.js 18+ (ES module). Keep production credentials on your server.
const BASE = "https://norvya.fly.dev";
const member_ref = process.env.MEMBER_REF;
const url = new URL(`${BASE}/v1/patients/${encodeURIComponent(member_ref)}/older-adults/falls`);
const res = await fetch(url, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
},
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
Physical function: Katz ADL and Lawton IADL where licensed and completed
The latest Katz ADL and Lawton IADL responses the patient completed (scored by Norvya) and whether you can request them. Their wording is licensed: on a deployment without the licensed copy they are not requestable (not_requestable_reason instrument_not_licensed) and no score is invented. Request one with POST /v1/members/{member_ref}/instrument-requests.
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
All responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s "https://norvya.fly.dev/v1/patients/$MEMBER_REF/older-adults/function" \
-H "Authorization: Bearer $TOKEN"import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
resp = requests.get(
f"{BASE}/v1/patients/{member_ref}/older-adults/function",
headers={"Authorization": f"Bearer {TOKEN}"},
timeout=30,
)
resp.raise_for_status()
print(resp.json())// Node.js 18+ (ES module). Keep production credentials on your server.
const BASE = "https://norvya.fly.dev";
const member_ref = process.env.MEMBER_REF;
const url = new URL(`${BASE}/v1/patients/${encodeURIComponent(member_ref)}/older-adults/function`);
const res = await fetch(url, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
},
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
Medication burden for medication review (65 and over)
The same evaluation as the practice's medication-burden insight: the count of CURRENT medications (only entries carrying a status or a stop date count) with its band (under 5, polypharmacy 5-9, hyper-polypharmacy 10+), the Anticholinergic Cognitive Burden total and band, sedatives, and regimen finding codes. status explains an exclusion (under_65, medications_not_shared, awaiting_medication_dates, ...). A list for review, never a recommendation to stop or change a medicine.
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
All responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s "https://norvya.fly.dev/v1/patients/$MEMBER_REF/older-adults/medication-burden" \
-H "Authorization: Bearer $TOKEN"import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
resp = requests.get(
f"{BASE}/v1/patients/{member_ref}/older-adults/medication-burden",
headers={"Authorization": f"Bearer {TOKEN}"},
timeout=30,
)
resp.raise_for_status()
print(resp.json())// Node.js 18+ (ES module). Keep production credentials on your server.
const BASE = "https://norvya.fly.dev";
const member_ref = process.env.MEMBER_REF;
const url = new URL(`${BASE}/v1/patients/${encodeURIComponent(member_ref)}/older-adults/medication-burden`);
const res = await fetch(url, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
},
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
Your care dyads for this patient (caregiver link, plan, contacts, GUIDE-shaped elements)
Your organisation's dyads where this patient is the beneficiary: relationship, status, whether the caregiver has a Norvya account and consented, the navigator as a staff_ref, care-plan dates, contact counts, respite hours and which GUIDE-shaped elements are present (no score; what Norvya does not do is listed in not_covered). Never the caregiver's name or contact details, never the support-line number. Caregiver burden assessments only when the caregiver's own consent is recorded; caregiver_app_access says whether the patient granted THAT caregiver the in-app caregiver summary. Recording these elements is not GUIDE participation.
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
All responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s "https://norvya.fly.dev/v1/patients/$MEMBER_REF/older-adults/care-dyad" \
-H "Authorization: Bearer $TOKEN"import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
resp = requests.get(
f"{BASE}/v1/patients/{member_ref}/older-adults/care-dyad",
headers={"Authorization": f"Bearer {TOKEN}"},
timeout=30,
)
resp.raise_for_status()
print(resp.json())// Node.js 18+ (ES module). Keep production credentials on your server.
const BASE = "https://norvya.fly.dev";
const member_ref = process.env.MEMBER_REF;
const url = new URL(`${BASE}/v1/patients/${encodeURIComponent(member_ref)}/older-adults/care-dyad`);
const res = await fetch(url, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
},
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
Log a contact with one of your care dyads
The staff contact log (care_dyad): date, kind, who it reached, minutes and after-hours, attributed to the member of your staff you name (422 staff_not_found). No free text. The beneficiary must still be your active member sharing their medical history (else 404 care_dyad_not_found). The same contact sent twice (date, kind, who, staff) returns the first with created false.
Parameters
Request body
Content type: application/json (required)
YYYY-MM-DD
navigator_checkin | care_plan_review | education | support_line | respite_arranged | referral | other
beneficiary | caregiver | both
staff_ref of the member of your staff who made the contact.
Errors specific to this call
404care_dyad_not_foundAll responses
201Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s -X POST "https://norvya.fly.dev/v1/care-dyads/$DYAD_REF/contacts" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"contact_on": "2026-10-14",
"kind": "navigator_checkin",
"who": "string",
"minutes": 0,
"after_hours": false,
"staff": "string"
}'import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
dyad_ref = os.environ["DYAD_REF"]
resp = requests.post(
f"{BASE}/v1/care-dyads/{dyad_ref}/contacts",
headers={"Authorization": f"Bearer {TOKEN}"},
json={
"contact_on": "2026-10-14",
"kind": "navigator_checkin",
"who": "string",
"minutes": 0,
"after_hours": False,
"staff": "string",
},
timeout=30,
)
resp.raise_for_status()
print(resp.json())// Node.js 18+ (ES module). Keep production credentials on your server.
const BASE = "https://norvya.fly.dev";
const dyad_ref = process.env.DYAD_REF;
const url = new URL(`${BASE}/v1/care-dyads/${encodeURIComponent(dyad_ref)}/contacts`);
const res = await fetch(url, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"contact_on": "2026-10-14",
"kind": "navigator_checkin",
"who": "string",
"minutes": 0,
"after_hours": false,
"staff": "string"
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());{
"dyad_ref": "string",
"contact_on": "string",
"kind": "string",
"who": "string",
"minutes": 0,
"after_hours": false,
"staff": "string",
"created": false
}The response is the shape from the schema, not live data.
Try it in your sandbox
The sleep-apnoea pathway and CPAP adherence
Where the patient is on screen, sleep study, treatment, adherence: state, next action, the STOP-BANG score and band (a screen, not a diagnosis) and, while on treatment and sharing both biometrics and their wearables home data (which covers sleep and CPAP) with you, CPAP nights logged against the CMS definition (4 h on 21 of 30 nights). An unlogged night is unknown, not missed. Deep-sleep minutes and anything about brain clearance are never reported.
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
All responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s "https://norvya.fly.dev/v1/patients/$MEMBER_REF/older-adults/sleep-apnea" \
-H "Authorization: Bearer $TOKEN"import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
resp = requests.get(
f"{BASE}/v1/patients/{member_ref}/older-adults/sleep-apnea",
headers={"Authorization": f"Bearer {TOKEN}"},
timeout=30,
)
resp.raise_for_status()
print(resp.json())// Node.js 18+ (ES module). Keep production credentials on your server.
const BASE = "https://norvya.fly.dev";
const member_ref = process.env.MEMBER_REF;
const url = new URL(`${BASE}/v1/patients/${encodeURIComponent(member_ref)}/older-adults/sleep-apnea`);
const res = await fetch(url, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
},
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
The five fillable dementia risk factors (status only, no score)
Hearing loss, social isolation (UCLA-3, a proxy), vision loss, education and air pollution as controlled / borderline / elevated / unknown, with the in-app action that fills an unknown one. risk_score is always null: Norvya does not turn the Lancet Commission's population attributable fractions into a personal dementia risk.
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
All responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s "https://norvya.fly.dev/v1/patients/$MEMBER_REF/older-adults/dementia-risk-factors" \
-H "Authorization: Bearer $TOKEN"import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
resp = requests.get(
f"{BASE}/v1/patients/{member_ref}/older-adults/dementia-risk-factors",
headers={"Authorization": f"Bearer {TOKEN}"},
timeout=30,
)
resp.raise_for_status()
print(resp.json())// Node.js 18+ (ES module). Keep production credentials on your server.
const BASE = "https://norvya.fly.dev";
const member_ref = process.env.MEMBER_REF;
const url = new URL(`${BASE}/v1/patients/${encodeURIComponent(member_ref)}/older-adults/dementia-risk-factors`);
const res = await fetch(url, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
},
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
Hospice / serious-illness review status (never an eligibility answer)
supports_review says whether enough is recorded to be worth a conversation, and missing what is not; never whether the patient is eligible. Your clinicians' latest Palliative Performance Scale level, which functional measures exist, hospital / ED counts ONLY inside an ascertainment period (no period, no number), the weight trend while the patient shares biometrics, the serious-illness care status, and whether an advance-care plan is on file (not its contents).
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
All responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s "https://norvya.fly.dev/v1/patients/$MEMBER_REF/older-adults/hospice-review" \
-H "Authorization: Bearer $TOKEN"import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
resp = requests.get(
f"{BASE}/v1/patients/{member_ref}/older-adults/hospice-review",
headers={"Authorization": f"Bearer {TOKEN}"},
timeout=30,
)
resp.raise_for_status()
print(resp.json())// Node.js 18+ (ES module). Keep production credentials on your server.
const BASE = "https://norvya.fly.dev";
const member_ref = process.env.MEMBER_REF;
const url = new URL(`${BASE}/v1/patients/${encodeURIComponent(member_ref)}/older-adults/hospice-review`);
const res = await fetch(url, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
},
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
Webhook events
Payloads carry no health data, only a reference to fetch with your token. Each event needs its scope as well as webhooks.manage. Signing and retries
| Event | Scope | When |
|---|---|---|
older_adults.falls_tier_raised | older_adults.read | A patient's newest CDC STEADI self-check set a higher falls tier than their previous one, and the new tier is moderate or high. |
Generated from the Partner API router and developers_catalog.py. The router docstring is the source of each description.