Lead object

Every lead in the API and in webhooks has the same shape.

FieldTypeMeaning
idUUIDYour lead's id. Stable.
service_id, servicetextCatalog id and name.
ziptextCustomer's ZIP code.
detailstextThe customer's description and their answers to the job questions. Until you accept (and after a decline), phone numbers, emails, links, handles, street addresses and names in it are replaced with [phone], [email], [link], [handle], [address] and [name]. Full text after you accept.
received_attimeWhen the lead was sent to you.
updated_attimeLast change of any kind (status, accept, decline, follow-up, your ids or note, credit).
statustextSee Statuses.
accepted, accepted_atbool, timeYou accepted it (shared leads count as accepted when sent).
declined, declined_atbool, timeYou declined it.
lead_typetextshared (up to 3 pros picked), direct (only you) or related (a nearby service you list).
exclusive, related, repeat_customerboolLead details for filtering.
contact_viatextHow the customer wants to be reached: phone, email or message.
contactobject or nullnull until accepted. Then first_name, last_name, phone (if contact_via is phone), email (if phone or email). Real numbers, never relay numbers.
customer_idtext or nullSame value for the same customer across leads (cus_...). Shown once contact is visible.
can_messageboolYou can send in-app messages (accepted, and the customer has an account).
unread_messagesnumberCustomer messages you have not read.
price_cents, freenumber, boolLead price; free leads (your referral link, tests).
charged_centsnumberWhat is actually charged for this lead now (after credits).
credittextnone, requested, approved or denied.
follow_up_attime or nullYour follow-up date.
external_idsobjectYour own ids, for example {"servicetitan":"88213"}.
notetext or nullYour internal note.
job_total_cents, paid_centsnumber or nullWhat you reported.

Money is in whole cents. Times are ISO 8601 with a time zone. Phone numbers are E.164 (+12535550100).

Example

{
  "id": "6b1c2f0e-1d7a-4c55-9a51-0f3c2a9d8e11",
  "service_id": "water-heater-installation",
  "service": "Water heater installation",
  "zip": "98391",
  "details": "40 gallon gas heater leaking at the base. Garage. Prefer mornings.",
  "received_at": "2026-10-22T16:04:11.201+00:00",
  "updated_at": "2026-10-22T18:30:00.410+00:00",
  "status": "hired",
  "accepted": true,
  "accepted_at": "2026-10-22T16:06:02.000+00:00",
  "declined": false,
  "declined_at": null,
  "lead_type": "direct",
  "exclusive": true,
  "related": false,
  "repeat_customer": false,
  "contact_via": "phone",
  "contact": {"first_name": "Pat", "last_name": "Rivera", "phone": "+12535550100", "email": "pat@example.com"},
  "customer_id": "cus_4f1a9c0d2b7e8a6c5d3f",
  "can_message": true,
  "unread_messages": 0,
  "price_cents": 4500,
  "free": false,
  "charged_cents": 4500,
  "credit": "none",
  "follow_up_at": null,
  "external_ids": {"servicetitan": "88213"},
  "note": "Gate code 1234",
  "job_total_cents": 185000,
  "paid_cents": null
}

We only add fields within v1. Ignore fields you do not know.