Audiences
Manage subscriber lists used by campaigns and sign-up forms.
Create an audience
Creates an empty audience.
/audiencesRequires a full API key. Add people with Add a subscriber, or by passing the audience ID in audiences when you create a contact. Fires an audience.created event. See Audiences.
Body parameters
namestringrequiredNewsletter. Must be unique in the workspace.visibilitystringdefault: privatepublic lists the audience on the manage subscriptions page for everyone; private only for people subscribed to it.public_namestring | nullnull shows name.public_descriptionstring | nulldouble_opt_inboolean | objecttrue or false, or an object with any of enabled, redirect_url (an http(s) URL people go to after confirming, or null) and email. email takes from, reply_to, subject, design (default or custom), heading, body, button_label and footer. Fields you leave out keep their stored value. Turning it on needs a from address on a verified sending domain. See Double opt-in.
confirmation_emailboolean | objecttrue or false, or an object with enabled and email, which takes the same fields as above plus button_url.unengagedobjectReturns
Returns 201 with the new audience, including its settings as described in Retrieve an audience:
objectstringaudience.idstringnamestringtokenstringvisibilitystringpublic or private.created_atstringupdated_atstring{
"object": "audience",
"id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
"name": "Newsletter",
"token": "4KXUJdXRVlVgbkWQm4GHLy8BleP",
"visibility": "private",
"public_name": null,
"public_description": null,
"double_opt_in": {
"enabled": false,
"redirect_url": null,
"email": {
"from": null,
"reply_to": null,
"subject": "Confirm your subscription to {{audience_name}}",
"design": "default",
"heading": "Please confirm your subscription",
"body": "Hi {{first_name|\"there\"}},\n\nYou asked to join {{audience_name}}. Confirm your email address to start getting our emails.",
"button_label": "Confirm subscription",
"footer": "Button not working? Open this link: <a href=\"{{confirm_url}}\">{{confirm_url}}</a>\n\nIf you did not ask to subscribe, ignore this email. You will not be added unless you confirm.",
"source": null
}
},
"confirmation_email": {
"enabled": false,
"email": {
"from": null,
"reply_to": null,
"subject": "You're subscribed to {{audience_name}}",
"design": "default",
"heading": "You're subscribed",
"body": "Hi {{first_name|\"there\"}},\n\nThanks for joining {{audience_name}}. You will hear from us soon.",
"button_label": "",
"button_url": "",
"footer": "You are getting this email because you subscribed to {{audience_name}}. <a href=\"{{manage_subscriptions_url}}\">Manage subscriptions</a>",
"source": null
}
},
"unengaged": { "exclude": false, "days": 365 },
"archived": false,
"archived_at": null,
"subscribers_count": 0,
"created_at": "2026-10-01T10:02:44.613207Z",
"updated_at": "2026-10-01T10:02:44.613207Z"
}{
"error": "Audience with this name already exists",
"existing": {
"object": "audience",
"id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
"name": "Newsletter",
"token": "4KXUJdXRVlVgbkWQm4GHLy8BleP",
"subscribers_count": 0,
"created_at": "2026-10-01T10:02:44.000000Z",
"updated_at": "2026-10-01T10:02:44.000000Z"
}
}Retrieve an audience
Retrieves an audience with its settings, counts and public token.
/audiences/{id}Requires a full API key.
Path parameters
idstringrequiredaud_…) or its exact name, URL-encoded.Returns
Returns the audience object.
objectstringaudience.idstringnamestringtokenstringvisibilitystringpublic or private. Public audiences are listed on the manage subscriptions page for everyone; private ones only for people subscribed to them.public_namestring | nullnull to show name.public_descriptionstring | nulldouble_opt_inobjectenabled, redirect_url (where people go after confirming, or null) and email, the double opt-in email with from, reply_to, subject, design (default or custom), heading, body, button_label, footer and source (the MJML of a custom design, or null; lists leave it out). Fields you never set hold the defaults.
confirmation_emailobjectenabled and email, the confirmation email, with the same fields as above plus button_url.
unengagedobjectarchivedbooleanarchived_at holds the time, or null.subscribers_countintegerusageobjectused (the same count), limit (the most subscribers an audience can have on your plan, or null for no limit) and plan. See Limits.
unengaged_countintegerpending_confirmations_countintegercreated_atstringupdated_atstring{
"object": "audience",
"id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
"name": "Newsletter",
"visibility": "public",
"public_name": "Monthly newsletter",
"public_description": "Product news and tips, once a month.",
"double_opt_in": {
"enabled": true,
"redirect_url": null,
"email": {
"from": "News <news@example.com>",
"reply_to": null,
"subject": "Confirm your subscription to {{audience_name}}",
"design": "default",
"heading": "Please confirm your subscription",
"body": "Hi {{first_name|\"there\"}},\n\nYou asked to join {{audience_name}}. Confirm your email address to start getting our emails.",
"button_label": "Confirm subscription",
"footer": "Button not working? Open this link: <a href=\"{{confirm_url}}\">{{confirm_url}}</a>\n\nIf you did not ask to subscribe, ignore this email. You will not be added unless you confirm.",
"source": null
}
},
"confirmation_email": {
"enabled": false,
"email": {
"from": null,
"reply_to": null,
"subject": "You're subscribed to {{audience_name}}",
"design": "default",
"heading": "You're subscribed",
"body": "Hi {{first_name|\"there\"}},\n\nThanks for joining {{audience_name}}. You will hear from us soon.",
"button_label": "",
"footer": "You are getting this email because you subscribed to {{audience_name}}. <a href=\"{{manage_subscriptions_url}}\">Manage subscriptions</a>",
"button_url": "",
"source": null
}
},
"unengaged": { "exclude": true, "days": 365 },
"archived": false,
"archived_at": null,
"token": "4KXUJdXRVlVgbkWQm4GHLy8BleP",
"subscribers_count": 1284,
"unengaged_count": 212,
"pending_confirmations_count": 3,
"usage": {
"used": 1284,
"limit": 50000,
"plan": "pro"
},
"created_at": "2026-10-01T10:02:44.000000Z",
"updated_at": "2026-10-01T10:02:44.000000Z"
}{
"error": "Audience not found"
}Update an audience
Renames an audience or changes its settings.
/audiences/{id}Requires a full API key. Send only the fields you want to change. The ID, token and subscribers don’t change. Fires an audience.updated event.
Path parameters
idstringrequiredBody parameters
namestringvisibilitystringpublic lists the audience on the manage subscriptions page for everyone; private only for people subscribed to it.public_namestring | nullnull shows name.public_descriptionstring | nulldouble_opt_inboolean | objecttrue or false, or an object with any of enabled, redirect_url (an http(s) URL people go to after confirming, or null) and email. email takes from, reply_to, subject, design (default or custom), heading, body, button_label and footer. Fields you leave out keep their stored value. Turning it on needs a from address on a verified sending domain. See Double opt-in.
confirmation_emailboolean | objecttrue or false, or an object with enabled and email, which takes the same fields as above plus button_url.unengagedobjectarchivedbooleanSetting a custom MJML design with email.source is part of the MJML alpha and returns 403 with error: "mjml_alpha" for API keys.
Returns
Returns the audience with its settings, as in Retrieve an audience. In this response subscribers_count is always 0, and the counts are left out; use Retrieve an audience for them. Invalid settings return 422 with an errors object keyed by field, such as double_opt_in.email.from.
{
"object": "audience",
"id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
"name": "Weekly newsletter",
"token": "4KXUJdXRVlVgbkWQm4GHLy8BleP",
"visibility": "public",
"public_name": "Weekly newsletter",
"public_description": null,
"double_opt_in": {
"enabled": true,
"redirect_url": null,
"email": {
"from": "News <news@example.com>",
"reply_to": null,
"subject": "Confirm your subscription to {{audience_name}}",
"design": "default",
"heading": "Please confirm your subscription",
"body": "Hi {{first_name|\"there\"}},\n\nYou asked to join {{audience_name}}. Confirm your email address to start getting our emails.",
"button_label": "Confirm subscription",
"footer": "Button not working? Open this link: <a href=\"{{confirm_url}}\">{{confirm_url}}</a>\n\nIf you did not ask to subscribe, ignore this email. You will not be added unless you confirm.",
"source": null
}
},
"confirmation_email": {
"enabled": false,
"email": {
"from": null,
"reply_to": null,
"subject": "You're subscribed to {{audience_name}}",
"design": "default",
"heading": "You're subscribed",
"body": "Hi {{first_name|\"there\"}},\n\nThanks for joining {{audience_name}}. You will hear from us soon.",
"button_label": "",
"button_url": "",
"footer": "You are getting this email because you subscribed to {{audience_name}}. <a href=\"{{manage_subscriptions_url}}\">Manage subscriptions</a>",
"source": null
}
},
"unengaged": {
"exclude": false,
"days": 365
},
"archived": false,
"archived_at": null,
"subscribers_count": 0,
"created_at": "2026-10-01T10:02:44.000000Z",
"updated_at": "2026-10-01T14:31:09.000000Z"
}{
"error": "No valid fields provided for update. Provide at least one of: name, visibility, public_name, public_description, double_opt_in, confirmation_email, unengaged, archived"
}{
"message": "Validation failed.",
"errors": {
"double_opt_in.email.from": ["Use an address on a verified sending domain of this workspace."]
}
}{
"error": "Audience not found"
}{
"error": "Another audience with this name already exists"
}List audiences
Returns a page of audiences, newest first. Archived audiences are left out unless you ask for them.
/audiencesRequires a full API key. List items don’t include the audience token; use Retrieve an audience for it.
Query parameters
pageintegerdefault: 1limitintegerdefault: 10searchstringarchivedstringdefault: falsefalse for active audiences, true for archived ones only, all for both.visibilitystringpublic or private to list only those.matchstringdefault: allall or or. How the filters below combine.orderstringname, public_name, visibility, subscribers_count or created_at.directionstringasc or desc.Filters
Add filters as key.condition=value, for example name.contains=news. See Filtering.
| Key | Type |
|---|---|
name |
string |
public_name |
string |
visibility |
enum: public, private |
subscribers_count |
number |
created_at |
date |
Returns
dataobject[]object, id, name, the settings (visibility, public_name, public_description, double_opt_in, confirmation_email, unengaged, archived, archived_at), subscribers_count, usage, created_at and updated_at. See Retrieve an audience. The email objects in lists leave out source.total_recordsintegerarchived.next_page_urlstring | nullnull. See Pagination.previous_page_urlstring | nullnull.{
"data": [
{
"object": "audience",
"id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
"name": "Newsletter",
"visibility": "public",
"public_name": "Monthly newsletter",
"public_description": "Product news and tips, once a month.",
"double_opt_in": {
"enabled": true,
"redirect_url": null,
"email": {
"from": "News <news@example.com>",
"reply_to": null,
"subject": "Confirm your subscription to {{audience_name}}",
"design": "default",
"heading": "Please confirm your subscription",
"body": "Hi {{first_name|\"there\"}},\n\nYou asked to join {{audience_name}}. Confirm your email address to start getting our emails.",
"button_label": "Confirm subscription",
"footer": "Button not working? Open this link: <a href=\"{{confirm_url}}\">{{confirm_url}}</a>\n\nIf you did not ask to subscribe, ignore this email. You will not be added unless you confirm."
}
},
"confirmation_email": {
"enabled": false,
"email": {
"from": "News <news@example.com>",
"reply_to": null,
"subject": "You're subscribed to {{audience_name}}",
"design": "default",
"heading": "You're subscribed",
"body": "Hi {{first_name|\"there\"}},\n\nThanks for joining {{audience_name}}. You will hear from us soon.",
"button_label": "",
"footer": "You are getting this email because you subscribed to {{audience_name}}. <a href=\"{{manage_subscriptions_url}}\">Manage subscriptions</a>",
"button_url": ""
}
},
"unengaged": {
"exclude": false,
"days": 365
},
"archived": false,
"archived_at": null,
"subscribers_count": 1284,
"usage": {
"used": 1284,
"limit": 50000,
"plan": "pro"
},
"created_at": "2026-10-01T10:02:44.000000Z",
"updated_at": "2026-10-01T10:02:44.000000Z"
},
{
"object": "audience",
"id": "aud_4KOlh9t2uw5od4qypqCtyrZyDq2",
"name": "Customers",
"visibility": "private",
"public_name": null,
"public_description": null,
"double_opt_in": {
"enabled": false,
"redirect_url": null,
"email": {
"from": null,
"reply_to": null,
"subject": "Confirm your subscription to {{audience_name}}",
"design": "default",
"heading": "Please confirm your subscription",
"body": "Hi {{first_name|\"there\"}},\n\nYou asked to join {{audience_name}}. Confirm your email address to start getting our emails.",
"button_label": "Confirm subscription",
"footer": "Button not working? Open this link: <a href=\"{{confirm_url}}\">{{confirm_url}}</a>\n\nIf you did not ask to subscribe, ignore this email. You will not be added unless you confirm."
}
},
"confirmation_email": {
"enabled": false,
"email": {
"from": null,
"reply_to": null,
"subject": "You're subscribed to {{audience_name}}",
"design": "default",
"heading": "You're subscribed",
"body": "Hi {{first_name|\"there\"}},\n\nThanks for joining {{audience_name}}. You will hear from us soon.",
"button_label": "",
"footer": "You are getting this email because you subscribed to {{audience_name}}. <a href=\"{{manage_subscriptions_url}}\">Manage subscriptions</a>",
"button_url": ""
}
},
"unengaged": {
"exclude": false,
"days": 365
},
"archived": false,
"archived_at": null,
"subscribers_count": 312,
"usage": {
"used": 312,
"limit": 50000,
"plan": "pro"
},
"created_at": "2026-09-20T16:45:10.000000Z",
"updated_at": "2026-09-20T16:45:10.000000Z"
}
],
"total_records": 2,
"next_page_url": null,
"previous_page_url": null
}Merge audiences
Copies the subscribers of other audiences into this one.
/audiences/{id}/mergeRequires a full API key. People who are already on the target audience keep their status there, so nobody who unsubscribed is subscribed again. A person on several of the merged audiences joins with Subscribed on when at least one of them has them subscribed. With delete_sources, the merged audiences are deleted afterwards and campaigns that haven’t finished sending (drafts, scheduled, queued and sending campaigns, and A/B tests waiting for their winner) send to the target instead. If such a campaign included one merged audience and excluded another, the target stays included. Segments that draw from or have a rule on a deleted audience use the target instead, and so do automation triggers, steps, conditions and exit conditions that name it. So do forms that add people to it or offer it as a choice, double opt-in links that haven’t been confirmed yet, and automation runs waiting on a condition about it. Each deletion fires audience.deleted.
Merging doesn’t fire subscriber.* events, start automations or send double opt-in or confirmation emails. If the new subscribers would take the target over your plan’s subscriber limit, nothing is merged and the request returns 422 with your usage. Invalid input, such as merging an audience into itself, also returns 422. See Merge audiences.
Path parameters
idstringrequiredBody parameters
source_idsstring[]requireddelete_sourcesbooleandefault: falseReturns
objectstringaudience_merge.audienceobjectobject, id, name and its new subscribers_count.addedintegeralready_in_audienceintegerdeleted_source_idsstring[]{
"object": "audience_merge",
"audience": {
"object": "audience",
"id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
"name": "Newsletter",
"subscribers_count": 1503
},
"added": 219,
"already_in_audience": 93,
"deleted_source_ids": ["aud_4KOlh9t2uw5od4qypqCtyrZyDq2"]
}{
"error": "One or more audiences were not found",
"missing": ["aud_4KOlh9t2uw5od4qypqCtyrZyDq2"]
}{
"message": "Validation failed.",
"errors": {
"source_ids": ["An audience cannot be merged into itself."]
}
}Bulk update audiences
Archives, unarchives or deletes several audiences at once.
/audiences/bulkRequires a full API key. Every ID must belong to the workspace, or nothing changes and the request returns 404 with the missing IDs. Archiving and unarchiving fire audience.updated; deleting fires audience.deleted and removes the audiences’ subscribers, like Delete an audience. See Archive an audience.
Body parameters
actionstringrequiredarchive, unarchive or delete.idsstring[]requiredReturns
objectstringaudience_bulk.actionstringprocessedintegerchangedintegeridsstring[]{
"object": "audience_bulk",
"action": "archive",
"processed": 2,
"changed": 2,
"ids": ["aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2", "aud_4KOlh9t2uw5od4qypqCtyrZyDq2"]
}{
"error": "One or more audiences were not found",
"missing": ["aud_4KOlh9t2uw5od4qypqCtyrZyDq2"]
}Delete an audience
Permanently deletes an audience and removes everyone from it.
/audiences/{id}Requires a full API key. The audience’s subscriber memberships are deleted with it, but the contacts stay in your workspace and in their other audiences. Its hosted subscribe URL stops working. Fires an audience.deleted event. No subscriber.deleted events are sent for the removed memberships.
Path parameters
idstringrequiredReturns
objectstringaudience.idstringnamestringdeletedbooleantrue.{
"object": "audience",
"id": "aud_4KOlh9t2uw5od4qypqCtyrZyDq2",
"name": "Customers",
"deleted": true
}{
"error": "Audience not found"
}