Subscriber Lists

Full reference for the Subscriber Lists resource in the bluefox.email API. See the API overview for authentication, the response envelope, and pagination.

List subscriber lists

GET /v1/projectId/{projectId}/subscriber-lists

Parameters

NameInTypeRequiredDescription
projectIdpathstringyesThe project _id, found in the app under Project Settings.
limitqueryintegerMax items per page. Capped at 30.
skipqueryintegerNumber of items to skip, for pagination.
sortquerystringField to sort by.
orderquerystring
filter[<field>]querystringExact-match filter on a top-level field, e.g. filter[name]=Welcome. Repeatable for multiple fields.

Responses

StatusDescription
200OK
403Missing or invalid API key

Response body

FieldTypeRequiredDescription
itemsarray
countintegerTotal matching items across all pages, not just this page.
nextstringFull URL (path + query string) of the next page, or null if this is the last page.

Create a subscriber list

POST /v1/projectId/{projectId}/subscriber-lists

doubleOptIn.emailId (if given) must be a transactional email belonging to this same project - a valid ID from a different project 404s. When doubleOptIn.active is true, that email's content must also include {{verifyLink}}.

Parameters

NameInTypeRequiredDescription
projectIdpathstringyesThe project _id, found in the app under Project Settings.

Request body

FieldTypeRequiredDescription
namestringyes
descriptionstringyes
privateboolean
doubleOptInobjectemailId is required when active is true. When active is true, the referenced transactional email's content must include {{verifyLink}} - the API rejects the request with a 400 otherwise, since that's the only way a contact can confirm their subscription. Replaces the whole object when given - to change just one field, GET the current value first and send all five back together. Do not include the GET response's doubleOptIn._id - it is Mongoose's own subdocument id, not a real field, and PATCH rejects it as unexpected.
doubleOptIn.activeboolean
doubleOptIn.redirectLinkstring
doubleOptIn.emailIdstringA transactional email _id used to send the confirmation email - NOT a template ID, even though a template may look interchangeable. Its content must include {{verifyLink}} if active is true. If the user wants double opt-in but hasn't said which email to use, call GET /v1/projectId/{projectId}/transactional-emails first and ask them to choose from the real names.
doubleOptIn.confirmationTitlestring
doubleOptIn.confirmationMessagestring
signupFormobjectReplaces the whole object when given, not a per-field merge - GET the current value first and send back every field you want to keep alongside your changes. Do not include the GET response's signupForm._id - it is Mongoose's own subdocument id, not a real field, and PATCH rejects it as unexpected.

Responses

StatusDescription
201Created
400Invalid request body or query - every violation found (missing/invalid/unexpected fields) is reported in one response, semicolon-separated, not just the first one hit.
403Missing or invalid API key

Response body

FieldTypeRequiredDescription
_idstring
namestring
descriptionstring
privateboolean
doubleOptInobject
doubleOptIn.activeboolean
doubleOptIn.redirectLinkstring
doubleOptIn.emailIdstringA transactional email _id used to send the confirmation email.
doubleOptIn.confirmationTitlestring
doubleOptIn.confirmationMessagestring
signupFormobject
signupForm.formLayoutstring
signupForm.showCaptchaboolean
signupForm.emailPlaceholderstring
signupForm.captchaPlaceholderstring
signupForm.formFontStylestring
signupForm.formFontColorstring
signupForm.formFontSizestring
signupForm.btnLabelstring
signupForm.btnFontstring
signupForm.btnFontColorstring
signupForm.btnColorstring
signupForm.btnFontSizestring
signupForm.successMessagestring
signupForm.successFontstring
signupForm.successFontColorstring
signupForm.successFontSizestring
signupForm.propertiesStyleobject
createdAtstring
updatedAtstring

Get a single subscriber list

GET /v1/projectId/{projectId}/subscriber-lists/{id}

Parameters

NameInTypeRequiredDescription
projectIdpathstringyesThe project _id, found in the app under Project Settings.
idpathstringyes

Responses

StatusDescription
200OK
403Missing or invalid API key
404Subscriber Lists not found

Response body

FieldTypeRequiredDescription
_idstring
namestring
descriptionstring
privateboolean
doubleOptInobject
doubleOptIn.activeboolean
doubleOptIn.redirectLinkstring
doubleOptIn.emailIdstringA transactional email _id used to send the confirmation email.
doubleOptIn.confirmationTitlestring
doubleOptIn.confirmationMessagestring
signupFormobject
signupForm.formLayoutstring
signupForm.showCaptchaboolean
signupForm.emailPlaceholderstring
signupForm.captchaPlaceholderstring
signupForm.formFontStylestring
signupForm.formFontColorstring
signupForm.formFontSizestring
signupForm.btnLabelstring
signupForm.btnFontstring
signupForm.btnFontColorstring
signupForm.btnColorstring
signupForm.btnFontSizestring
signupForm.successMessagestring
signupForm.successFontstring
signupForm.successFontColorstring
signupForm.successFontSizestring
signupForm.propertiesStyleobject
createdAtstring
updatedAtstring

Partially update a subscriber list

