KnoxCall · Schema
AiGatewayAgent
An agent under a gateway — the addressable unit an AI SDK points at.
CompanyAPI ManagementSecurityDevOpsAI Agents
Properties
| Name | Type | Description |
|---|---|---|
| id | string | |
| tenant_id | string | |
| gateway_id | string | |
| name | string | |
| slug | string | |
| description | stringnull | |
| primary_route_id | stringnull | |
| fallback_route_ids | array | |
| model_allowlist | array | |
| model_denylist | array | |
| default_model | stringnull | |
| 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 | |
| fallback_agent_id | stringnull | |
| pii_redact_policy_id | stringnull | |
| pii_detokenize_response | boolean | AIGW-100 legacy alias. Read-only mirror of `pii_response_mode == "detokenize"`; the column is GENERATED in the database so the two can never disagree. Still ACCEPTED on create and update, where it is |
| pii_request_mode | string | What happens to the PROMPT before it leaves KnoxCall. `tokenize` (default) replaces detected entities with conversation-scoped, format-preserving tokens before the provider sees them; `off` forwards t |
| pii_response_mode | string | What happens to the provider's answer. `redact` runs the detector stack (fresh PII in the completion, canary tokens) and leaves `KC_*` tokens as tokens; `detokenize` (default) also swaps them back to |
| pii_streaming_holdback_chars | integer | |
| pii_streaming_mode | string | |
| cache_mode | string | |
| cache_ttl_seconds | integer | |
| cache_similarity_threshold | numbernull | |
| cache_embedding_model | stringnull | |
| streaming_enabled | boolean | |
| firewall_policy_id | stringnull | |
| tool_allowlist | array | |
| output_schema | objectnull | |
| output_validation_action | string | |
| data_residency_region | stringnull | AIGW-53: pin this agent's upstream egress to a data-residency region. When set, a request whose upstream endpoint KnoxCall cannot classify as serving that region is refused on the data plane with HTTP |
| cmek_key_id | stringnull | AIGW-53: the `tenant_master_keys` id this agent's AI data (its PII token map) is encrypted under. Must be one of THIS tenant's keys and must be customer-managed (`wrap_method = customer_kms`, i.e. BYO |
| status | string | |
| paused_reason | stringnull | |
| tags | object | FinOps attribution labels (cost_center/team/project/…) echoed onto this agent's usage rows. |
| provider | stringnull | The upstream shape this agent fronts — one of the values `CreateAiGatewayAgentRequest.provider` enumerates (the catalog has grown to fourteen; `ai_gateway_agents_provider_check` is the authority). Set |
| routing_policy | object | Returned on every agent read. `{}` — the default for every agent — means one attempt per route and fail-over to `fallback_route_ids` on 5xx only. |
| guardrail_webhook_url | stringnull | The external scanner this agent POSTs to for a verdict, or null when it has none. See `CreateAiGatewayAgentRequest.guardrail_webhook_url` for what the hook receives and how the destination is refused. |
| guardrail_webhook_secret_id | stringnull | Secret holding the HMAC-SHA256 key deliveries are signed with, or null when deliveries are sent unsigned. |
| guardrail_webhook_mode | string | Which directions are inspected. `off` when the agent has no hook — the server returns the string, never a boolean. |
| guardrail_webhook_timeout_ms | integer | How long the gateway waits for a verdict. Defaults to 2000. |
| guardrail_webhook_failure_action | string | What happens when the hook does not answer. Defaults to `fail_open`, the posture an agent already has with no hook at all. |
| created_at | string | |
| updated_at | string | |
| created_by | stringnull | |
| agent_url | string | The data-plane base URL for this agent — `https://{tenant}.knoxcall.com/v1/ai/{slug}`. Point an AI SDK's `base_url` here and give it a capability token as the API key. Present on EVERY agent projectio |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/knoxcall/main/json-schema/knoxcall-ai-gateway-agent-schema.json",
"title": "AiGatewayAgent",
"description": "An agent under a gateway — the addressable unit an AI SDK points at.",
"x-generated": "2026-10-18",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/knoxcall-openapi.json#/components/schemas/AiGatewayAgent",
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"tenant_id": {
"type": "string",
"format": "uuid"
},
"gateway_id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"description": {
"type": [
"string",
"null"
]
},
"primary_route_id": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"fallback_route_ids": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
}
},
"model_allowlist": {
"type": "array",
"items": {
"type": "string"
}
},
"model_denylist": {
"type": "array",
"items": {
"type": "string"
}
},
"default_model": {
"type": [
"string",
"null"
]
},
"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"
},
"fallback_agent_id": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"pii_redact_policy_id": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"pii_detokenize_response": {
"type": "boolean",
"readOnly": true,
"description": "AIGW-100 legacy alias. Read-only mirror of `pii_response_mode == \"detokenize\"`; the column is GENERATED in the database so the two can never disagree. Still ACCEPTED on create and update, where it is folded onto `pii_response_mode`."
},
"pii_request_mode": {
"type": "string",
"enum": [
"off",
"tokenize"
],
"description": "What happens to the PROMPT before it leaves KnoxCall. `tokenize` (default) replaces detected entities with conversation-scoped, format-preserving tokens before the provider sees them; `off` forwards the prompt exactly as sent. Independent of `pii_response_mode` — before AIGW-100 request tokenization was gated on the response toggle, so an agent with a PII policy and `pii_detokenize_response: false` sent prompts verbatim."
},
"pii_response_mode": {
"type": "string",
"enum": [
"redact",
"detokenize"
],
"description": "What happens to the provider's answer. `redact` runs the detector stack (fresh PII in the completion, canary tokens) and leaves `KC_*` tokens as tokens; `detokenize` (default) also swaps them back to this conversation's originals. There is no `off` — the detector stack runs on every 2xx."
},
"pii_streaming_holdback_chars": {
"type": "integer"
},
"pii_streaming_mode": {
"type": "string"
},
"cache_mode": {
"type": "string"
},
"cache_ttl_seconds": {
"type": "integer"
},
"cache_similarity_threshold": {
"type": [
"number",
"null"
]
},
"cache_embedding_model": {
"type": [
"string",
"null"
]
},
"streaming_enabled": {
"type": "boolean"
},
"firewall_policy_id": {
"type": [
"string",
"null"
],
"format": "uuid"
},
"tool_allowlist": {
"type": "array",
"items": {
"type": "string"
}
},
"output_schema": {
"type": [
"object",
"null"
],
"additionalProperties": true
},
"output_validation_action": {
"type": "string"
},
"data_residency_region": {
"type": [
"string",
"null"
],
"enum": [
"us",
"eu",
"uk",
"ca",
"au",
"jp",
"in",
null
],
"description": "AIGW-53: pin this agent's upstream egress to a data-residency region. When set, a request whose upstream endpoint KnoxCall cannot classify as serving that region is refused on the data plane with HTTP 403 `residency_violation` — including a fallback route, which is where an unpinned failover would otherwise leave the region. `null` (the default) applies no residency constraint. See https://docs.knoxcall.com/ai-gateway/data-residency for the endpoints KnoxCall classifies and for what this control does and does not guarantee."
},
"cmek_key_id": {
"type": [
"string",
"null"
],
"format": "uuid",
"description": "AIGW-53: the `tenant_master_keys` id this agent's AI data (its PII token map) is encrypted under. Must be one of THIS tenant's keys and must be customer-managed (`wrap_method = customer_kms`, i.e. BYOK configured) — a KnoxCall-wrapped key is refused, because a CMEK the platform can unwrap is not a CMEK. If the key is missing, retired, revoked, or your KMS refuses to unwrap it, the data-plane request is refused with HTTP 503 `cmek_unavailable` rather than written under a different key."
},
"status": {
"type": "string",
"enum": [
"active",
"paused",
"archived"
]
},
"paused_reason": {
"type": [
"string",
"null"
]
},
"tags": {
"type": "object",
"additionalProperties": true,
"description": "FinOps attribution labels (cost_center/team/project/…) echoed onto this agent's usage rows."
},
"provider": {
"type": [
"string",
"null"
],
"description": "The upstream shape this agent fronts — one of the values `CreateAiGatewayAgentRequest.provider` enumerates (the catalog has grown to fourteen; `ai_gateway_agents_provider_check` is the authority). Set once, at create time, and deliberately NOT patchable: changing it without re-pointing `primary_route_id` at a matching route would make the stored value a lie. `null` on an agent created before the field existed whose route shape the backfill did not recognise — render that as \"custom\", never as a guess."
},
"routing_policy": {
"allOf": [
{
"$ref": "#/$defs/AiGatewayRoutingPolicy"
}
],
"description": "Returned on every agent read. `{}` — the default for every agent — means one attempt per route and fail-over to `fallback_route_ids` on 5xx only.\n"
},
"guardrail_webhook_url": {
"type": [
"string",
"null"
],
"format": "uri",
"description": "The external scanner this agent POSTs to for a verdict, or null when it has none. See `CreateAiGatewayAgentRequest.guardrail_webhook_url` for what the hook receives and how the destination is refused.\n"
},
"guardrail_webhook_secret_id": {
"type": [
"string",
"null"
],
"format": "uuid",
"description": "Secret holding the HMAC-SHA256 key deliveries are signed with, or null when deliveries are sent unsigned.\n"
},
"guardrail_webhook_mode": {
"type": "string",
"enum": [
"off",
"request",
"response",
"both"
],
"description": "Which directions are inspected. `off` when the agent has no hook — the server returns the string, never a boolean.\n"
},
"guardrail_webhook_timeout_ms": {
"type": "integer",
"minimum": 100,
"maximum": 10000,
"description": "How long the gateway waits for a verdict. Defaults to 2000."
},
"guardrail_webhook_failure_action": {
"type": "string",
"enum": [
"fail_open",
"fail_closed"
],
"description": "What happens when the hook does not answer. Defaults to `fail_open`, the posture an agent already has with no hook at all.\n"
},
"created_at": {
"type": "string",
"format": "date-time"
},
"updated_at": {
"type": "string",
"format": "date-time"
},
"created_by": {
"type": [
"string",
"null"
]
},
"agent_url": {
"type": "string",
"description": "The data-plane base URL for this agent — `https://{tenant}.knoxcall.com/v1/ai/{slug}`.\nPoint an AI SDK's `base_url` here and give it a capability token as the API key.\n\nPresent on EVERY agent projection: create, get, update and the list rows (AIGW-160\nera it was create and get only, so a list row was shaped differently from the row\ncreate returned). It is server-computed rather than stored, so it MOVES when `slug`\nchanges — which is why `PATCH` returns it too.\n\nAn EMPTY STRING when the tenant slug cannot be resolved. Treat empty as \"not\navailable\", never as a URL.\n"
}
},
"required": [
"id",
"gateway_id",
"name",
"slug",
"status",
"agent_url",
"created_at",
"updated_at"
],
"$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
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/knoxcall-ai-gateway-agent"
All schemas
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.