> For the complete documentation index, see [llms.txt](https://docs.bird.com/api/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.bird.com/api/contacts-api/api-reference/manage-contact-lists/trigger-double-opt-in.md).

# Trigger double opt-in confirmations for a list

{% openapi src="<https://global--openapi-specs--151603429280--use1.s3.us-east-1.amazonaws.com/joined-specs/openapi.yml>" path="/workspaces/{workspaceId}/double-opt-in/{listId}" method="post" %}
<https://global--openapi-specs--151603429280--use1.s3.us-east-1.amazonaws.com/joined-specs/openapi.yml>
{% endopenapi %}

## Examples

The target list must be **double opt-in**. Instead of adding the contacts directly, this sends a confirmation message per identifier — each contact joins the list only after it clicks the confirmation link. Each identifier is routed to the channel matching its type: an email address to `emailChannelId`, a phone number to exactly one of `smsChannelId` or `rcsChannelId`.

Example data used below:

* **Workspace ID**: a1405560-c8d3-4b1a-877d-3f449ad95352
* **List ID** (double opt-in): 123e4567-e89b-12d3-a456-426614174000
* **Email channel ID** (active): 7c0a8f12-3b4d-4e5f-9a1b-2c3d4e5f6a7b
* **AccessKey:** abcd

### Trigger a confirmation for an email address

{% tabs fullWidth="true" %}
{% tab title="Request" %}

```bash
curl -X POST "https://api.bird.com/workspaces/a1405560-c8d3-4b1a-877d-3f449ad95352/double-opt-in/123e4567-e89b-12d3-a456-426614174000" \
-H "Content-Type: application/json" \
-H "Authorization: AccessKey abcd" \
-d '{
  "identifiers": [{ "key": "emailaddress", "value": "test@example.com" }],
  "emailChannelId": "7c0a8f12-3b4d-4e5f-9a1b-2c3d4e5f6a7b"
}'
```

{% endtab %}

{% tab title="Response (200 OK)" %}

```json
{
  "status": "confirmation_pending",
  "confirmationsSent": 1
}
```

{% endtab %}
{% endtabs %}

The response `status` is always `confirmation_pending`: no contact is added yet. `confirmationsSent` counts the identifiers a confirmation was dispatched for. Any identifier that could not be confirmed is returned under `errors` with a per-identifier reason; if none could be confirmed, the request returns `422`.
