> ## 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.

# Use the Customer-360 workspace (and fetch the snapshot)

> The full-page Customer-360 workspace collapses a contact’s profile, conversations, calls, AI reply suggestions, knowledge articles, CRM context, journeys, surveys, and notes into one three-column screen — backed by a single parallel-fan-out snapshot endpoint you can also call with an API key.

# Use the Customer-360 workspace (and fetch the snapshot)

Reconstructing one customer's picture used to mean paging the **Conversations** list, **Call logs**, the **Knowledge** base, and whatever CRM you run on separate tabs. The Customer-360 workspace collapses all of those sources into one three-column screen per contact, and it is backed by a single API endpoint you can also call from your own tools.

Open the workspace from **Contacts → Audience → Contacts**, pick a contact, and visit the `/360` view of its detail page (for example `/<locale>/audience/contacts/<id>/360`). The inbox contact drawer shows the same snapshot as an inline panel, so you can jump straight from a conversation to the full view.

Check these prerequisites before you read empty sections as bugs:

* **Knowledge base populated** — the knowledge card shows your most recently updated ready documents. With an empty knowledge base it correctly shows *No knowledge articles found*.
* **CRM connected** — Salesforce, HubSpot, or Zendesk must be linked under **Integrations → Connected apps** (via Nango). Until one is linked, the CRM card shows a *connect a CRM* hint and every `crm.*` field in the snapshot returns `null`.
* **Some activity** — a contact with no conversations yet sees the journey-replay tab plus a friendly empty state, while the right rail still shows calls, journeys, surveys, and notes that do exist.
* **Role** — the workspace and the snapshot endpoint are available to the `owner`, `admin`, `developer`, and `viewer` roles. Viewers see the screen with phone and email masked by default.

## The three-column layout

The page splits into a left identity rail (\~25%), a center conversation area (\~50%), and a right context rail (\~25%).

**Left — identity and stats.** The identity card (avatar, name, phone, email, country), the lifecycle stage, per-channel consent and frequency-cap status, a channel-send launcher for SMS, WhatsApp, RCS, email, voice, push, fax, video, journey enrollment, and ticket creation, plus voice-biometrics enrollment and a link to the full profile. Below that, a compact stats block: 24-hour and 7-day message volumes with channel mix, and counts of conversations, calls, open tickets, active journeys, and goal conversions. Contact notes live at the bottom of the right rail, next to this identity context.

**Center — conversation tabs.** One tab per recent conversation, with channel icon, latest-message preview, status badge, an **Active** marker when the thread is open with a message in the last 24 hours, and an **Open in inbox** link for the full thread. A static **Journey replay** tab always sits first, rendering the unified contact timeline even while a conversation is live.

**Right — context rail.** Communication-preferences chips, the recommended-channel card, next-best-action suggestions, AI **suggested replies** and **suggested actions** (call, send template, escalate, schedule follow-up) that launch the matching compose surface, recent calls with missed indicators, top-3 knowledge articles, CRM sections (Salesforce opportunities/cases, HubSpot deals, Zendesk tickets), native inbox tickets, goal conversions, active journey enrollments, answered survey responses, and the notes thread.

## One request, one response

The workspace renders from a single GET:

```bash theme={null}
curl "https://api.orbit.devotel.io/api/v1/customer-360/contacts/{contact_id}/snapshot" \
  -H "X-API-Key: $ORBIT_API_KEY"
```

Instead of a dozen sequential queries, the endpoint fans every source out in parallel — conversations, calls, message stats, knowledge, CRM, goal conversions, journey enrollments, surveys, lifecycle history, tickets, video sessions, and notes all race at once. Each source has its own 3-second budget, and a source that times out or errors collapses to its empty sentinel (`[]` or `null`) instead of failing the request. The response always carries the full envelope shape, so your UI (and ours) can render partial results with an empty section rather than an error page.

A second request for the same contact within 30 seconds is served from a per-tenant cache. Agents can refresh the workspace on every keystroke without putting a load spike on your CRM upstream — the cached shape is built once and re-masked per caller on each read.

