Channex Webhook Signing Keys API

HMAC keys that sign webhook deliveries, so that a receiving endpoint can tell that a callback came from Channex and that its body was not altered on the way. A key is a shared secret: Channex holds it and so do you. It is not an API credential — it authenticates nothing against this API and grants no access. It is used in one direction only, on the callbacks Channex sends to you. A key belongs to a billing account and holds up to two secret versions — the current one plus an optional pending one, which is what makes rotation zero-downtime. To turn signing on, point a webhook at the key with `signing_key_id` and set `is_signed`. ## What is signed Every delivery of a signed webhook — the `POST` Channex makes to the webhook's `callback_url` — carries three headers: - `x-hmac-timestamp` — Unix timestamp (seconds) taken when the delivery was signed. - `x-hmac-signature-256` — comma-separated lowercase-hex HMAC-SHA256 signatures, one per secret version of the key, the current version first. - `x-hmac-keys-256` — comma-separated version labels (`...` followed by each secret's last 6 characters), in the same order as the signatures. Each signature is computed over the string `{timestamp}.{raw request body}`: the value of `x-hmac-timestamp`, a dot, and the exact bytes of that delivery's body. Nothing else enters it — neither the callback URL nor the webhook's `request_params` and `headers`. ## Verifying a delivery Recompute HMAC-SHA256 over `{timestamp}.{raw body}` with your stored secret, then compare it against the signature at the position whose label in `x-hmac-keys-256` ends with your secret's last 6 characters. ## Rotating a key `generate` adds a pending secret version beside the current one, and deliveries are then signed with both — so verification against the current secret keeps working while the new secret is stored on your side. `rotate` promotes the newest version to be the sole current version, after which deliveries carry its signature alone.

Operations 8

GET /signing_keys List signing keys #
POST /signing_keys Create a signing key #
GET /signing_keys/options List signing key options #
GET /signing_keys/{id} Retrieve a signing key #
PUT /signing_keys/{id} Update a signing key #
DELETE /signing_keys/{id} Delete a signing key #
POST /signing_keys/{id}/generate Generate a secret version #
POST /signing_keys/{id}/rotate Rotate a signing key #

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/channex:channex-webhook-signing-keys-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

channex-webhook-signing-keys-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Channex.io — Public Webhook Signing Keys API
  version: 0.0.0
  description: 'HMAC keys that sign webhook deliveries, so that a receiving endpoint can tell that a

    callback came from Channex and that its body was not altered on the way.


    A key is a shared secret: Channex holds it and so do you. It is not an API credential

    — it authenticates nothing against this API and grants no access. It is used in one

    direction only, on the callbacks Channex sends to you.


    A key belongs to a billing account and holds up to two secret versions — the current

    one plus an optional pending one, which is what makes rotation zero-downtime. To turn

    signing on, point a webhook at the key with `signing_key_id` and set `is_signed`.


    ## What is signed


    Every delivery of a signed webhook — the `POST` Channex makes to the webhook''s

    `callback_url` — carries three headers:


    - `x-hmac-timestamp` — Unix timestamp (seconds) taken when the delivery was signed.

    - `x-hmac-signature-256` — comma-separated lowercase-hex HMAC-SHA256 signatures, one

    per secret version of the key, the current version first.

    - `x-hmac-keys-256` — comma-separated version labels (`...` followed by each secret''s

    last 6 characters), in the same order as the signatures.


    Each signature is computed over the string `{timestamp}.{raw request body}`: the value

    of `x-hmac-timestamp`, a dot, and the exact bytes of that delivery''s body. Nothing else

    enters it — neither the callback URL nor the webhook''s `request_params` and `headers`.


    ## Verifying a delivery


    Recompute HMAC-SHA256 over `{timestamp}.{raw body}` with your stored secret, then

    compare it against the signature at the position whose label in `x-hmac-keys-256` ends

    with your secret''s last 6 characters.


    ## Rotating a key


    `generate` adds a pending secret version beside the current one, and deliveries are

    then signed with both — so verification against the current secret keeps working while

    the new secret is stored on your side. `rotate` promotes the newest version to be the

    sole current version, after which deliveries carry its signature alone.'
servers:
- url: https://app.channex.io/api/v1
  description: Production server
  variables: {}
- url: https://staging.channex.io/api/v1
  description: Staging server
  variables: {}
security:
- UserApiKeyAuth: []
tags:


# --- truncated at 32 KB (44 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/channex/refs/heads/main/openapi/channex-webhook-signing-keys-api-openapi.yml