Norvya Developers
Get a sandbox
API reference · Specialty practices

Rehab (PT / OT / speech)

Built — gated18 endpoints · 1 webhook event · OpenAPI tag rehab

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

Scopes

ScopeAllows
rehab.readRead 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.writeAct 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)

GET/v1/rehab/patients/{member_ref}/episodesrehab.read

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

member_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

All responses

200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes every call can return are in Errors & limits.

curl -s "https://norvya.fly.dev/v1/rehab/patients/$MEMBER_REF/episodes" \
  -H "Authorization: Bearer $TOKEN"

One recovery episode

GET/v1/rehab/patients/{member_ref}/episodes/{episode_ref}rehab.read

Parameters

member_refpath · stringrequired
episode_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

All responses

200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes 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"

Set an episode's discipline and lead therapist

PUT/v1/rehab/patients/{member_ref}/episodes/{episode_ref}/carerehab.write

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

member_refpath · stringrequired
episode_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

Request body

Content type: application/json (required)

clinicianstringrequired

staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).

disciplinestring | null

pt | ot | slp

lead_therapiststring | null

staff_ref of an active staff member of your practice; an empty string clears it.

Errors specific to this call

409episode_held_by_another_practice

All responses

200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes 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"
  }'

Set weight-bearing status and precautions (a named clinician's order)

PUT/v1/rehab/patients/{member_ref}/episodes/{episode_ref}/restrictionsrehab.write

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

member_refpath · stringrequired
episode_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

Request body

Content type: application/json (required)

clinicianstringrequired

staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).

weight_bearingstring | null

non | toe_touch | partial | as_tolerated | full | na

precautionsarray of string | null

rehab_episodes precaution keys (GET .../episodes catalog.precautions).

All responses

200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes 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"
    ]
  }'

Request or record an outcome measure for an episode

POST/v1/rehab/patients/{member_ref}/episodes/{episode_ref}/outcome-measuresrehab.write

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

member_refpath · stringrequired
episode_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

Request body

Content type: application/json (required)

clinicianstringrequired

staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).

instrument_idstringrequired

A clinician-rated measure (FOIS, Nine-Hole Peg Test) or a patient-reported PT measure (ODI, LEFS, QuickDASH, NDI) this deployment is licensed for.

timepointstringrequired

baseline | interval | discharge

valuesarray of number | null

Clinician-rated only: one value per item. Omit for a patient-reported measure (the patient answers it in Norvya).

external_idstring | null

Patient-reported only: your id for the request (idempotent).

Errors specific to this call

422patient_reported_measure_cannot_be_entered

All responses

201Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes 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"
  }'

A patient's home exercise programs and recorded days

GET/v1/rehab/patients/{member_ref}/home-programsrehab.read

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

member_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

All responses

200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes 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"

Assign a home exercise program (replaces the discipline's active one)

POST/v1/rehab/patients/{member_ref}/home-programsrehab.write

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

member_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

Request body

Content type: application/json (required)

clinicianstringrequired

staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).

focusstringrequired

pt: low_back | neck | knee | hip | shoulder | general | pelvic_floor; ot: hand | adl | energy_conservation | joint_protection; slp: swallowing | voice | articulation | language

itemsarray of object | null

{exercise_key, sets?, reps?, hold_seconds?, minutes?, days_per_week?}; default the focus's starter set (PT).

notestring | null

All responses

201Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes 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"
  }'

End your practice's active home program for a discipline

POST/v1/rehab/patients/{member_ref}/home-programs/{discipline}/endrehab.write

Only a program your practice assigned (a self-started or another practice's program is 409 program_held_elsewhere).

Parameters

member_refpath · stringrequired
disciplinepath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

Request body

Content type: application/json (required)

clinicianstringrequired

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_elsewhere

All responses

200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes 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"
  }'

A patient's functional goals and their own ratings

GET/v1/rehab/patients/{member_ref}/goalsrehab.read

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

