Update a Contact
exclude_unset), so omitting a field leaves it untouched, but explicitly passing null clears it. Field semantics are the same as Create, plus department, which isn’t accepted on create — this endpoint and a CSV import are the two ways to set it. account_id, if provided, is validated to belong to the caller’s organization the same way as on create.
This endpoint does not accept stage — use Respond, Disqualify, or Convert to move a contact through the funnel.
contact_id exists before patching. A PATCH matching no row (nonexistent id, or a different organization’s contact under RLS) is still a “successful” PostgREST update of zero rows, so the response is 200 {} rather than a 404.Auth
Requires a CRM manage scope and an active organization on the token. Any*:manage scope qualifies — in practice contacts:manage, deals:manage, companies:manage, or activities:manage.
Response
The updated contact row (same shape as Create’s response), or{} if contact_id didn’t match a row — see note above.
Errors
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The contact's id.
Body
Link to a different account (must belong to the caller's organization), or null to unlink.
Given name.
Family name.
Contact's email address.
Job title.
Department/team name. Not accepted on creation — set it via PATCH or by mapping a column to it in a CSV import.
Phone number.
LinkedIn profile URL.
Free-text company name for an unlinked contact.
Company's email domain, used for search/enrichment.
Origin tag for this record.
Free-text notes.
Logto user ID of the owning rep.
Response
Successful Response
The response is of type Response Patch Contact Route Contacts Contact Id Patch · object.