Monitor and integrate
Calls and recordings
/v1/calls, most recently started first. GET/v1/calls/{callId} adds the transcript.Filter calls
| Parameter | Filters on |
|---|---|
agentId, campaignId | An agent's or a campaign's calls |
customerPhoneNumber | The calls with one customer |
type | inbound, outbound, webcall |
status | See the statuses below |
from, to | Creation time, as a full ISO date-time (2026-10-01T00:00:00Z) |
endedReason | One ended reason, exact match |
minDuration | At least this many billed seconds |
isReached, isSignificant, isSuccessful, isSilent | true or false |
# Calls of a campaign that nobody answered in October
curl "https://api.callshift.ai/v1/calls?campaignId=$CAMPAIGN_ID&isReached=false&from=2026-10-01T00:00:00Z&to=2026-11-01T00:00:00Z" \
-H "Authorization: Bearer $CALLSHIFT_API_KEY"const params = new URLSearchParams({
campaignId,
isReached: "false",
from: "2026-10-01T00:00:00Z",
to: "2026-11-01T00:00:00Z",
});
const res = await fetch(`https://api.callshift.ai/v1/calls?${params}`, {
headers: { Authorization: `Bearer ${process.env.CALLSHIFT_API_KEY}` },
});
const { data, pageCount } = await res.json();res = requests.get(
"https://api.callshift.ai/v1/calls",
headers={"Authorization": f"Bearer {os.environ['CALLSHIFT_API_KEY']}"},
params={
"campaignId": campaign_id,
"isReached": "false",
"from": "2026-10-01T00:00:00Z",
"to": "2026-11-01T00:00:00Z",
},
)
calls = res.json()["data"]Statuses
| Status | Meaning |
|---|---|
READY | Queued in a campaign, waiting to be dialed |
SCHEDULED | Picked from the queue, to be dialed within seconds |
IN_PROGRESS | Ringing or under way |
COMPLETED | Ended. The endedReason says how. |
REJECTED | An inbound call refused before the agent answered: no active plan, no credit left, or flagged as spam |
ERROR | Failed. The endedReason says why. |
Transcript
transcript is one text, a line per turn, each line starting with the speaker. Split it on line breaks to get the turns.
Assistant: Hello, this is Alice, the AI assistant of Club Lyon Part-Dieu. How can I help?
User: Hi, I'd like to book a visit on Saturday.Recording
recordingUrl is a direct, non-expiring URL, readable without authentication: store it like a secret. It is null while the call is in progress or when no recording was made.
A transferred call ends COMPLETED, with assistant-forwarded-call as its ended reason.
Cost of a call
billingSeconds is the billed duration, rounded up. costEstimationCents prices it at your plan's overage rate, in euro cents, plus the dial fee of a campaign call whatever its outcome. It is an estimate for comparing calls and forecasting spend: it does not deduct the minutes your plan includes, and it is null when the account has no overage rate. What you actually pay is on your invoices.