member_refpath · stringrequired
goal_refquery · string | null

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

All responses

200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes every call can return are in Errors & limits.

curl -s "https://norvya.fly.dev/v1/rehab/patients/$MEMBER_REF/goals" \
  -H "Authorization: Bearer $TOKEN"

Create a functional goal

POST/v1/rehab/patients/{member_ref}/goalsrehab.write

Parameters

member_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

Request body

Content type: application/json (required)

clinicianstringrequired

staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).

disciplinestringrequired

pt | ot | slp

domainstringrequired

GET .../goals goal_domains[discipline]

textstringrequired
target_datestring | null

YYYY-MM-DD, today to two years ahead.

episode_refstring | null

All responses

201Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes 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"
  }'

Update a goal your practice set (status met / discontinued, text, target date)

PATCH/v1/rehab/patients/{member_ref}/goals/{goal_ref}rehab.write

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

member_refpath · stringrequired
goal_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

Request body

Content type: application/json (required)

clinicianstringrequired

staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).

statusstring | null

active | met | discontinued

textstring | null
target_datestring | null

All responses

200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes 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"
  }'

A patient's home-safety checklist (CDC STEADI; no score)

GET/v1/rehab/patients/{member_ref}/home-safetyrehab.read

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

member_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

All responses

200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes 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"

Recommend home-safety items (replaces the list)

PUT/v1/rehab/patients/{member_ref}/home-safety/recommendationsrehab.write

Parameters

member_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

Request body

Content type: application/json (required)

clinicianstringrequired

staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).

itemsarray of stringrequired

Checklist item keys to recommend (GET .../home-safety groups); replaces the list.

All responses

200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes 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"
    ]
  }'

A patient's current IDDSI food and drink levels

GET/v1/rehab/patients/{member_ref}/iddsirehab.read

The levels a clinician set (only clinical staff set them; the app never changes or infers a level), with the IDDSI framework attribution.

Parameters

member_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

All responses

200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes every call can return are in Errors & limits.

curl -s "https://norvya.fly.dev/v1/rehab/patients/$MEMBER_REF/iddsi" \
  -H "Authorization: Bearer $TOKEN"

Set IDDSI food and / or drink levels (a named clinician's order)

PUT/v1/rehab/patients/{member_ref}/iddsirehab.write

rehab_disciplines.set_iddsi: the new order replaces the active one.

Parameters

member_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

Request body

Content type: application/json (required)

clinicianstringrequired

staff_ref of the clinician who decided this (rehab: GET /v1/panel/clinicians; nutrition: GET /v1/nutrition/staff).

food_levelstring | null

IDDSI food level: 3 | 4 | 5 | 6 | 7 | 7EC

drink_levelinteger | null

IDDSI drink level 0-4

food_transitionalboolean
notestring | null
episode_refstring | null

All responses

200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes 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"
  }'

End the IDDSI levels your practice set

POST/v1/rehab/patients/{member_ref}/iddsi/endrehab.write

Parameters

member_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

Request body

Content type: application/json (required)

clinicianstringrequired

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 Unavailable

Codes 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"
  }'

Episode outcome measures and recorded clinician measures

GET/v1/rehab/patients/{member_ref}/outcome-measuresrehab.read

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

member_refpath · stringrequired

EMR vendors also pass vendor (the practice) with a vendor-issued token. EMR vendor tokens

All responses

200Successful Response401Unauthorized403Forbidden404Not Found409Conflict422Unprocessable Entity429Too Many Requests503Service Unavailable

Codes 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"

Your practice's PT outcome summary (aggregate, small cells withheld)

GET/v1/rehab/outcomes-summaryrehab.read

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 Unavailable

Codes every call can return are in Errors & limits.

curl -s "https://norvya.fly.dev/v1/rehab/outcomes-summary" \
  -H "Authorization: Bearer $TOKEN"

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

EventScopeWhen
rehab.goal_metrehab.readA 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.

↑ ↓ to moveEnter to open