Numeric Pain Rating Scale
Status:
stableCategory:painAdded:2026-04-20Last reviewed:2026-04-21
Summary
The Numeric Pain Rating Scale (NPRS) is Trinity's single-item
pain-intensity instrument. One question, one integer answer 0–10,
one band. Use this when you want a quick intensity probe — not the
multi-domain yellow-flag screen that
orebro provides.
Resource identity
| Field | Value |
|---|---|
| Category | pain |
| Resource | pain_scale |
| Instrument ID | pain_scale |
| Rubric version | 1.0.0 |
| Path prefix | /api/pain/pain_scale |
Operations
| Operation | Method | Path | Contract |
|---|---|---|---|
| Questions | GET | /api/pain/pain_scale/questions | patterns-questions.md |
| Score | POST | /api/pain/pain_scale/score | patterns-score.md |
Items
One item on a 0–10 integer scale.
| ID | Prompt (paraphrased) | Range |
|---|---|---|
item_1 | Pain intensity right now (0 = no pain, 10 = worst imaginable). | 0 – 10 |
Authoritative text comes from
GET /api/pain/pain_scale/questions.
Scoring
| Field | Value |
|---|---|
| Method | simple_sum over [item_1] (pass-through of the single value). |
| Score range | 0 – 10. |
Bands
| Band | Range (inclusive) | Clinical meaning |
|---|---|---|
none | 0 | No pain. |
mild | 1 – 3 | Mild pain. |
moderate | 4 – 6 | Moderate pain. |
severe | 7 – 10 | Severe pain. |
Band cutoffs follow the common 1–3 / 4–6 / 7–10 convention for
interpreting NPRS responses.
Required items
item_1 is required. A /score call without it returns 400 ValidationError.
Worked example
Single item answered with 6. See quickstart.md
for per-language scaffolding and patterns-score.md
for the full /score contract.
Send:
POST /api/pain/pain_scale/score HTTP/1.1
Host: engine.tripod-health.com
apikey: $ENGINE_API_KEY
Content-Type: application/json
X-Request-ID: docs-pain_scale-score-basic
{"responses":{"item_1":6}}
Receive (200 OK):
{
"instrument": "pain_scale",
"category": "pain",
"finding": {
"algorithm_id": "pain_scale",
"algorithm_version": "1.0.0",
"score": 6,
"band": "moderate",
"raw": {
"rubric_version": "1.0.0",
"responded_items": 1
},
"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-pain_scale-score-basic",
"timestamp": "2026-04-21T23:14:52.922512+00:00"
}
Computation: item_1 = 6 → score = 6 → band moderate (4–6).
Calling in your language
curl
curl -sS -X POST "https://engine.tripod-health.com/api/pain/pain_scale/score" \
-H "apikey: $ENGINE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"responses":{"item_1":6}}'
Python (requests)
# Uses the call() helper from quickstart.md.
result = call("POST", "/api/pain/pain_scale/score", {"responses": {"item_1": 6}})
print(result["finding"]["score"], result["finding"]["band"])
Node.js (native fetch)
// Uses the call() helper from quickstart.md.
const result = await call("POST", "/api/pain/pain_scale/score",
{ responses: { item_1: 6 } });
console.log(result.finding.score, result.finding.band);
TypeScript
// Uses the typed call<T>() helper from quickstart.md.
const result = await call<ScoreResponse>(
"POST",
"/api/pain/pain_scale/score",
{ responses: { item_1: 6 } },
);
Go
// Uses the call() helper from quickstart.md.
result, err := call("POST", "/api/pain/pain_scale/score",
map[string]any{"responses": map[string]int{"item_1": 6}}, 3)
if err != nil {
panic(err)
}
finding := result["finding"].(map[string]any)
fmt.Printf("pain_scale: %v (%v)\n", finding["score"], finding["band"])
Java
// Uses the call() helper from quickstart.md.
String result = call("POST", "/api/pain/pain_scale/score",
"{\"responses\":{\"item_1\":6}}", 3);
System.out.println(result);
C# (.NET HttpClient)
// Uses the Call() helper from quickstart.md.
var result = await Call(HttpMethod.Post, "/api/pain/pain_scale/score",
new { responses = new { item_1 = 6 } });
var finding = result.GetProperty("finding");
Console.WriteLine($"pain_scale: {finding.GetProperty("score").GetDouble()} ({finding.GetProperty("band").GetString()})");
PowerShell
# Uses the Invoke-Engine helper from quickstart.md.
$result = Invoke-Engine -Method Post -Path "/api/pain/pain_scale/score" -Body @{
responses = @{ item_1 = 6 }
}
"pain_scale: $($result.finding.score) ($($result.finding.band))"
Clinical interpretation
- What it captures. Subjective pain intensity at a single point in time. No information about function, mood, duration, or psychosocial risk.
- Strength. Brevity. One item is easy to administer repeatedly, including inside a visit or between visits, which makes it the right instrument for tracking short-term change.
- Weakness. It conflates pain experience with everything that amplifies or attenuates that experience on a given day.
A single NPRS reading is a poor basis for clinical decisions on its
own. Pair with orebro (yellow-flag
screen), oswestry or
neck_disability (regional
function), and a psychosocial screen when more signal is needed.
Intended use
- Quick intensity probe at the start of a visit or between other assessments.
- Time-series tracking of pain level over days or weeks.
- Feeding the CDRI composite as a lightweight pain-intensity signal when full Örebro is not administered.
Mistaken use
- Do not use it as a standalone psychosocial screen. A
severeNPRS says nothing about fear-avoidance, depression, or recovery expectation. - Do not compare NPRS scores across subjects. Pain is
subjective; a
7from one person and a4from another may describe the same underlying experience. Within-subject change over time is more meaningful. - Do not confuse with a visual analog scale (VAS). NPRS is a
discrete integer scale; VAS is a continuous
0–100scale. The two correlate but are not interchangeable at fine resolution.
Debugging
- Capture
request_id. Present in every response body. 400 ValidationErrorwithmissing_items: ["item_1"]. The body did not includeitem_1underresponses.- Score outside the expected
0–10range. Not possible under the current rubric; values outside range would be client-side data errors (for example stringified numbers or a value sent asnull). Inspectfinding.raw.responded_items— it should be1.
Related
- patterns-questions.md, patterns-score.md — the shared contracts.
- instruments-orebro.md — when you need the multi-domain yellow-flag screen, not just intensity.
- composite-cdri-compute.md — where the NPRS feeds the pain-domain signal.
Change history
| Date | Change |
|---|---|
| 2026-04-20 | Initial publication. |