| 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
{
"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"
}
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.
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.
Use cases
- Attempt funnel analysis.
- Cross-channel reach analytics (phone vs. email).
- Operational health monitoring.
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.