PATCH /v1/projectId/{projectId}/subscriber-lists/{id}

Merges the given fields into the existing document - omitted fields are left unchanged. Nothing is required (unlike create) since every field is optional on a partial update.

doubleOptIn.emailId and the {{verifyLink}} content requirement are re-validated the same way as create.

Parameters

NameInTypeRequiredDescription
projectIdpathstringyesThe project _id, found in the app under Project Settings.
idpathstringyes

Request body

FieldTypeRequiredDescription
namestring
descriptionstring
privateboolean
doubleOptInobjectemailId is required when active is true. When active is true, the referenced transactional email's content must include {{verifyLink}} - the API rejects the request with a 400 otherwise, since that's the only way a contact can confirm their subscription. Replaces the whole object when given - to change just one field, GET the current value first and send all five back together. Do not include the GET response's doubleOptIn._id - it is Mongoose's own subdocument id, not a real field, and PATCH rejects it as unexpected.
doubleOptIn.activeboolean
doubleOptIn.redirectLinkstring
doubleOptIn.emailIdstringA transactional email _id used to send the confirmation email - NOT a template ID, even though a template may look interchangeable. Its content must include {{verifyLink}} if active is true. If the user wants double opt-in but hasn't said which email to use, call GET /v1/projectId/{projectId}/transactional-emails first and ask them to choose from the real names.
doubleOptIn.confirmationTitlestring
doubleOptIn.confirmationMessagestring
signupFormobjectReplaces the whole object when given, not a per-field merge - GET the current value first and send back every field you want to keep alongside your changes. Do not include the GET response's signupForm._id - it is Mongoose's own subdocument id, not a real field, and PATCH rejects it as unexpected.

Responses

StatusDescription
200OK
400Invalid request body or query - every violation found (missing/invalid/unexpected fields) is reported in one response, semicolon-separated, not just the first one hit.
403Missing or invalid API key
404Subscriber Lists not found

Response body

FieldTypeRequiredDescription
_idstring
namestring
descriptionstring
privateboolean
doubleOptInobject
doubleOptIn.activeboolean
doubleOptIn.redirectLinkstring
doubleOptIn.emailIdstringA transactional email _id used to send the confirmation email.
doubleOptIn.confirmationTitlestring
doubleOptIn.confirmationMessagestring
signupFormobject
signupForm.formLayoutstring
signupForm.showCaptchaboolean
signupForm.emailPlaceholderstring
signupForm.captchaPlaceholderstring
signupForm.formFontStylestring
signupForm.formFontColorstring
signupForm.formFontSizestring
signupForm.btnLabelstring
signupForm.btnFontstring
signupForm.btnFontColorstring
signupForm.btnColorstring
signupForm.btnFontSizestring
signupForm.successMessagestring
signupForm.successFontstring
signupForm.successFontColorstring
signupForm.successFontSizestring
signupForm.propertiesStyleobject
createdAtstring
updatedAtstring

Delete a subscriber list

DELETE /v1/projectId/{projectId}/subscriber-lists/{id}

Parameters

NameInTypeRequiredDescription
projectIdpathstringyesThe project _id, found in the app under Project Settings.
idpathstringyes

Responses

StatusDescription
200Deleted
403Missing or invalid API key
404Subscriber Lists not found
405The operation is blocked by a business rule (e.g. the resource is still in use)

Response body

FieldTypeRequiredDescription
_idstring
namestring
descriptionstring
privateboolean
doubleOptInobject
doubleOptIn.activeboolean
doubleOptIn.redirectLinkstring
doubleOptIn.emailIdstringA transactional email _id used to send the confirmation email.
doubleOptIn.confirmationTitlestring
doubleOptIn.confirmationMessagestring
signupFormobject
signupForm.formLayoutstring
signupForm.showCaptchaboolean
signupForm.emailPlaceholderstring
signupForm.captchaPlaceholderstring
signupForm.formFontStylestring
signupForm.formFontColorstring
signupForm.formFontSizestring
signupForm.btnLabelstring
signupForm.btnFontstring
signupForm.btnFontColorstring
signupForm.btnColorstring
signupForm.btnFontSizestring
signupForm.successMessagestring
signupForm.successFontstring
signupForm.successFontColorstring
signupForm.successFontSizestring
signupForm.propertiesStyleobject
createdAtstring
updatedAtstring

Get stats for a single subscriber list

GET /v1/projectId/{projectId}/subscriber-lists/{id}/stats

Aggregate counts only, never a per-recipient list - response size and query cost are bounded regardless of how much activity actually happened, since every count is a single indexed query scoped to this one resource. For the actual list of recipients (who received/opened/clicked/bounced/unsubscribed), see GET /v1/projectId/{projectId}/subscriber-lists/{id}/recipients.

Parameters

NameInTypeRequiredDescription
projectIdpathstringyesThe project _id, found in the app under Project Settings.
idpathstringyesThe subscriber list _id.
fromquerystringOnly count events at or after this date/time.
toquerystringOnly count events at or before this date/time. If both from and to are given, the range between them cannot exceed 366 days.

Responses

