Subscriptions ​

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

List subscribers of a list ​

GET /v1/subscriber-lists/{id}

Legacy flat URL shape. Auth: API key (Authorization: Bearer) matching the list's project, OR an admin/account-owner JWT.
Unlike GET /v1/projectId/{projectId}/contacts (where custom field values are flat top-level keys), here they are
returned nested under a "customFields" object, e.g. { "email": "x@y.com", "customFields": { "plan": "pro" } }.

Parameters ​

NameInTypeRequiredDescription
idpathstringyesThe subscriber list _id.

Responses ​

StatusDescription
200OK
403Missing or invalid API key

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/subscriber-lists/{id}

Legacy flat URL shape. Creates the contact if it doesn't exist yet. Auth: API key, or a whitelisted Origin (in which case a CAPTCHA is required unless the list disables it).

Double opt-in: when it is on for the list and the request uses an API key (or a whitelisted Origin), a new contact - or one who is unverified or unsubscribed on the list - is not activated. They get the verification email and stay as they are (new contacts become "unverified") until they click its link, and the response is { success: true, info } instead of the subscriber. Sending status "active" does not skip this. A paused subscriber is reactivated directly, without an email. With a SubscriptionToken the subscriber has already proven they own the address, so they are activated directly.

Parameters ​

NameInTypeRequiredDescription
idpathstringyesThe subscriber list _id.

Request body ​

FieldTypeRequiredDescription
emailstringyes
namestring
statusstring (unverified | active)
captchaTextstring
captchaProbestring

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
405The operation is blocked by a business rule (e.g. the resource is still in use)

Response body ​

FieldTypeRequiredDescription
statusstring
emailstring

Get a subscriber by email ​

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

Legacy flat URL shape. Accepts an API key or a whitelisted Origin header.
Unlike GET /v1/projectId/{projectId}/contacts/{email} (where custom field values are flat top-level keys), here they
are returned nested under a "customFields" object, e.g. { "email": "x@y.com", "customFields": { "plan": "pro" } }.

Parameters ​

NameInTypeRequiredDescription
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/subscriber-lists/{id}/{email}

Legacy flat URL shape. Setting status to "paused" requires pausedUntil (a future date). Accepts an API key or a whitelisted Origin header.

Double opt-in: when it is on for the list and the request uses an API key, setting status to "active" on an unverified or unsubscribed subscriber does not activate them - they keep their status, get the verification email, and the response includes verificationEmailSent: true. They become active only by clicking its link. A paused subscriber is reactivated directly. With a SubscriptionToken the change applies directly.

Parameters ​

NameInTypeRequiredDescription
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)

One-click unsubscribe ​

POST /v1/subscriber-lists/{id}/{email}/unsubscribe

Legacy flat URL shape. Not API-key authenticated - requires a signed one-click-unsubscribe token (the ?token= query param from a dispatched email's List-Unsubscribe link).

Parameters ​

NameInTypeRequiredDescription
idpathstringyesThe subscriber list _id.
emailpathstringyes
tokenquerystringyes

Responses ​

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

Look up a published, BlueFox-hosted signup form by its public slug ​

GET /v1/signup-forms/slug/{slug}

Not API-key authenticated - requires a whitelisted Origin header instead, restricted to BlueFox's own app domain (the APP_URL this deployment is configured with) since this endpoint only ever backs the bluefox.email/signup/{slug} page and takes no project-level whitelist. Only returns forms with published: true (404 otherwise, including for a valid slug on an unpublished form). Returns the same self-contained, ready-to-render HTML (styling, markup, and captcha/submit JS included) as GET .../signup-forms/{id}/embed - never the raw form config, so there is no secret-leak surface. Also includes the owning project's name and logoUrl for page branding.

Parameters ​

NameInTypeRequiredDescription
slugpathstringyes

Responses ​

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

Response body ​

FieldTypeRequiredDescription
namestring
pageHeadlinestringThe heading to show on the hosted page. Falls back to the project name when not set.
pageDescriptionstringThe description to show under the heading on the hosted page.
formLayoutstringThe form's layout ("row" or "column") - the hosted page uses this to size its own container appropriately, since a row-laid-out form needs more width than a column one.
htmlstring
projectobject
project.namestring
project.logoUrlstring

Submit a hosted/embedded signup form ​

POST /v1/signup-forms/{id}

Legacy flat URL shape. Not API-key authenticated - requires a whitelisted Origin header (BlueFox's own hosted-page domain is always allowed), and (depending on the form config) a CAPTCHA. Subscribes the contact to every list configured on the form.

Double opt-in follows the form's own setting, not the lists': when it is on, lists where the contact is new, unverified or unsubscribed get one verification email covering all of them (response { success: true, info }, statuses unchanged until the link is clicked); lists where they are paused are reactivated directly; lists where they are already active are skipped, and if that is every list the request fails with 400 "Email already exists.".

Parameters ​

NameInTypeRequiredDescription
idpathstringyesThe signup form _id.

Request body ​

FieldTypeRequiredDescription
emailstringyes
namestring
captchaTextstring
captchaProbestring
turnstileTokenstring
termsAcceptedboolean

Responses ​

StatusDescription
201OK
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
405The operation is blocked by a business rule (e.g. the resource is still in use)

Response body ​

FieldTypeRequiredDescription
successboolean
redirectTostring