Loading documentation

Access required

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

Sign out
Skip to main content

Yellow-flag Screen

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

Summary

The Optimal Screening for Prediction of Referral and Outcome — Yellow Flag screen (OSPRO-YF) is a brief presence/absence screen for psychosocial risk factors in musculoskeletal pain. Trinity implements a 10-item binary version: each item is yes/no, and the total count maps to three bands (low, moderate, high).

Unlike most other instruments in the catalog, OSPRO-YF's score is a flag count, not a continuous-scale severity.

⚠ Binary response format

Every item here accepts only 0 (no) or 1 (yes). Trinity will score other values per the rubric's math (summing whatever integer is provided), but the band semantics assume binary responses. Do not send Likert-style responses to this endpoint — use kinesiophobia, fear_avoidance_beliefs, depression_screen, or anxiety_screen for Likert-scaled constructs.

Resource identity

FieldValue
Categoryfear_avoidance
Resourceyellow_flag_screen
Instrument IDyellow_flag_screen
Rubric version1.0.0
Path prefix/api/fear_avoidance/yellow_flag_screen

Operations

OperationMethodPathContract
QuestionsGET/api/fear_avoidance/yellow_flag_screen/questionspatterns-questions.md
ScorePOST/api/fear_avoidance/yellow_flag_screen/scorepatterns-score.md

Items

Ten binary presence/absence items.

IDPrompt (paraphrased)
item_1Marked pain-related worry present.
item_2Depressed mood present.
item_3Anxious / tense mood present.
item_4Low self-efficacy for recovery.
item_5High pain catastrophizing.
item_6High fear of movement / reinjury.
item_7Low recovery expectation.
item_8Somatic complaints beyond index pain region.
item_9Sleep disturbance reported.
item_10Active substance-use concern.

Answer choices per item:

ValueLabel
0No
1Yes

Scoring

FieldValue
Methodsimple_sum over all ten items.
Score range010 (count of flags present).

Bands

BandRange (inclusive)Clinical meaning
low02Low psychosocial-flag burden.
moderate35Moderate flag burden; consider targeted follow-up.
high610High flag burden; multi-domain follow-up typically warranted.

Bands reflect the count of "yes" flags — more flags means broader psychosocial risk footprint.

Required items

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

Worked example

All ten flags raised. See quickstart.md for per-language scaffolding and patterns-score.md for the shared /score contract.

Send:

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

{
"responses": {
"item_1": 1, "item_2": 1, "item_3": 1, "item_4": 1, "item_5": 1,
"item_6": 1, "item_7": 1, "item_8": 1, "item_9": 1, "item_10": 1
}
}

Receive (200 OK):

{
"instrument": "yellow_flag_screen",
"category": "fear_avoidance",
"finding": {
"algorithm_id": "yellow_flag_screen",
"algorithm_version": "1.0.0",
"score": 10,
"band": "high",
"raw": {
"rubric_version": "1.0.0",
"responded_items": 10
},
"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-yellow_flag_screen-score-basic",
"timestamp": "2026-04-21T23:15:00.089456+00:00"
}

Computation: sum of 0/1 flags = 10high band. Zero flags → 0low; three flags (for example item_1, item_3, item_6) → 3moderate (3–5).

Calling in your language

curl

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

Python (requests)

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

Go

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

C# (.NET HttpClient)

// Uses the Call() helper from quickstart.md.
var responses = Enumerable.Range(1, 10)
.ToDictionary(i => $"item_{i}", _ => 1);
var result = await Call(HttpMethod.Post,
"/api/fear_avoidance/yellow_flag_screen/score",
new { responses });
var finding = result.GetProperty("finding");
Console.WriteLine($"OSPRO-YF: {finding.GetProperty("score").GetDouble()} ({finding.GetProperty("band").GetString()})");

PowerShell

# Uses the Invoke-Engine helper from quickstart.md.
$responses = @{}
1..10 | ForEach-Object { $responses["item_$_"] = 1 }
$result = Invoke-Engine -Method Post -Path "/api/fear_avoidance/yellow_flag_screen/score" -Body @{ responses = $responses }
"OSPRO-YF: $($result.finding.score) ($($result.finding.band))"

Clinical interpretation

  • What it measures. Breadth of psychosocial risk across multiple domains — worry, mood, anxiety, self-efficacy, catastrophizing, fear of movement, recovery expectation, somatic complaints, sleep, and substance-use concern.
  • Flag count, not severity. The score measures how many domains show concern, not the severity within any domain. A subject with 3 mild flags and a subject with 3 severe flags have the same OSPRO-YF score; severity should be assessed with the domain-specific instruments.
  • Companion to Örebro. Where orebro returns a weighted total and one risk band, OSPRO-YF returns a breadth count. They answer overlapping but distinct questions.

Intended use

  • Rapid multi-domain screen when the caller wants to know how many psychosocial risk areas are elevated.
  • Triage signal for deciding whether to administer the domain-specific instruments (PHQ-9, GAD-7, TSK-11, FABQ-W, recovery expectation).
  • Feeding the CDRI composite as a complementary breadth measure alongside Örebro's weighted total.

Mistaken use

  • Do not send Likert or scaled values. The rubric's scoring is a simple sum; a 3 on an item produces three times the band contribution of a 1, which breaks the flag-count semantics.
  • Do not interpret flag count as severity within any domain. A moderate OSPRO-YF with a severe PHQ-9 is different from a moderate OSPRO-YF with a minimal PHQ-9. The OSPRO-YF alone does not distinguish the two.
  • Do not skip the domain-specific follow-up on a moderate or high band. The screen points where to look, but the depth of evaluation in each flagged domain belongs to a dedicated instrument.
  • Do not compare OSPRO-YF scores across populations without context. The meaning of "moderate" flag burden differs between acute and chronic pain populations.

Debugging

  1. Capture request_id. Present in every response body.
  2. Score substantially above 10. A Likert-style response (value 2 or higher) was sent on a binary item. Send only 0 or 1.
  3. 400 ValidationError with missing_items. Send all ten items.
  4. Band unknown in a response. Not possible under the current rubric with binary responses (0–10 covers the whole band space). If you see it, a non-binary value was summed into the score.

Change history

DateChange
2026-04-20Initial publication.