KnoxCall Webhook Events API

The Webhook Events API from KnoxCall — 0 operation(s) for webhook events.

Work with this as data

Every API 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 apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • 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 API
curl "https://apis.io/api/v1/apis/knoxcall:knoxcall-webhook-events-api"
All apis
curl "https://apis.io/api/v1/apis?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.

OpenAPI Specification

knoxcall-webhook-events-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: KnoxCall Client Management Webhook Events API
  version: '1.0'
  description: 'The KnoxCall Client Management API provides programmatic access to manage your API gateway

    resources including routes, secrets, clients, environments, webhooks, and API keys. ## Authentication


    All requests must include an OAuth 2.1 access token **or** a legacy API key. The

    recommended path for new integrations is the first-party SDKs, which mint, cache, and

    refresh OAuth tokens for you (start with `knoxcall login` on a developer machine, or

    `KNOXCALL_CLIENT_ID` / `KNOXCALL_CLIENT_SECRET` in CI). You can authenticate using any of:


    - **Authorization header (OAuth 2.1 bearer token — recommended)**: `Authorization: Bearer `

    - **Authorization header (legacy API key)**: `Authorization: Bearer tk_xxx_yyy`

    - **x-api-key header (legacy API key)**: `x-api-key: tk_xxx_yyy`


    OAuth 2.1 access tokens (`kc_` prefix) are minted at the root-host token endpoint

    `https://api.knoxcall.com/oauth/token` (not under `/v1`) using the `client_credentials`

    or `authorization_code` grant. See the `OAuth2` security scheme and the `/oauth/*`

    endpoints. Some resources that are managed exclusively through OAuth reject API-key auth

    with a `403 use_oauth` error. Long-lived API keys remain fully supported. They come in three types:

    - **Standard keys** (`tk_` prefix) are used on the production API (`api.knoxcall.com`). - **Test keys** (`tk_` prefix, type=test) are used on the sandbox API (`sandbox.knoxcall.com`). - **Enterprise Access Keys** (`AKE` prefix) follow the format `AKE[16chars]:[40chars]`. Using a test key on the production API (or vice versa) will return a `403 wrong_key_type` error. ## Request IDs


    Every response — success or error — includes an `X-Request-Id` response header (a UUID). Its value is identical to the `request_id` field in the response body (`meta.request_id`

    on success, `error.request_id` on error). Quote it when contacting support. ## API Versioning


    The API is versioned on two axes:


    - **Major version — the `/v1` path prefix.** Breaking changes ship under a new major

    (`/v2`). `/v1` never receives a breaking change. - **Minor version — the `KnoxCall-Version` header (dated, `YYYY-MM-DD`).** Send

    `KnoxCall-Version: 2026-08-05` to pin the behaviour of a specific dated release. Omit

    the header to get the newest minor version. Every response echoes the resolved version

    back in a `KnoxCall-Version` response header. Within a major version, **additive changes are not breaking** and may appear without a new

    dated version: new endpoints, new optional request fields, new response fields, new

    `error.type` values, and new enum members. Clients must tolerate unknown response fields

    and unknown `error.type` values (see the `ErrorResponse` schema). An **unknown or malformed** `KnoxCall-Version` value returns `400` with

    `error.type: invalid_api_version`. ## Rate Limiting


    API keys can have optional rate limits configured. When a limit is configured, the

    following headers are emitted on **every** response (not only `429`s):

    - `X-RateLimit-Limit` -- maximum requests allowed per window

    - `X-RateLimit-Remaining` -- remaining requests in the current window

    - `X-RateLimit-Reset` -- epoch seconds at which the window resets


    When the limit is exceeded the API returns `429` (`rate_limit_exceeded` / `rate_limited`)

    and additionally sets `Retry-After` (seconds until the window resets). ## DPoP sender-constrained tokens, and the server nonce


    A token minted with a `cnf.jkt` binding (DPoP, RFC 9449) requires a `DPoP` proof header

    on every request, signed over the request''s method and canonical public URL. **Every response to a request that carried a `DPoP` header also carries a

    `DPoP-Nonce` response header** -- mints, refusals and successful calls alike, on

    `POST /oauth/token`, `/v1`, the tenant data plane, the self-hosted proxy and the AI

    gateway. The value is stateless and changes every minute; the server accepts the current

    and the previous minute''s, so a nonce is good for 60-120 seconds.'
  contact:
    name: KnoxCall Support
    url: https://knoxcall.com
    email: support@knoxcall.com
  license:
    name: Proprietary
    url: https://knoxcall.com/terms
