GET/v1/forwarding/call-logs returns every call that came in on your forwarding numbers, newest first, with the caller, who answered, duration, billed duration, status, outcome, cost and a ready-to-play recording link. Filter by rule, status and date, and page through with page and per_page.
Query parameters#
| Name | Type | Description |
|---|---|---|
rule_id |
uuid | Only calls for this rule |
status |
string | initiated, answered, completed, busy, no-answer, canceled or failed |
start_date |
RFC 3339 | Calls on or after this time, e.g. 2026-10-01T00:00:00+05:30 |
end_date |
RFC 3339 | Calls before this time |
page |
integer | Page number from 1. Default 1 |
per_page |
integer | Results per page. Default 20 |
A date in any other format is ignored, and you get unfiltered results rather than an error.
Example#
curl "https://voice-api.edesy.in/v1/forwarding/call-logs?start_date=2026-10-01T00:00:00Z&per_page=20" \
-H "Authorization: Bearer sk_your_api_key"
{
"data": [
{
"id": "0c9e7d52-1a3b-4f68-8e24-5b7a9c1d3e60",
"rule_id": "3f2b8c1e-7d4a-4e59-9b21-6a0c5d8e1f47",
"caller_number": "9988776655",
"did_number": "8071387146",
"connected_number": "9876543210",
"strategy": "sequential",
"status": "completed",
"started_at": "2026-10-16T09:31:02Z",
"answered_at": "2026-10-16T09:31:09Z",
"ended_at": "2026-10-16T09:33:15Z",
"duration_sec": 126,
"bill_duration_sec": 180,
"price": 3,
"price_unit": "INR",
"recording_url": "https://voice-api.edesy.in/v1/public/recordings/forwarding/CALL_SID?t=SIGNED_TOKEN",
"created_at": "2026-10-16T09:31:02Z"
}
],
"meta": { "total": 1, "page": 1, "per_page": 20, "total_pages": 1, "timestamp": "2026-10-16T09:35:00Z" }
}
Fields#
| Field | Description |
|---|---|
id |
Id of the call log row |
rule_id |
The forwarding rule that handled the call |
caller_number |
The real caller |
did_number |
Your virtual number that was called |
connected_number |
The forward-to number that answered, when known |
strategy |
simultaneous or sequential at the time of the call |
status |
initiated, answered, completed, busy, no-answer, canceled or failed |
started_at, answered_at, ended_at |
UTC timestamps |
duration_sec |
Call length in seconds |
bill_duration_sec |
Billed seconds, rounded up to whole minutes |
price, price_unit |
What the call cost, in INR |
recording_url |
Signed link to the MP3, valid for 1 hour, no API key needed |
hangup_cause |
Why a call did not connect: busy, rejected, no_answer, unavailable, invalid_number, call_blocked, network_timeout, carrier_error, caller_canceled, call_failed |
sip_status |
SIP response code for a call that did not connect |
call_outcome |
Who or what the call ended at: answered, callee, unreachable, invalid_number, network, account, platform |
created_at |
When the row was written |
Fields with no value (answered_at, ended_at, connected_number, recording_url, hangup_cause) are left out. A call no destination answered is busy, no-answer or failed even when hold audio played; hangup_cause gives the reason.
Get a recording link#
A fresh, ready-to-play link to one call's recording, valid for 1 hour. call_sid is the call's SID from the call log.
{ "data": { "url": "https://voice-api.edesy.in/v1/public/recordings/forwarding/CALL_SID?t=SIGNED_TOKEN", "call_sid": "CALL_SID" }, "meta": { "timestamp": "2026-10-16T09:35:00Z" } }
404 not_found when there is no such call in your workspace or the call was not recorded.
See also Logs and Recordings.