---
title: "The campaign's leads with their per-step state"
method: GET
path: "/business/campaigns/{campaignId}/leads"
tags: ["Campaigns"]
---

# The campaign's leads with their per-step state

`GET /business/campaigns/{campaignId}/leads`

## Request

- Base URL: `https://api.tryfuse.ai/api/v1`
- URL: `https://api.tryfuse.ai/api/v1/business/campaigns/{campaignId}/leads`
- Auth: HTTP basic

Lists the contacts enrolled in the campaign with their progress through the sequence. `id` is the campaign-membership row and `contactId` is the underlying contact, so you can cross-reference the contacts API. `status` is the state the app shows for the lead (it reads `stopped` or `completed` once the campaign itself stops), `sentSteps`/`totalSteps` show progress, and `firstSentBy` names the account and channel that first reached the lead. Only the token owner's own campaigns resolve: a campaign delegated to you, one shared by your team's visibility settings, and a deleted one all answer 404. Rate limit: 30 requests/minute and 1,000/day per token owner, shared by every campaign, scheduled-send, campaign-template and knowledge-hub endpoint.

Errors:
- `404` `CAMPAIGN_NOT_FOUND` — No campaign with this id exists, it belongs to another account (including a campaign delegated to you or shared by your team's visibility settings), or it has been deleted.
- `422` `VALIDATION_FAILED` — A query parameter is out of range, or campaignId is not a 24-character hex id.
- `429` `RATE_LIMITED` — More than 30 campaign requests in a minute, or 1,000 in a day, for this token owner (the bucket is shared by every /business/campaigns, /business/scheduled-sends, /business/campaign-templates and /business/knowledge-hubs call).
- `500` `UNEXPECTED_ERROR` — An unhandled failure; the detail stays in our logs and is never returned.

Requires one of the following token scopes: campaigns.

## Path parameters

- `campaignId` string, required: The campaign's id (24-character hex ObjectId), as returned by POST /business/campaigns or as the campaignId of a GET /business/campaigns row.

## Query parameters

- `limit` integer: Page size, 1-100 (default 25).
- `pageNum` integer: 1-based page number (default 1).
- `search` string: Free text matched case-insensitively against the lead's full name or their company name (1-200 characters); any string is accepted, and regex metacharacters are escaped for you, so it behaves as a literal substring match. A term that matches no lead returns an empty page, not an error.

## Response `200`

Success

- object
  - `leads` object[], required
    - `id` string, nullable, required: The campaign-membership row's id.
    - `contactId` string, nullable, required: The underlying contact's id.
    - `name` string, nullable, required
    - `email` string, nullable, required: The contact's primary email address.
    - `linkedinUrl` string, nullable, required
    - `companyName` string, nullable, required
    - `companyUrl` string, nullable, required
    - `status` string, nullable, required: The lead's state in this campaign as the app displays it.
    - `outcome` string, nullable, required: Recorded outcome for the lead, when one was set.
    - `sentSteps` integer, required
    - `totalSteps` integer, required
    - `openCount` integer, required
    - `clickCount` integer, required
    - `hasOpened` boolean, required
    - `hasClicked` boolean, required
    - `hasReplied` boolean, required
    - `hasConnected` boolean, required: Whether a LinkedIn connection request to this lead was accepted.
    - `repliedInOtherCampaignAt` string, date-time, nullable, required: When a reply from this lead was attributed to another campaign. A reply counts as `hasReplied` on one campaign only; the lead's other campaigns carry this instead.
    - `repliedInOtherCampaignId` string, nullable, required: The campaign that reply was attributed to.
    - `firstMessageReceivedAt` string, date-time, nullable, required: When the lead's first reply arrived.
    - `firstSentBy` object, required
      - `name` string, nullable, required
      - `email` string, nullable, required
      - `channel` string, nullable, required
  - `pagination` object, required
    - `page` integer, required: 1-based page number this response covers.
    - `pageSize` integer, required: Rows requested per page.
    - `total` integer, required: Total rows matching the query.
    - `totalPages` integer, required: Total pages at this page size.

## Other responses

- `400`: Error
- `401`: Error
- `402`: Error
- `403`: Error
- `404`: Error
- `409`: Error
- `422`: Error
- `429`: Error
- `500`: Error

---

[API](https://skmtc.dev/fuseai/apis/fuse-business-api.md) · [All operations](https://skmtc.dev/fuseai/apis/fuse-business-api/llms.txt) · [OpenAPI document](https://skmtc.dev/fuseai/apis/fuse-business-api/revisions/50d95e0536f4?raw)