servers:
- url: https://api.knoxcall.com/v1
  description: Production
- url: https://sandbox.knoxcall.com/v1
  description: Sandbox (test keys only)
security:
- OAuth2: []
- BearerAuth: []
- ApiKeyAuth: []
tags:
- name: Webhook Events
paths: {}
webhooks:
  requestReceived:
    post:
      operationId: onRequestReceived
      summary: Request received
      description: Fired when a proxied request is received by a route.
      tags:
      - Webhook Events
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookEventPayload'
      responses:
        '200':
          description: Webhook received successfully.
  requestSuccess:
    post:
      operationId: onRequestSuccess
      summary: Request succeeded (2xx)
      description: Fired when a proxied request returns a 2xx success status.
      tags:
      - Webhook Events
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookEventPayload'
      responses:
        '200':
          description: Webhook received successfully.
  requestError:
    post:
      operationId: onRequestError
      summary: Request error (4xx/5xx/timeout)
      description: Fired when a proxied request returns a 4xx, 5xx, or times out.
      tags:
      - Webhook Events
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookEventPayload'
      responses:
        '200':
          description: Webhook received successfully.
  requestCompleted:
    post:
      operationId: onRequestCompleted
      summary: Request completed (any status)
      description: Fired for every completed proxied request, regardless of status.
      tags:
      - Webhook Events
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookEventPayload'
      responses:
        '200':
          description: Webhook received successfully.
  vaultTokenExpiring:
    post:
      operationId: onVaultTokenExpiring
      summary: Stored card approaching expiry
      description: Fired 60 and 30 days before a stored payment card's expiry date, so a card-on-file customer can be prompted to update it before their payment processor declines. Emitted once per (token, threshold) by a daily job — never by a request — and scoped to the token's data space, so a Test-mode card reaches only Test-mode webhooks. A token receives this only if its tokenize call supplied `card_exp_month` / `card_exp_year`. The payload carries the token, never the card number.
      tags:
      - Webhook Events
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VaultTokenExpiringEventPayload'
      responses:
        '200':
          description: Webhook received successfully.
