Create or update a contact
The endpoint to build a sync on. Matches an existing contact by phone; creates one when there is no match.
Returns 201 when a contact was created and 200 when an existing one was matched. The update half is a patch: upsert never clears a field you did not send.
Safe to run concurrently — two simultaneous upserts with the same phone produce one contact, not a duplicate.
Authorizations
A workspace API token. Create one in Settings → API. Send it as Authorization: Bearer sk_live_....
Query Parameters
Comma-separated relationships to inline in the response. Unexpanded relations are still identified by their *_id field.
"organization,owner"
Body
Body for PUT /v1/contacts.
Matched on phone, which is unique per workspace and canonicalized before
comparison, so (11) 98765-4321 and +55 11 98765-4321 are the same key.
Required; a nameless contact is not useful.
1Required. Any format; normalized to E.164.
What to do when a contact with this phone already exists.
update, ignore Unique identifier for an organization.
^org_[0-9a-f]{32}$"org_9f2ac41d8b7e4a51b0d3e6f7a1c2d3e4"
Unique identifier for an user.
^usr_[0-9a-f]{32}$"usr_9f2ac41d8b7e4a51b0d3e6f7a1c2d3e4"
CRM record visibility levels; resolved live against the owner's current teams.
private, team, team_and_subteams, company Response
Successful Response
A person in your CRM.
Unique identifier for a contact.
^con_[0-9a-f]{32}$"con_9f2ac41d8b7e4a51b0d3e6f7a1c2d3e4"
Where the contact stands.
open, on_hold, won, lost Governs who sees this record in the Sailer UI. API tokens are workspace-scoped and are not filtered by it.
private, team, team_and_subteams, company Short-lived signed URL; do not store it.
Free-text employer name. Unrelated to your workspace and to organization, which is a CRM record.
Every custom field defined on contacts in this workspace, keyed by field key and typed from its definition. Unset fields are null, so reading any contact shows the full set of keys in use.
Name of the reason, when status is lost.
Display name. Derived from first_name and last_name.
"contact"Populated only when organization is in expand.
Unique identifier for an organization.
^org_[0-9a-f]{32}$"org_9f2ac41d8b7e4a51b0d3e6f7a1c2d3e4"
Populated only when owner is in expand.
Unique identifier for an user.
^usr_[0-9a-f]{32}$"usr_9f2ac41d8b7e4a51b0d3e6f7a1c2d3e4"
E.164. Normalized on write.
cold, warm, hot