Skip to main content
POST
Create contact (or reuse the existing one)

Authorizations

Authorization
string
header
required

JWT authentication token

Headers

x-company-id
string

Target company identifier. Required only for global API keys (type=global). Ignored for company API keys and human users.

Body

application/json
name
string
required

The contact's full name. Required. If the contact already exists, its name is preserved.

Minimum string length: 1
country_code
string

Country calling code (1-3 digits). Examples: 55 (Brazil), 1 (USA), 351 (Portugal). Required when phone_number is sent; without a phone, don't send it.

Required string length: 1 - 3
Pattern: ^\d{1,3}$
email
string

The contact's email address. Identifies the contact by its normalized form (no leading or trailing spaces, lowercase), which is how it's saved. Old emails saved with uppercase letters are only recognized with the same spelling, until the database is normalized. Only counts as an identifier if it contains "@". On an existing contact, it's updated when the contact is found by phone; found by email or LinkedIn, it's only filled in if empty.

linkedin_identifier
string

The contact's LinkedIn identifier: profile URL or just the profile name. Example: joao-silva-123. Identifies the contact. On an existing contact, it's updated when the contact is found by phone; found by email or LinkedIn, it's only filled in if empty.

phone_number
string

Phone number without formatting, digits only (area code + number, without the country code). Example: 11999998888. Identifies the contact. A phone that doesn't form a valid number with country_code is rejected with 400. Optional: the contact needs at least one identifier among phone, email, and LinkedIn.

Pattern: ^\d*$
job_title
string

The contact's job title. Example: Sales Manager. Saved on creation; on an existing contact, it's updated when the contact is found by phone; found by email or LinkedIn, it's only filled in if empty.

seniority
string

The contact's seniority level. Example: Senior, Junior, Mid-level. Saved on creation; on an existing contact, it's updated when the contact is found by phone; found by email or LinkedIn, it's only filled in if empty.

department
string

The contact's department. Example: Sales, IT, Marketing. Saved on creation; on an existing contact, it's updated when the contact is found by phone; found by email or LinkedIn, it's only filled in if empty.

country
string

The contact's country. Example: Brazil. Saved on creation; on an existing contact, it's updated when the contact is found by phone; found by email or LinkedIn, it's only filled in if empty.

region
string

The contact's state or region. Example: São Paulo. Saved on creation; on an existing contact, it's updated when the contact is found by phone; found by email or LinkedIn, it's only filled in if empty.

city
string

The contact's city. Example: São Paulo. Saved on creation; on an existing contact, it's updated when the contact is found by phone; found by email or LinkedIn, it's only filled in if empty.

experience
string

The contact's professional experience. Saved on creation; on an existing contact, it's updated when the contact is found by phone; found by email or LinkedIn, it's only filled in if empty.

additional_attributes
object

The contact's custom fields. Format: { "field_slug": value }. Slugs must match custom fields registered with the CONTACT context. Invalid or nonexistent slugs are silently ignored. Values must be primitives (string, number, boolean or null). On an existing contact found by phone, the slugs sent are updated (merge); found by email or LinkedIn, only empty slugs are filled in. Slugs not sent stay as they are. Example: { "cpf": "12345678900", "data_nascimento": "1990-01-15", "valor_total": 1500.50 }

Response

Existing contact reused (created: false). Found by phone, the fields sent were updated; by email or LinkedIn, only empty ones were filled in and ignored_fields lists what wasn't saved.

name
string
required

Contact name

company
any
required

Contact's company

created
boolean
required

true when the contact was created (201); false when it was reused (200).

matched_by
enum<string> | null
required

Identifier that matched

Available options:
email,
linkedin,
phone
matches_count
number
required

How many contacts in the company matched by the matched_by key (0 on creation). Above 1, the company has duplicate contacts and the oldest one was reused.

ignored_fields
string[]
required

Fields sent that were NOT saved because the existing contact already had another value (only when reused by email or LinkedIn). E.g. email, phone_number, job_title, additional_attributes.<slug>. Empty on creation and when found by phone.

_id
string

Contact ID

id
string

Contact ID (same value as _id)

country_code
string

Country code of the number. Absent, along with the phone, when the contact only has a WhatsApp identifier.

email
string

Contact's email

last_activity_at
any

Date of the contact's last activity

phone_number
string

The contact's phone number. Absent when the contact only has a WhatsApp identifier.

linkedin_identifier
string

LinkedIn profile identifier

job_title
string

Contact's job title

seniority
string

Contact's seniority level

department
string

Contact's department

country
string

Contact's country

region
string

Contact's state or region

city
string

Contact's city

experience
string

Contact's professional experience

skills
string

Contact's skills

additional_attributes
object

Values of the contact's custom fields, by slug. When saved via additional_attributes, the value comes in the envelope { id, value, type, updatedAt }. When saved via custom_fields (PUT), it comes raw: the option_id (select), the list of option_id (multi_select) or the text (text).

business
string | null

ID of the Business the contact belongs to

notes
object[]

Notes recorded on the contact

marketing_opt_out
object

Marketing opt-out per communication channel (whatsapp, email, linkedin). Absent or empty when the contact hasn't opted out of any channel.

whatsapp_user_id
string

The contact's WhatsApp identifier (BSUID), assigned by Meta. Opaque string.

whatsapp_username
string

The contact's WhatsApp @username, as Meta sends it

whatsapp_parent_user_id
string

The contact's WhatsApp parent_user_id, as Meta sends it

createdAt
any

Contact creation date

updatedAt
any

Contact update date