components:
  schemas:
    VaultTokenExpiringEventPayload:
      type: object
      description: 'Payload delivered for the `vault.token.expiring` event — Card-Grade

        Vaults. Signed exactly like every other webhook delivery.


        It carries the TOKEN (the format-preserving alias you already store) and

        never the card number, and there is no field that could hold one: a

        delivery whose contents were card-shaped is refused server-side rather

        than sent.

        '
      properties:
        event:
          type: string
          enum:
          - vault.token.expiring
          example: vault.token.expiring
        timestamp:
          type: string
          format: date-time
          description: When the notice was decided.
        data:
          type: object
          properties:
            token_id:
              type: string
              format: uuid
              description: The vault token's uuid.
            token:
              type: string
              description: The token string you store in place of the card. For a `pan` vault it preserves the card's BIN and last four, and it is NOT a usable card number.
              example: '4111114725124116'
            vault_id:
              type: string
              format: uuid
            vault_name:
              type: string
              example: cards
            last4:
              type: string
              description: The card's last four digits, read off the token alias.
              example: '4116'
            card_expires_on:
              type: string
              format: date
              description: The last day of the card's expiry month.
              example: '2029-07-31'
            days_until_expiry:
              type: integer
              description: Days from today to `card_expires_on`, by the server's clock.
              example: 60
            threshold_days:
              type: integer
              enum:
              - 60
              - 30
              description: Which notice this is. Each fires at most once per token; the window stays open a few days past the exact day so a run the job missed catches up rather than skipping the notice entirely.
            sandbox:
              type: boolean
              description: The token's data space. A Test-mode card is only ever delivered to Test-mode webhooks.
    WebhookEventPayload:
      type: object
      description: 'Payload delivered to webhook endpoints when events are triggered.

        All payloads are signed with HMAC-SHA256 using the webhook''s `secret_key`.

        The signature is sent in the `X-KnoxCall-Signature` header.

        '
      properties:
        event:
          type: string
          enum:
          - request.received
          - request.success
          - request.redirect
          - request.client_error
          - request.server_error
          - request.timeout
          - request.error
          - request.completed
          description: The event type that triggered this webhook delivery.
          example: request.server_error
        timestamp:
          type: string
          format: date-time
          description: When the event occurred.
          example: '2025-03-15T10:30:00.000Z'
        webhook_id:
          type: string
          format: uuid
          description: The ID of the webhook subscription.
        webhook_name:
          type: string
          description: The name of the webhook subscription.
          example: Error Alerts
        test:
          type: boolean
          description: Whether this is a test delivery (triggered manually via the test endpoint).
          example: false
        data:
          type: object
          description: Event-specific data.
          properties:
            route_id:
              type: string
              format: uuid
              description: The route that processed the request.
            route_name:
              type: string
              description: Name of the route.
              example: stripe-payments
            environment:
              type: string
              description: The environment the request was resolved against.
              example: production
            request:
              $ref: '#/components/schemas/WebhookEventRequest'
            response:
              $ref: '#/components/schemas/WebhookEventResponse'
      required:
      - event
      - timestamp
      - webhook_id
      - webhook_name
      - data
    WebhookEventResponse:
      type: object
      description: Details of the upstream response (included based on webhook configuration).
      properties:
        status:
          type: integer
          description: HTTP status code from the upstream (if `include_status_code` is enabled).
          example: 500
        latency_ms:
          type: integer
          description: Round-trip latency in milliseconds.
          example: 245
        headers:
          type: object
          additionalProperties:
            type: string
          description: Response headers (if `include_headers` is enabled).
        body:
          description: Response body (if `include_response_body` is enabled).
    WebhookEventRequest:
      type: object
      description: Details of the original proxied request (included based on webhook configuration).
      properties:
        method:
          type: string
          description: HTTP method of the request.
          example: POST
        path:
          type: string
          description: Request path.
          example: /v1/charges
        ip:
          type: string
          description: Source IP address of the caller.
          example: 203.0.113.42
        headers:
          type: object
          additionalProperties:
            type: string
          description: 'Request headers (if `include_headers` is enabled on the webhook).

            Sensitive headers (Authorization, x-api-key, etc.) are automatically redacted.

            '
        body:
          description: Request body (if `include_request_body` is enabled on the webhook).
  securitySchemes:
    OAuth2:
      type: oauth2
      description: 'OAuth 2.1 authentication — recommended for new integrations. Access tokens

        (`kc_` prefix) are minted at the root-host token endpoint

        `https://api.knoxcall.com/oauth/token` and passed as `Authorization: Bearer <access_token>`.

        Public clients must use PKCE with the `authorization_code` grant; confidential

        clients may use `client_credentials`. The first-party SDKs and the

        `knoxcall login` CLI handle token minting, caching, refresh, and DPoP for you.

        '
      flows:
        clientCredentials:
          tokenUrl: https://api.knoxcall.com/oauth/token
          refreshUrl: https://api.knoxcall.com/oauth/token
          scopes:
            routes:read: Read routes.
            routes:write: Create, update, and delete routes.
            secrets:read: Read secret metadata. Does NOT include retrieving a live OAuth2 access token.
            secrets:oauth_token: Retrieve a live upstream OAuth2 access token (GET /v1/secrets/{id}/oauth2/token). Distinct from secrets:read because the call refreshes the credential at the provider.
            secrets:write: Create, update, and delete secrets.
            vaults:detokenize: Turn a vault token back into its original value. Required by GET /v1/vaults/{vault}/tokens/{token}, by a token template reference in a /v1/proxy body, and by creating a `detokenize` route action. Distinct from vaults:read, which lists vaults and token metadata and never returns a value.
            transit:decrypt: Open a portable `kc:` ciphertext with a tenant transit key. Required by creating a `decrypt` route action, which stores a standing instruction to open every matching field on every later request through that route. It is the same capability name the policy engine uses for POST /v1/decrypt. No routes scope satisfies it — managing a route is not permission to open the data flowing through it.
            proxy:invoke: Call the one-shot ephemeral proxy (any method on /v1/proxy). Required for EVERY verb — the proxy is one capability behind one handler, and a bodyless GET spends an escrowed credential exactly as a POST does. Neither proxy:read nor proxy:write satisfies it.
            clients:read: Read clients.
            clients:write: Manage clients.
            webhooks:write: Manage webhooks.
            workflows:write: Manage and execute workflows.
            '*:*': Full access (all scopes).
        authorizationCode:
          authorizationUrl: https://api.knoxcall.com/oauth/authorize
          tokenUrl: https://api.knoxcall.com/oauth/token
          refreshUrl: https://api.knoxcall.com/oauth/token
          scopes:
            routes:read: Read routes.
            routes:write: Create, update, and delete routes.
            secrets:read: Read secret metadata. Does NOT include retrieving a live OAuth2 access token.
            secrets:oauth_token: Retrieve a live upstream OAuth2 access token (GET /v1/secrets/{id}/oauth2/token). Distinct from secrets:read because the call refreshes the credential at the provider.
            secrets:write: Create, update, and delete secrets.
            vaults:detokenize: Turn a vault token back into its original value. Required by GET /v1/vaults/{vault}/tokens/{token}, by a token template reference in a /v1/proxy body, and by creating a `detokenize` route action. Distinct from vaults:read, which lists vaults and token metadata and never returns a value.
            transit:decrypt: Open a portable `kc:` ciphertext with a tenant transit key. Required by creating a `decrypt` route action, which stores a standing instruction to open every matching field on every later request through that route. It is the same capability name the policy engine uses for POST /v1/decrypt. No routes scope satisfies it — managing a route is not permission to open the data flowing through it.
            proxy:invoke: Call the one-shot ephemeral proxy (any method on /v1/proxy). Required for EVERY verb — the proxy is one capability behind one handler, and a bodyless GET spends an escrowed credential exactly as a POST does. Neither proxy:read nor proxy:write satisfies it.
            clients:read: Read clients.
            clients:write: Manage clients.
            webhooks:write: Manage webhooks.
            workflows:write: Manage and execute workflows.
            '*:*': Full access (all scopes).
    PhantomToken:
      type: http
      scheme: bearer
      description: "The AI **data plane** credential — a `kp_`-prefixed capability token, not a\nManagement API credential. It is minted per agent (or per MCP resource) at\n`POST /v1/ai-gateway/agents/{agentId}/tokens`, or exchanged from a CI workload's\nOIDC token at `POST /v1/oauth/token`, and it is the ONLY credential `/v1/ai/*`\naccepts: an OAuth `kc_` access token or a `tk_` API key is refused there, and a\n`kp_` token is refused on `api.knoxcall.com`.\n\nThree header spellings are accepted, so an existing provider SDK can be pointed at\nthe agent URL without rewriting its auth:\n\n    Authorization: Bearer kp_live_a_...\n    x-api-key: kp_live_a_...\n    x-knox-ai-key: kp_live_a_...\n\n`kp_live_` is refused on the sandbox host and `kp_test_` on the Live host — the env\nsegment is enforced, not cosmetic. DPoP-bound tokens additionally require a valid\n`DPoP` proof header on every request, signed over the canonical public URL rather\nthan a rewritten `Host`.\n\nA rejected credential answers `401`/`403` in the data-plane error envelope with the\ncause in `code` and in the `X-Auth-Failure` response header.\n"
    BearerAuth:
      type: http
      scheme: bearer
      description: 'Legacy long-lived API key authentication via the Authorization header.

        Pass your API key as: `Authorization: Bearer tk_xxx_yyy`.


        Standard keys (`tk_` prefix) are accepted on `api.knoxcall.com`.

        Test keys (type=test) are accepted on `sandbox.knoxcall.com`.

        Enterprise Access Keys (`AKE` prefix) are accepted on both.


        Fully supported, but prefer the `OAuth2` scheme (or the SDKs, which handle

        OAuth for you) for new integrations.

        '
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: 'Legacy API key authentication via the `x-api-key` header.

        This is an alternative to Bearer token authentication for clients that cannot

        set the `Authorization` header. Prefer the `OAuth2` scheme for new integrations.

        '
    CapabilityTokenAuth:
      type: http
      scheme: bearer
      description: 'Single-use client capability token (`kct_` prefix), passed as

        `Authorization: Bearer kct_...`. Minted server-side via

        `POST /client-tokens` and bound either to one exact payload + action

        (`decrypt`, `detokenize`) or to one vault + a closed set of page

        origins (`tokenize`). This is NOT an API key — it authenticates only

        the `POST /client/decrypt`, `POST /client/detokenize` and

        `POST /client/tokenize` consume endpoints and is invalidated after its

        first use.

        '