Runtime API
/v1/evaluate/toolEvaluate a tool / function invocation
Evaluate a tool / function call the LLM wants to make. Supply the tool name, arguments, and optional context. The runtime checks tool-call permissions (allow/deny lists, argument schemas, scope restrictions) declared in the resolved policy.
Authentication
Create via POST /v1/orgs/{org_id}/tokens/runtime. Scoped to one project + environment.
SDK install
pip install znyx-sdknpm install @znyx/sdkRequest bodyrequired
| Field | Type | Required | Description |
|---|---|---|---|
| request_id | string | required | Unique identifier for this request |
| tenant_id | string | required | Tenant identifier |
| app_id | string | required | Application identifier |
| agent_id | string | optional | Agent identifier |
| env | string | optional | Environment (prod, staging, dev) |
| tool_name | string | required | Name of the tool being invoked |
| tool_args | object | required | Tool arguments (arbitrary JSON) |
| metadata | object | null | optional | Optional metadata |
| trace_id | string | null | optional | Distributed trace ID for correlation |
| session_id | string | null | optional | Session/conversation ID for grouping |
| span_id | string | null | optional | Span ID within a trace |
Responses
| Status | Description |
|---|---|
| 200 | Successful Response |
| 422 | Validation Error |
Response schema
Risk score from 0-100
Sanitized text if REDACT/TRANSFORM
Sanitized tool args (for tool evaluation)
Safe message to show end-user when blocked
Developer-facing explanation
Total evaluation latency in milliseconds
Trace ID for distributed tracing correlation
Session/conversation ID echoed from request
Span ID within a trace echoed from request
Per-detector timing breakdown
Response quality scores (output context only)
Field-level errors from structured output validation
Remediation action applied after detector decision
Human review queue ID if ask_human remediation was triggered
Errors & what triggers them
| Code | Trigger | Fix |
|---|---|---|
| 401 | Missing or invalid X-API-Key / Authorization header. | Check the token is still active — rotated tokens return 401 after the grace period ends. |
| 403 | Token does not have the `evaluate` scope. | Use a runtime token (POST /v1/orgs/{org_id}/tokens/runtime). |
| 422 | Request body failed Pydantic validation (missing tenant_id, bad context, etc.). | — |
| 429 | Monthly evaluation quota hit for your plan. | Upgrade via POST /v1/billing/checkout, or wait for the next monthly reset. |
| 500 | Detector crashed or resolver timed out. Typically transient. | Retry with backoff. If it persists, check Traces for the request_id. |
Notes & examples
When to use this
Call this immediately before dispatching a tool call the LLM proposed. Input:
tool_name— e.g.search_customers,send_email,run_sql.tool_arguments— the JSON arguments the LLM emitted.tenant_id/app_id/agent_id/env— policy scope.
The endpoint returns the standard evaluation response. If it returns BLOCK, do not dispatch the tool — return the user_message to the user (or surface developer_message to the developer).
Policy knobs
In your policy under tools.*, declare which tools are allowed for each agent:
tools:
allowed:
- search_customers
- summarize_document
denied:
- run_sql
- exec_shell
schemas:
search_customers:
required: [query]
max_length: 500Common pitfalls
- Argument validation runs against the schemas block, not your tool's OpenAPI spec. Keep both in sync or you'll drift.
- Unknown tools default to
BLOCKunderpolicy.tools.mode = "deny-unknown". This is the safer default for production.
Request
curl -X POST 'https://api.znyx.ai/v1/evaluate/tool' \
-H 'Authorization: Bearer $ZNYX_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"request_id": "string",
"tenant_id": "string",
"app_id": "string",
"agent_id": "default",
"env": "prod",
"tool_name": "string",
"tool_args": {},
"metadata": null,
"trace_id": null,
"session_id": null,
"span_id": null
}'Response
Successful Response
{
"request_id": "string",
"decision": "ALLOW",
"risk_score": 0,
"policy_version": "string",
"rule_hits": [
{
"rule_id": "string",
"severity": "low",
"message": "string"
}
],
"sanitized_text": null,
"sanitized_tool_args": null,
"user_message": null,
"developer_message": null,
"latency_ms": null,
"trace_id": null,
"session_id": null,
"span_id": null,
"detector_results": [
{
"detector_name": "string",
"decision": null,
"risk_score": 0,
"latency_ms": 0,
"rule_hits": [
{
"rule_id": "string",
"severity": "low",
"message": "string"
}
],
"transformed": false
}
],
"quality": null,
"field_errors": [
{
"path": "string",
"message": "string",
"expected": null,
"actual": null
}
],
"remediation": null,
"pending_review_id": null
}Schema: object