List subscribers

Returns a page of one list's subscribers, newest first unless asked otherwise.

GET /v1/marketing/lists/{id}/subscribers

Addresshttps://api.hanzo.ai/v1/marketing/lists/{id}/subscribers
MethodGET
Operationget_marketing_lists_by_id_subscribers
AuthAuthorization: Bearer $HANZO_API_KEY

Returns a page of one list's subscribers, newest first unless asked otherwise. Every filter (status, tag, source, ref, consent basis, a prefix of the address or name, a custom field's value, ranges of when they joined and confirmed, and whether they opened or clicked since a time) walks an index of its own, so a page costs the same on a list of ten rows or ten million. Continue with next.

Request

21 fields.

FieldInTypeRequiredDescription
idpathstringyesID is the list, by id or slug, from the path.
statusquerystring—Status is one status or several, comma-separated: pending, subscribed, unsubscribed, bounced, complained, cleaned.
tagquerystring—Tag keeps subscribers carrying this tag.
sourcequerystring—Source keeps subscribers that came from this kind of source: form, page, api, import or commerce.
refquerystring—Ref keeps subscribers from one source instance: a form id, a page, an import batch id.
basisquerystring—Basis keeps subscribers by the consent basis recorded for them: explicit, legitimate_interest or unverified.
qquerystring—Q keeps subscribers whose address or name begins with it, case-insensitively.
fieldquerystring—Field names a custom field, and Value keeps subscribers whose value for it is exactly this.
valuequerystring—Value is the custom field's value Field keeps.
createdAfterqueryinteger—CreatedAfter and CreatedBefore bound when the subscriber joined the list, unix seconds, inclusive.
createdBeforequeryinteger—CreatedBefore is the upper bound of CreatedAfter's range.
confirmedAfterqueryinteger—ConfirmedAfter and ConfirmedBefore bound when the subscription was confirmed, unix seconds, inclusive.
confirmedBeforequeryinteger—ConfirmedBefore is the upper bound of ConfirmedAfter's range.
openedAfterqueryinteger—OpenedAfter keeps subscribers who opened a broadcast at or after this time.
notOpenedSincequeryinteger—NotOpenedSince keeps subscribers who have opened nothing since this time, including those who never opened anything.
clickedAfterqueryinteger—ClickedAfter keeps subscribers who clicked a link at or after this time.
segmentquerystring—Segment applies a saved segment of the list; the filter fields narrow it further.
sortquerystring—Sort is created (the default), email, name, confirmed or opened.
orderquerystring—Order is desc (the default) or asc.
cursorquerystring—Cursor continues from where the previous page ended.
limitqueryinteger—Limit is the page size, 50 by default and at most 500.

Response

StatusBodyMeaning
200marketing.SubscriberPageok
defaultproblem-detailsrefused

200 body — 33 fields.

FieldInTypeAlwaysDescription
databodymarketing.Subscriber[]—Data is the page.
data[].clicksbodyinteger (int64)—Clicks counts the clicks reported.
data[].confirmedAtbodyinteger (int64)—ConfirmedAt is when the subscription was confirmed or, for one that needed no confirmation, began; 0 while pending.
data[].consentbodymarketing.Consent—
data[].consent.atbodyinteger (int64)—At is when it was given, unix seconds; for an import, the date the file carried when it carried one.
data[].consent.basisbodystring—Basis is explicit, legitimate_interest or unverified.
data[].consent.dntbodyboolean—DNT records that the request carried Do Not Track (DNT: 1).
data[].consent.gpcbodyboolean—GPC records that the request carried Global Privacy Control (Sec-GPC: 1).
data[].consent.ipbodystring—IP is the network address it was given from, when it was given here.
data[].consent.languagebodystring—Language is the language it was asked in.
data[].consent.methodbodystring—Method is how it was given: double_opt_in, single_opt_in, import, api, preferences or commerce.
data[].consent.pagebodystring—Page is the form or page it was given on.
data[].createdAtbodyinteger (int64)—CreatedAt is when the row was created, unix seconds.
data[].emailbodystring—Email is the address, lower-cased and trimmed; one row per address per list.
data[].fieldsbodyobject—Fields are the values of the org's custom fields, by key.
data[].fields.*bodystring—
data[].idbodyinteger (int64)—ID is the subscriber's id within the org.
data[].languagebodystring—Language is the subscriber's language, a BCP 47 tag.
data[].lastClickAtbodyinteger (int64)—LastClickAt is the last click the email plane reported.
data[].lastOpenAtbodyinteger (int64)—LastOpenAt is the last open the email plane reported.
data[].lastSentAtbodyinteger (int64)—LastSentAt is the last broadcast sent to them.
data[].listbodystring—List is the list's id.
data[].namebodystring—Name is the person's name, as given.
data[].opensbodyinteger (int64)—Opens counts the opens reported.
data[].personbodystring—Person is the CRM person the address is: the key the event stream, the CRM and Insights join on.
data[].refbodystring—Ref is that place: a form id, a page, an import batch id.
data[].sourcebodystring—Source is the kind of place the membership came from: form, page, api, import or commerce.
data[].statusbodystring—Status is pending, subscribed, unsubscribed, bounced, complained or cleaned.
data[].tagsbodystring[]—Tags label the subscriber; each at most 64 characters.
data[].unsubscribedAtbodyinteger (int64)—UnsubscribedAt is when the subscriber left; 0 while they have not.
data[].updatedAtbodyinteger (int64)—UpdatedAt is the last change, unix seconds.
nextbodystring—Next continues the walk; empty when this is the last page.
totalbodyinteger (int64)—Total is how many subscribers match, when the list knows without reading them: the whole list or a set of statuses.

Failure carries the platform error shape — see Errors.

Examples

hanzo marketing lists subscribers list <id>
import { Configuration, MarketingApi } from 'hanzoai';

const api = new MarketingApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.getMarketingListsByIdSubscribers({ id: 'id' });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import MarketingApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = MarketingApi(client).get_marketing_lists_by_id_subscribers(id='id')
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.MarketingAPI.GetMarketingListsByIdSubscribers(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, marketing_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = marketing_api::get_marketing_lists_by_id_subscribers(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.MarketingApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new MarketingApi(client).getMarketingListsByIdSubscribers();

The method above is the one at the current release of the document. [email protected] (npm) and [email protected] (PyPI) were generated from an earlier release, where this operation carried a different id, so it spells the method differently — regenerating the clients is what makes the two agree. SDKs →

curl https://api.hanzo.ai/v1/marketing/lists/<id>/subscribers \
  -H "Authorization: Bearer $HANZO_API_KEY"

MCP reaches marketing through the marketing tool, which names its 82 operations with its own verbs — this one among them, under a name only MCP declares. describe explains any of them:

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "list_marketing_audiences"
         }
       }
     }'

Marketing API · All Hanzo APIs · Interactive reference

Was this page useful?
Broken link or missing step? Drop it in #docs on Discord or open a PR.