Who just emailed me?
The reason this endpoint is worth having. Pair it with themessage.received webhook and one call turns a sender into a
person:
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
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.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.