Kardinal Webhook API

How to register, retrieve, update, and delete plan webhooks, and inspect their delivery results.

Operations 6

POST /plans/{planId}/webhooks Create a new webhook on a given plan #
GET /plans/{planId}/webhooks Retrieve the list of webhooks of a given plan #
GET /plans/{planId}/webhooks/{webhookId} Retrieve a single webhook of a given plan #
PUT /plans/{planId}/webhooks/{webhookId} Update an existing webhook of a given plan #
DELETE /plans/{planId}/webhooks/{webhookId} Delete a single webhook of a given plan #
GET /plans/{planId}/webhooks/{webhookId}/results Retrieve the list of results of a webhook of a given plan #

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/kardinal:kardinal-webhook-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

kardinal-webhook-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Kardinal Route Optimization Webhook API
  version: 1.0.1
  description: 'This document specifies the REST API of Kardinal for builder users.


    Every endpoint applies to the single agency carried by the access token (either the sandbox agency or the production agency), which is why no agency id appears in the paths. An access token that does not grant access to exactly one agency is rejected with a `403`.


    This single-agency shape is specific to **builder** users, the audience of this document. A builder account is created through self-service sign-up and always has exactly two agencies, `sandbox` and `production` — one per environment. This differs from a **standard** Kardinal user, who may belong to a pre-existing set of agencies of any size and receives a single access token scoped accordingly, rather than one token per environment.


    A `429` response with an empty body signals a temporary overload, not a quota: retry after a pause, with an increasing delay between attempts. See Limits and quotas.


    ## Terminology


    A few everyday terms map to specific fields in this API. Reusing the API''s own vocabulary in integration code and support requests avoids ambiguity:


    - **Route:** the ordered sequence of stops a single resource performs within a plan''s solution. Called a `tour` in the API response (`item.tours[]`, with `resourceId`, `distanceInKm`, `workingDuration`, and `wayPoints`). "Route" is the everyday term; `tour` is the field name you''ll see in payloads.

    - **Route plan** (or just "plan"): the full request submitted for optimization (`resources`, `orders`, and any plan-level constraints or objectives). Called `Plan` in this API. Submitting a plan doesn''t return a route directly; it returns a `Solution` object (under `item`) containing one tour per resource.

    - **Disruption:** an event during execution that invalidates part of an already-computed solution and calls for a new one: a delay, a cancellation, or an urgent new order, typically. A disruption is handled by re-optimizing the affected plan (see "Re-optimization" below), not by starting a new one.

    - **Re-optimization:** submitting an update to a plan that already has a solution (`PUT /plans/{planId}`), using the *same* `id` (the `version` is incremented, and the plan re-optimized, only if its content changed; a `PUT` identical to the stored plan changes nothing and isn''t billed). The engine treats this as "same problem, updated data" (the update still carries the complete plan, not only the changes): it repairs the previous solution, adjusting it just enough to be valid for the new data, then keeps improving from there, rather than searching from scratch.

    - **Delivery window:** the time window during which a `delivery`-kind stop should or must be visited: `authorizedTimeWindows` (hard: outside of it, the stop can''t be planned at all) or `preferredTimeWindows` (soft: reachable outside it, at the cost of the `minimizeDelay` objective).'
  contact:
    url: https://kardinal.ai/
    email: customer.success@kardinal.ai
servers:
- url: https://app.kardinal.ai/api/v2
  description: Production and sandbox (same host; the API token used determines which agency a call applies to).
- url: /api/v2
  description: Relative path, for environments where the host is supplied separately.
security:
- access_token: []
tags:


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