Create or Update Contacts in Bulk

Upsert up to 500 contacts in one call. Each row finds its existing contact (matchBy, oldest match wins) — by default by its phone number when it has one, otherwise by its email; a row with a number is never matched on an email several people may share — and is updated with the fields it carries (custom fields merged); rows without a match are created (they need firstName). Bad rows are listed in invalid by position — the others still go through. Every created contact fires the contact.created webhook.

Security:

  • The organisationId in the URL must match the organisation your JWT was issued for — requests for a different organisation fail with 401.
  • Requires CRM_ADMIN, ACCOUNT_OWNER, or CRM_BOT role; other roles receive 403.
Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…
Path Params
string
required

Your organisation UUID (returned as org from the /token endpoint).

Body Params
contacts
array of objects
required

1–500 contacts. Existing ones (see matchBy) are updated; new ones need firstName.

contacts*
string
enum
Defaults to phone_or_email

How a row finds its existing contact (the oldest match wins). phone_or_email (default): by its phone number when the row has one, otherwise by its email — a row with a number is never matched on an email, which several people may share.

Allowed:
string

Contact template channel for new contacts (as in create).

Responses

400

Bad request — not a list, more than 500, or a bad matchBy / channelId

401

Unauthorized — invalid/expired JWT or organisation ID does not match the token

403

Forbidden — role not permitted

429

Too many requests

Language
Credentials
Bearer
JWT
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json