> ## Documentation Index
> Fetch the complete documentation index at: https://www.cometchat.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Call Logs

> CometChat Calling SDK v5 - Call Logs for Flutter

Retrieve call history for your application. Call logs provide detailed information about past calls including duration, participants, recordings, and status.

## Fetch Call Logs

Use `CallLogRequest` to fetch call logs with pagination support. The builder pattern allows you to filter results by various criteria.

```dart theme={null}
CallLogRequest callLogRequest = CallLogRequest.CallLogRequestBuilder()
    .setLimit(30)
    .build();

callLogRequest.fetchNext(
  onSuccess: (List<CallLog> callLogs) {
    for (CallLog callLog in callLogs) {
      debugPrint("Session: ${callLog.sessionID}");
      debugPrint("Duration: ${callLog.totalDuration}");
      debugPrint("Status: ${callLog.status}");
    }
  },
  onError: (CometChatCallsException e) {
    debugPrint("Error: ${e.message}");
  },
);
```

## CallLogRequestBuilder

Configure the request using the builder methods:

| Method                     | Type   | Description                                                      |
| -------------------------- | ------ | ---------------------------------------------------------------- |
| `setLimit(int)`            | int    | Number of call logs to fetch per request (default: 30, max: 100) |
| `setSessionType(String)`   | String | Filter by call type: `video` or `audio`                          |
| `setCallStatus(String)`    | String | Filter by call status                                            |
| `setHasRecording(bool)`    | bool   | Filter calls that have recordings                                |
| `setCallCategory(String)`  | String | Filter by category: `call` or `meet`                             |
| `setCallDirection(String)` | String | Filter by direction: `incoming` or `outgoing`                    |
| `setUid(String)`           | String | Filter calls with a specific user                                |
| `setGuid(String)`          | String | Filter calls with a specific group                               |

### Filter Examples

```dart theme={null}
// Fetch only video calls
CallLogRequest videoCallsRequest = CallLogRequest.CallLogRequestBuilder()
    .setSessionType("video")
    .setLimit(20)
    .build();

// Fetch calls with recordings
CallLogRequest recordedCallsRequest = CallLogRequest.CallLogRequestBuilder()
    .setHasRecording(true)
    .build();

// Fetch missed incoming calls
CallLogRequest missedCallsRequest = CallLogRequest.CallLogRequestBuilder()
    .setCallStatus("missed")
    .setCallDirection("incoming")
    .build();

// Fetch calls with a specific user
CallLogRequest userCallsRequest = CallLogRequest.CallLogRequestBuilder()
    .setUid("user_id")
    .build();
```

## Pagination

Use `fetchNext()` and `fetchPrevious()` for pagination:

```dart theme={null}
// Fetch next page
callLogRequest.fetchNext(
  onSuccess: (List<CallLog> callLogs) {
    // Handle next page
  },
  onError: (CometChatCallsException e) {
    debugPrint("Error: ${e.message}");
  },
);

// Fetch previous page
callLogRequest.fetchPrevious(
  onSuccess: (List<CallLog> callLogs) {
    // Handle previous page
  },
  onError: (CometChatCallsException e) {
    debugPrint("Error: ${e.message}");
  },
);
```

## CallLog Object

Each `CallLog` object contains detailed information about a call:

| Property                 | Type                   | Description                            |
| ------------------------ | ---------------------- | -------------------------------------- |
| `sessionID`              | String                 | Unique identifier for the call session |
| `initiator`              | CallEntity             | User who initiated the call            |
| `receiver`               | CallEntity             | User or group that received the call   |
| `receiverType`           | String                 | `user` or `group`                      |
| `type`                   | String                 | Call type: `video` or `audio`          |
| `status`                 | String                 | Final status of the call               |
| `callCategory`           | String                 | Category: `call` or `meet`             |
| `initiatedAt`            | int                    | Timestamp when call was initiated      |
| `endedAt`                | int                    | Timestamp when call ended              |
| `totalDuration`          | String                 | Human-readable duration (e.g., "5:30") |
| `totalDurationInMinutes` | double                 | Duration in minutes                    |
| `totalAudioMinutes`      | double                 | Audio duration in minutes              |
| `totalVideoMinutes`      | double                 | Video duration in minutes              |
| `totalParticipants`      | int                    | Number of participants                 |
| `hasRecording`           | bool                   | Whether the call was recorded          |
| `recordings`             | List\<Recording>       | List of recording objects              |
| `participantInfoList`    | List\<ParticipantInfo> | List of participant details            |

## Access Recordings

If a call has recordings, access them through the `recordings` property:

```dart theme={null}
callLogRequest.fetchNext(
  onSuccess: (List<CallLog> callLogs) {
    for (CallLog callLog in callLogs) {
      if (callLog.hasRecording == true) {
        callLog.recordings?.forEach((recording) {
          debugPrint("Recording ID: ${recording.rid}");
          debugPrint("Recording URL: ${recording.recordingURL}");
          debugPrint("Duration: ${recording.duration} seconds");
        });
      }
    }
  },
  onError: (CometChatCallsException e) {
    debugPrint("Error: ${e.message}");
  },
);
```

<Accordion title="Call Status Values">
  | Status       | Description                         |
  | ------------ | ----------------------------------- |
  | `ongoing`    | Call is currently in progress       |
  | `busy`       | Receiver was busy                   |
  | `rejected`   | Call was rejected                   |
  | `cancelled`  | Call was cancelled by initiator     |
  | `ended`      | Call ended normally                 |
  | `missed`     | Call was missed                     |
  | `initiated`  | Call was initiated but not answered |
  | `unanswered` | Call was not answered               |
</Accordion>

<Accordion title="Call Category Values">
  | Category | Description               |
  | -------- | ------------------------- |
  | `call`   | Direct call between users |
  | `meet`   | Meeting/conference call   |
</Accordion>

<Accordion title="Call Direction Values">
  | Direction  | Description                |
  | ---------- | -------------------------- |
  | `incoming` | Call received by the user  |
  | `outgoing` | Call initiated by the user |
</Accordion>
