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:
{ "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
| What | Format |
|---|---|
| Base URL | https://api.callshift.ai, JSON request and response bodies |
| Identifiers | UUIDs. Your own identifiers go in an entity's externalId or a contact's metadata. |
| Timestamps | ISO 8601 in UTC, such as 2026-10-30T09:12:00.000Z. Date filters need the full date-time. |
| Phone numbers | E.164, such as +33612345678. Send them normalised: contacts are matched by number. |
| Amounts | Integers in euro cents (costEstimationCents, totalCents). |
| Durations | Seconds (billingSeconds, maxDurationSeconds). |
| Booleans in a query | The strings true and false, such as ?isReached=true. |
| Shared or in an entity | entityId or entityExternalId; null means shared. See Entities. |
