---
title: "List contacts"
method: GET
path: "/contacts"
tags: ["Campaigns"]
---

# List contacts

`GET /contacts`

## Request

- Base URL: `https://sendhq.cc/api/v1`
- URL: `https://sendhq.cc/api/v1/contacts`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/sendhq/apis/sendhq-api/docs/contacts/get.ts> (a function with typed inputs; its response is checked against the schema)

Newest-first contacts with consent evidence, tags, engagement, and the lists they are subscribed to. Filter by `list_id`, `status` (`subscribed`, `pending`, `unsubscribed`, `bounced`, `complained`, or `dormant`), `query` (email or name substring; `*` is a wildcard on the email, as in `*@example.com`), `tag`, `source` (`form`, `api`, or `import`), signup time (`after`, `before`), or `segment_id`. Engagement counts come from open and click tracking: opens are estimates (privacy proxies and security scanners load images on their own, and requests that look automated are left out), never proof that someone read a message. A dormant contact stopped opening, did not answer a list-cleanup email, and no longer gets broadcasts until it engages again.

## Query parameters

- `list_id` string
- `status` 'subscribed' | 'pending' | 'unsubscribed' | 'bounced' | 'complained' | 'dormant'
- `query` string
- `tag` string
- `source` 'form' | 'api' | 'import'
- `after` string, date-time
- `before` string, date-time
- `segment_id` string
- `limit` integer
- `offset` integer

## Response `200`

Successful response

- object
  - `data` object[], required
    - `id` string, required
    - `email` string, email, required
    - `name` string, required
    - `fields` object, required
      - `plan` string, required
    - `status` string, required
    - `consent` object, required
      - `source` string, required
      - `basis` string, required
      - `importId` unknown, required
      - `optedInAt` string, date-time, required
      - `confirmedAt` unknown, required
      - `ip` unknown, required
      - `userAgent` unknown, required
    - `unsubscribedAt` unknown, required
    - `dormant` boolean, required
    - `dormantAt` unknown, required
    - `engagement` object, required
      - `sent` integer, required
      - `opens` integer, required
      - `clicks` integer, required
      - `lastSentAt` string, date-time, required
      - `lastOpenedAt` string, date-time, required
      - `lastClickedAt` string, date-time, required
      - `sendsSinceEngaged` integer, required
    - `country` string, required
    - `tags` string[], required
    - `lists` string[], required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
  - `count` integer, required
  - `total` integer, required

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid authentication
- `402`: A paid entitlement is required for this recipient or feature
- `403`: The workspace, domain, policy, or suppression state forbids the operation
- `404`: Tenant-scoped resource not found
- `409`: Resource state or idempotency conflict
- `413`: Attachment count or bytes exceed the accepted limit
- `422`: Request validation or suppression check failed
- `423`: Sending is paused for this sender identity or workspace; the message gives the reason and how to appeal
- `429`: A monthly, daily, or trial usage limit was reached
- `500`: Unexpected server error
- `502`: An upstream provider operation failed
- `503`: A required provider or signing configuration is unavailable
- `default`: An error response using SendHQ's standard JSON envelope

---

[API](https://skmtc.dev/sendhq/apis/sendhq-api.md) - [All operations](https://skmtc.dev/sendhq/apis/sendhq-api/llms.txt) - [OpenAPI document](https://skmtc.dev/sendhq/apis/sendhq-api/revisions/98e39e48cb9a?raw)
