# Call Logs

> GET /forwarding/call-logs - page through forwarded calls with who answered, duration, status, outcome, cost and a recording link, and get a fresh recording link for one call.

Source: https://edesy.in/docs/call-forwarding/api/call-logs

```
GET /v1/forwarding/call-logs
```

`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

```bash
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"
```

```json
{
  "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

```
GET /v1/forwarding/calls/:call_sid/recording
```

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.

```json
{ "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](https://edesy.in/docs/call-forwarding/logs-and-recordings).
