List unified calls
curl --request GET \
--url https://dashboard.ondial.ai/api/v1/calls \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://dashboard.ondial.ai/api/v1/calls', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://dashboard.ondial.ai/api/v1/calls"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"calls": [
{
"id": "<string>",
"direction": "inbound",
"callId": "<string>",
"callSessionId": "<string>",
"callSid": "<string>",
"status": "<string>",
"outcome": "<string>",
"startedAt": "<string>",
"endedAt": "<string>",
"durationSeconds": 123,
"fromNumber": "<string>",
"toNumber": "<string>",
"agentId": "<string>",
"agentName": "<string>",
"campaignId": "<string>",
"contactId": "<string>",
"billingStatus": "pending",
"creditsCharged": 123,
"creditsError": "<string>",
"balanceAfter": 123,
"hasTranscript": true,
"hasAnalysis": true,
"hasRecording": true,
"summary": "<string>"
}
],
"pagination": {}
}{
"error": "Invalid or inactive API key",
"reasonCode": "unauthorized"
}{
"error": "Insufficient scope",
"reasonCode": "forbidden",
"missing": [
"calls:read"
]
}List calls
Unified inbound + outbound call feed for the API-key tenant.
GET
/
api
/
v1
/
calls
List unified calls
curl --request GET \
--url https://dashboard.ondial.ai/api/v1/calls \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://dashboard.ondial.ai/api/v1/calls', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://dashboard.ondial.ai/api/v1/calls"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"calls": [
{
"id": "<string>",
"direction": "inbound",
"callId": "<string>",
"callSessionId": "<string>",
"callSid": "<string>",
"status": "<string>",
"outcome": "<string>",
"startedAt": "<string>",
"endedAt": "<string>",
"durationSeconds": 123,
"fromNumber": "<string>",
"toNumber": "<string>",
"agentId": "<string>",
"agentName": "<string>",
"campaignId": "<string>",
"contactId": "<string>",
"billingStatus": "pending",
"creditsCharged": 123,
"creditsError": "<string>",
"balanceAfter": 123,
"hasTranscript": true,
"hasAnalysis": true,
"hasRecording": true,
"summary": "<string>"
}
],
"pagination": {}
}{
"error": "Invalid or inactive API key",
"reasonCode": "unauthorized"
}{
"error": "Insufficient scope",
"reasonCode": "forbidden",
"missing": [
"calls:read"
]
}Requires scope
calls:read (granted by default on new keys).
Use this for HMS call-log UIs and webhook catch-up. Each row includes billingStatus (pending | charged | failed | skipped). Credits are often still pending right after an inbound call/end — bill lands async via carrier hangup or inbound-billing.
Query params: direction, status, agentId, campaignId, startedAfter, startedBefore, page, limit.
See Healthcare HMS integration.Authorizations
Paste only your API key (ond_live_… or ond_test_…). Do not type the word Bearer — the playground adds it.
Query Parameters
Available options:
inbound, outbound Required range:
x <= 100Response
Call list
Hide child attributes
Hide child attributes
Available options:
inbound, outbound Available options:
pending, charged, failed, skipped 
