Call log
The call log, the Calls page in the Bird dashboard, is your workspace's call history: every call it attempted, whether the call connected, rang out, or was refused. Each one lands here as a call detail record (a CDR), newest first. Use it to confirm a call went out, see how long it lasted, read the SIP response it ended on, and check what it cost.
Bird writes each record when the call ends, so every call in the log has a final outcome. The Live tab beside it holds the calls that are still up.
The call list
Each row is one call:
| Column | What it shows |
|---|---|
| Status | How the call ended (see Statuses), as a color-coded indicator |
| From | The calling number, the caller ID your equipment presented |
| To | The number that was called |
| Direction | Outbound, for the calls your equipment placed |
| Duration | Total length of the call, from the moment Bird received it to hangup |
| Started | When Bird received the call |
The list is paginated, 25 calls per page. Select any row to open the call.
Live calls
The Live tab lists the calls on your trunks right now, and carries a count so you can see how many are up without opening it. A live call holds one of two statuses:
| Status | What is happening |
|---|---|
| Ringing | The call reached a carrier, and the number you called has not picked up yet |
| In progress | The number you called picked up, and the call is connected |
The columns are the call log's, except Duration, which reads Elapsed here and counts up: from the answer once the call is connected, from the start while it is still ringing. The tab re-reads itself every few seconds. A call leaves it when it ends and lands in the call log with a final outcome.
Searching and filtering
The page leads with a number search and its filters. They combine: a status filter plus a date range narrows to the calls matching both.
Search by number. The search box matches a number against either side of the call, so one query finds the calls to it and the calls from it.
Direction. Filter to outbound or inbound calls.
Status. Filter to one of answered, no answer, failed, rejected, or unknown. Each is defined in Statuses. On the Live tab the choices are ringing and in progress.
Date. On the call log, pick a preset (the last 24 hours, 7 days, or 30 days) or choose a custom range on the calendar.
Usage this month
Three tiles sit above the list, covering the running calendar month in UTC:
| Tile | What it counts |
|---|---|
| Calls | Completed call records in the month, including unanswered and refused ones |
| Total duration | Every call's full length added up, from the moment Bird received it to hangup |
| Billable time | Every call's answered time added up |
The gap between total duration and billable time is ring time nobody picked up, so a large gap is worth a look at what you are dialing. A call nobody answered costs you nothing.
Billable time is a duration, not a bill: each call is priced on its own destination and charged on time rounded up to that rate's billing increment. Cost and billing covers how a call is priced.
These tiles cover the whole month whatever you filter the list to.
Statuses
A call in the log ended with one of these outcomes:
| Status | What happened |
|---|---|
| Answered | The number you called picked up. Billable time is answer to hangup |
| No answer | The call reached the number you called and rang out without being answered |
| Failed | The call did not complete. Either a carrier failed it, or Bird refused it before dialing one |
| Rejected | The carrier declined the call outright rather than failing it |
| Unknown | The outcome could not be determined, for example when no final response ever arrived |
A busy number is recorded as Failed, with the carrier's 486 in the SIP response. A call Bird refused is recorded as Failed too, carrying a rejection reason that names the check it failed, which is what tells the two apart. Rejected calls covers every reason and its fix.
If you read these values from your own tooling, match the ones you handle and treat any other as a status you do not handle rather than an error.
Inspecting a call
Opening a call shows what Bird recorded about it:
| Field | What it tells you |
|---|---|
| Status | The call's outcome (see Statuses). A refused call also shows the reason and what to do about it |
| SIP response | The call's final SIP code, for example 200 or 486. A call Bird refused carries 503, with no carrier involved |
| From / To | Both numbers, each copyable |
| Trunk | Which SIP trunk the call came in on, useful when several sites share a workspace |
| Started | When Bird received the call |
| Answered | When the call was picked up, or Not answered |
| Ended | When the call was torn down |
| Call ID | The record's own id (vcl_…). Quote this to support, and use it to correlate with your own logs |
| Session ID | Shared by every leg of a transferred or multi-party call (vcs_…), so related records can be grouped |
| Billing | Billable time, total duration, and the call's cost once it has been rated |
Rejected calls
Bird checks a call against your account before it dials a carrier: the caller ID it presents, the destination, your limits, and your balance. A call that fails one of those checks is refused, and no carrier is ever involved.
Your phone system sees a plain SIP 503, and the specific reason goes onto the call record where only you can read it. That keeps someone probing your trunk from learning which trunks, numbers, and destinations exist. Open the call: a panel above the details names the cause and links straight to the setting that fixes it.
Reasons you can fix
| Reason | What happened | What to do |
|---|---|---|
| source_not_allowed | The call arrived from an address the trunk's IP allow list does not cover | Add the address your phone system sends from to the trunk |
| caller_id_not_verified | The number in the From header is not a verified caller ID for this workspace | Verify that number, or present one already verified |
| destination_not_enabled | Calling to that country is switched off for your workspace | Turn the country on under Destinations |
| insufficient_balance | Your wallet did not cover the call, so Bird refused it up front | Top up, or turn on automatic top-ups so a low balance does not interrupt calling |
| daily_spend_exceeded | The call would have passed your organization's daily voice spend ceiling | Wait for the ceiling to reset at the start of the next UTC day, or ask Bird to raise it |
| concurrent_calls_exceeded | You have as many calls in progress as your account allows | Wait for a call to end, or contact support to raise the ceiling |
| calls_per_second_exceeded | You placed new calls faster than your account allows | Slow your dial rate, then retry. Retrying immediately gets the same answer |
A campaign dialer can hit calls_per_second_exceeded while nowhere near the concurrent-call ceiling, so check which of the two you got before changing anything.
Reasons Bird resolves for you
These sit on Bird's side of the setup. Contact support and quote the Call ID from the record:
| Reason | What happened |
|---|---|
| routing_not_configured | Your workspace's routing is still being attached, which is expected while a new voice setup is being completed |
| no_route_found | Routing is attached, and the number you dialed sits outside what it currently covers. An available country can still have destinations inside it that routing does not reach yet |
| destination_blocked | Bird's routing configuration blocks calls to that destination |
| call_not_permitted | Bird could not complete the call for your account, so it refused the call rather than place it on unknown terms |
How a refusal reads
A refused call is recorded as Failed, the same status as a call that reached a carrier and failed there. The rejection reason is what separates them, because only a Bird refusal carries one:
- Failed with a rejection reason. Bird refused the call, and the reason names the check it failed. SIP response is the 503 your phone system saw, so the code says nothing about the cause on its own.
- Failed with no rejection reason. The call reached a carrier and failed there, and SIP response carries the carrier's own code. A 486 is a busy number, a 404 an unallocated one.
So the first question on a failing call is whether it carries a rejection reason. One points at a setting, on your side or Bird's; the other usually points at the number you dialed.
Rejected is a third outcome, and it is not this one: it means the carrier declined the call outright rather than failing it.
A call Bird cannot admit at all is turned away before a record exists, so it never reaches the log. Voice troubleshooting covers those calls.
Getting the records out
Three ways to work with these records outside the dashboard:
- Export CSV. Download CSV on the Call log tab exports every record matching your current filters, not only the visible page. Use it for reconciliation and ad-hoc reporting.
- Read them from the terminal. With the Bird CLI, bird voice list lists the same records and bird voice get returns one; bird voice stats carries the daily, hourly, and per-country aggregates. Agents get the same reads over the MCP server.
- Subscribe to the events. voice_call.initiated, voice_call.answered, and voice_call.ended are pushed to your endpoint as calls happen, so your own systems stay current without polling. See Voice events.
Next steps
| Page | What it covers |
|---|---|
| Voice events | The three call events, their payloads, and how to consume them |
| Placing calls | What Bird expects on the INVITE, and how a call is priced |
| SIP trunks | The IP allow list, allowed API keys, and Digest settings |
| Voice destinations | Enabling countries, and what availability means |
| Errors | The API error envelope and its recovery fields |