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

# Read and export the unified contact timeline

> The contact-detail Timeline tab merges every touchpoint — messages, calls, tickets, events, AI decisions, campaigns, video, and agent sessions — into one reverse-chronological feed with filter chips, API parity, and a 5,000-row CSV export.

# Read and export the unified contact timeline

Every time a customer texts, calls, joins a video room, triggers a campaign step, or talks to an AI agent, the contact record collects a touchpoint. Before the Timeline tab, reconstructing one customer's history meant paging **Conversations**, **Call logs**, and campaign logs separately and merging them by hand. The contact-detail **Timeline** tab merges all of those sources into a single reverse-chronological feed you can filter with chips, page through, and export.

Use the timeline when you need the whole picture for one contact:

* **Customer support** — answer "what has this person touched so far" without switching screens.
* **Compliance review** — AI decisions and tool calls appear alongside the operational activity, which satisfies record-keeping requirements across the pillars in one per-person view.
* **Handoff to an auditor** — export the filtered slice to CSV, or run the full GDPR data-export flow when a data subject exercises access rights.

Open it from the dashboard sidebar under **Contacts → Audience → Contacts**, pick a contact, and switch to the **Timeline** tab of the contact-detail page.

## The ten event buckets

The top of the tab renders ten channel buckets as filter chips. Each chip maps to one underlying source, so enabling a bucket narrows the feed to the touchpoints that belong to it:

| Chip      | What it aggregates                                    |
| --------- | ----------------------------------------------------- |
| `sms`     | SMS and MMS message rows                              |
| `email`   | Email message rows                                    |
| `call`    | Voice and fax call-log entries                        |
| `ticket`  | Inbox conversation threads (the support object)       |
| `event`   | CDP analytics events (track, page, identify)          |
| `ai`      | AI-turn audit rows for per-person AI decision records |
| `tool`    | Agent tool-call rows                                  |
| `journey` | Campaign step executions                              |
| `video`   | Video-room participation sessions                     |
| `agent`   | Chat and voice agent runtime sessions                 |

Enabling a chip narrows the feed to that bucket only. Leaving all chips unselected is the open default and returns every bucket. Unknown chip values are ignored, not rejected, so a stale chip from a previous rollout never fails the query.

## How chips map to API filters

The dashboard chips translate directly onto query parameters on `GET /api/v1/contacts/{id}/timeline`. Each filter axis is additive — AND semantics across axes, OR semantics within one axis.

```bash theme={null}
# Channel filter — one chip per value
curl "https://api.orbit.devotel.io/api/v1/contacts/{id}/timeline?channels=sms,email" \
  -H "X-API-Key: $ORBIT_API_KEY"

# Type filter — a single event class
curl "https://api.orbit.devotel.io/api/v1/contacts/{id}/timeline?type=call" \
  -H "X-API-Key: $ORBIT_API_KEY"

# Direction filter — inbound or outbound engagement
curl "https://api.orbit.devotel.io/api/v1/contacts/{id}/timeline?direction=inbound" \
  -H "X-API-Key: $ORBIT_API_KEY"
```

For the deep journey-timeline variant (`GET /api/v1/contacts/{id}/journey`), the same channel/type/direction axes widen to richer event types — `message`, `call`, `agent_chat`, `agent_handoff`, `consent`, `note`, `sdk_event`, `lifecycle_change`, `campaign_enrolled`, `campaign_completed`, `survey_response` — plus date bounds (`after`, `before`) and a cursor page size of up to 100 rows.

## CSV export

The **Export CSV** button on the timeline downloads the same filtered view as a file. The export runs through `GET /api/v1/contacts/{id}/journey.csv` and is capped at 5,000 rows — enough for an ad-hoc review, bounded so a browser can't accidentally pull a multi-million-row history.

Use CSV when:

* The export is one bounded slice of the contact's history — the same filters you applied on screen, packaged for a spreadsheet.
* A colleague or auditor needs the record and you already know which chips to narrow.

Use the GDPR data-export flow when:

* A data subject requests a complete access export. GDPR export traverses the full journey history, not just the 5,000-row view.
* You need a complete, legally-compliant handover rather than a working slice.

The 5,000-row ceiling is the CSV guardrail; GDPR export is the complete-export path. Pick CSV for the day-to-day review, GDPR for the subject-access response.

## Walk the dashboard

1. Open **Contacts → Audience → Contacts** and pick a contact.
2. Switch the detail pane to the **Timeline** tab.
3. Click a chip to narrow the feed; click it again to widen back. Chips combine with AND semantics across axes (channel AND direction), OR semantics within one axis.
4. Set the **From / To** date range if the feed is too long.
5. Select **Export CSV** to download the filtered view, or **Clear (N)** to reset all filters at once.

## Troubleshooting an empty timeline

Work top-down — each check eliminates one class of empty feed:

1. **Stale chip** — a channel bucket left selected from a previous session filters everything out. Hit **Clear (N)** to remove all filters and re-test.
2. **Date range covers nothing** — a narrow **From / To** range or an accidental one-day window hides older touchpoints. Widen the range or remove it.
3. **Bucket source is genuinely empty** — if the contact has no `video` or `agent` sessions, that chip returns zero rows even though other buckets have data.
4. **Permission scope too narrow** — the timeline respects the caller's role. Viewer and supervisor roles get PII-masked summaries; confirm your role can read the contact row at all.
5. **Wrong contact picked** — the feed is per contact id. Verify the detail pane shows the same contact you searched for.

If none of these checks resolve the empty feed, the contact may simply have no recorded activity yet.

## See also

* [Interactions search](/guides/interaction-search) — the cross-workspace recency-ordered list over every conversation and call.
* [Search message history](/guides/search-message-history) — fielded single-message lookups by provider reference.
* [Conversation archive](/guides/conversation-archive) — natural-language search plus per-thread exports.
