Browse the docs

Get started

Authentication

Every request under /v1 carries an API key as a Bearer token. GET/health is the only public route.

Create a key

Create keys at app.callshift.ai/api-keys, one per integration, named after it (CRM sync, Make scenario), so that you can revoke one without stopping the others. Revoke a key there too.

Send it

curl "https://api.callshift.ai/v1/agents" \
  -H "Authorization: Bearer $CALLSHIFT_API_KEY"
const res = await fetch("https://api.callshift.ai/v1/agents", {
  headers: { Authorization: `Bearer ${process.env.CALLSHIFT_API_KEY}` },
});
import os
import requests

res = requests.get(
    "https://api.callshift.ai/v1/agents",
    headers={"Authorization": f"Bearer {os.environ['CALLSHIFT_API_KEY']}"},
)

A missing or unknown key answers 401:

JSON
{ "error": "Authentication error" }

What a key can reach

A key acts on the whole account: every agent, number, campaign and call, whatever entity they belong to. Entities organise an account; they do not restrict a key.

Keep keys on the server

Never put a key in a web page, a mobile app or a file you share. A key that went into a chat, a ticket or a screenshot should be revoked and replaced.

Conventions

WhatFormat
Base URLhttps://api.callshift.ai, JSON request and response bodies
IdentifiersUUIDs. Your own identifiers go in an entity's externalId or a contact's metadata.
TimestampsISO 8601 in UTC, such as 2026-10-30T09:12:00.000Z. Date filters need the full date-time.
Phone numbersE.164, such as +33612345678. Send them normalised: contacts are matched by number.
AmountsIntegers in euro cents (costEstimationCents, totalCents).
DurationsSeconds (billingSeconds, maxDurationSeconds).
Booleans in a queryThe strings true and false, such as ?isReached=true.
Shared or in an entityentityId or entityExternalId; null means shared. See Entities.