Loading documentation

Access required

Your account doesn't have access to the documentation. Contact your administrator.

Sign out
Skip to main content

Work Ability Index

Status: stable Category: occupational Added: 2026-04-20 Last reviewed: 2026-04-21

Summary

The Work Ability Index (WAI) is Trinity's measure of perceived current work ability. Seven items, each scored 17, summing to 7–49 and mapping to four tiers from poor to excellent. Higher scores indicate better work ability.

⚠ Work ability ≠ return-to-work readiness

Work ability and return-to-work readiness are often conflated but are different constructs. Work ability is the current match between a person's capacities and their job's demands. Return-to-work readiness is whether they are ready to resume the job right now, which depends on ability, motivation, logistics, permission, and context.

The WAI measures the former. It does not produce a verdict on RTW readiness. Use recovery_expectation for belief about future work, and let the caller's own workflow integrate those signals with the broader context for RTW decisions.

Resource identity

FieldValue
Categoryoccupational
Resourcework_ability
Instrument IDwork_ability
Rubric version1.0.0
Path prefix/api/occupational/work_ability

Operations

OperationMethodPathContract
QuestionsGET/api/occupational/work_ability/questionspatterns-questions.md
ScorePOST/api/occupational/work_ability/scorepatterns-score.md

Items

Seven items, each on a 17 scale.

IDPrompt (paraphrased)
item_1Current work ability compared with lifetime best.
item_2Work ability in relation to physical demands.
item_3Work ability in relation to mental demands.
item_4Number of currently diagnosed diseases.
item_5Estimated work impairment due to diseases.
item_6Sick leave in the past year.
item_7Own prognosis of work ability in 2 years.

Answer choices per item are integers 1 through 7. Trinity uses the numeric value directly; the original WAI scoring maps item text to these integers differently per item (for example, item 4 maps "no diseases" to 7 and multiple diseases to lower values). The /questions response gives the accepted values with generic 17 labels; callers implementing the WAI should translate between the published WAI scoring rules and the integer values expected before submitting.

Scoring

FieldValue
Methodsimple_sum over all seven items.
Score range749.

Bands (tiers)

TierRange (inclusive)Clinical meaning
poor727Poor work ability. Consider restoration / intervention.
moderate2836Moderate work ability. Consider improvement.
good3743Good work ability. Support to maintain.
excellent4449Excellent work ability. Support to maintain.

These tier cutoffs align with the commonly-published WAI categorization (poor / moderate / good / excellent) for the full seven-item WAI total.

Required items

All seven items are required for a strict /score call.

Worked example

Every item answered with 3. See quickstart.md for per-language scaffolding and patterns-score.md for the shared /score contract.

Send:

POST /api/occupational/work_ability/score HTTP/1.1
Host: engine.tripod-health.com
apikey: $ENGINE_API_KEY
Content-Type: application/json
X-Request-ID: docs-work_ability-score-basic

{
"responses": {
"item_1": 3, "item_2": 3, "item_3": 3, "item_4": 3,
"item_5": 3, "item_6": 3, "item_7": 3
}
}

Receive (200 OK):

{
"instrument": "work_ability",
"category": "occupational",
"finding": {
"algorithm_id": "work_ability",
"algorithm_version": "1.0.0",
"score": 21,
"band": "poor",
"raw": {
"rubric_version": "1.0.0",
"responded_items": 7
},
"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-work_ability-score-basic",
"timestamp": "2026-04-21T23:15:02.589456+00:00"
}

Computation: 7 × 3 = 21poor tier (7–27). Every item at 5 yields 35 (moderate, 28–36); every item at 7 yields 49 (excellent); every item at 1 yields 7 (poor).

Calling in your language

curl

curl -sS -X POST "https://engine.tripod-health.com/api/occupational/work_ability/score" \
-H "apikey: $ENGINE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"responses":{"item_1":3,"item_2":3,"item_3":3,"item_4":3,"item_5":3,"item_6":3,"item_7":3}}'

Python (requests)

# Uses the call() helper from quickstart.md.
responses = {f"item_{i}": 3 for i in range(1, 8)}
result = call("POST", "/api/occupational/work_ability/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: 7 }, (_, i) => [`item_${i + 1}`, 3]),
);
const result = await call("POST",
"/api/occupational/work_ability/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: 7 }, (_, i) => [`item_${i + 1}`, 3]),
);
const result = await call<ScoreResponse>(
"POST",
"/api/occupational/work_ability/score",
{ responses },
);

Go

// Uses the call() helper from quickstart.md.
responses := make(map[string]int, 7)
for i := 1; i <= 7; i++ {
responses[fmt.Sprintf("item_%d", i)] = 3
}
result, err := call("POST",
"/api/occupational/work_ability/score",
map[string]any{"responses": responses}, 3)
if err != nil {
panic(err)
}
finding := result["finding"].(map[string]any)
fmt.Printf("WAI: %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 <= 7; i++) {
if (i > 1) body.append(",");
body.append("\"item_").append(i).append("\":3");
}
body.append("}}");
String result = call("POST",
"/api/occupational/work_ability/score",
body.toString(), 3);
System.out.println(result);

C# (.NET HttpClient)

// Uses the Call() helper from quickstart.md.
var responses = Enumerable.Range(1, 7)
.ToDictionary(i => $"item_{i}", _ => 3);
var result = await Call(HttpMethod.Post,
"/api/occupational/work_ability/score",
new { responses });
var finding = result.GetProperty("finding");
Console.WriteLine($"WAI: {finding.GetProperty("score").GetDouble()} ({finding.GetProperty("band").GetString()})");

PowerShell

# Uses the Invoke-Engine helper from quickstart.md.
$responses = @{}
1..7 | ForEach-Object { $responses["item_$_"] = 3 }
$result = Invoke-Engine -Method Post -Path "/api/occupational/work_ability/score" -Body @{ responses = $responses }
"WAI: $($result.finding.score) ($($result.finding.band))"

Clinical interpretation

  • What it measures. Self-assessed work ability now and short-term prognosis, including health-related impairment to work.
  • Reading the tiers. "Poor" is an intervention flag — the subject perceives their work capacity is significantly below their job demands. "Excellent" is a protective signal — the subject perceives strong alignment between capacity and demands.
  • Four tiers, not a continuous gradient. The tier matters more than small within-tier differences; a score of 36 and 37 fall on either side of a tier boundary but clinically mean similar things.

Intended use

  • Occupational-health surveillance — periodic WAI administration tracks work ability over time.
  • Matching job demands to capacity. A poor WAI alongside specific low-scoring items (item 2 for physical, item 3 for mental) points to where demand-modification may help.
  • Feeding the CDRI composite as the occupational-health signal.

Mistaken use

  • Do not conflate WAI tier with return-to-work verdict. See the note above.
  • Do not use the WAI in contexts where the subject has no job to reference. Every item anchors on current work. In pre- employment or long-term-unemployed contexts, responses become interpretively hollow.
  • Do not compare WAI tiers across culturally or occupationally different populations without considering context. "Poor" in a physically-demanding industry often reflects different realities than "poor" in a sedentary role.

Debugging

  1. Capture request_id. Present in every response body.
  2. Sum seems off by one or two. Check whether your client is sending 0-indexed values — the WAI uses 1-based values.
  3. 400 ValidationError with missing_items. Send all seven items.
  4. Tier reads moderate for a subject with clear intervention need. The moderate band spans 28–36; a subject scoring 29 is close to poor. Inspect individual item responses to understand which sub-areas (physical, mental, disease-related) are driving the total.

Change history

DateChange
2026-04-20Initial publication.