---
title: "leads.updateStatus"
method: PATCH
path: "/v1/leads/{leadId}/status"
tags: ["leads"]
---

# leads.updateStatus

`PATCH /v1/leads/{leadId}/status`

## Request

- Base URL: `https://api.selda.ai`
- URL: `https://api.selda.ai/v1/leads/{leadId}/status`
- Auth: HTTP bearer

Set a lead's status (legacy path, session-authenticated, an API key cannot reach this; the MCP tool uses the org-scoped leads.update).

Dispatched to `leads.updateStatus` on `POST /mcp/mutate`. This route is a different URL for the same call: the request is answered by the same dispatcher, with the same authentication, the same scope check, the same organisation scoping and the same refusals.

- Scope: `write`
- A free sandbox key may call it
- A legacy entry. Its summary above says what that costs you.

## Path parameters

- `leadId` string, required: A Convex document id in the `leads` table.

## Request body

- object
  - `status` 'new' | 'contacted' | 'responded' | 'qualified' | 'quote' | 'unqualified', required

## Response `200`

The call succeeded.

- object
  - `value` unknown, required
  - `request_id` string, required: Echoed in the `X-Request-Id` header.

## Other responses

- `400`: Unknown route, or arguments the validator refused.
- `401`: Missing, expired or revoked key.
- `403`: The key lacks the scope, the plan entitlement, or is a sandbox key on a live-only function.
- `429`: Rate limited. Wait for the next minute window and retry.
- `500`: The function threw. The message says what, without leaking internals.

---

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