Create a signup form
A form that adds people to an audience. Each form has a hosted page at its url, which you can link to or embed in a frame, and the same address accepts a plain HTML form POST from your own site. For JavaScript, post JSON to https://api.sendsend.email/public/forms/{id}/subscribe with { "email": "…", "first_name": "…" }; it allows requests from any site.
With double_opt_in (the default) a new person is held as pending, we email them a confirmation link from from, and they are only subscribed when they press the button in it. Pending contacts are never sent a broadcast. Anyone who unsubscribed before must confirm again, even on a form without double opt-in, so nobody can be put back on a list by someone else typing their address. The response never says whether an address was already on the list. Signups are rate limited, and we send at most one confirmation to an address every ten minutes.
Required scope: contacts:manage
Request body
| Field | Type |
|---|---|
audience_idrequired | string |
namerequired | string |
titleoptional | string |
double_opt_inoptional | boolean |
fromoptional | string |
confirm_subjectoptional | string |
success_urloptional | string |
confirmed_urloptional | string |
topic_idsoptional | string[] |
collect_nameoptional | boolean |
activeoptional | boolean |
Unknown fields are rejected, so a typo never silently does nothing.
Example
curl -X POST 'https://api.sendsend.email/v1/forms' \
-H "Authorization: Bearer $SENDSEND_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"audience_id": "aud_7Qe2…",
"name": "Footer signup",
"from": "Acme <news@mail.acme.com>",
"confirmed_url": "https://acme.com/welcome"
}'Response 201
{
"id": "frm_Bn6…",
"object": "form",
"audience_id": "aud_7Qe2…",
"name": "Footer signup",
"title": "Join the newsletter",
"double_opt_in": true,
"from": "Acme <news@mail.acme.com>",
"confirm_subject": null,
"success_url": null,
"confirmed_url": "https://acme.com/welcome",
"topic_ids": [],
"collect_name": false,
"active": true,
"url": "https://api.sendsend.email/f/frm_Bn6…",
"created_at": "2026-10-06T15:00:00.000Z",
"updated_at": "2026-10-06T15:00:00.000Z"
}Errors
| Status | Code | When |
|---|---|---|
| 400 | validation_error | The request body or parameters are invalid. The message says which field. |
| 404 | not_found | No such resource in this project. |
| 401 | unauthorized | The API key is missing, invalid or revoked. |
| 403 | forbidden | The key does not have the scope this endpoint needs. |
Every error has the same shape. See Errors.