---
title: "Return a tenant-scoped normalized call and SMS timeline for one customer (calls:read AND sms:read)."
method: GET
path: "/v1/conversations"
---

# Return a tenant-scoped normalized call and SMS timeline for one customer (calls:read AND sms:read).

`GET /v1/conversations`

## Request

- Base URL: `https://www.kaicalls.com/api`
- URL: `https://www.kaicalls.com/api/v1/conversations`
- Auth: HTTP bearer

Identify the customer with any one of customer_id, lead_id, phone, email or external_id — the same resolver `/v1/customers` uses. Items are normalized (`source_type`/`source_id`, `conversation_id`, `customer_id`/`lead_id`, `provider`/`provider_id`, `occurred_at`) while `source` preserves the original record, so a consumer can act without knowing which internal table held the artifact. Paging is an opaque keyset over the immutable `created_at` across both channels; walk it with `next_cursor`. `updated_since` matches a call on its updated_at and an SMS on its created_at — SMS rows carry no updated_at, so a delivery-status change on an already-synced message is NOT visible here; use the event/delivery endpoints for that.

## Query parameters

- `customer_id` string
- `lead_id` string
- `phone` string
- `email` string
- `external_id` string
- `updated_since` string, date-time
- `cursor` string
- `order` 'asc' | 'desc'
- `limit` integer

## Response `200`

Normalized call and SMS timeline

## Other responses

- `400`: No lookup key, more than one lookup key, an invalid cursor, or a bad updated_since.
- `403`: Missing calls:read or sms:read scope

---

[API](https://skmtc.dev/kaicalls/apis/kaicalls-public-api.md) · [All operations](https://skmtc.dev/kaicalls/apis/kaicalls-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/kaicalls/apis/kaicalls-public-api/revisions/e607fc6cf36e?raw)
