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

FieldMeaning
refThe call's public reference, such as CA-482137. Quote it in a ticket; use id in the API.
startedAtWhen the call arrived, as a UTC instant.
statusThe carrier-level status: completed, no_answer, rejected, busy, failed and so on. Use outcome for reporting and status for debugging.
outcomeOne word per call — see Outcomes.
callerNumberThe caller's number in E.164. null when the caller hid it.
dialedNumberThe tracking number that was dialled.
campaign, publisher, buyer, targetAn { 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.
talkSecondsSeconds the caller spent talking to the buyer, counted from the moment the buyer's leg answered.
ringSecondsSeconds spent ringing before an answer.
convertedWhether the call earned its price. See Conversions and adjustments.
revenueCents, payoutCents, profitCentsThe 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.
usageCentsWhat the platform charged your wallet for the call's connected minutes.
reasonCode, reasonSentenceSet only on an unrouted call: one of the eleven unrouted reason codes, and the sentence the router stored for it as the call happened.
hasRecordingWhether there is audio to play. See Recordings.
tagsThe call's tags as a flat object of strings.
Opening one call adds the waterfall, the tag sources, the frozen terms and the recordings. That is The call waterfall.

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:

OutcomeThe call…
liveHas not ended yet.
convertedEarned its price: the buyer's duration threshold was met, the buyer posted a conversion, or you marked it by hand.
unroutedEnded under an unrouted reason code. This holds even if the campaign's fallback number answered it — a fallback answer is not a buyer connection.
connectedWas answered by a buyer and did not convert.
missedEnded 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.

FilterAcceptsNotes
from, toISO 8601 instantDefault: 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.
tzIANA zoneDefaults to the workspace's time zone. An unknown zone is a 400, never a silent fall back to UTC.
campaignId, publisherId, buyerId, targetId, numberIdUUIDA malformed id here is a 400 naming the field.
statusA call statuscompleted, no_answer, busy, rejected, failed, abandoned and the in-progress statuses.
outcomeconnected, converted, unrouted, missed, liveSee above.
minTalk, maxTalkSeconds, 0 to 86,400minTalk must not exceed maxTalk.
callerAt least 4 digitsA 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".
tagKeyLetters, digits, dot, dash, underscore; 64 at mostOn its own: the call carries that tag.
tagValueUp to 512 charactersNeeds tagKey. Exact match.
reasonAn unrouted reason codeOnly the eleven codes a call can end on. A skip code such as capped is a 400, because no call ends under one.
hasRecordingtrue 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.
  • connectRate is connected ÷ calls and conversionRate is converted ÷ connected. Both are fractions to four places, and both are null — not 0 — when there is nothing to divide by.
  • revenueCents, payoutCents, profitCents, usageCents — sums, in integer cents.
  • avgTalkSeconds is over connected calls only. totalTalkSeconds is their sum.

Sorting and paging

  • sort takes startedAt (the default), talkSeconds or billedCents. Anything else falls back to startedAt. dir is asc or desc, and desc is the default.
  • page starts at 1. pageSize defaults 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"
200 OK (one row shown)
{
  "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.

Next steps