> ## Documentation Index
> Fetch the complete documentation index at: https://cometchat-22654f5b-docs-agentbuddy-4.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Call Logs

> Display CometChat Calls SDK v5 call logs on Flutter with call history, participants, call type, duration, and status details.

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>
