---
title: "List a contact's recent messages"
description: "The contact's most recent messages across channels, newest first: the emails sent to them, and texts both ways. `GET /api/v1/contacts/{id}/activity`"
url: https://www.unitpost.com/docs/platform/get-contacts-id-activity
section: "Platform API reference"
updated: 2026-10-13
---
# List a contact's recent messages

`GET /api/v1/contacts/{id}/activity`

The contact's most recent messages across channels, newest first: the emails sent to them, and texts both ways. Emails also require `emails:read` and texts `sms:read`; without one, those rows are left out. Returns up to `limit` (1–100, default 25) with no cursor: for the full history page [List sent emails](https://www.unitpost.com/docs/email/get-email) or [List SMS messages](https://www.unitpost.com/docs/sms/get-sms) with `contact_id`. The `{id}` accepts a contact id or email. Requires the `contacts:read` capability.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | — |
| `limit` | query | integer | no | How many recent messages (1–100, default 25). |

## Response fields (200)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | — |
| `message_id` | string | yes | An email (`email_…`) or text (`sms_…`) id; read it with its own get operation. |
| `channel` | string | yes | `email` or `sms`. |
| `direction` | enum | yes | One of: `outbound`, `inbound`. |
| `subject` | string \| null | yes | An email's subject, or the start of a text. |
| `status` | string | yes | The message's `status` as its own object reports it (`GET /email/{id}`, `GET /sms/{id}`). |
| `campaign_id` | string \| null | yes | — |
| `created_at` | string | yes | — |
| `sent_at` | string \| null | yes | — |
| `error` | string \| null | yes | Texts only: why it wasn't delivered, in plain words. |
| `error_code` | string \| null | yes | — |

## Responses

| Status | Description |
| --- | --- |
| 200 | The most recent messages; `has_more` says older ones exist. |
| 401 | Missing or invalid API key. |
| 403 | Insufficient scope. |
| 404 | Contact not found. |
| 422 | `limit` is out of range, or another query key was sent (there is no cursor). |

## Example request

```bash
curl -X GET 'https://www.unitpost.com/api/v1/contacts/con_123/activity' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'User-Agent: my-app/1.0'
```

## Example response (200)

```json
{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "object": "contact_activity",
      "message_id": "message_123",
      "channel": "string",
      "direction": "outbound",
      "subject": "Welcome to Acme",
      "status": "queued",
      "campaign_id": "campaign_123",
      "created_at": "2026-01-01T00:00:00.000Z",
      "sent_at": "2026-01-01T00:00:00.000Z",
      "error": "string",
      "error_code": "string"
    }
  ]
}
```

## Links

- HTML reference (with Node.js, Python, Ruby, PHP, Laravel, Go, Java, Rust, .NET and CLI examples): https://www.unitpost.com/docs/platform/get-contacts-id-activity
- OpenAPI 3.1 (full schemas): https://www.unitpost.com/api/v1/openapi.json
