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

# Communication Logs

> Per-attempt operational log of calls, emails, and other outreach

| Property      | Value                                              |
| ------------- | -------------------------------------------------- |
| Dataset code  | `D21`                                              |
| Section code  | `S4` — Communications                              |
| Endpoint path | `/exports/S4/D21`                                  |
| Cursor field  | `communicated_at`                                  |
| Page size     | `1`–`1000` (default `500`)                         |
| Availability  | Phase 1 — generally available                      |
| Pagination    | Via (variable page size — joined through a parent) |

One row per outreach attempt we made — a call, email, or other operational communication. It includes the direction, status, duration, and timestamps. It does **not** include message bodies, transcripts, or PBX metadata, which are operational-only and deliberately excluded.

## Fields

| Field                | Type           | Description                                                                                                                                 | Notes                                                                                                                                        |
| -------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `public_id`          | string         | Stable unique identifier for this communication row. Use as the primary key for warehouse upserts. Derived from the underlying Mongo `_id`. | Available as of v1.1                                                                                                                         |
| `communication_type` | string         | Channel of the attempt (e.g. call, email).                                                                                                  |                                                                                                                                              |
| `direction`          | string         | `inbound` or `outbound`.                                                                                                                    |                                                                                                                                              |
| `status`             | string         | Outcome/status of the attempt.                                                                                                              |                                                                                                                                              |
| `from`               | string         | Originating address/number for the attempt.                                                                                                 |                                                                                                                                              |
| `to`                 | string         | Destination address/number for the attempt.                                                                                                 |                                                                                                                                              |
| `subject`            | string \| null | Subject line, where applicable (e.g. email).                                                                                                |                                                                                                                                              |
| `duration`           | number \| null | Call/communication duration in **seconds**, where applicable (e.g. calls).                                                                  | **Fractional** (sub-second precision, e.g. `119.86464333534241`); `null` when not applicable. Ingest as `FLOAT64`/`NUMERIC`, **not** `INT64` |
| `communicated_at`    | string         | When the communication occurred (ISO-8601).                                                                                                 | Cursor field                                                                                                                                 |
| `created_at`         | string         | Row creation timestamp (ISO-8601).                                                                                                          |                                                                                                                                              |
| `updated_at`         | string         | Last-modified timestamp (ISO-8601).                                                                                                         |                                                                                                                                              |

## Sample row

```json theme={null}
{
  "public_id": "664a1b2c3d4e5f6071829301",
  "communication_type": "CALL",
  "direction": "outbound",
  "status": "ANSWERED",
  "from": "+966550000001",
  "to": "+966512345678",
  "subject": null,
  "duration": 119.86464333534241,
  "communicated_at": "2026-05-19T09:31:20.000Z",
  "created_at": "2026-05-19T09:31:25.441Z",
  "updated_at": "2026-05-19T09:33:01.118Z"
}
```

<Warning>
  **`duration` is a fractional number, not an integer.** It carries sub-second precision (e.g. `119.86464333534241`) and may be `null`. If you ingest into a typed warehouse, map it to a floating-point/decimal type (`FLOAT64`, `NUMERIC`) — mapping to `INT64`/`INTEGER` will reject rows with fractional values.
</Warning>

## Pagination characteristics

This dataset is **via** — it is filtered to your tenant by joining through its parent (`user_lender_detail_id` → `UserLenderDetails`). On multi-tenant databases a single response may contain **fewer rows than your `limit`** even when more data exists. The cursor still advances correctly — keep paging until `nextCursor` is `null`. See [Pagination → Variable page size](/api-reference/exports/pagination).

## Use cases

* Attempt funnel analysis.
* Cross-channel reach analytics (phone vs. email).
* Operational health monitoring.

<Note>
  Page size may be smaller than the requested `limit` on multi-tenant DBs. Do not infer "end of data" from `rows.length < limit` — rely on `nextCursor: null`.
</Note>

***

<Snippet file="snippets/support-info.mdx" />
