List your lists
GET /api/v1/contact-groups
Returns the lists and segments in your organization, with their IDs. Use this to find the list ID you need for the add-contact call.
GET /api/v1/contact-groups/{id} returns a single list.
Add a contact to a list
POST /api/v1/contact-groups/{listId}/contacts
Creates or updates the contact and adds them to the list, in one call. Returns 200 OK.
The body is a flat contact object — the same field set as the Contacts API. Do not wrap it in a contact object and do not send an array; both are rejected with 400.
The contact’s email address. Required on this endpoint, even though the Contacts API accepts phone instead.
SUBSCRIBED, NON_SUBSCRIBED, or UNSUBSCRIBED. See the warning below — always set this explicitly.Example request
Response
200 OK
action is created or updated, telling you whether the contact already existed. Note this endpoint returns a plain object — unlike the Contacts API, which returns a JSON:API envelope.
A 404 means the list ID doesn’t exist. The contact may still have been created; it just isn’t in that list.
List membership as a trigger
Joining a list can trigger an automation — which makes this API a simple, robust way to start flows from your backend:- Create a list like “Trial started” in the dashboard.
- Build a welcome/onboarding automation triggered by Subscribed to list → Trial started.
- From your backend, add users to the list when their trial begins.
For richer use cases — where the triggering moment carries data you want in filters and emails — prefer custom events. Lists-as-triggers shine when the only fact that matters is membership itself.
Membership vs. consent
Adding someone to a list does not make them marketable — their subscription status still governs whether marketing email reaches them. Manage consent through theemail_opt_in field.
Contacts not showing up?
Contacts are written synchronously — if you got a success response with acontactUUID, the contact exists. If you can’t see it:
- Check
actionin the response. A response without acontactobject means you’re not hitting this endpoint — verify the URL. - Verify the list ID. A wrong ID returns
404; look it up withGET /api/v1/contact-groups. - Match the API key to the organization you’re viewing in the dashboard. A key belongs to exactly one organization.
- Check
email_opt_in. Contacts created asNON_SUBSCRIBEDare hidden by the default subscription filters on the Members tab. - Clear filters on the Members view, and hard-refresh — the dashboard caches client-side.