StatusDescription
200OK
400Invalid request body or query - every violation found (missing/invalid/unexpected fields) is reported in one response, semicolon-separated, not just the first one hit.
403Missing or invalid API key
404Subscriber Lists not found

Response body

FieldTypeRequiredDescription
activeinteger
pausedinteger
unsubscribedinteger
unverifiedinteger
subscribedintegersubscribe events in range.
unsubscribedEventsinteger
pausedEventsinteger
unpausedEventsinteger
bounceinteger
complaintinteger

List subscribers on a list, with their contact data

GET /v1/projectId/{projectId}/subscriber-lists/{id}/subscribers

Project-scoped equivalent of GET /v1/subscriber-lists/{id} (which is a legacy flat URL shape kept for hosted signup
forms and one-click-unsubscribe links). Each item merges the subscriber's per-list status with their contact data -
custom field values come back nested under a "customFields" object here, not flattened onto top-level keys like
GET /v1/projectId/{projectId}/contacts.

Parameters

NameInTypeRequiredDescription
projectIdpathstringyesThe project _id, found in the app under Project Settings.
idpathstringyesThe subscriber list _id.
limitqueryintegerMax items per page. Capped at 30.
skipqueryintegerNumber of items to skip, for pagination.
sortquerystringField to sort by.
orderquerystring
filter[<field>]querystringExact-match filter on a top-level field, e.g. filter[name]=Welcome. Repeatable for multiple fields.

Responses

StatusDescription
200OK
403Missing or invalid API key
404Subscriber list not found

Response body

FieldTypeRequiredDescription
itemsarray of object
items[].emailstring
items[].statusstring (unverified | active | unsubscribed | paused)
items[].customFieldsobjectCustom contact field values, keyed by field name.
countintegerTotal matching items across all pages, not just this page.
nextstringFull URL (path + query string) of the next page, or null if this is the last page.

Subscribe a contact to a list

POST /v1/projectId/{projectId}/subscriber-lists/{id}/subscribers

Project-scoped equivalent of POST /v1/subscriber-lists/{id} (which is a legacy flat URL shape kept for hosted
signup forms - it also accepts a whitelisted Origin header and CAPTCHA, neither of which apply here since this
route is API-key only). Creates the contact if it doesn't exist yet. Triggers double opt-in if enabled on the
list, unless status is explicitly set to "active".

Parameters

NameInTypeRequiredDescription
projectIdpathstringyesThe project _id, found in the app under Project Settings.
idpathstringyesThe subscriber list _id.

Request body

FieldTypeRequiredDescription
emailstringyes
namestring
statusstring (unverified | active)
tagsarray of string

Responses

StatusDescription
201Created
400Invalid request body or query - every violation found (missing/invalid/unexpected fields) is reported in one response, semicolon-separated, not just the first one hit.
403Missing or invalid API key
404Subscriber list not found
405The operation is blocked by a business rule (e.g. the resource is still in use)

Response body

FieldTypeRequiredDescription
emailstring
statusstring (unverified | active | unsubscribed | paused)
customFieldsobjectCustom contact field values, keyed by field name.

Get a single subscriber's status and contact data on a list

GET /v1/projectId/{projectId}/subscriber-lists/{id}/subscribers/{email}

Project-scoped equivalent of GET /v1/subscriber-lists/{id}/{email} (which is a legacy flat URL shape kept for hosted
signup forms and one-click-unsubscribe links). Custom field values come back nested under a "customFields" object
here, not flattened onto top-level keys like GET /v1/projectId/{projectId}/contacts/{email}.

Parameters

NameInTypeRequiredDescription
projectIdpathstringyesThe project _id, found in the app under Project Settings.
idpathstringyesThe subscriber list _id.
emailpathstringyes

Responses

StatusDescription
200OK
403Missing or invalid API key
404Subscriber not found

Response body

FieldTypeRequiredDescription
emailstring
statusstring (unverified | active | unsubscribed | paused)
customFieldsobjectCustom contact field values, keyed by field name.

Update a subscriber (status, contact fields, pause/resubscribe)

PATCH /v1/projectId/{projectId}/subscriber-lists/{id}/subscribers/{email}

Project-scoped equivalent of PATCH /v1/subscriber-lists/{id}/{email} (which is a legacy flat URL shape kept for
hosted signup forms). Setting status to "paused" requires pausedUntil (a future date).

Parameters

NameInTypeRequiredDescription
projectIdpathstringyesThe project _id, found in the app under Project Settings.
idpathstringyesThe subscriber list _id.
emailpathstringyes

Request body

FieldTypeRequiredDescription
emailstring
statusstring (active | paused | unsubscribed)
pausedUntilstring

Responses

StatusDescription
200OK
400Invalid request body or query - every violation found (missing/invalid/unexpected fields) is reported in one response, semicolon-separated, not just the first one hit.
403Missing or invalid API key
404Subscriber not found
405The operation is blocked by a business rule (e.g. the resource is still in use)

Response body

FieldTypeRequiredDescription
emailstring
statusstring (unverified | active | unsubscribed | paused)
customFieldsobjectCustom contact field values, keyed by field name.