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.
Max 100 characters.
Max 100 characters.
SUBSCRIBED, NON_SUBSCRIBED, or UNSUBSCRIBED. See the warning below — always set this explicitly.7–20 characters.
Where the contact came from. Defaults to
api.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.