Calls

Every conversation the platform has had, and what came out of it.

A call is one conversation. It carries its status while it is happening and its transcript, recording and analysis once it is over.

Analysis is not immediate. A call ends, then it is analysed, so analysis is absent until it has run; analysis.analyzedAt says when it did. A call that ended thirty seconds ago will usually not have it yet.

Recording audio is streamed through the API itself, from audioUrl on the recording.

List calls#

Every call the key can reach in its organization, across campaigns, newest first. `summary` counts the whole filtered set.

GET/api/v1/calls

Query parameters

pagenumber
Page number.
Default1
pageSizenumber
Calls per page, up to 100.
Default50
statusstring
queued, in-progress, completed, failed, cancelled, unjoined, or any exact call status.
dateFromstring
ISO date, inclusive.
dateTostring
ISO date, inclusive.
minDurationnumber
Seconds, inclusive.
maxDurationnumber
Seconds, inclusive.
searchstring
Match a callee name or a phone number.
campaignIdstring
Only calls from this campaign.
directionstring
outbound or inbound.

Responses

A page of calls.

curl -X GET "https://voice.evryhealth.com/api/v1/calls" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"calls": [
{
"id": "5bbdd475-38f6-4211-9361-de482d105b81",
"campaignId": "357b188c-c618-4f95-84b1-cbe26b8ce3e0",
"campaignName": "Q1 Provider Outreach",
"phoneNumber": "+14155551234",
"calleeName": "Dr. John Smith",
"direction": "outbound",
"status": "completed",
"createdAt": "2026-01-20T10:30:00.000Z",
"initiatedAt": "2026-01-20T10:30:02.000Z",
"connectedAt": "2026-01-20T10:30:09.000Z",
"endedAt": "2026-01-20T10:34:05.000Z",
"duration": 236,
"endReason": "hangup",
"analysis": {
"analyzedAt": "2026-01-20T10:35:12.000Z",
"sentiment": {
"overallSentiment": "positive",
"confidence": 0.86,
"summary": "Friendly and cooperative."
},
"humanContact": {
"reachedHuman": true,
"confidence": 0.97,
"reachedVoicemail": false
},
"objectives": {
"confirm": {
"status": "achieved",
"confidence": 0.9,
"reasoning": "Confirmed renewal."
}
}
}
}
],
"pagination": {
"page": 1,
"pageSize": 50,
"total": 150,
"totalPages": 3
},
"summary": {
"total": 150,
"completed": 120,
"failed": 10,
"active": 5,
"queued": 15
}
}

List campaign calls#

The calls belonging to one campaign, newest first. `summary` counts every call on the campaign, ignoring filters.

GET/api/v1/campaigns/{id}/calls

Path parameters

idstringrequired
Campaign id.

Query parameters

pagenumber
Page number.
Default1
pageSizenumber
Calls per page, up to 100.
Default50
statusstring
queued, in-progress, completed, failed, cancelled, unjoined, or any exact call status.
dateFromstring
ISO date, inclusive.
dateTostring
ISO date, inclusive.
minDurationnumber
Seconds, inclusive.
maxDurationnumber
Seconds, inclusive.
searchstring
Match a callee name or a phone number.
runIdstring
Only calls placed under this run.

Responses

A page of the campaign's calls.

curl -X GET "https://voice.evryhealth.com/api/v1/campaigns/{id}/calls" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"calls": [
{
"id": "5bbdd475-38f6-4211-9361-de482d105b81",
"campaignId": "357b188c-c618-4f95-84b1-cbe26b8ce3e0",
"campaignName": "Q1 Provider Outreach",
"phoneNumber": "+14155551234",
"calleeName": "Dr. John Smith",
"direction": "outbound",
"status": "completed",
"createdAt": "2026-01-20T10:30:00.000Z",
"initiatedAt": "2026-01-20T10:30:02.000Z",
"connectedAt": "2026-01-20T10:30:09.000Z",
"endedAt": "2026-01-20T10:34:05.000Z",
"duration": 236,
"endReason": "hangup"
}
],
"pagination": {
"page": 1,
"pageSize": 50,
"total": 500,
"totalPages": 10
},
"summary": {
"total": 500,
"completed": 420,
"failed": 30,
"active": 5,
"queued": 45
}
}

Queue calls#

Calls contacts already on the campaign, under its current run (opening one if none is running), through the same queue the product uses: the campaign's schedule decides when they are released. Name contacts with `contactIds`, or set `queueAllPending` to call every contact whose status is in `filter.callStatus` (default `not_called` and `failed`). Contacts already `queued` are never queued again. Contacts sharing a number are dialled once. Not for inbound campaigns.

POST/api/v1/campaigns/{id}/calls

Path parameters

idstringrequired
Campaign id.

Body

application/json
contactIds
string[] (or queueAllPending)
queueAllPending
boolean
filter
{ callStatus?: (not_called | called | reached | failed)[], maxAttempts?: number }
options
{ maxCalls?: number, priority?: 1-10 (1 dials first), scheduledFor?: ISO date-time in the future }

Responses

Queued. `skippedCount` counts contact ids not on the campaign and contacts with no number. `scheduledFor` is set when a call is held for later.

