Browse the docs

Monitor and integrate

Calls and recordings

Every call, inbound, outbound or from a browser, is in GET/v1/calls, most recently started first. GET/v1/calls/{callId} adds the transcript.

Filter calls

ParameterFilters on
agentId, campaignIdAn agent's or a campaign's calls
customerPhoneNumberThe calls with one customer
typeinbound, outbound, webcall
statusSee the statuses below
from, toCreation time, as a full ISO date-time (2026-10-01T00:00:00Z)
endedReasonOne ended reason, exact match
minDurationAt least this many billed seconds
isReached, isSignificant, isSuccessful, isSilenttrue 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

StatusMeaning
READYQueued in a campaign, waiting to be dialed
SCHEDULEDPicked from the queue, to be dialed within seconds
IN_PROGRESSRinging or under way
COMPLETEDEnded. The endedReason says how.
REJECTEDAn inbound call refused before the agent answered: no active plan, no credit left, or flagged as spam
ERRORFailed. 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.

Transcript
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.