API Reference · Campaigns
List contacts & calls
Returns every contact in a campaign, in the order they were added, with what happened when they were called — status, outcome, duration, the AI's summary and any error.
GET
/campaigns/{campaign_id}/callshttps://calling.ubiqproject.com/api/v1/campaigns/{campaign_id}/calls · Auth: API key (full or read-only)
Request
Path parameters
campaign_idstring (UUID)requiredThe campaign's ID.
No query parameters and no pagination — every contact is returned.
Request
curl https://calling.ubiqproject.com/api/v1/campaigns/9b4e6f12-8a3c-4d71-b05e-2f6a8c1d7e93/calls \
-H "Authorization: Bearer vk_live_YOUR_KEY"Response
Response · 200
{
"from_number": "+918046801234",
"calls": [
{
"id": "4c2e8a6f-1b3d-4f97-a05c-7e9d2b6f8a31",
"call_id": "b8f1d3a5-7c2e-4a64-9f08-3d5e7a1c9b62",
"name": "Rahul Verma",
"to": "+919876543210",
"from_number": "+918046801234",
"status": "done",
"outcome": "completed",
"ended_by": null,
"duration_sec": 96,
"recording_url": "/api/v1/calls/b8f1d3a5-7c2e-4a64-9f08-3d5e7a1c9b62/recording",
"summary": "Rahul confirmed he will pay the ₹4,500 EMI by 15 October.",
"cost_usd": 0.080412,
"retry_count": 0,
"started_at": "2026-10-08T09:15:12.640118+00:00",
"intent": "promise_to_pay",
"notes": "Salary comes on the 14th.",
"error": null,
"error_at": null,
"requeues": 0,
"next_attempt_at": null,
"created_at": "2026-10-08T09:14:22.530981+00:00"
},
{
"id": "7a9d1e3c-5f2b-4b86-8c40-2e6f9a3d7b15",
"call_id": null,
"name": "Anita Desai",
"to": "+919812345678",
"from_number": "+918046801234",
"status": "queued",
"outcome": "no_answer",
"ended_by": null,
"duration_sec": null,
"recording_url": null,
"summary": "",
"cost_usd": null,
"retry_count": 1,
"started_at": "2026-10-08T09:15:12.702264+00:00",
"intent": null,
"notes": null,
"error": null,
"error_at": null,
"requeues": 0,
"next_attempt_at": "2026-10-08T11:15:40.118027+00:00",
"created_at": "2026-10-08T09:14:22.531204+00:00"
}
]
}Response fields
from_numberstring | nullThe campaign's caller number. null when it uses the AI employee's own number.
calls[].idstring (UUID)The contact's ID within this campaign.
calls[].call_idstring | nullThe latest call to this contact. null until a call connects.
calls[].namestringFrom the contact's
name field, or the first field with “name” in its header.calls[].tostringThe number called.
calls[].statusstringqueued (waiting, including for a retry), in_progress, done (connected and finished), failed (out of attempts) or skipped_dnc (filtered out by your conditions — never called).calls[].outcomestring | nullWhat the line did, such as
completed, no_answer, busy, failed, voicemail, rescheduled, dnc or condition_filtered.calls[].intentstring | nullThe result Daffy Voice read from the transcript — one of your
config.outcomes keys, or a built-in one such as promise_to_pay.calls[].summarystringThe AI's summary of the call. Empty until the call is analysed.
calls[].notesstring | nullA short note taken from the call.
calls[].duration_secinteger | nullCall length in seconds.
calls[].recording_urlstring | nullPath of the call recording. It opens only with a dashboard login — an API key can't download it.
calls[].cost_usdnumber | nullEstimated AI cost of the call in US dollars, telephony excluded. Only filled for AI employees on the Ultravox model; null otherwise.
calls[].retry_countintegerRetries used so far (0 on the first attempt).
calls[].requeuesintegerTimes a workflow follow-up put this contact back in the queue (at most 3).
calls[].next_attempt_atstring | nullWhen the next attempt is due, for a queued retry or callback.
calls[].error, error_atstring | nullWhy the last attempt failed, in words, and when.
calls[].started_atstring | nullThe last attempt, or when the contact was added if never called.
calls[].created_atstringWhen the contact was added.
calls[].ended_bynullNot tracked yet — always null.
Times here use +00:00
Times in this response are UTC written with
+00:00 rather than Z. Both are standard ISO 8601.Errors
Responses
Campaign not found404No campaign with this ID in your company.
Invalid id400campaign_id isn't a UUID.