Enforcement API
Check a proposed tool call against policy with POST /v1/enforce, and poll a step-up hold with GET /v1/enforce/hold/{hold_token}.
The SDKs call these endpoints for you before every tool execution. Call them
directly only when you are building a custom integration. Both use your unified
tenant API base URL and a runtime key with execute permission; see
Authentication.
Check a tool call
POST/v1/enforce
Evaluates a proposed tool call against your configured server policy, the authenticated identity and the request context, and returns a decision before the tool runs.
approved_scope is a list you supply, not an authorization grant, and the
requested enforcement_mode informs evaluation without guaranteeing an outcome.
Always act on the returned decision; never run the raw callback after a refusal
or an unresolved hold.
Body parameters
agent_idstringrequired
tenant_idstringrequired
tool_namestringrequired
session_idstringrequired
user_idstringrequired
approved_scopestring[]required
session_tool_callsstring[]required
enforcement_modestringrequired
observe, progressive, step_up or block.tool_argsobject
environmentstring
prod.session_intentstring
purposestring
data_classificationstring
endpoint_idstring
fleet_idstring
enforcement_trace_idstring
identity_bindingobject
auth_contextobject
delegation_contextobject
model_namestring
model_providerstring
token_countnumber
estimated_cost_usdnumber
metadataobject
Returns
An EnforcementDecision. Act on decision:
ALLOW: run the tool. Ifauthorization_decisionisMODIFY, run it withmodified_tool_argsinstead of the original arguments (for example, after outbound redaction).STEP_UP: do not run the tool yet. Poll thehold_tokenuntil the hold resolves. A policy deferral (authorization_decision: "DEFER") is returned this way.BLOCK: do not run the tool. Surfacereasonand keepviolation_idfor audit.
decision"ALLOW" | "STEP_UP" | "BLOCK"required
authorization_decision"ALLOW" | "DENY" | "MODIFY" | "STEP_UP" | "DEFER"
reasonstring
decision_reason_codestring
modified_tool_argsobject
MODIFY.modification_reasonstring
MODIFY.hold_tokenstring
STEP_UP.step_up_timeout_secondsinteger
STEP_UP.violation_idstring
BLOCK.risk_scorenumber
latency_msnumber
Evidence and explainability fields may also be present, including
enforcement_trace_id, receipt, decision_evidence, score_components,
top_contributors, matched_rule_ids, matched_control_ids,
policy_references, model_signals and policy-pack version metadata.
Poll a step-up hold
GET/v1/enforce/hold/{hold_token}
Returns the state of a pending step-up hold. Poll until resolved is true
or your own timeout passes, then act on resolution. Treat anything other than
ALLOW as a refusal. The SDKs run this loop for you.
Path parameters
hold_tokenstringrequired
hold_token from a STEP_UP decision.Returns
tokenstring
tenant_idstring
agent_idstring
tool_namestring
session_idstring
expires_atstring (ISO 8601)
resolvedboolean
false while pending, true once resolved.resolution"ALLOW" | "BLOCK" | null
resolved_bystring | null
timeout.resolved_atstring | null
reasonstring | null
step_up_timeout_secondsinteger | null
initial_receiptobject
STEP_UP decision.terminal_receiptobject
The response contains only these fields. An unknown hold token returns 404; a
hold that belongs to a different caller returns 403.