Skip to main content
PUT
Create or update a contact

Authorizations

Authorization
string
header
required

A workspace API token. Create one in Settings → API. Send it as Authorization: Bearer sk_live_....

Query Parameters

expand
string | null

Comma-separated relationships to inline in the response. Unexpanded relations are still identified by their *_id field.

Example:

"organization,owner"

Body

application/json

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.

first_name
string
required

Required; a nameless contact is not useful.

Minimum string length: 1
phone
string
required

Required. Any format; normalized to E.164.

address
string | null
city
string | null
company_name
string | null
custom_fields
Custom Fields · object
email
string | null
job_title
string | null
last_name
string | null
on_match
enum<string>
default:update

What to do when a contact with this phone already exists.

Available options:
update,
ignore
organization_id
string | null

Unique identifier for an organization.

Pattern: ^org_[0-9a-f]{32}$
Example:

"org_9f2ac41d8b7e4a51b0d3e6f7a1c2d3e4"

owner_id
string | null

Unique identifier for an user.

Pattern: ^usr_[0-9a-f]{32}$
Example:

"usr_9f2ac41d8b7e4a51b0d3e6f7a1c2d3e4"

state
string | null
visibility
enum<string>
default:company

CRM record visibility levels; resolved live against the owner's current teams.

Available options:
private,
team,
team_and_subteams,
company

Response

Successful Response

A person in your CRM.

created_at
string<date-time>
required
id
string
required

Unique identifier for a contact.

Pattern: ^con_[0-9a-f]{32}$
Example:

"con_9f2ac41d8b7e4a51b0d3e6f7a1c2d3e4"

status
enum<string>
required

Where the contact stands.

Available options:
open,
on_hold,
won,
lost
updated_at
string<date-time>
required
visibility
enum<string>
required

Governs who sees this record in the Sailer UI. API tokens are workspace-scoped and are not filtered by it.

Available options:
private,
team,
team_and_subteams,
company
address
string | null
avatar_url
string | null

Short-lived signed URL; do not store it.

channels
ContactChannel · object[]
city
string | null
company_name
string | null

Free-text employer name. Unrelated to your workspace and to organization, which is a CRM record.

custom_fields
Custom Fields · object

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.

email
string | null
first_name
string | null
job_title
string | null
last_name
string | null
lost_reason
string | null

Name of the reason, when status is lost.

name
string | null

Display name. Derived from first_name and last_name.

object
string
default:contact
Allowed value: "contact"
organization
Organization · object | null

Populated only when organization is in expand.

organization_id
string | null

Unique identifier for an organization.

Pattern: ^org_[0-9a-f]{32}$
Example:

"org_9f2ac41d8b7e4a51b0d3e6f7a1c2d3e4"

owner
User · object | null

Populated only when owner is in expand.

owner_id
string | null

Unique identifier for an user.

Pattern: ^usr_[0-9a-f]{32}$
Example:

"usr_9f2ac41d8b7e4a51b0d3e6f7a1c2d3e4"

phone
string | null

E.164. Normalized on write.

score
enum<string> | null
Available options:
cold,
warm,
hot
state
string | null
tags
Tag · object[]