Contacts
Manage your CRM contacts, and read the organisations and groups they belong to. Reading requires
contacts:read; creating, updating, deleting and (un)subscribing require contacts:write.
Where a contact came from
Section titled “Where a contact came from”Every contact carries a source recording its origin: api, manual, import, form,
email_ticket, instagram_message, messenger_message, whatsapp_message, or unknown. Contacts
created through the API are stamped source: "api".
Creating contacts
Section titled “Creating contacts”POST /v1/contacts requires only email; everything else is optional.
Shout also auto-matches a contact to an organisation by its email domain where it can, so a new
contact may come back with an organisationId you didn’t set.
Updating contacts (partial semantics)
Section titled “Updating contacts (partial semantics)”PUT /v1/contacts/{id} is a partial update — omit a field (or send null) to leave it unchanged.
The one exception is groupIds:
null(or omitted) → keep the current group membership.- a non-null array (including
[]) → replaces the membership wholesale.
Subscribe / unsubscribe
Section titled “Subscribe / unsubscribe”POST /v1/contacts/{id}/unsubscribe and .../subscribe each return the updated contact with
unsubscribed flipped. Unsubscribing suppresses the contact from your email sends, honouring their
consent — prefer this over deleting. (DELETE is available and returns 204.)
Organisations and groups (read-only)
Section titled “Organisations and groups (read-only)”Both are read-only and require contacts:read:
- Organisations (
GET /v1/organisations) — filterable bydomain. Carryname,website,industry,country. - Groups / contact lists (
GET /v1/groups) — small per tenant, so returned unpaginated. Groupids are integers, not UUIDs; use them in a contact’sgroupIds.typeisstandardorall_contacts(the built-in list of everyone).