---
title: "List the contacts of a step"
method: GET
path: "/advanced/campaigns/{campaignId}/progress/contacts"
tags: ["Campaign tracking"]
---

# List the contacts of a step

`GET /advanced/campaigns/{campaignId}/progress/contacts`

## Request

- Base URL: `https://api.emelia.io`
- URL: `https://api.emelia.io/advanced/campaigns/{campaignId}/progress/contacts`
- Auth: API key in header `Authorization`

Contacts that passed (`completed`) or wait at (`waiting`) a given step, newest first, 20 per page. Here `page` is ONE based.

## Path parameters

- `campaignId` string, required: MongoDB ObjectId: 24 hexadecimal characters.

## Query parameters

- `stepId` string, required
- `status` 'all' | 'completed' | 'waiting'
- `page` integer

## Response `200`

Success.

- object
  - `success` unknown
  - `contacts` object[]
    - `contactId` string
    - `firstName` string
    - `lastName` string
    - `email` string
    - `linkedinUrlProfile` string
    - `status` 'completed' | 'waiting'
    - `date` string, date-time, nullable
  - `total` integer
  - `totalPages` integer
  - `completedTotal` integer
  - `waitingTotal` integer

## Other responses

- `400`: Invalid request.
- `401`: Missing, malformed, unknown or disabled API key. The key must be exactly 48 characters, otherwise it is treated as a session token and rejected the same way.
- `500`: Unexpected error. IMPORTANT: this is also what you receive today when the per minute quota of your account is exceeded (the quota error is not mapped to 429 for API keys). No `Retry-After` header is sent. Wait until the next minute window before retrying.

---

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