---
title: "Update a lead's status"
method: PATCH
path: "/api/v1/leads/{id}"
tags: ["Leads"]
---

# Update a lead's status

`PATCH /api/v1/leads/{id}`

## Request

- Base URL: `https://www.zen-mode.io`
- URL: `https://www.zen-mode.io/api/v1/leads/{id}`
- Auth: HTTP bearer

Only four statuses are writable by a human or an integration; the rest are written by the automation and refused here. `changed` appears on the 200 and on every 409, and on nothing else — it is absent from the 400s, the 404, the auth failures and the 500, because nothing was evaluated on those paths.

## Path parameters

- `id` integer, required

## Request body

- object
  - `status` 'meeting_booked' | 'replied' | 'not_interested' | 'connected', required

## Response `200`

Applied, or a no-op if the lead already had that status.

- object
  - `changed` boolean
  - `lead` Lead
    - `id` integer
    - `campaign_id` integer
    - `name` string, nullable
    - `title` string, nullable
    - `company` string, nullable
    - `location` string, nullable
    - `linkedin_url` string
    - `status` 'pending' | 'warming_up' | 'sent' | 'connected' | 'replied' | 'meeting_booked' | 'not_interested' | 'failed' | 'no_response' | 'stale_connection' | 'disconnected' | 'connection_removed' | 'messaging_closed' | 'calendar_clicked' | 'invitation_withdrawn'
    - `follow_up_number` integer
    - `calendar_clicked` boolean
    - `connection_sent_at` string, date-time, nullable
    - `connection_accepted_at` string, date-time, nullable
    - `replied_at` string, date-time, nullable
    - `created_at` string, date-time, nullable
    - `updated_at` string, date-time, nullable
  - `previous_status` string

## Other responses

- `400`: `status_required` or `invalid_status`; both carry `valid_statuses`.
- `401`: Missing, malformed or invalid Authorization header, or an unknown API key.
- `403`: The key is valid but the account's plan does not include API access.
- `404`: Lead not found for this account.
- `409`: `withdrawn_status_write_refused`, `promote_only_guard` or `conflict`.
- `429`: Rate limit exceeded (100 requests/minute). Carries `Retry-After`.
- `500`: Unhandled server error.

---

[API](https://skmtc.dev/zen-mode/apis/zenmode-api.md) · [All operations](https://skmtc.dev/zen-mode/apis/zenmode-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zen-mode/apis/zenmode-api/revisions/2769372f1e3f?raw)
