Access to the API is provisioned by invitation: you’re invited to set a password for a username (usually your company email), and given an environment URL that looks like
https://<env>.kardinal.ai (for example https://app.kardinal.ai). There is currently no self-serve sign-up flow — if you don’t have credentials yet, contact your Account Executive or api@kardinal.ai.Step 1 — Authenticate
Kardinal uses JWT authentication. Exchange your username and password for anaccess_token:
Response
access_token — every following request uses it as a bearer token. It’s valid for one hour; see Authentication and API keys for how to refresh it.
Step 2 — Submit a minimal plan
A plan is created withPOST /plans — the service generates the plan’s id, returned in the response; a client-supplied id in this request is rejected with a 400. Here is the smallest viable plan: one resource and three pickup-only orders in Paris.
Response (abridged)
id from the response — every request below uses it in place of <plan_id>.
You can also submit a plan as a file upload (-F "file=@plan.json") instead of an inline -d body, and as XLSX instead of JSON — column names in the spreadsheet match the JSON field names.
As soon as the plan is accepted, optimization starts automatically — there’s no separate “start” call.
Step 3 — Retrieve the solution
item field and gives you, per resource, the ordered list of stops (tours[].wayPoints) with arrival/departure times, plus any stop that couldn’t be planned:
Response (abridged)
status field until optimization settles (see the polling workflow in How the optimization engine works).
Next steps
PUT /plans/<plan_id>with the sameidto see interactive re-optimization in action — read How the optimization engine works first to understand what happens on update.- Add time windows, capacities, and skills to your orders and resources — see the full data model reference.
- Move from crow-fly (
fly) to a real vehicle profile (car,truck) before going further than a smoke test.

