Lower Extremity Functional Scale
Status:
stableCategory:functionAdded:2026-04-20Last reviewed:2026-04-21
Summary
The Lower Extremity Functional Scale (LEFS) is Trinity's
lower-limb function instrument. Twenty items, each scored 0–4,
summing to a 0–80 total. Higher scores indicate better
function. This is the opposite sign convention from
oswestry,
neck_disability, and
quick_dash, where higher means more
disability.
⚠ Sign convention: higher = better
Unlike most disability instruments in the catalog, the LEFS is a
function instrument — the maximum score (80) represents full
function, and 0 represents total loss of function.
This matters for callers who consume multiple function scores and
apply rules like "flag subjects whose function score exceeds a
threshold." A threshold of 40 against ODI means subjects with
severe disability; against LEFS it means subjects with
moderate-to-severe disability (since 41–60 is mild on LEFS).
Flipping that sign will produce the wrong set.
Read the band field when mixing instruments — band names
(minimal, mild, moderate, severe) have consistent meaning
across instruments, so they are the safer cross-instrument signal
than the raw numeric score.
Resource identity
| Field | Value |
|---|---|
| Category | function |
| Resource | lower_extremity_function |
| Instrument ID | lower_extremity_function |
| Rubric version | 1.0.0 |
| Path prefix | /api/function/lower_extremity_function |
Operations
| Operation | Method | Path | Contract |
|---|---|---|---|
| Questions | GET | /api/function/lower_extremity_function/questions | patterns-questions.md |
| Score | POST | /api/function/lower_extremity_function/score | patterns-score.md |
Items
Twenty items, each on a 0–4 scale.
| ID | Prompt (paraphrased) |
|---|---|
item_1 | Usual work, housework, or school activities. |
item_2 | Usual hobbies, recreational, or sporting activities. |
item_3 | Getting into or out of the bath. |
item_4 | Walking between rooms. |
item_5 | Putting on your shoes or socks. |
item_6 | Squatting. |
item_7 | Lifting an object from the floor. |
item_8 | Performing light activities around the home. |
item_9 | Performing heavy activities around the home. |
item_10 | Getting into or out of a car. |
item_11 | Walking two blocks. |
item_12 | Walking a mile. |
item_13 | Going up or down 10 stairs. |
item_14 | Standing for 1 hour. |
item_15 | Sitting for 1 hour. |
item_16 | Running on even ground. |
item_17 | Running on uneven ground. |
item_18 | Making sharp turns while running fast. |
item_19 | Hopping. |
item_20 | Rolling over in bed. |
Answer choices per item (note: 0 is the worst response):
| Value | Label |
|---|---|
0 | Extreme difficulty / unable |
1 | Quite a bit of difficulty |
2 | Moderate difficulty |
3 | A little bit of difficulty |
4 | No difficulty |
Scoring
| Field | Value |
|---|---|
| Method | simple_sum over all twenty items. |
| Score range | 0 – 80. |
Bands
| Band | Range (inclusive) | Clinical meaning |
|---|---|---|
severe | 0 – 20 | Severe functional limitation. |
moderate | 21 – 40 | Moderate functional limitation. |
mild | 41 – 60 | Mild functional limitation. |
minimal | 61 – 80 | Minimal functional limitation. |
Note the band order: severe is at the low end, minimal is at
the high end — consistent with the "higher = better function" sign
convention.
Required items
All twenty items are required for a strict /score call.
Worked example
Every item answered with 2 ("moderate difficulty"). See
quickstart.md for per-language scaffolding and
patterns-score.md for the shared /score
contract.
Send:
POST /api/function/lower_extremity_function/score HTTP/1.1
Host: engine.tripod-health.com
apikey: $ENGINE_API_KEY
Content-Type: application/json
X-Request-ID: docs-lower_extremity_function-score-basic
{
"responses": {
"item_1": 2, "item_2": 2, "item_3": 2, "item_4": 2, "item_5": 2,
"item_6": 2, "item_7": 2, "item_8": 2, "item_9": 2, "item_10": 2,
"item_11": 2, "item_12": 2, "item_13": 2, "item_14": 2, "item_15": 2,
"item_16": 2, "item_17": 2, "item_18": 2, "item_19": 2, "item_20": 2
}
}
Receive (200 OK):
{
"instrument": "lower_extremity_function",
"category": "function",
"finding": {
"algorithm_id": "lower_extremity_function",
"algorithm_version": "1.0.0",
"score": 40,
"band": "moderate",
"raw": {
"rubric_version": "1.0.0",
"responded_items": 20
},
"context": null,
"imputed": false,
"sd": null,
"prior_source": null
},
"confidence": {
"overall": 1,
"tier": "high",
"breakdown": {
"input_completeness": 1,
"imputation_variance": null,
"model_certainty": null
}
},
"recommendations": null,
"depth": "basic",
"catalog_version": "0.13.0",
"request_id": "docs-lower_extremity_function-score-basic",
"timestamp": "2026-04-21T23:14:55.913104+00:00"
}
Computation: sum = 20 × 2 = 40, top of the moderate band (21–40).
Every item at 4 (no difficulty) yields 80 (minimal); every item
at 0 yields 0 (severe). Remember LEFS is higher = better;
the band semantics invert compared to disability-index instruments.
Calling in your language
curl
curl -sS -X POST "https://engine.tripod-health.com/api/function/lower_extremity_function/score" \
-H "apikey: $ENGINE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"responses":{"item_1":2,"item_2":2,"item_3":2,"item_4":2,"item_5":2,"item_6":2,"item_7":2,"item_8":2,"item_9":2,"item_10":2,"item_11":2,"item_12":2,"item_13":2,"item_14":2,"item_15":2,"item_16":2,"item_17":2,"item_18":2,"item_19":2,"item_20":2}}'
Python (requests)
# Uses the call() helper from quickstart.md.
responses = {f"item_{i}": 2 for i in range(1, 21)}
result = call("POST", "/api/function/lower_extremity_function/score",
{"responses": responses})
print(result["finding"]["score"], result["finding"]["band"])
Node.js (native fetch)
// Uses the call() helper from quickstart.md.
const responses = Object.fromEntries(
Array.from({ length: 20 }, (_, i) => [`item_${i + 1}`, 2]),
);
const result = await call(
"POST",
"/api/function/lower_extremity_function/score",
{ responses },
);
console.log(result.finding.score, result.finding.band);
TypeScript
// Uses the typed call<T>() helper from quickstart.md.
const responses = Object.fromEntries(
Array.from({ length: 20 }, (_, i) => [`item_${i + 1}`, 2]),
);
const result = await call<ScoreResponse>(
"POST",
"/api/function/lower_extremity_function/score",
{ responses },
);
Go
// Uses the call() helper from quickstart.md.
responses := make(map[string]int, 20)
for i := 1; i <= 20; i++ {
responses[fmt.Sprintf("item_%d", i)] = 2
}
result, err := call("POST", "/api/function/lower_extremity_function/score",
map[string]any{"responses": responses}, 3)
if err != nil {
panic(err)
}
finding := result["finding"].(map[string]any)
fmt.Printf("LEFS: %v (%v)\n", finding["score"], finding["band"])
Java
// Uses the call() helper from quickstart.md.
StringBuilder body = new StringBuilder("{\"responses\":{");
for (int i = 1; i <= 20; i++) {
if (i > 1) body.append(",");
body.append("\"item_").append(i).append("\":2");
}
body.append("}}");
String result = call("POST",
"/api/function/lower_extremity_function/score", body.toString(), 3);
System.out.println(result);
C# (.NET HttpClient)
// Uses the Call() helper from quickstart.md.
var responses = Enumerable.Range(1, 20)
.ToDictionary(i => $"item_{i}", _ => 2);
var result = await Call(HttpMethod.Post,
"/api/function/lower_extremity_function/score",
new { responses });
var finding = result.GetProperty("finding");
Console.WriteLine($"LEFS: {finding.GetProperty("score").GetDouble()} ({finding.GetProperty("band").GetString()})");
PowerShell
# Uses the Invoke-Engine helper from quickstart.md.
$responses = @{}
1..20 | ForEach-Object { $responses["item_$_"] = 2 }
$result = Invoke-Engine -Method Post -Path "/api/function/lower_extremity_function/score" -Body @{ responses = $responses }
"LEFS: $($result.finding.score) ($($result.finding.band))"
Clinical interpretation
- What it measures. Difficulty with twenty lower-extremity- dependent activities. Total score reflects the sum of remaining function across those activities.
- Score range.
0–80, with80representing no limitation. - Percentage conversion. Some clinical reports express LEFS as
a percentage (
score / 80 × 100%). Trinity does not compute this; do it client-side if your UI needs it.
Intended use
- Lower-extremity outcome tracking for hip, knee, ankle, or foot conditions.
- Baseline vs. follow-up after intervention targeting the lower limb.
- Feeding the CDRI composite as the lower-extremity function signal.
Mistaken use
- Do not apply an "ODI-like" threshold convention. If you are
flagging "function below threshold X," remember that LEFS goes up
as function improves. An analogous threshold for concerning
function on LEFS is
score < 40, notscore > 40. - Do not use for lumbar, cervical, or upper-extremity complaints. Those have their own instruments.
- Do not convert LEFS to ODI-equivalent by subtraction. While
80 - LEFSproduces a value between0and80, it does not correspond to any standardized disability scale. - Do not confuse with LEFS 2.0 or regional short forms. The Trinity implements the original 20-item LEFS.
Debugging
- Capture
request_id. Present in every response body. - Scores look inverted compared to other function instruments.
Expected — see the sign-convention note above. Consume
bandfor cross-instrument comparisons. 400 ValidationErrorwithmissing_items. Send all twenty items.finding.raw.responded_itemsis less than 20 but the request succeeded. Not possible under the current strict rubric; investigate a proxy between client and API stripping items.
Related
- patterns-questions.md, patterns-score.md — shared contracts.
- instruments-oswestry.md — lumbar; opposite sign convention.
- instruments-quick_dash.md — upper extremity.
- instruments-neck_disability.md — cervical.
- composite-cdri-compute.md — composite.
Change history
| Date | Change |
|---|---|
| 2026-04-20 | Initial publication. |