Skip to main content
A list is a manually membered collection of contacts. The public API can enumerate every list in the workspace and add or remove members on any of them. All four endpoints authenticate with the X-Sender-Tenant + X-API-Key headers and are rooted at https://api.senderz.app/api/v1.
Lists are not segments. A segment computes its own membership from a filter and is a separate resource. Everything on this page operates on lists, whose membership only ever changes when something adds or removes a contact explicitly.
The public API is read plus membership only. There is no endpoint to create, rename, archive or delete a list. Create lists in the dashboard, then manage their members here.

List all lists

Returns every list in the workspace, newest updated first. There are no filters beyond paging: archived lists are included, so filter on the archived field client side if you need to hide them.

Query parameters

integer
default:"50"
Page size. Must be an integer between 1 and 100.
integer
default:"0"
Number of records to skip. Must be an integer of 0 or more.
The response uses the standard pagination envelope, with a list object per item.

The list object

string
List UUID. Use this as :id on the membership endpoints.
string
Display name.
string
Free-text description. Empty string when none was set, never null.
integer
Cached member count.
string
Hex swatch used in the dashboard. Defaults to #0b1f3f.
boolean
true when the list is archived in the dashboard. Archived lists are still returned by this endpoint and still accept membership changes.
string
Where the members originally came from. One of manual, import, form, api, segment, preference_center. Defaults to manual. This records origin only, it does not restrict what you can do with the list.
object[]
One entry per contact import that landed in this list. Empty array when the list was never imported into.
Consent page bound to this list, or null.
string | null
ISO 8601 timestamp of the last time members was recounted, or null if it never has been.
string
ISO 8601 creation timestamp.
string
ISO 8601 last-modified timestamp. Results are ordered by this field, newest first.
members on this endpoint is the cached count, served without a recount so the listing stays fast. It is refreshed whenever the Lists surface loads a single list, and whenever a membership change goes through the endpoints below. The count returned by an add or remove is always a live count.

Errors

Add members

Adds one or more contacts to a list. Returns 201 Created.
string
required
List UUID.

Body

Send at least one of these four fields. They combine: contactId and contactIds are merged with email and emails into a single set of contacts, and duplicates within one request collapse.
string
A single email address. Trimmed and lowercased before lookup.
string[]
Email addresses. Each entry is trimmed and lowercased before lookup.
string
A single contact UUID.
string[]
Contact UUIDs. Entries are validated as UUID v4.
The cap of 100 is a combined total across all four fields, not 100 each. A request whose contactIds plus contactId plus emails plus email exceeds 100 returns 400 with Up to 100 profiles can be changed at once. Either array alone exceeding 100 entries is also rejected at validation.

How addresses resolve

1

Known email

An address that already belongs to a contact in the workspace resolves to that contact.
2

Unknown email

A new contact is created with that address and then added to the list. The new contact has no marketing consent recorded, so it is not sendable to until consent is captured. List membership and consent are independent.
3

Contact IDs

A contactId that does not belong to the workspace, or belongs to a deleted contact, is silently skipped and does not count toward added.

Response

integer
Contacts actually inserted into the list by this call. A contact that was already a member, or a contact ID that did not resolve, counts as 0.
integer
Live total members on the list after the call.

Errors

Remove members by identity

Removes one or more contacts from a list by email or by contact ID. Returns 200 OK, not 204.
string
required
List UUID.

Body

The same four fields as the add endpoint, with the same combined cap of 100 and the same trimming and lowercasing of addresses.
string
A single email address.
string[]
Email addresses.
string
A single contact UUID.
string[]
Contact UUIDs. Entries are validated as UUID v4.
Removal never creates anything. An email that matches no contact is simply skipped, in contrast with the add endpoint which creates a contact for it. Contact IDs you supply always count as resolved, so a syntactically valid but unknown UUID passes the guard below and is reported as removed 0.

Response

integer
Contacts actually removed from the list. A contact that was not a member counts as 0.
integer
Live total members on the list after the call.

Errors

Remove a single member by ID

Removes one contact from a list. Returns 200 OK.
string
required
List UUID.
string
required
Contact UUID.
There is no request body.

Response

integer
Live total members on the list after the call.
This endpoint is idempotent and does not report whether anything was removed. Removing a contact that was never a member succeeds and returns the unchanged count. Use the identity endpoint above when you need the removed figure.

Errors

Webhooks

Membership changes made through these endpoints fire outbound webhooks, one event per contact: The payload carries listId, listName and contactId. Dispatch is best effort: a webhook that fails to deliver is logged and does not fail or roll back the membership change.
Bulk membership changes are cheapest in batches of up to 100 identifiers per request. Page through GET /public/lists once to resolve your list IDs and cache them, since list IDs are stable.