---
title: "Get Lead"
method: GET
path: "/api/v1/campaigns/{campaign_id}/leads/{lead_id}"
tags: ["Campaigns"]
---

# Get Lead

`GET /api/v1/campaigns/{campaign_id}/leads/{lead_id}`

## Request

- Base URL: `http://localhost:3009`
- URL: `http://localhost:3009/api/v1/campaigns/{campaign_id}/leads/{lead_id}`
- Auth: HTTP bearer

Returns one lead with its ordered step timeline — the per-step record of what was sent, when it completed, and whether it was opened or replied to.

## Path parameters

- `campaign_id` string, required
- `lead_id` string, required

## Response `200`

Default Response

- object
  - `status` integer
  - `data` object
    - `id` string
    - `email` string
    - `name` string, nullable
    - `status` string
    - `email_provider` string, nullable: Mail provider derived from the address's MX records
    - `fields` object: Custom field values, keyed by field name from the campaign's `lead_schema`
    - `emails_sent` integer
    - `replied` boolean
    - `positive` boolean: Whether the reply was positive. **Not populated yet** — no reply classifier exists, so this is always false. Do not build on it until reply classification ships.
    - `current_node_id` string, nullable
    - `next_run_at` string, date-time, nullable
    - `replied_at` string, date-time, nullable
    - `created_at` string, date-time, nullable
    - `steps` object[]: Ordered step timeline
      - `node_id` string, nullable
      - `node_type` string, nullable
      - `status` string, nullable: entered | waiting | sending | sent | failed | skipped | held | done
      - `hold_reason` string, nullable: Why a `held` step is waiting (e.g. `campaign_paused`). A hold is not a failure — `error` stays null.
      - `error` string, nullable: Failure detail, when the step actually failed
      - `started_at` string, date-time, nullable
      - `completed_at` string, date-time, nullable
      - `next_run_at` string, date-time, nullable
      - `opened_at` string, date-time, nullable
      - `open_count` integer
      - `replied_at` string, date-time, nullable

## Other responses

- `401`: Unauthorized — missing or invalid API key
- `403`: Forbidden. `code` says which permission refused: ROLE_FORBIDDEN (your role), INSUFFICIENT_SCOPE (the API key's scopes), WORKFLOW_FORBIDDEN (no access to the workflow), KEY_WORKFLOW_FORBIDDEN (the API key's workflow restriction).
- `404`: Campaign or lead not found
- `429`: Too Many Requests — rate limit exceeded. Check `Retry-After` header for seconds until the limit resets.

---

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