Call logs show
GET
https://app.sulus.ai/api/call-logs/{callId}
Retrieve one call log and its structured conversation
Authentication
Send a bearer token created on your dashboard's Developer page:
Authorization: Bearer <YOUR_API_KEY>
Path parameters
callId
string
Required
Public call identifier (not the numeric primary key).
Validation:
must match call_logs.call_id for a row in the caller's content-protection scopeStored in
call_logs.call_idErrors
| Status | Meaning | Body |
|---|---|---|
401 |
Missing or invalid bearer token | |
403 |
Feature call_logs not enabled for the account | {"message":"This feature is not enabled for your account. Please contact your administrator.","feature":"call_logs"} |
404 |
No call_id in scope | {"success":false,"message":"Call log not found"} |
Notes
- Lookup is where(call_id, {callId}) under contentProtection — numeric id in the path will 404 unless it happens to equal call_id.
- End-user example omits cost, currency, metadata, webhook_data, and nested assistant (stripped in the controller).
- Content admins also receive cost, currency, metadata, webhook_data, and nested assistant (including assistants.vapi_assistant_id and the Assistants-module alias assistant_id on that nested object). Raw metadata/webhook_data payloads are omitted from examples.
- Empty transcript yields conversation: {conversation:[], total_messages:0, participants:[]} with no summary key.
- Speaker lines matching AI|User|Assistant|Customer|Bot are normalised to Assistant or Customer; timestamp on each message is always null today.
curl --request GET \
--url https://app.sulus.ai/api/call-logs/{callId} \
--header 'Authorization: Bearer <YOUR_API_KEY>'
import requests
url = "https://app.sulus.ai/api/call-logs/{callId}"
headers = {"Authorization": "Bearer <YOUR_API_KEY>"}
response = requests.get(url, headers=headers)
print(response.json())
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
url := "https://app.sulus.ai/api/call-logs/{callId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <YOUR_API_KEY>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
Response
200
{
"success": true,
"data": {
"id": 1842,
"call_id": "call_01hxyz9abcdeFGHIjklmnopq",
"assistant_id": 57,
"user_id": 12,
"reseller_id": "9f3c2a10-5b6d-4e8f-9a1b-2c3d4e5f6789",
"workspace_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"phone_number": "+14155550100",
"caller_number": "+14155550199",
"duration": 142,
"status": "completed",
"direction": "inbound",
"start_time": "2026-07-30T14:02:11.000000Z",
"end_time": "2026-07-30T14:04:33.000000Z",
"transcript": "Assistant: Thanks for calling. How can I help?\nCustomer: What is your return policy?\nAssistant: You can return items within 30 days with a receipt.",
"summary": "Caller asked about return policy; assistant confirmed 30-day window.",
"call_record_file_name": "rec_01hxyz9abcdeFGHIjklmnopq.mp3",
"created_at": "2026-07-30T14:04:40.000000Z",
"updated_at": "2026-07-30T14:04:40.000000Z",
"has_recording": true,
"public_audio_url": "https://app.example.com/play/rec_01hxyz9abcdeFGHIjklmnopq.mp3",
"public_audio_player_url": "https://app.example.com/p/rec_01hxyz9abcdeFGHIjklmnopq.mp3",
"assistant_name": "Front Desk",
"assistant_phone": "+14155550100"
},
"conversation": {
"conversation": [
{
"id": 1,
"speaker": "Assistant",
"message": "Thanks for calling. How can I help?",
"timestamp": null,
"original_speaker": "Assistant"
},
{
"id": 2,
"speaker": "Customer",
"message": "What is your return policy?",
"timestamp": null,
"original_speaker": "Customer"
},
{
"id": 3,
"speaker": "Assistant",
"message": "You can return items within 30 days with a receipt.",
"timestamp": null,
"original_speaker": "Assistant"
}
],
"total_messages": 3,
"participants": [
"Assistant",
"Customer"
],
"summary": {
"assistant_messages": 2,
"customer_messages": 1
}
}
}
Response — GET
/call-logs/{callId}
200
{
"success": true,
"data": {
"id": 1842,
"call_id": "call_01hxyz9abcdeFGHIjklmnopq",
"assistant_id": 57,
"user_id": 12,
"reseller_id": "9f3c2a10-5b6d-4e8f-9a1b-2c3d4e5f6789",
"workspace_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"phone_number": "+14155550100",
"caller_number": "+14155550199",
"duration": 142,
"status": "completed",
"direction": "inbound",
"start_time": "2026-07-30T14:02:11.000000Z",
"end_time": "2026-07-30T14:04:33.000000Z",
"transcript": "Assistant: Thanks for calling. How can I help?\nCustomer: What is your return policy?\nAssistant: You can return items within 30 days with a receipt.",
"summary": "Caller asked about return policy; assistant confirmed 30-day window.",
"call_record_file_name": "rec_01hxyz9abcdeFGHIjklmnopq.mp3",
"created_at": "2026-07-30T14:04:40.000000Z",
"updated_at": "2026-07-30T14:04:40.000000Z",
"has_recording": true,
"public_audio_url": "https://app.example.com/play/rec_01hxyz9abcdeFGHIjklmnopq.mp3",
"public_audio_player_url": "https://app.example.com/p/rec_01hxyz9abcdeFGHIjklmnopq.mp3",
"assistant_name": "Front Desk",
"assistant_phone": "+14155550100"
},
"conversation": {
"conversation": [
{
"id": 1,
"speaker": "Assistant",
"message": "Thanks for calling. How can I help?",
"timestamp": null,
"original_speaker": "Assistant"
},
{
"id": 2,
"speaker": "Customer",
"message": "What is your return policy?",
"timestamp": null,
"original_speaker": "Customer"
},
{
"id": 3,
"speaker": "Assistant",
"message": "You can return items within 30 days with a receipt.",
"timestamp": null,
"original_speaker": "Assistant"
}
],
"total_messages": 3,
"participants": [
"Assistant",
"Customer"
],
"summary": {
"assistant_messages": 2,
"customer_messages": 1
}
}
}