Skip to main content
Required permission: Contacts → Read to list, Contacts → Write to create, edit or delete.
These are organization contacts. A key never sees anybody’s personal address book.Contacts a person adds in the web app belong to that person and are invisible to every API key — as are their groups. Contacts a key creates are visible to your team in the dashboard, because an address book nobody can reach is not an address book.

Who just emailed me?

The reason this endpoint is worth having. Pair it with the message.received webhook and one call turns a sender into a person:
The address is matched case-insensitively, so the value straight out of a webhook payload works without cleaning it up first.

List contacts

search deliberately does not read notes. A search that reaches into free text turns a lookup into a way to read the whole address book by fishing for words. Name and organisation are what a lookup is for.

Create a contact

display_name is the only required field. Addresses are stored lowercased and trimmed, which is what makes ?email= match. Empty rows are dropped rather than stored — an empty row is somebody leaving a field alone, not an error.

Read, replace, delete

PATCH replaces the whole contact; it does not merge. A field you leave out is cleared.Sending {"display_name": "Alice Chen"} to a contact that had an email address leaves it with no email address — and it will then stop appearing in ?email= lookups. Read the contact, change what you want, and send it back whole.The one exception is the photograph, which is never touched by a write, so replacing a record cannot silently remove somebody’s picture.

Groups

Membership travels with the group rather than living at its own endpoint: a group is small, and “the group is these contacts” is one fact — splitting it across two calls would let a caller leave a group half-updated with no way to tell.
members omitted means “leave it alone”; members: [] means “empty it”. That distinction is what lets a rename be only a rename.Every id must be a contact in your organization. One that is not — including a member’s personal contact — is refused with 400, and the group is not created or changed. Nothing is half-applied.
Deleting a group removes the grouping and keeps the contacts. A group is a label on people, not a container of them.

Not available yet

Contact activity and correspondents. The web app shows how often you have written to somebody and who else was involved. Both are computed from an index that is only refreshed when a person opens the app, and that is keyed to that person — so an API version would return figures that are quietly out of date and incomplete. It is left out rather than shipped wrong. Photographs. has_photo tells you one exists. Fetching it is not supported: the app serves photographs from a session-authenticated route, and the alternative — a direct storage URL — would make every contact’s picture readable by anyone who guessed the address.

Errors

See Errors for the full response shape.