curl --request POST \
--url 'https://api.nsr.stateset.com/api/v1/answer/batch' \
--header 'X-API-Key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"items": [
{
"context": {},
"facts": {},
"include_decision": true,
"mode": "string",
"question": "string",
"rules": [],
"subject": "string"
}
]
}'
{
"answers": [
{
"auto_send": true,
"decision": {
"action": null,
"confidence": null,
"decision": null,
"decision_id": null,
"dropped_citations": null,
"evaluated_goal": null,
"grounding": null,
"gss_machine": null,
"plain_explanation": null,
"proof": null,
"rationale": null,
"refusal": null,
"trace": null,
"usage": null,
"verifiable_bundle": null,
"warnings": null,
"x_nsr": null
},
"evidence": {
"because": null,
"cited_rules": null,
"decision_id": null,
"grounding": null,
"policy_hash": null,
"replayable": null
},
"gaps": [],
"reply": {
"auto_send": null,
"macro_id": null,
"macro_name": null,
"missing_slots": null,
"rendered": null,
"rule_name": null
},
"requires_human": [],
"subject": "string",
"tool_call": null,
"verdict": "string"
}
],
"auto_send_count": 1,
"errors": [
{
"error": "string",
"index": 1,
"subject": "string"
}
],
"human_count": 1
}
Answer a queue of tickets in one call.
Required scope: write
POST
/
api
/
v1
/
answer
/
batch
curl --request POST \
--url 'https://api.nsr.stateset.com/api/v1/answer/batch' \
--header 'X-API-Key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"items": [
{
"context": {},
"facts": {},
"include_decision": true,
"mode": "string",
"question": "string",
"rules": [],
"subject": "string"
}
]
}'
{
"answers": [
{
"auto_send": true,
"decision": {
"action": null,
"confidence": null,
"decision": null,
"decision_id": null,
"dropped_citations": null,
"evaluated_goal": null,
"grounding": null,
"gss_machine": null,
"plain_explanation": null,
"proof": null,
"rationale": null,
"refusal": null,
"trace": null,
"usage": null,
"verifiable_bundle": null,
"warnings": null,
"x_nsr": null
},
"evidence": {
"because": null,
"cited_rules": null,
"decision_id": null,
"grounding": null,
"policy_hash": null,
"replayable": null
},
"gaps": [],
"reply": {
"auto_send": null,
"macro_id": null,
"macro_name": null,
"missing_slots": null,
"rendered": null,
"rule_name": null
},
"requires_human": [],
"subject": "string",
"tool_call": null,
"verdict": "string"
}
],
"auto_send_count": 1,
"errors": [
{
"error": "string",
"index": 1,
"subject": "string"
}
],
"human_count": 1
}
Required scope:
write
Request body
BatchAnswerRequest
AnswerRequest[]
required
Response
BatchAnswerResponse
AnswerResponse[]
required
Show AnswerResponse
Show AnswerResponse
boolean
required
True when this can ship untouched. False means read
requires_human.object
Show decision
Show decision
object
number (double)
required
string
required
approved | denied | refused.string
required
string[]
Org rules the engine fired during hydration that were dropped from
proof.cited_rules as unrelated to this decision. Persistently non-empty values mean a standing rule with permanently satisfied premises fires on every hydrated decision — scope or prune it.string
Exact predicate evaluated as the permit target. Absent for legacy requests that relied on action/query inference.
DecisionGrounding
required
GssMachineGroundingSnapshot
required
string
required
Deterministic, proof-derived, business-readable ‘why’ — distinct from
rationale (engine narration): ‘Approved to issue a refund for order 9412: the return for order 9412 was received and order 9412 passed inspection.’ Always present.DecisionProof
required
string
required
object
RecursiveChatTraceStep[]
Full proof trace, when
include_trace was set.DecisionUsage
required
object
A self-contained, INDEPENDENTLY-VERIFIABLE proof bundle for an approved decision: the exact facts and rules plus a
RuleEngine::backward_chain derivation of the authorization goal, in the knowledge::ProofBundle wire format. POST it verbatim to /v1/proofs/verify (or check it offline with the dependency-light proof_check) to confirm the verdict without trusting this server. Present only when the caller declared an authorization_goal AND the rule engine reproduces the proof; absent otherwise (the verdict still stands on its own derivation).string[]
Non-fatal advisories about how the verdict was derived (e.g. the outcome rested on predicate-name inference rather than declared rule effects). Omitted when empty.
object
AnswerEvidence
required
AnswerGap[]
object
Show reply
Show reply
boolean
required
True only when the macro is approved, fully filled, its tool call fully bound, and the macro itself armed for auto-send. Anything less is a draft for a human.
string
required
string
required
string[]
required
Merge fields with no value supplied. Non-empty blocks sending.
string
required
string
required
string[]
Why a human is needed. Empty means none is.
string
required
object
Emitted, NOT executed — the engine never holds your credentials. Run it against your own systems.
string
required
approved | denied | refused.integer
required
BatchAnswerError[]
required
integer
required
Status codes
| Code | Meaning |
|---|---|
200 | One answer per ticket |
401 | Unauthorized — missing or invalid credentials |
403 | Forbidden — the key/token lacks the required scope |
429 | Rate limited — see Retry-After / X-RateLimit-Reset |
curl --request POST \
--url 'https://api.nsr.stateset.com/api/v1/answer/batch' \
--header 'X-API-Key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"items": [
{
"context": {},
"facts": {},
"include_decision": true,
"mode": "string",
"question": "string",
"rules": [],
"subject": "string"
}
]
}'
{
"answers": [
{
"auto_send": true,
"decision": {
"action": null,
"confidence": null,
"decision": null,
"decision_id": null,
"dropped_citations": null,
"evaluated_goal": null,
"grounding": null,
"gss_machine": null,
"plain_explanation": null,
"proof": null,
"rationale": null,
"refusal": null,
"trace": null,
"usage": null,
"verifiable_bundle": null,
"warnings": null,
"x_nsr": null
},
"evidence": {
"because": null,
"cited_rules": null,
"decision_id": null,
"grounding": null,
"policy_hash": null,
"replayable": null
},
"gaps": [],
"reply": {
"auto_send": null,
"macro_id": null,
"macro_name": null,
"missing_slots": null,
"rendered": null,
"rule_name": null
},
"requires_human": [],
"subject": "string",
"tool_call": null,
"verdict": "string"
}
],
"auto_send_count": 1,
"errors": [
{
"error": "string",
"index": 1,
"subject": "string"
}
],
"human_count": 1
}