Roles `owner`, `admin`, `developer`, and `viewer` may call it. On workspaces that opt into PII redaction, `viewer` callers get phone and email (including numbers nested in call rows) masked by default; privileged roles can pass `?reveal=true` to unmask, and each reveal is written to the audit log.

## Read the envelope

Top-level fields, all always present — an empty section is an empty array or a null, never a missing key:

| Field                          | Contents                                                                                                      |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------- |
| `contact`                      | Identity: id, phone, email, names, display name, country, lifecycle stage                                     |
| `conversations`                | Up to 10 recent threads with channel, preview text, status, and an `is_active` flag                           |
| `recent_calls`                 | Up to 5 calls with direction, duration, missed indicators, and a `has_recording` boolean                      |
| `messages_summary`             | `total_24h`, `total_7d`, and a per-channel `channel_mix`                                                      |
| `ai_assist`                    | `suggested_replies` (text, tone, confidence) and `suggested_actions` (call / template / escalate / follow-up) |
| `knowledge.suggested_articles` | Top-3 most recently updated ready knowledge documents, with excerpts                                          |
| `crm`                          | `salesforce`, `hubspot`, `zendesk` — each null until that provider is linked                                  |
| `tickets`                      | Native helpdesk tickets attached to the contact (newest 5)                                                    |
| `goal_conversions`             | Recent goal-conversion attributions with value                                                                |
| `active_drip_enrollments`      | Running or paused journeys with the current step                                                              |
| `survey_responses`             | Answered NPS/CSAT/CES responses with score and comment                                                        |
| `lifecycle_history`            | Stage transitions, newest first                                                                               |
| `video_sessions`               | Video rooms the contact joined                                                                                |
| `notes`                        | Latest operator notes, pinned first                                                                           |

Recordings are never exposed as raw storage URIs — a `has_recording: true` flag tells you to exchange for a signed playback URL through `GET /api/v1/calls/{id}/recording`.

## Partial rendering is by design

When a tile shows an empty state, separate two cases:

1. **The source is genuinely empty.** No conversations, no calls, no tickets — the field returns its empty sentinel and the section renders its *No …* placeholder. This is the normal case.
2. **The source degraded.** A CRM timeout or a slow query collapses that one field to its sentinel while everything else still renders. The endpoint reports the degraded outcome on its metrics, so a recurring empty CRM or knowledge section across many contacts is worth treating as a source-health signal, not a UI bug.

Because every section checks its own key, write your consumer the same way: never treat a null `crm.salesforce` as a failed request, and keep rendering the sections that did return data.

## Build your own 360 view

For an internal ops surface, poll the snapshot on a 30-second-or-longer cadence. Cache hits are answered by the API's own cache, so a slower poll only ever burns one origin fetch per window per contact. Cache the response per contact id on your side if you embed it in a list view, and pass the reveal flag only from privileged operator contexts — reveal requests are audit-logged.

```bash theme={null}
# Fetch and render only the sections your ops tool needs
curl -s "https://api.orbit.devotel.io/api/v1/customer-360/contacts/con_ab12cd34/snapshot" \
  -H "X-API-Key: $ORBIT_API_KEY" | jq '.data | {conversations, recent_calls, tickets, crm}'
```

## Act on it

The workspace is a launchpad, not a dead end:

* **Send** — the left-rail channel menu deep-links into the SMS, WhatsApp, RCS, email, fax, or push compose surface with the contact pre-filled; video opens a video-room link, and journey enrollment or ticket creation open their matching flows.
* **Call** — the *Call contact* suggested action and the voice option in the send menu both launch the softphone with the number pre-dialed.
* **Enroll in voice biometrics** — the left rail carries an enrollment action, disabled with an explanation when the contact has no phone.
* **Open the thread** — every conversation tab links into the inbox for the full message history and the richer reply coach.

## See also

* [Contact timeline](/guides/contact-timeline) — the per-contact event feed that powers the journey-replay tab.
* [Connected apps](/guides/connected-apps) — link Salesforce, HubSpot, or Zendesk so CRM sections populate.
* [Knowledge base lifecycle](/guides/knowledge-base-lifecycle) — populate the documents the knowledge card surfaces.
* [Events API](/api-reference/endpoints/events) — the event stream factored into the contact's journey.
