Update a lead
PATCH /v1/leads/{id} — change only the fields you send.
PATCH Update a lead
/v1/leads/{id}Sends only what changes. No field is required, but the body must hold at least one. Fields you
leave out are untouched; null (or an empty string) clears one. The response is the updated
lead in the same shape as GET /v1/leads.
idstring · uuidRequiredThe lead's id.
If-Unmodified-Sincestring · date-timeThe updatedAt you last read. If staff have edited the lead since, the patch is refused with
a 409 and the current updatedAt, so you can re-read and decide. Without it the patch always
applies.
firstNamestring · max 100, or nullThe customer must keep a name: one of firstName, lastName or companyName.
lastNamestring · max 100, or nullcompanyNamestring · max 250, or nulltitleoption · id or name, or nullcustomerTypeoption · id or name, or nullemailstring · email · max 255, or nullThe customer must keep a way to be contacted: one of email, phoneNumber or mobile.
phoneNumberstring · max 50, or nullNormalised as on create.
mobilestring · max 50, or nullNormalised as on create.
addressstring · max 250, or nulladdress2string · max 250, or nulladdress3string · max 250, or nulltownstring · max 100, or nullcountystring · max 100, or nullpostcodestring · max 20, or nullUpper-cased.
countryoption · id or name, or nullwhat3Wordsstring · max 100, or nullmarketingEmailbooleanmarketingSmsbooleanmarketingPostbooleanmarketingoption · id or name, or nullClearing it clears subSourceCampaign with it.
subSourceCampaignoption · id or name, or nullSent alone, moves the lead to that campaign's source. By name it is looked up within the
current or sent marketing.
leadTypeoption · id or name, or nullmainInterestoption · id or name, or nullsalesAreaoption · id or name, or nullleadProductTypesoption[] · max 50, or nullReplaces the whole list.
propertyTypeoption · id or name, or nullpropertyCategoryoption · id or name, or nullplanningRequiredoption · id or name, or nullplanningTypeoption · id or name, or nullpropertyOtherstring · max 250, or nullyearBuiltinteger · 1000 to 2200, or nullassignedTostring · user id or email, or nullReassigns and notifies the new user; null unassigns.
messagestring · max 5000, or nulladvancedDataobject, or nullexpectedCloseDatestring · date or date-time, or nullRead in your timezone.
testbooleanTypes, limits and valid values are exactly those of create: option fields
take an id or name, dates are read in your
timezone, phone numbers and postcodes are normalised.
The identity fields cannot change: reference, source, and the old webhook's aliases (id,
name, phone, emailMarketing, smsMarketing) are refused.
Any patch bumps the lead's updatedAt, even when only customer or contact fields
changed, so a sync using updatedSince sees it. Changing the stage is a separate call:
move to a stage.
curl -X PATCH https://api.evacrm.co.uk/v1/leads/1e4e3f90-4384-42ce-90c3-540db5343964 \
-H "Authorization: Bearer sk_..." \
-H "If-Unmodified-Since: 2026-09-02T11:14:03.512+01:00" \
-H "Content-Type: application/json" \
-d '{
"mobile": "07700 900456",
"leadType": "Doors",
"expectedCloseDate": "2026-10-01",
"assignedTo": "sam@example.com",
"companyName": null
}'{
"changed": ["mobile", "leadType", "expectedCloseDate", "assignedTo", "companyName"],
"lead": { "id": "1e4e3f90-…", "code": "L013898", "…": "…" }
}