The call log
Find any call in the workspace — routed or not — with the filters, the outcome vocabulary and the totals that describe exactly the calls you are looking at.
After this page you can find any call your workspace has received, narrow the log to the calls that answer a question, and read the totals that sit above it. The same log is on the Calls page of the console and on GET /api/v1/calls, and both are served by one query, so they cannot disagree.
The log holds every call that reached one of your tracking numbers, and every call a publisher won at auction on one of your campaigns. That includes the calls that were not routed: a call that met a closed campaign, a full cap or an empty wallet is still a row, with the reason code it ended under. A log that leaves out the calls that went nowhere cannot answer the question people ask it most.
What a row holds
| Field | Meaning |
|---|---|
ref | The call's public reference, such as CA-482137. Quote it in a ticket; use id in the API. |
startedAt | When the call arrived, as a UTC instant. |
status | The carrier-level status: completed, no_answer, rejected, busy, failed and so on. Use outcome for reporting and status for debugging. |
outcome | One word per call — see Outcomes. |
callerNumber | The caller's number in E.164. null when the caller hid it. |
dialedNumber | The tracking number that was dialled. |
campaign, publisher, buyer, target | An { id, name } pair each, as frozen on the call. A buyer you rename or delete later still reads as it did; id becomes null once the record is gone. publisher is null for your own media, and buyer and target are null when nobody took the call. |
talkSeconds | Seconds the caller spent talking to the buyer, counted from the moment the buyer's leg answered. |
ringSeconds | Seconds spent ringing before an answer. |
converted | Whether the call earned its price. See Conversions and adjustments. |
revenueCents, payoutCents, profitCents | The call's books: what the buyer owes you, what you owe the publisher, and the difference. These are records, not transfers — see books-only money. |
usageCents | What the platform charged your wallet for the call's connected minutes. |
reasonCode, reasonSentence | Set only on an unrouted call: one of the eleven unrouted reason codes, and the sentence the router stored for it as the call happened. |
hasRecording | Whether there is audio to play. See Recordings. |
tags | The call's tags as a flat object of strings. |
Outcomes
A carrier status says how a phone call ended. It does not say whether you sold it. outcome does, in one word, chosen most specific first:
| Outcome | The call… |
|---|---|
live | Has not ended yet. |
converted | Earned its price: the buyer's duration threshold was met, the buyer posted a conversion, or you marked it by hand. |
unrouted | Ended under an unrouted reason code. This holds even if the campaign's fallback number answered it — a fallback answer is not a buyer connection. |
connected | Was answered by a buyer and did not convert. |
missed | Ended with no buyer answering and no unrouted reason — typically the caller hung up while a target was ringing. |
Filters
Filters combine with AND. The same vocabulary drives the call log, its CSV export and every report, so a filter you build here can be pasted into a report unchanged.
| Filter | Accepts | Notes |
|---|---|---|
from, to | ISO 8601 instant | Default: the last 7 days on the workspace's calendar, up to now. from must not be after to, and the span is at most 366 days. |
tz | IANA zone | Defaults to the workspace's time zone. An unknown zone is a 400, never a silent fall back to UTC. |
campaignId, publisherId, buyerId, targetId, numberId | UUID | A malformed id here is a 400 naming the field. |
status | A call status | completed, no_answer, busy, rejected, failed, abandoned and the in-progress statuses. |
outcome | connected, converted, unrouted, missed, live | See above. |
minTalk, maxTalk | Seconds, 0 to 86,400 | minTalk must not exceed maxTalk. |
caller | At least 4 digits | A full number — E.164, or 10 or 11 digits — is matched exactly. Anything shorter matches the end of the number, which is how a caller is described on a support call: "the one ending 0142". |
tagKey | Letters, digits, dot, dash, underscore; 64 at most | On its own: the call carries that tag. |
tagValue | Up to 512 characters | Needs tagKey. Exact match. |
reason | An unrouted reason code | Only the eleven codes a call can end on. A skip code such as capped is a 400, because no call ends under one. |
hasRecording | true or false |
The totals above the list
Every answer carries a stats block computed over the same filter as the rows, across every page and not only the one you hold. total is stats.count. So the tiles above the table are always about the table.
count,connected,converted,unrouted— counts, by the definitions in the Metrics glossary.connectRateis connected ÷ calls andconversionRateis converted ÷ connected. Both are fractions to four places, and both arenull— not0— when there is nothing to divide by.revenueCents,payoutCents,profitCents,usageCents— sums, in integer cents.avgTalkSecondsis over connected calls only.totalTalkSecondsis their sum.
Sorting and paging
sorttakesstartedAt(the default),talkSecondsorbilledCents. Anything else falls back tostartedAt.dirisascordesc, anddescis the default.pagestarts at 1.pageSizedefaults to 25 and is capped at 200; a larger value is clamped, not refused.- To pull a whole window, use the CSV export rather than paging. It streams up to 100,000 rows and does not shift under you while new calls arrive.
Worked example: yesterday's unrouted calls
Acme Health's campaign looked quiet yesterday. The question is whether calls did not arrive, or arrived and went nowhere. Ask the log for the unrouted calls of that day, with the window written as instants so that the day is Chicago's and not UTC's. This needs a key with the calls:read scope — see API keys.
curl -G "https://api.buy3.io/api/v1/calls" \
-H "Authorization: Bearer $BUY3_API_KEY" \
--data-urlencode "outcome=unrouted" \
--data-urlencode "from=2026-09-19T05:00:00Z" \
--data-urlencode "to=2026-09-20T05:00:00Z" \
--data-urlencode "pageSize=50"{
"data": [
{
"id": "7c1d0e9a-4b2f-4a63-8d15-9e0f1a2b3c4d",
"ref": "CA-482201",
"startedAt": "2026-09-19T21:14:02.000Z",
"status": "no_answer",
"outcome": "unrouted",
"callerNumber": "+14155550142",
"dialedNumber": "+18885550100",
"campaign": { "id": "6a2d1f0e-8b7c-4c55-a1d3-0e9f8a7b6c5d", "name": "Medicare — Inbound" },
"publisher": { "id": "c4e1a2b3-9d8f-4f6e-b5a4-1c2d3e4f5a6b", "name": "Northwind Media" },
"buyer": null,
"target": null,
"talkSeconds": 0,
"ringSeconds": 0,
"converted": false,
"revenueCents": 0,
"payoutCents": 0,
"profitCents": 0,
"usageCents": 0,
"reasonCode": "campaign_closed",
"reasonSentence": "The call arrived outside the campaign's hours of operation.",
"hasRecording": false,
"tags": {
"dialed_number": "+18885550100",
"publisher": "Northwind Media",
"caller_area_code": "415",
"caller_state": "CA"
}
}
],
"page": 1,
"pageSize": 50,
"total": 14,
"totalPages": 1,
"stats": {
"count": 14, "connected": 0, "converted": 0, "unrouted": 14,
"connectRate": 0, "conversionRate": null,
"revenueCents": 0, "payoutCents": 0, "profitCents": 0, "usageCents": 0,
"avgTalkSeconds": 0, "totalTalkSeconds": 0
},
"from": "2026-09-19T05:00:00.000Z",
"to": "2026-09-20T05:00:00.000Z",
"timezone": "America/Chicago"
}Fourteen calls arrived and all fourteen ended campaign_closed. The traffic was fine; the campaign's hours were wrong. Note connectRate is 0 — calls arrived and none connected — while conversionRate is null, because nothing connected for it to be a rate of. To see which reasons cost the most over a longer period, group a report by reason instead: see Report builder.
Who can read the log
- Owners and admins of the workspace, in the console. A workspace whose plan has lapsed can still read its log; it cannot change anything.
- An API key with
calls:read. A key acts as its workspace and sees only that workspace's tracking calls. - A publisher never sees this log. Their portal lists their own calls, with your buyers, your revenue and your margin left out. See Publisher portal.
