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}/calls

https://calling.ubiqproject.com/api/v1/campaigns/{campaign_id}/calls · Auth: API key (full or read-only)

Request

Path parameters

campaign_idstring (UUID)required
The 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 | null
The 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 | null
The latest call to this contact. null until a call connects.
calls[].namestring
From the contact's name field, or the first field with “name” in its header.
calls[].tostring
The number called.
calls[].statusstring
queued (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 | null
What the line did, such as completed, no_answer, busy, failed, voicemail, rescheduled, dnc or condition_filtered.
calls[].intentstring | null
The result Daffy Voice read from the transcript — one of your config.outcomes keys, or a built-in one such as promise_to_pay.
calls[].summarystring
The AI's summary of the call. Empty until the call is analysed.
calls[].notesstring | null
A short note taken from the call.
calls[].duration_secinteger | null
Call length in seconds.
calls[].recording_urlstring | null
Path of the call recording. It opens only with a dashboard login — an API key can't download it.
calls[].cost_usdnumber | null
Estimated AI cost of the call in US dollars, telephony excluded. Only filled for AI employees on the Ultravox model; null otherwise.
calls[].retry_countinteger
Retries used so far (0 on the first attempt).
calls[].requeuesinteger
Times a workflow follow-up put this contact back in the queue (at most 3).
calls[].next_attempt_atstring | null
When the next attempt is due, for a queued retry or callback.
calls[].error, error_atstring | null
Why the last attempt failed, in words, and when.
calls[].started_atstring | null
The last attempt, or when the contact was added if never called.
calls[].created_atstring
When the contact was added.
calls[].ended_bynull
Not 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 found404
No campaign with this ID in your company.
Invalid id400
campaign_id isn't a UUID.