KnoxCall · Schema

RequestLog

A record of a proxied API request. On `GET /logs` the fields `id`, `request_id`, `tenant_id`, `route_id`, `matched_client_id`, `identification_method`, `method`, `status_code`, `src_ip`, `environment`, `sandbox` and `ts` are exactly what the Merkle anchor commits to, in that order - see `GET /logs/{request_id}/proof`. Every other field is operational detail and is NOT part of the leaf.

CompanyAPI ManagementSecurityDevOpsAI Agents

Properties

Name Type Description
id string Row id as a decimal string. This is `api_requests.id`, a bigint - NOT a uuid, which earlier revisions of this schema incorrectly declared. It is a string rather than a JSON number because a JSON numbe
request_id string Correlation ID for the proxied request.
ts string Timestamp of the request.
src_ip string Source IP address of the caller, host form without a prefix length. Identity tier on `GET /logs`: requires `log:read_identity`, and is ABSENT (not null) when denied.
method string HTTP method used.
path string Request path.
status_code integer HTTP status code returned by the upstream.
latency_ms integer Round-trip latency in milliseconds.
upstream_host stringnull Upstream host the request was forwarded to.
error stringnull Error message if the request failed.
environment stringnull Environment the request was resolved against.
rate_limited booleannull Whether this request was rate-limited.
signature_valid booleannull Whether the request signature was valid (if required).
source_ip_country stringnull Country of the source IP (GeoIP lookup).
source_ip_city stringnull City of the source IP (GeoIP lookup).
tenant_id string Owning tenant. Returned by `GET /logs`; omitted by `GET /routes/{id}/logs`.
route_id stringnull
matched_client_id stringnull Which client the request was attributed to. Kept when that client is later deleted, so it may name a client that no longer exists: it is a committed field of the row's Merkle leaf and is never rewritt
identification_method stringnull How that attribution was made (e.g. `ip`, `mtls_thumbprint`). Identity tier on `GET /logs`.
sandbox booleannull Live/Test partition. `null` on rows written before the partition existed, which are treated as Live. Null, false and true are three distinct facts and the Merkle anchor keeps them apart.
proxy_mode stringnull
cursor string Opaque resume token, returned by `GET /logs` only. Pass the last row's value as `cursor` on the next call.
client_origin string How the call arrived at the Route. `sdk_intercept`: a KnoxCall SDK's route-aware interceptor rerouted a third-party SDK's request onto the Route (the SDK sent `x-knoxcall-origin: sdk-intercept`). `dir
View JSON Schema on GitHub

JSON Schema

knoxcall-request-log-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/api-evangelist/knoxcall/main/json-schema/knoxcall-request-log-schema.json",
  "title": "RequestLog",
  "description": "A record of a proxied API request.\n\nOn `GET /logs` the fields `id`, `request_id`, `tenant_id`, `route_id`,\n`matched_client_id`, `identification_method`, `method`, `status_code`,\n`src_ip`, `environment`, `sandbox` and `ts` are exactly what the Merkle\nanchor commits to, in that order - see `GET /logs/{request_id}/proof`.\nEvery other field is operational detail and is NOT part of the leaf.\n",
  "x-generated": "2026-10-18",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/knoxcall-openapi.json#/components/schemas/RequestLog",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Row id as a decimal string. This is `api_requests.id`, a bigint - NOT a uuid, which earlier revisions of this schema incorrectly declared. It is a string rather than a JSON number because a JSON number is a double and cannot hold a bigint exactly past 2^53."
    },
    "request_id": {
      "type": "string",
      "format": "uuid",
      "description": "Correlation ID for the proxied request."
    },
    "ts": {
      "type": "string",
      "format": "date-time",
      "description": "Timestamp of the request."
    },
    "src_ip": {
      "type": "string",
      "description": "Source IP address of the caller, host form without a prefix length. Identity tier on `GET /logs`: requires `log:read_identity`, and is ABSENT (not null) when denied."
    },
    "method": {
      "type": "string",
      "description": "HTTP method used."
    },
    "path": {
      "type": "string",
      "description": "Request path."
    },
    "status_code": {
      "type": "integer",
      "description": "HTTP status code returned by the upstream."
    },
    "latency_ms": {
      "type": "integer",
      "description": "Round-trip latency in milliseconds."
    },
    "upstream_host": {
      "type": [
        "string",
        "null"
      ],
      "description": "Upstream host the request was forwarded to."
    },
    "error": {
      "type": [
        "string",
        "null"
      ],
      "description": "Error message if the request failed."
    },
    "environment": {
      "type": [
        "string",
        "null"
      ],
      "description": "Environment the request was resolved against."
    },
    "rate_limited": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "Whether this request was rate-limited."
    },
    "signature_valid": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "Whether the request signature was valid (if required)."
    },
    "source_ip_country": {
      "type": [
        "string",
        "null"
      ],
      "description": "Country of the source IP (GeoIP lookup)."
    },
    "source_ip_city": {
      "type": [
        "string",
        "null"
      ],
      "description": "City of the source IP (GeoIP lookup)."
    },
    "tenant_id": {
      "type": "string",
      "format": "uuid",
      "description": "Owning tenant. Returned by `GET /logs`; omitted by `GET /routes/{id}/logs`."
    },
    "route_id": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid"
    },
    "matched_client_id": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid",
      "description": "Which client the request was attributed to. Kept when that client is later deleted, so it may name a client that no longer exists: it is a committed field of the row's Merkle leaf and is never rewritten. Identity tier on `GET /logs`: requires `log:read_identity`, and is ABSENT (not null) when denied."
    },
    "identification_method": {
      "type": [
        "string",
        "null"
      ],
      "description": "How that attribution was made (e.g. `ip`, `mtls_thumbprint`). Identity tier on `GET /logs`."
    },
    "sandbox": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "Live/Test partition. `null` on rows written before the partition existed, which are treated as Live. Null, false and true are three distinct facts and the Merkle anchor keeps them apart."
    },
    "proxy_mode": {
      "type": [
        "string",
        "null"
      ]
    },
    "cursor": {
      "type": "string",
      "description": "Opaque resume token, returned by `GET /logs` only. Pass the last row's value as `cursor` on the next call."
    },
    "client_origin": {
      "type": "string",
      "enum": [
        "direct",
        "sdk_intercept"
      ],
      "description": "How the call arrived at the Route. `sdk_intercept`: a KnoxCall SDK's route-aware interceptor rerouted a third-party SDK's request onto the Route (the SDK sent `x-knoxcall-origin: sdk-intercept`). `direct`: a plain `call()` / bound-route request, and every row written before the marker existed. Informational only - it never influences authentication, routing, rate limits or the response block."
    }
  }
}

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.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/knoxcall-request-log"
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.