curl -X POST "https://voice.evryhealth.com/api/v1/campaigns/{id}/calls" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"queueAllPending": true,
"filter": {
"callStatus": [
"not_called",
"failed"
],
"maxAttempts": 3
},
"options": {
"maxCalls": 100,
"priority": 1
}
}'
Response202
{
"message": "1 calls queued successfully",
"queuedCount": 1,
"skippedCount": 0,
"campaignRunId": "9f8e7d6c-5b4a-4321-8fed-cba987654321",
"calls": [
{
"callId": "5bbdd475-38f6-4211-9361-de482d105b81",
"contactId": "e3c9a1b7-2d4f-4a6e-8b0c-1f2e3d4c5b6a",
"phoneNumber": "4155551234",
"status": "queued"
}
]
}

Get a call#

One call in full, with `summary` when one has been produced and `analysis` once the call has been analysed.

GET/api/v1/calls/{callId}

Path parameters

callIdstringrequired
Call id.

Responses

The call.

curl -X GET "https://voice.evryhealth.com/api/v1/calls/{callId}" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"id": "5bbdd475-38f6-4211-9361-de482d105b81",
"campaignId": "357b188c-c618-4f95-84b1-cbe26b8ce3e0",
"campaignName": "Q1 Provider Outreach",
"phoneNumber": "+14155551234",
"calleeName": "Dr. John Smith",
"direction": "outbound",
"status": "completed",
"createdAt": "2026-01-20T10:30:00.000Z",
"initiatedAt": "2026-01-20T10:30:02.000Z",
"connectedAt": "2026-01-20T10:30:09.000Z",
"endedAt": "2026-01-20T10:34:05.000Z",
"duration": 236,
"endReason": "hangup",
"summary": "The member confirmed they will renew before March.",
"analysis": {
"analyzedAt": "2026-01-20T10:35:12.000Z",
"sentiment": {
"overallSentiment": "positive",
"confidence": 0.86,
"summary": "Friendly and cooperative."
},
"humanContact": {
"reachedHuman": true,
"confidence": 0.97,
"reachedVoicemail": false
},
"objectives": {
"confirm": {
"status": "achieved",
"confidence": 0.9,
"reasoning": "Confirmed renewal."
}
}
}
}

Get a call transcript#

The conversation as messages in order. `role` is `agent`, `user` or `unknown`; `medium` is `voice` or `text`. A call that never connected has no messages.

GET/api/v1/calls/{callId}/transcript

Path parameters

callIdstringrequired
Call id.

Responses

The transcript. `duration` is the call's length in seconds.

curl -X GET "https://voice.evryhealth.com/api/v1/calls/{callId}/transcript" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"callId": "5bbdd475-38f6-4211-9361-de482d105b81",
"messages": [
{
"role": "agent",
"text": "Hello, is this Dr. Smith?",
"medium": "voice",
"ordinal": 0
},
{
"role": "user",
"text": "Speaking.",
"medium": "voice",
"ordinal": 1
}
],
"messageCount": 2,
"duration": 236
}

Get a call recording#

The call's recordings. `audioUrl` is the API path that streams the audio; it is absent when there is nothing to play.

GET/api/v1/calls/{callId}/recording

Path parameters

callIdstringrequired
Call id.

Responses

The recordings. `duration` is in seconds.

curl -X GET "https://voice.evryhealth.com/api/v1/calls/{callId}/recording" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"callId": "5bbdd475-38f6-4211-9361-de482d105b81",
"recordings": [
{
"sid": "RE0123456789abcdef0123456789abcdef",
"duration": 236,
"status": "completed",
"createdAt": "2026-01-20T10:34:06.000Z"
}
],
"recordingCount": 1,
"audioUrl": "/api/v1/calls/5bbdd475-38f6-4211-9361-de482d105b81/recording/audio"
}

Download the recording audio#

Streams the audio itself. Recordings of calls over the phone network come as MP3 by default or WAV with `format=wav`. Recordings the platform stores itself are only available as `audio/ogg`; naming a format for them is a 422.

GET/api/v1/calls/{callId}/recording/audio

Path parameters

callIdstringrequired
Call id.

Query parameters

recordingSidstring
Which recording, when a call has several. Defaults to the first.
formatstring
mp3 or wav. Only for calls over the phone network.
Defaultmp3

Responses

The audio itself: `audio/mpeg` by default, `audio/wav` with `format=wav`, or `audio/ogg` for recordings stored by the platform.

curl -X GET "https://voice.evryhealth.com/api/v1/calls/{callId}/recording/audio" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"contentType": "audio/mpeg",
"note": "Binary response, not JSON."
}

Cancel a call#

Cancels a call that is `queued`, `initiated` or `ringing`. A call that has connected or ended cannot be cancelled.

POST/api/v1/calls/{callId}/cancel

Path parameters

callIdstringrequired
Call id.

Responses

Cancelled.

curl -X POST "https://voice.evryhealth.com/api/v1/calls/{callId}/cancel" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"message": "Call cancelled successfully",
"callId": "5bbdd475-38f6-4211-9361-de482d105b81",
"previousStatus": "queued",
"newStatus": "cancelled"
}