PATCH
/api/public/v1/leads/{leadId}Update a lead
Edits the details or moves the status. Setting `status` to CONTACTED also stamps `lastContactedAt` — that is how you record that somebody actually reached out, and converting the lead deliberately does not do it for you.
Required scope
The access token must carry this scope. A token missing it gets 403 Forbidden. Grant them to an API client under Settings → Company → API, and to a teammate under Employee → Permissions.
leads:write
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
leadId | string | Required | Lead ID. |
Request Body
| Property | Type | Description |
|---|---|---|
fullname | string | |
email | string | |
phoneNumber | string | |
companyName | string | |
title | string | |
website | string | |
city | string | |
state | string | |
source | string | |
notes | string | |
status | string | CONTACTED also stamps `lastContactedAt`. |
PATCHExample request
curl
curl -X PATCH "https://www.pxb.app/api/public/v1/leads/{leadId}" \
-H "Authorization: Bearer your_access_token" \
-H "Content-Type: application/json" \
-d '{
"status": "CONTACTED"
}'200Example response
json
{
"message": "Lead updated successfully!",
"content": {
"lead": {
"id": "led_5c21",
"locationId": "loc_abc123",
"fullname": "Rae Nakamura",
"email": "rae@northwind.example",
"phoneNumber": "+15125550142",
"companyName": "Northwind Traders",
"title": "Operations lead",
"website": "https://northwind.example",
"city": "Austin",
"state": "TX",
"source": "Trade show",
"notes": null,
"status": "NEW",
"lastContactedAt": null,
"accountId": null,
"createdAt": "2026-08-11T16:20:00.000Z",
"updatedAt": "2026-08-11T16:20:00.000Z"
}
}
}In the console
The same thing done by hand, for anyone comparing the API against the screen they already use.