> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.vapi.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.vapi.ai/_mcp/server.

# Get Campaign V2 Contacts

GET https://api.vapi.ai/v2/campaign/{id}/contacts

Reference: https://docs.vapi.ai/api-reference/campaigns/campaign-controller-get-campaign-v-2-contacts

## Authentication

- `Authorization` header (bearer token, required) — Authenticate server-side requests with a private Vapi API key. Create or copy a key from the [Vapi Dashboard](https://dashboard.vapi.ai) and send it in the `Authorization` header as `Bearer <token>`. Keep private API keys out of client-side code and public repositories.

## Request

### Path parameters

- `id` (string, required) — The unique identifier for the resource.

### Query parameters

- `status` (list of enum, optional) — This is the status to filter contacts by. Pass once or multiple times to filter on any of the provided statuses.
  - Allowed values: `contact.pending`, `contact.dispatched`, `contact.completed`, `contact.failed`, `contact.skipped`, `contact.predial-failed`
- `limit` (double, optional) — This is the maximum number of contacts to return. Defaults to 50.
- `sortBy` (enum, optional) — This is the column to sort by. Defaults to `position` — the order contacts were uploaded, which is also dial order. `status` sorts by the enum's declaration order rather than alphabetically, which means it reads as a lifecycle: pending, dispatched, completed, failed, skipped, predial-failed. Only columns on `campaign_contact` are sortable. Call-level values such as cost or duration live on the call and are attached after this query, so sorting by them here would only reorder the current page.
  - Allowed values: `position`, `status`
- `page` (double, optional) — This is the page number to return. Defaults to 1.

## Response

### 200

- `results` (list of CampaignContactWithOutcome, required)
- `metadata` (PaginationMeta, required) — Pagination and retention metadata returned with a paginated list of phone numbers.

## Types

### CampaignContactWithOutcome

- `id` (string, required)
- `number` (string, required)
- `status` (enum, required)
  - Allowed values: `contact.pending`, `contact.dispatched`, `contact.completed`, `contact.failed`, `contact.skipped`, `contact.predial-failed`
- `name` (string, optional)
- `callId` (string, optional)
- `dispatchedAt` (datetime, optional)
- `endedReason` (string, optional)

### PaginationMeta

Pagination and retention metadata returned with a paginated list of phone numbers.

- `itemsPerPage` (double, required) — The number of phone numbers returned per page.
- `totalItems` (double, required) — The total number of phone numbers matching the request.
- `currentPage` (double, required) — The current page number.
- `totalPages` (double, optional)
- `hasNextPage` (boolean, optional)
- `nextCursor` (string, optional) — Opaque cursor for the next page under keyset pagination (PRO-3163). Pass it back as the `cursor` query param to fetch the next page without an OFFSET scan. Present only when a further page likely exists.
- `sortOrder` (enum, optional)
  - Allowed values: `ASC`, `DESC`
- `itemsBeyondRetention` (boolean, optional) — Whether additional matching phone numbers exist beyond the organization's data-retention window.
- `createdAtLe` (datetime, optional) — The inclusive upper creation-time boundary applied to the result set.
- `createdAtGe` (datetime, optional) — The inclusive lower creation-time boundary applied to the result set.

## Examples

**Response**

```json
{
  "results": [
    {
      "id": "string",
      "number": "string",
      "status": "contact.pending",
      "name": "string",
      "callId": "string",
      "dispatchedAt": "2024-01-15T09:30:00Z",
      "endedReason": "string"
    }
  ],
  "metadata": {
    "itemsPerPage": 1.1,
    "totalItems": 1.1,
    "currentPage": 1.1,
    "totalPages": 1.1,
    "hasNextPage": true,
    "nextCursor": "string",
    "sortOrder": "ASC",
    "itemsBeyondRetention": true,
    "createdAtLe": "2024-01-15T09:30:00Z",
    "createdAtGe": "2024-01-15T09:30:00Z"
  }
}
```