---
title: "Add a subscriber"
method: POST
path: "/audiences/{id}/subscribers"
tags: ["Audiences"]
---

# Add a subscriber

`POST /audiences/{id}/subscribers`

## Request

- Base URL: `https://shipmail.to/api/v1`
- URL: `https://shipmail.to/api/v1/audiences/{id}/subscribers`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://shipmail.to/api/auth/oauth2/authorize`, token URL `https://shipmail.to/api/auth/oauth2/token`)

Add one subscriber (single opt-in). Returns a per-row outcome; it does not error for a suppressed or invalid address. Re-adding an existing subscriber merges: a provided display_name replaces the stored one (absent keeps it), merge_fields keys you send are merged into the stored object, and consent is re-attested. Use PATCH to replace fields wholesale.

## Headers

- `X-Shipmail-Organization` string

## Request body

- AddSubscriberRequest
  - `email_address` string, email, required
  - `display_name` string, nullable
  - `merge_fields` MergeFields: Arbitrary string/number/boolean/null values keyed by field name. Max 50 keys.
  - `consent_source` string, nullable
  - `consent_ip` string, nullable

## Response `200`

Per-row outcome for the address.

- SubscriberResult: Per-row outcome. email_address echoes the normalized (trimmed, lowercased) address. Skip reasons are generic and never reveal suppression or opt-out state.
  - `email_address` string, email, required
  - `outcome` 'created' | 'updated' | 'skipped_not_mailable' | 'skipped_invalid' | 'skipped_cap' | 'skipped_quota', required

## Other responses

- `403`: Insufficient permissions.
- `404`: Resource not found.
- `422`: Validation failed.
- `429`: Rate limit exceeded.

---

[API](https://skmtc.dev/shipmail/apis/shipmail-api.md) · [All operations](https://skmtc.dev/shipmail/apis/shipmail-api/llms.txt) · [OpenAPI document](https://skmtc.dev/shipmail/apis/shipmail-api/revisions/2c23e59d7e30?raw)
