> ## Documentation Index
> Fetch the complete documentation index at: https://docs.foxreach.io/llms.txt
> Use this file to discover all available pages before exploring further.

# List Campaign Leads

> Retrieve a paginated list of leads enrolled in a campaign.

## Path Parameters

<ParamField path="campaign_id" type="string" required>
  The unique identifier of the campaign.
</ParamField>

## Query Parameters

<ParamField query="page" type="integer" default="1">
  Page number (starts at 1).
</ParamField>

<ParamField query="pageSize" type="integer" default="50">
  Number of leads per page (1-100).
</ParamField>

<ParamField query="status" type="string">
  Filter by campaign lead status: `pending`, `sent`, `paused`, or `completed`.
</ParamField>

<ParamField query="search" type="string">
  Search by lead email, name, or company.
</ParamField>

## Response

<ResponseField name="data" type="array">
  Array of campaign lead objects.

  <Expandable title="Campaign lead object">
    <ResponseField name="id" type="string">Lead ID.</ResponseField>
    <ResponseField name="email" type="string">Lead email.</ResponseField>
    <ResponseField name="firstName" type="string">First name.</ResponseField>
    <ResponseField name="lastName" type="string">Last name.</ResponseField>
    <ResponseField name="company" type="string">Company name.</ResponseField>
    <ResponseField name="status" type="string">Campaign lead status: `pending`, `sent`, `paused`, or `completed`.</ResponseField>
    <ResponseField name="currentStep" type="integer">Current sequence step number.</ResponseField>
    <ResponseField name="totalSent" type="integer">Emails sent to this lead in the campaign.</ResponseField>
    <ResponseField name="lastSentAt" type="string">ISO 8601 timestamp of last email sent.</ResponseField>
    <ResponseField name="repliedAt" type="string">ISO 8601 timestamp if lead replied.</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="meta" type="object">
  Pagination metadata.

  <Expandable title="Meta object">
    <ResponseField name="page" type="integer">Current page number.</ResponseField>
    <ResponseField name="pageSize" type="integer">Items per page.</ResponseField>
    <ResponseField name="total" type="integer">Total leads in campaign.</ResponseField>
    <ResponseField name="totalPages" type="integer">Total pages.</ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X GET "https://api.foxreach.io/api/v1/campaigns/cmp_abc123/leads?page=1&pageSize=50" \
    -H "X-API-Key: otr_your_key"
  ```

  ```python Python SDK theme={null}
  import requests

  response = requests.get(
      "https://api.foxreach.io/api/v1/campaigns/cmp_xyz789/leads",
      headers={"X-API-Key": "otr_your_key"},
      params={"page": 1, "pageSize": 50},
  )
  leads = response.json()
  ```

  ```typescript TypeScript SDK theme={null}
  const response = await fetch(
    "https://api.foxreach.io/api/v1/campaigns/cmp_xyz789/leads?page=1&pageSize=50",
    {
      headers: { "X-API-Key": "otr_your_key" },
    }
  );
  const leads = await response.json();
  ```
</RequestExample>

<ResponseExample>
  ```json theme={null}
  {
    "data": [
      {
        "id": "cld_xyz789",
        "email": "john@acme.com",
        "firstName": "John",
        "lastName": "Doe",
        "company": "Acme Inc",
        "status": "sent",
        "currentStep": 2,
        "totalSent": 2,
        "lastSentAt": "2025-01-18T09:00:00",
        "repliedAt": null
      }
    ],
    "meta": {
      "page": 1,
      "pageSize": 50,
      "total": 1,
      "totalPages": 1
    }
  }
  ```
</ResponseExample>

## Errors

| Status | Description        |
| ------ | ------------------ |
| `404`  | Campaign not found |

## Rate Limit

* **100 requests per minute, per API key.** Fixed 60-second window.
* Every response includes `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` (unix epoch seconds).
* A `429` response includes a `Retry-After` header (seconds until the bucket resets).

For client-side patterns (`Retry-After`, exponential backoff, monitoring `X-RateLimit-Remaining`), see [Rate Limiting](/rate-limiting).
