UpdateAiGatewayAgentRequest
Only the provided fields are changed. Every writable column on an agent appears here — this schema is what the typed SDKs are generated and reviewed against, so a field missing from it becomes a field missing from them (AIGW-161).
Properties
| Name | Type | Description |
|---|---|---|
| name | string | |
| slug | string | RENAMES the agent, which MOVES its data-plane URL: `agent_url` is computed from the slug rather than stored, so every caller pointed at the old URL gets a 404 from the moment this returns. The new URL |
| description | stringnull | |
| primary_route_id | stringnull | |
| fallback_route_ids | array | |
| default_model | stringnull | |
| model_allowlist | array | |
| model_denylist | array | |
| model_rewrite | object | Map of requested model → substituted model. Values must be STRINGS (the server validates with a string map) and at most 100 entries. |
| budget_daily_usd | numbernull | |
| budget_monthly_usd | numbernull | |
| budget_per_call_max_tokens | integernull | |
| budget_overage_action | string | What happens once a budget is exhausted. `fallback` needs `fallback_agent_id`; without one it behaves as `block`. |
| fallback_agent_id | stringnull | |
| streaming_enabled | boolean | |
| firewall_policy_id | stringnull | |
| pii_redact_policy_id | stringnull | |
| pii_detokenize_response | boolean | AIGW-100 legacy alias for `pii_response_mode` (`true` -> `detokenize`, `false` -> `redact`). Still accepted; sending both with contradictory values is a 400. |
| pii_request_mode | string | What happens to the PROMPT before it leaves KnoxCall. Default `tokenize`. Set `off` only for an agent whose payload must reach the provider byte-for-byte (structured tool-use JSON, for example) — it m |
| pii_response_mode | string | What happens to the provider's answer. Default `detokenize`. |
| pii_streaming_holdback_chars | integer | How many characters of a STREAMED answer are held back while a detector decides. Larger catches an entity split across more chunks; smaller is lower latency. |
| pii_streaming_mode | string | How a streamed answer is rewritten. `holdback` releases text behind a sliding window; `buffer` withholds the whole answer until it is complete; `monitor` REPORTS detections without rewriting, so the r |
| tags | object | FinOps attribution labels (cost_center/team/project/…) echoed onto this agent's usage rows. |
| cache_mode | string | `semantic` additionally needs `cache_embedding_model`; without one the cache reports itself degraded and serves nothing. |
| cache_ttl_seconds | integer | |
| cache_similarity_threshold | number | Cosine floor for a semantic cache hit, 0–1. Lower means more hits, and more wrong ones. NOT nullable: the column is `NOT NULL` and the validator is non-nullable, so an explicit `null` is a 400. |
| cache_embedding_model | stringnull | |
| tool_allowlist | array | |
| output_schema | objectnull | JSON Schema the answer is validated against. |
| output_validation_action | string | |
| data_residency_region | stringnull | |
| cmek_key_id | stringnull | |
| routing_policy | object | |
| guardrail_webhook_url | stringnull | HTTPS endpoint your own scanner listens on (AIGW-45). Every prompt — and, in `response`/`both` mode, every response — is POSTed to it for a verdict before it moves. What it receives is the REDACTED, p |
| guardrail_webhook_secret_id | stringnull | Secret holding the HMAC-SHA256 key deliveries are signed with. The signature covers ` |
| guardrail_webhook_mode | string | Which directions are inspected. `response` and `both` evaluate the complete buffered response before it is sent, so an agent in those modes REFUSES a streaming request (400 `guardrail_streaming_unsupp |
| guardrail_webhook_timeout_ms | integer | How long to wait for a verdict. Clamped, because a request waiting on your scanner is holding one of the gateway's API workers. |
| guardrail_webhook_failure_action | string | What happens when the hook does not answer. Applies identically to EVERY non-answer — timeout, refused connection, refused destination, non-2xx, unparseable body, an `action` verb we do not recognise. |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/knoxcall/main/json-schema/knoxcall-update-ai-gateway-agent-request-schema.json",
"title": "UpdateAiGatewayAgentRequest",
"description": "Only the provided fields are changed. Every writable column on an agent appears here — this schema is what the typed SDKs are generated and reviewed against, so a field missing from it becomes a field missing from them (AIGW-161).",
"x-generated": "2026-10-18",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/knoxcall-openapi.json#/components/schemas/UpdateAiGatewayAgentRequest",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string",
"description": "RENAMES the agent, which MOVES its data-plane URL: `agent_url` is computed from the slug rather than stored, so every caller pointed at the old URL gets a 404 from the moment this returns. The new URL is on this response — read it rather than reconstructing it."
},
"description": {
"type": [
"string",
"null"
]
},
"primary_route_id": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"fallback_route_ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
}
},
"default_model": {
"type": [
"string",
"null"
]
},
"model_allowlist": {
"type": "array",
"items": {
"type": "string"
}
},
"model_denylist": {
"type": "array",
"items": {
"type": "string"
}
},
"model_rewrite": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"maxProperties": 100,
"description": "Map of requested model → substituted model. Values must be STRINGS (the server validates with a string map) and at most 100 entries."
},
"budget_daily_usd": {
"type": [
"number",
"null"
]
},
"budget_monthly_usd": {
"type": [
"number",
"null"
]
},
"budget_per_call_max_tokens": {
"type": [
"integer",
"null"
]
},
"budget_overage_action": {
"type": "string",
"enum": [
"block",
"warn",
"fallback"
],
"description": "What happens once a budget is exhausted. `fallback` needs `fallback_agent_id`; without one it behaves as `block`."
},
"fallback_agent_id": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"streaming_enabled": {
"type": "boolean"
},
"firewall_policy_id": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"pii_redact_policy_id": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"pii_detokenize_response": {
"type": "boolean",
"deprecated": true,
"description": "AIGW-100 legacy alias for `pii_response_mode` (`true` -> `detokenize`, `false` -> `redact`). Still accepted; sending both with contradictory values is a 400."
},
"pii_request_mode": {
"type": "string",
"enum": [
"off",
"tokenize"
],
"description": "What happens to the PROMPT before it leaves KnoxCall. Default `tokenize`. Set `off` only for an agent whose payload must reach the provider byte-for-byte (structured tool-use JSON, for example) — it means prompts are forwarded unscanned."
},
"pii_response_mode": {
"type": "string",
"enum": [
"redact",
"detokenize"
],
"description": "What happens to the provider's answer. Default `detokenize`."
},
"pii_streaming_holdback_chars": {
"type": "integer",
"description": "How many characters of a STREAMED answer are held back while a detector decides. Larger catches an entity split across more chunks; smaller is lower latency."
},
"pii_streaming_mode": {
"type": "string",
"enum": [
"holdback",
"buffer",
"monitor"
],
"description": "How a streamed answer is rewritten. `holdback` releases text behind a sliding window; `buffer` withholds the whole answer until it is complete; `monitor` REPORTS detections without rewriting, so the raw value reaches the client — an observability mode, not a redaction one."
},
"tags": {
"type": "object",
"additionalProperties": true,
"description": "FinOps attribution labels (cost_center/team/project/…) echoed onto this agent's usage rows."
},
"cache_mode": {
"type": "string",
"enum": [
"off",
"exact",
"semantic"
],
"description": "`semantic` additionally needs `cache_embedding_model`; without one the cache reports itself degraded and serves nothing."
},
"cache_ttl_seconds": {
"type": "integer"
},
"cache_similarity_threshold": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Cosine floor for a semantic cache hit, 0–1. Lower means more hits, and more wrong ones. NOT nullable: the column is `NOT NULL` and the validator is non-nullable, so an explicit `null` is a 400."
},
"cache_embedding_model": {
"type": [
"string",
"null"
]
},
"tool_allowlist": {
"type": "array",
"items": {
"type": "string"
}
},
"output_schema": {
"type": [
"object",
"null"
],
"additionalProperties": true,
"description": "JSON Schema the answer is validated against."
},
"output_validation_action": {
"type": "string",
"enum": [
"block",
"retry",
"warn"
]
},
"data_residency_region": {
"type": [
"string",
"null"
]
},
"cmek_key_id": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"routing_policy": {
"$ref": "#/$defs/AiGatewayRoutingPolicy"
},
"guardrail_webhook_url": {
"type": [
"string",
"null"
],
"format": "uri",
"description": "HTTPS endpoint your own scanner listens on (AIGW-45). Every prompt — and, in `response`/`both` mode, every response — is POSTed to it for a verdict before it moves.\n\nWhat it receives is the REDACTED, post-tokenization body: the same bytes the provider would get, never a resolved provider credential and never your KnoxCall token. Shipping raw PHI to a third party to ask whether it contains PHI would be the leak the gateway exists to prevent.\n\nThe destination is resolved and refused at write time AND on every call — a private, loopback, link-local or cloud-metadata address is a 400, because DNS is not a promise.\n"
},
"guardrail_webhook_secret_id": {
"type": [
"string",
"null"
],
"format": "uuid",
"description": "Secret holding the HMAC-SHA256 key deliveries are signed with. The signature covers `<timestamp>.<body>` and travels in `x-knox-guardrail-signature` with the timestamp in `x-knox-guardrail-timestamp`, so a captured delivery is not replayable. Omit to send unsigned — the receiver then cannot prove the call came from KnoxCall.\n"
},
"guardrail_webhook_mode": {
"type": "string",
"enum": [
"off",
"request",
"response",
"both"
],
"description": "Which directions are inspected. `response` and `both` evaluate the complete buffered response before it is sent, so an agent in those modes REFUSES a streaming request (400 `guardrail_streaming_unsupported`) rather than serving one past a control that could not run on it.\n"
},
"guardrail_webhook_timeout_ms": {
"type": "integer",
"minimum": 100,
"maximum": 10000,
"description": "How long to wait for a verdict. Clamped, because a request waiting on your scanner is holding one of the gateway's API workers.\n"
},
"guardrail_webhook_failure_action": {
"type": "string",
"enum": [
"fail_open",
"fail_closed"
],
"description": "What happens when the hook does not answer. Applies identically to EVERY non-answer — timeout, refused connection, refused destination, non-2xx, unparseable body, an `action` verb we do not recognise. Defaults to `fail_open`, which is the posture an agent already has with no hook at all.\n\nA hook responds `200` with `{\"action\":\"allow\"|\"block\"|\"flag\",\"reason\":\"…\"}`. `block` refuses the request with 400 `guardrail_block` and your `reason` in the message; `flag` serves it and records the outcome.\n"
}
},
"$defs": {
"AiGatewayRoutingPolicy": {
"type": "object",
"description": "How this agent retries and spreads load (AIGW-42). An empty object — the default for every agent — means one attempt per route and fail-over to `fallback_route_ids` on 5xx only, which is the behaviour the gateway has always had.\n\nEvery field is clamped server-side. A request parked waiting to retry occupies an API worker, so `max_attempts` caps at 5, any single delay at 30s, a honoured `Retry-After` at 60s, and the total sleep for one request at 60s regardless of how the fields combine.\n",
"additionalProperties": false,
"properties": {
"retry_on": {
"type": "array",
"description": "Which outcomes are retried on the SAME route before failing over. `429` also promotes a rate-limit response to a fail-over trigger; without it a 429 is returned to you immediately, unchanged.\n",
"items": {
"type": "string",
"enum": [
"429",
"5xx",
"timeout"
]
}
},
"max_attempts": {
"type": "integer",
"minimum": 1,
"maximum": 5,
"description": "Attempts per candidate route, including the first. Forced to 1 when `retry_on` is empty, so a stored policy never claims a retry that cannot happen.\n"
},
"backoff_ms": {
"type": "integer",
"minimum": 0,
"maximum": 30000,
"description": "Delay before the second attempt."
},
"backoff_multiplier": {
"type": "number",
"minimum": 1,
"maximum": 10
},
"max_backoff_ms": {
"type": "integer",
"minimum": 0,
"maximum": 30000
},
"respect_retry_after": {
"type": "boolean",
"description": "Default true. An upstream `Retry-After` is honoured when it asks for LONGER than the computed backoff — it can extend a wait, never shorten one.\n"
},
"max_retry_after_ms": {
"type": "integer",
"minimum": 0,
"maximum": 60000,
"description": "Ceiling on a honoured `Retry-After`."
},
"jitter": {
"type": "boolean",
"description": "Default true. Spreads each delay across 50–100% of its computed value so a fleet does not retry in lockstep.\n"
},
"route_weights": {
"type": "object",
"description": "`{route_id: weight}`. When present, the route that serves a request is chosen in proportion to its weight across the primary and every fallback, and the remainder stay in weighted order for fail-over. A route not named here keeps weight 1; a route weighted 0 is drained and receives no traffic at all, including fail-over traffic. The token's own capability scope is enforced on every candidate, so a weight can never reach a route the token was not granted.\n",
"additionalProperties": {
"type": "integer",
"minimum": 0,
"maximum": 1000
}
}
}
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
curl "https://apis.io/api/v1/json-schemas/knoxcall-update-ai-gateway-agent-request"
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.