POST/api/v1/projects/{project_id}/lists/{list_id}/subscribers
Needs scope: writeIdempotency-KeyMCP tool: add_subscriber
operationId add_subscriber
Add a subscriber
Adds a subscriber to the list, or, if the address is already on it,
merges the attributes (new values win) and keeps its status. Needs scope
write. A new subscriber answers 201; a re-add answers 200.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
project_idrequired |
path | string · uuid | The project’s id |
list_idrequired |
path | string · uuid | The list’s id |
Idempotency-Key |
header | string
1–128 characters · pattern |
A key of the client’s choosing, one per request it means to send once (a UUID will do). A repeat with the same key and the same body within 24 h creates nothing again and gets the first answer, marked Idempotent-Replayed: true. The key belongs to the API key that sent it. Only a 2xx answer is kept: after any other answer the key is free again. |
Request body
application/json · required
- CreateSubscriberRequest object · all fields required
-
attributesobjectAttributes to set: a map of string, number or boolean values.
nullfor a key removes it. Up to 64 keys, up to 4 KB of JSON. -
emailstring · emailThe address; any case and surrounding whitespace are normalized.
example
ann@example.com
Responses
200
The address was already on the list; its attributes were merged
| Header | Type | Description |
|---|---|---|
Idempotent-Replayed | string · enum | true when the answer is a replay of an earlier request with the same Idempotency-Key; absent otherwise. |
- Subscriber object · all fields required
-
attributesobjectThe subscriber’s attributes, a map of string, number or boolean values.
-
confirmed_atstring · date-time | nullWhen the subscriber confirmed a double opt-in;
nullotherwise. -
created_atstring · date-time -
emailstring · emailexample
ann@example.com -
idstring · uuidexample
01900000-0000-7000-8000-000000000001 -
list_idstring · uuidThe list the subscriber is on.
-
project_idstring · uuidThe subscriber’s project.
-
soft_bounce_streakinteger · int32Soft bounces in a row; reset by a delivery (P4+).
≥ 0
-
sourcestringHow the subscriber was added:
api,importorconfirm. -
statusstringpending,active,unsubscribed,bouncedorcomplained.example
active -
unsubscribed_atstring · date-time | nullWhen the subscriber unsubscribed;
nullotherwise. -
updated_atstring · date-timeThe latest change: creation, an attribute merge, a status change.
201
The subscriber was created
| Header | Type | Description |
|---|---|---|
Idempotent-Replayed | string · enum | true when the answer is a replay of an earlier request with the same Idempotency-Key; absent otherwise. |
Location | string | The subscriber’s URL |
- Subscriber object · all fields required
-
attributesobjectThe subscriber’s attributes, a map of string, number or boolean values.
-
confirmed_atstring · date-time | nullWhen the subscriber confirmed a double opt-in;
nullotherwise. -
created_atstring · date-time -
emailstring · emailexample
ann@example.com -
idstring · uuidexample
01900000-0000-7000-8000-000000000001 -
list_idstring · uuidThe list the subscriber is on.
-
project_idstring · uuidThe subscriber’s project.
-
soft_bounce_streakinteger · int32Soft bounces in a row; reset by a delivery (P4+).
≥ 0
-
sourcestringHow the subscriber was added:
api,importorconfirm. -
statusstringpending,active,unsubscribed,bouncedorcomplained.example
active -
unsubscribed_atstring · date-time | nullWhen the subscriber unsubscribed;
nullotherwise. -
updated_atstring · date-timeThe latest change: creation, an attribute merge, a status change.
409
The project or list is deleted (conflict); or a request with the same Idempotency-Key has not answered yet (idempotency_key_in_progress)
422
Invalid fields, every one in errors (validation_failed): a bad email, an attribute that is not a scalar, a bad key, too many keys or too large; or the Idempotency-Key was used in the last 24 h for another request (idempotency_key_reused), or is not 1 to 128 visible ASCII characters (validation_failed, field Idempotency-Key)
429
The key is over its rate limit, api.rate_limit_per_minute requests a minute on this node (rate_limited)
| Header | Type | Description |
|---|---|---|
Retry-After | integer | Seconds until the key’s next request passes; rounded up. |
504
Postwind’s storage did not answer within its time limit (storage_timeout). A change the request makes may still take effect: check before repeating it. A repeat with the same Idempotency-Key never runs it twice: it is 409 idempotency_key_in_progress until the key’s 24 h end