Rehab (PT / OT / speech)
Rehab episodes with the lead therapist and restrictions, home exercise programs with recorded days (an unrecorded day is not a missed one), goals, home-safety recommendations, IDDSI diet levels for dysphagia, standardised outcome measures scored server-side and a practice outcomes summary. Webhook: rehab.goal_met.
- Who calls it
- Core for Rehab & nutrition practices
- Before production
- Treating practices; each read follows the patient's sharing choices.
- Sandbox
- Build against synthetic members first. What each sandbox holds
- Standards
- IDDSI diet levels
Markets that use this family
- Rehab & nutrition practices (core)
Scopes
| Scope | Allows |
|---|---|
rehab.read | Read a patient's physical, occupational and speech therapy record with your practice: recovery episodes (discipline, restrictions, milestones), home exercise programs with the days the patient recorded (an unrecorded day is never a missed one), functional goals and the patient's own ratings, the home-safety checklist (no score), IDDSI food and drink levels and episode outcome measures; the patient must share their medical history with you (treating practices only). |
rehab.write | Act in Norvya for a named clinician of your practice on that record: set an episode's discipline, lead therapist and restrictions, assign or end a home program, create or update goals, set or end IDDSI levels, recommend home-safety items, request a patient-reported outcome measure for an episode or record a clinician-rated one (treating practices only). |
Endpoints
A patient's recovery episodes (PT / OT / speech)
Every recovery episode the patient has in Norvya (the same list your staff see): discipline, lead therapist (staff_ref when one of yours), weight-bearing and precautions (set only by clinical staff), milestones the patient recorded, the latest warning-sign check lane and the episode's outcome measures. Phases are general education; none exist for OT / SLP conditions (no source was read for a timeline).
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/rehab/patients/$MEMBER_REF/episodes" \
-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/rehab/patients/{member_ref}/episodes",
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/rehab/patients/${encodeURIComponent(member_ref)}/episodes`);
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
One recovery episode
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/rehab/patients/$MEMBER_REF/episodes/$EPISODE_REF" \
-H "Authorization: Bearer $TOKEN"import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
episode_ref = os.environ["EPISODE_REF"]
resp = requests.get(
f"{BASE}/v1/rehab/patients/{member_ref}/episodes/{episode_ref}",
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 episode_ref = process.env.EPISODE_REF;
const url = new URL(`${BASE}/v1/rehab/patients/${encodeURIComponent(member_ref)}/episodes/${encodeURIComponent(episode_ref)}`);
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
Set an episode's discipline and lead therapist
rehab_disciplines.set_episode_care, as the staff screen. The lead therapist is a staff_ref of your practice (empty string clears it). An episode another practice holds is 409 episode_held_by_another_practice.
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
Request body
Content type: application/json (required)
staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).
pt | ot | slp
staff_ref of an active staff member of your practice; an empty string clears it.
Errors specific to this call
409episode_held_by_another_practiceAll responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s -X PUT "https://norvya.fly.dev/v1/rehab/patients/$MEMBER_REF/episodes/$EPISODE_REF/care" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"discipline": "string",
"lead_therapist": "string"
}'import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
episode_ref = os.environ["EPISODE_REF"]
resp = requests.put(
f"{BASE}/v1/rehab/patients/{member_ref}/episodes/{episode_ref}/care",
headers={"Authorization": f"Bearer {TOKEN}"},
json={
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"discipline": "string",
"lead_therapist": "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 member_ref = process.env.MEMBER_REF;
const episode_ref = process.env.EPISODE_REF;
const url = new URL(`${BASE}/v1/rehab/patients/${encodeURIComponent(member_ref)}/episodes/${encodeURIComponent(episode_ref)}/care`);
const res = await fetch(url, {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"discipline": "string",
"lead_therapist": "string"
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
Set weight-bearing status and precautions (a named clinician's order)
rehab_episodes.set_restrictions with the named clinician as the author. The patient sees them as set by their care team; the app never infers or relaxes one.
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
Request body
Content type: application/json (required)
staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).
non | toe_touch | partial | as_tolerated | full | na
rehab_episodes precaution keys (GET .../episodes catalog.precautions).
All responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s -X PUT "https://norvya.fly.dev/v1/rehab/patients/$MEMBER_REF/episodes/$EPISODE_REF/restrictions" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"weight_bearing": "string",
"precautions": [
"string"
]
}'import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
episode_ref = os.environ["EPISODE_REF"]
resp = requests.put(
f"{BASE}/v1/rehab/patients/{member_ref}/episodes/{episode_ref}/restrictions",
headers={"Authorization": f"Bearer {TOKEN}"},
json={
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"weight_bearing": "string",
"precautions": [
"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 member_ref = process.env.MEMBER_REF;
const episode_ref = process.env.EPISODE_REF;
const url = new URL(`${BASE}/v1/rehab/patients/${encodeURIComponent(member_ref)}/episodes/${encodeURIComponent(episode_ref)}/restrictions`);
const res = await fetch(url, {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"weight_bearing": "string",
"precautions": [
"string"
]
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
Request or record an outcome measure for an episode
Two kinds, never mixed. A CLINICIAN-RATED measure (FOIS, Nine-Hole Peg Test) is recorded with `values` for the named clinician and scored by Norvya (rehab_disciplines.record_clinician_measure). A PATIENT-REPORTED PT measure (ODI, LEFS, QuickDASH, NDI: licensed, available only where this deployment holds the licence) is REQUESTED: the patient answers it in Norvya, scored server-side through the same questionnaire path as every request (idempotent with external_id; the same generic push; the instrument.completed event when answered). `values` on a patient-reported measure is 422 patient_reported_measure_cannot_be_entered.
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
Request body
Content type: application/json (required)
staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).
A clinician-rated measure (FOIS, Nine-Hole Peg Test) or a patient-reported PT measure (ODI, LEFS, QuickDASH, NDI) this deployment is licensed for.
baseline | interval | discharge
Clinician-rated only: one value per item. Omit for a patient-reported measure (the patient answers it in Norvya).
Patient-reported only: your id for the request (idempotent).
Errors specific to this call
422patient_reported_measure_cannot_be_enteredAll 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/rehab/patients/$MEMBER_REF/episodes/$EPISODE_REF/outcome-measures" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"instrument_id": "fois",
"timepoint": "string",
"values": [
0.0
],
"external_id": "string"
}'import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
episode_ref = os.environ["EPISODE_REF"]
resp = requests.post(
f"{BASE}/v1/rehab/patients/{member_ref}/episodes/{episode_ref}/outcome-measures",
headers={"Authorization": f"Bearer {TOKEN}"},
json={
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"instrument_id": "fois",
"timepoint": "string",
"values": [
0.0,
],
"external_id": "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 member_ref = process.env.MEMBER_REF;
const episode_ref = process.env.EPISODE_REF;
const url = new URL(`${BASE}/v1/rehab/patients/${encodeURIComponent(member_ref)}/episodes/${encodeURIComponent(episode_ref)}/outcome-measures`);
const res = await fetch(url, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"instrument_id": "fois",
"timepoint": "string",
"values": [
0.0
],
"external_id": "string"
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
A patient's home exercise programs and recorded days
The active program per discipline (pt / ot / slp) with its exercises and adherence over the last 28 days as RECORDED days and fully-completed days (OT / SLP: how hard the recorded days felt, the patient's own word). There is deliberately no missed-day count: a day with nothing recorded is unknown.
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/rehab/patients/$MEMBER_REF/home-programs" \
-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/rehab/patients/{member_ref}/home-programs",
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/rehab/patients/${encodeURIComponent(member_ref)}/home-programs`);
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
Assign a home exercise program (replaces the discipline's active one)
pain_care.start_program with the named clinician as the assigner, as the staff screens do: one active program per discipline (the focus decides it), validated exercises and doses.
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
Request body
Content type: application/json (required)
staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).
pt: low_back | neck | knee | hip | shoulder | general | pelvic_floor; ot: hand | adl | energy_conservation | joint_protection; slp: swallowing | voice | articulation | language
{exercise_key, sets?, reps?, hold_seconds?, minutes?, days_per_week?}; default the focus's starter set (PT).
All 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/rehab/patients/$MEMBER_REF/home-programs" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"focus": "string",
"items": [
{}
],
"note": "string"
}'import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
resp = requests.post(
f"{BASE}/v1/rehab/patients/{member_ref}/home-programs",
headers={"Authorization": f"Bearer {TOKEN}"},
json={
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"focus": "string",
"items": [
{},
],
"note": "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 member_ref = process.env.MEMBER_REF;
const url = new URL(`${BASE}/v1/rehab/patients/${encodeURIComponent(member_ref)}/home-programs`);
const res = await fetch(url, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"focus": "string",
"items": [
{}
],
"note": "string"
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
End your practice's active home program for a discipline
Only a program your practice assigned (a self-started or another practice's program is 409 program_held_elsewhere).
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
Request body
Content type: application/json (required)
staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).
Errors specific to this call
409program_held_elsewhereAll responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s -X POST "https://norvya.fly.dev/v1/rehab/patients/$MEMBER_REF/home-programs/$DISCIPLINE/end" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b"
}'import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
discipline = os.environ["DISCIPLINE"]
resp = requests.post(
f"{BASE}/v1/rehab/patients/{member_ref}/home-programs/{discipline}/end",
headers={"Authorization": f"Bearer {TOKEN}"},
json={
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
},
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 discipline = process.env.DISCIPLINE;
const url = new URL(`${BASE}/v1/rehab/patients/${encodeURIComponent(member_ref)}/home-programs/${encodeURIComponent(discipline)}/end`);
const res = await fetch(url, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b"
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
A patient's functional goals and their own ratings
Goals in the therapist's own words by domain, with the patient's 0-10 rating of how close each feels (at most one a day). ?goal_ref= narrows to one (the rehab.goal_met event's resource_url).
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/rehab/patients/$MEMBER_REF/goals" \
-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/rehab/patients/{member_ref}/goals",
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/rehab/patients/${encodeURIComponent(member_ref)}/goals`);
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
Create a functional goal
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
Request body
Content type: application/json (required)
staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).
pt | ot | slp
GET .../goals goal_domains[discipline]
YYYY-MM-DD, today to two years ahead.
All 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/rehab/patients/$MEMBER_REF/goals" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"discipline": "string",
"domain": "string",
"text": "string",
"target_date": "string",
"episode_ref": "string"
}'import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
resp = requests.post(
f"{BASE}/v1/rehab/patients/{member_ref}/goals",
headers={"Authorization": f"Bearer {TOKEN}"},
json={
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"discipline": "string",
"domain": "string",
"text": "string",
"target_date": "string",
"episode_ref": "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 member_ref = process.env.MEMBER_REF;
const url = new URL(`${BASE}/v1/rehab/patients/${encodeURIComponent(member_ref)}/goals`);
const res = await fetch(url, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"discipline": "string",
"domain": "string",
"text": "string",
"target_date": "string",
"episode_ref": "string"
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
Update a goal your practice set (status met / discontinued, text, target date)
rehab_disciplines.update_goal. Marking a goal met sends rehab.goal_met to your subscribed endpoints (once per goal). Another practice's goal is 409 goal_set_by_another_practice.
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
Request body
Content type: application/json (required)
staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).
active | met | discontinued
All responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s -X PATCH "https://norvya.fly.dev/v1/rehab/patients/$MEMBER_REF/goals/$GOAL_REF" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"status": "string",
"text": "string",
"target_date": "string"
}'import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
goal_ref = os.environ["GOAL_REF"]
resp = requests.patch(
f"{BASE}/v1/rehab/patients/{member_ref}/goals/{goal_ref}",
headers={"Authorization": f"Bearer {TOKEN}"},
json={
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"status": "string",
"text": "string",
"target_date": "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 member_ref = process.env.MEMBER_REF;
const goal_ref = process.env.GOAL_REF;
const url = new URL(`${BASE}/v1/rehab/patients/${encodeURIComponent(member_ref)}/goals/${encodeURIComponent(goal_ref)}`);
const res = await fetch(url, {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"status": "string",
"text": "string",
"target_date": "string"
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
A patient's home-safety checklist (CDC STEADI; no score)
The patient's answers (yes / no / na), the items an OT recommended and counts only. It is NOT a fall-risk score and produces no number.
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/rehab/patients/$MEMBER_REF/home-safety" \
-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/rehab/patients/{member_ref}/home-safety",
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/rehab/patients/${encodeURIComponent(member_ref)}/home-safety`);
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
Recommend home-safety items (replaces the list)
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
Request body
Content type: application/json (required)
staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).
Checklist item keys to recommend (GET .../home-safety groups); replaces the list.
All responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s -X PUT "https://norvya.fly.dev/v1/rehab/patients/$MEMBER_REF/home-safety/recommendations" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"items": [
"string"
]
}'import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
resp = requests.put(
f"{BASE}/v1/rehab/patients/{member_ref}/home-safety/recommendations",
headers={"Authorization": f"Bearer {TOKEN}"},
json={
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"items": [
"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 member_ref = process.env.MEMBER_REF;
const url = new URL(`${BASE}/v1/rehab/patients/${encodeURIComponent(member_ref)}/home-safety/recommendations`);
const res = await fetch(url, {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"items": [
"string"
]
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
A patient's current IDDSI food and drink levels
The levels a clinician set (only clinical staff set them; the app never changes or infers a level), with the IDDSI framework attribution.
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/rehab/patients/$MEMBER_REF/iddsi" \
-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/rehab/patients/{member_ref}/iddsi",
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/rehab/patients/${encodeURIComponent(member_ref)}/iddsi`);
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
Set IDDSI food and / or drink levels (a named clinician's order)
rehab_disciplines.set_iddsi: the new order replaces the active one.
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
Request body
Content type: application/json (required)
staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).
IDDSI food level: 3 | 4 | 5 | 6 | 7 | 7EC
IDDSI drink level 0-4
All responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s -X PUT "https://norvya.fly.dev/v1/rehab/patients/$MEMBER_REF/iddsi" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"food_level": "string",
"drink_level": 0,
"food_transitional": false,
"note": "string",
"episode_ref": "string"
}'import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
resp = requests.put(
f"{BASE}/v1/rehab/patients/{member_ref}/iddsi",
headers={"Authorization": f"Bearer {TOKEN}"},
json={
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"food_level": "string",
"drink_level": 0,
"food_transitional": False,
"note": "string",
"episode_ref": "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 member_ref = process.env.MEMBER_REF;
const url = new URL(`${BASE}/v1/rehab/patients/${encodeURIComponent(member_ref)}/iddsi`);
const res = await fetch(url, {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
"food_level": "string",
"drink_level": 0,
"food_transitional": false,
"note": "string",
"episode_ref": "string"
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
End the IDDSI levels your practice set
Parameters
EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens
Request body
Content type: application/json (required)
staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).
All responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s -X POST "https://norvya.fly.dev/v1/rehab/patients/$MEMBER_REF/iddsi/end" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b"
}'import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
member_ref = os.environ["MEMBER_REF"]
resp = requests.post(
f"{BASE}/v1/rehab/patients/{member_ref}/iddsi/end",
headers={"Authorization": f"Bearer {TOKEN}"},
json={
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b",
},
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/rehab/patients/${encodeURIComponent(member_ref)}/iddsi/end`);
const res = await fetch(url, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"clinician": "stf_4c1d2e3f4a5b6c7d8e9f0a1b"
}),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(await res.json());Try it in your sandbox
Episode outcome measures and recorded clinician measures
Per episode: each PT measure's baseline, follow-up, change and whether the published MCID (cited next to it) was reached (pt_outcomes; a provisional follow-up is an interval, not a discharge). Plus the clinician-rated measures recorded for the patient, and which measures this deployment can request or record.
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/rehab/patients/$MEMBER_REF/outcome-measures" \
-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/rehab/patients/{member_ref}/outcome-measures",
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/rehab/patients/${encodeURIComponent(member_ref)}/outcome-measures`);
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 practice's PT outcome summary (aggregate, small cells withheld)
pt_outcomes.practice_summary over the patients who share their medical history with you (the staff route's population); counts below the small-cell minimum are suppressed by the engine.
All responses
200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service UnavailableCodes every call can return are in Errors & limits.
curl -s "https://norvya.fly.dev/v1/rehab/outcomes-summary" \
-H "Authorization: Bearer $TOKEN"import os
import requests
BASE = "https://norvya.fly.dev"
TOKEN = os.environ["TOKEN"]
resp = requests.get(
BASE + "/v1/rehab/outcomes-summary",
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 url = new URL(`${BASE}/v1/rehab/outcomes-summary`);
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 |
|---|---|---|
rehab.goal_met | rehab.read | A functional goal the practice set was marked met (once per goal; only while the patient shares their medical history). |
Generated from the Partner API router and developers_catalog.py. The router docstring is the source of each description.