Loading documentation

Access required

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

Sign out
Skip to main content

Numeric Pain Rating Scale

Status: stable Category: pain Added: 2026-04-20 Last 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

FieldValue
Categorypain
Resourcepain_scale
Instrument IDpain_scale
Rubric version1.0.0
Path prefix/api/pain/pain_scale

Operations

OperationMethodPathContract
QuestionsGET/api/pain/pain_scale/questionspatterns-questions.md
ScorePOST/api/pain/pain_scale/scorepatterns-score.md

Items

One item on a 0–10 integer scale.

IDPrompt (paraphrased)Range
item_1Pain intensity right now (0 = no pain, 10 = worst imaginable).010

Authoritative text comes from GET /api/pain/pain_scale/questions.

Scoring

FieldValue
Methodsimple_sum over [item_1] (pass-through of the single value).
Score range010.

Bands

BandRange (inclusive)Clinical meaning
none0No pain.
mild13Mild pain.
moderate46Moderate pain.
severe710Severe 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 = 6score = 6 → band moderate (46).

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 severe NPRS says nothing about fear-avoidance, depression, or recovery expectation.
  • Do not compare NPRS scores across subjects. Pain is subjective; a 7 from one person and a 4 from 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–100 scale. The two correlate but are not interchangeable at fine resolution.

Debugging

  1. Capture request_id. Present in every response body.
  2. 400 ValidationError with missing_items: ["item_1"]. The body did not include item_1 under responses.
  3. Score outside the expected 0–10 range. Not possible under the current rubric; values outside range would be client-side data errors (for example stringified numbers or a value sent as null). Inspect finding.raw.responded_items — it should be 1.

Change history

DateChange
2026-04-20Initial publication.