curl --request GET \
--url 'https://api.nsr.stateset.com/v1/decisions/{id}' \
--header "X-API-Key: $STATESET_NSR_API_KEY"
{
"batch": true,
"billable": true,
"cited_rules": [
"string"
],
"confidence": 7.5,
"cost_micros": 1,
"decision": "string",
"decision_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"dropped_citations": [
"string"
],
"external_ref": "string",
"latency_ms": 250,
"missing_predicates": [
"string"
],
"outcome": "string",
"query": "string",
"request": {
"action": "string",
"authorization_goal": {
"args": [],
"name": "Two-Person Tent",
"negated": true
},
"confidence_threshold": 7.5,
"facts": [
{
"confidence": null,
"predicate": null,
"source": null
}
],
"hydrate_org_context": true,
"max_depth": 1,
"mode": "string",
"query": "string",
"rules": [
{
"category": null,
"constraints": null,
"description": null,
"effect": null,
"enabled": null,
"id": null,
"if": null,
"name": null,
"priority": null,
"then": null
}
]
},
"request_policy_hash": "string",
"timestamp": "2026-08-31T14:22:05Z"
}
Look up one recent decision by the decision_id from the API response or
the outcome.produced webhook. The analytics log is bounded and ephemeral: a 404 means ‘rotated out of the recent window or never existed’ — billing truth lives…
GET
/
v1
/
decisions
/
{id}
curl --request GET \
--url 'https://api.nsr.stateset.com/v1/decisions/{id}' \
--header "X-API-Key: $STATESET_NSR_API_KEY"
{
"batch": true,
"billable": true,
"cited_rules": [
"string"
],
"confidence": 7.5,
"cost_micros": 1,
"decision": "string",
"decision_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"dropped_citations": [
"string"
],
"external_ref": "string",
"latency_ms": 250,
"missing_predicates": [
"string"
],
"outcome": "string",
"query": "string",
"request": {
"action": "string",
"authorization_goal": {
"args": [],
"name": "Two-Person Tent",
"negated": true
},
"confidence_threshold": 7.5,
"facts": [
{
"confidence": null,
"predicate": null,
"source": null
}
],
"hydrate_org_context": true,
"max_depth": 1,
"mode": "string",
"query": "string",
"rules": [
{
"category": null,
"constraints": null,
"description": null,
"effect": null,
"enabled": null,
"id": null,
"if": null,
"name": null,
"priority": null,
"then": null
}
]
},
"request_policy_hash": "string",
"timestamp": "2026-08-31T14:22:05Z"
}
the
outcome.produced webhook. The analytics log is bounded and
ephemeral: a 404 means ‘rotated out of the recent window or never
existed’ — billing truth lives in the metering pipeline.
Required scope: read
Path parameters
string
required
Response
DecisionRecord
boolean
required
True when the decision came through
/v1/decisions/batch.boolean
required
string[]
required
Rule ids cited in the proof chain.
number (double)
The confidence the decision reported, in [0, 1]. Stored so calibration can bucket decisions by what they claimed and compare against what actually happened (see
outcome).integer (int64)
required
string
required
approved | denied | refused.string
The
decision_id returned in the API response and carried by the outcome.produced webhook — the correlation key for audits.string[]
Org rules that fired during hydration but were dropped from the proof as unrelated — the audit record of standing-rule noise per decision.
string
Optional client-supplied correlation key (their order id, case id, claim number…). This is what closes the outcome loop from REAL events: a chargeback or override webhook knows the order id, not our
decision_id, so POST /v1/decisions/outcome-by-ref records the outcome by this key. None when the caller didn’t supply one.integer (int64)
required
string[]
Deduped predicate names from a refused decision’s
refusal.missing_facts — the KB coverage gaps that blocked it. Empty for approvals/denials and safety-gated refusals (which carry none).string
The real-world outcome, recorded AFTER the fact via
POST /v1/decisions/{id}/outcome: honored (the decision held up), reversed (e.g. an approved refund was charged back), overridden (a human changed it), or escalated. None until reported. This is the ground truth that turns confidence from a heuristic into a calibrated, measurable number.string
required
The decision query, truncated to 200 chars for memory hygiene.
object
Show request
Show request
string
object
Show authorization_goal
Show authorization_goal
Arg[]
required
string
required
boolean
Negation-as-failure for a rule CONDITION:
not fraud_flagged(?o, ?r). Meaningful only on rule conditions (ignored on facts and conclusions). Defaulted and skipped-when-false so existing payloads are unchanged. Without this the negation was silently dropped and the condition read as POSITIVE — a fraud-flagged subject slipped a not fraud_flagged guard.number (double)
RecursiveChatFactInput[]
boolean
integer
string
string
required
string
sha256:<hex> over the request-scoped policy the decision was evaluated against (see DecisionProof::request_policy_hash) — lets an audit confirm a replay uses the same policy inputs.string (date-time)
required
Status codes
| Code | Meaning |
|---|---|
200 | The decision record |
401 | Unauthorized — missing or invalid credentials |
403 | Forbidden — the key/token lacks the required scope |
404 | Not in the retained window |
429 | Rate limited — see Retry-After / X-RateLimit-Reset |
curl --request GET \
--url 'https://api.nsr.stateset.com/v1/decisions/{id}' \
--header "X-API-Key: $STATESET_NSR_API_KEY"
{
"batch": true,
"billable": true,
"cited_rules": [
"string"
],
"confidence": 7.5,
"cost_micros": 1,
"decision": "string",
"decision_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"dropped_citations": [
"string"
],
"external_ref": "string",
"latency_ms": 250,
"missing_predicates": [
"string"
],
"outcome": "string",
"query": "string",
"request": {
"action": "string",
"authorization_goal": {
"args": [],
"name": "Two-Person Tent",
"negated": true
},
"confidence_threshold": 7.5,
"facts": [
{
"confidence": null,
"predicate": null,
"source": null
}
],
"hydrate_org_context": true,
"max_depth": 1,
"mode": "string",
"query": "string",
"rules": [
{
"category": null,
"constraints": null,
"description": null,
"effect": null,
"enabled": null,
"id": null,
"if": null,
"name": null,
"priority": null,
"then": null
}
]
},
"request_policy_hash": "string",
"timestamp": "2026-08-31T14:22:05Z"
}
Last modified on August 31, 2026