Forms API
Create and manage signup forms. Each form has a submit URL you can post to from your own site. All routes need a bearer API key (see API Overview).
For the dashboard builder, embed code and display options, see Forms.
The form object
{
"id": "clx...",
"name": "Footer signup",
"listId": "clx...",
"fields": ["firstName"],
"style": {},
"successMessage": "Thanks! You're subscribed.",
"createdAt": "2026-10-01T09:00:00.000Z",
"updatedAt": "2026-10-01T09:00:00.000Z",
"embedUrl": "https://flomailr.com/api/forms/clx.../submit"
}
fieldslists the optional fields shown next to email, for example["firstName", "lastName"].styleholds the form's look (button text and colours, background, corner radius). It is{}until the builder or aPATCHsets it.listIdis the list that new subscribers join. It can benull.embedUrlis the URL the form submits to.
List forms
GET /api/v1/forms
Query: limit, after (see pagination).
Create a form
POST /api/v1/forms
{
"name": "Footer signup",
"listId": "clx...",
"fields": ["firstName", "lastName"],
"successMessage": "You're in."
}
nameis required.listIdis optional. If given it must be a list in your workspace (404otherwise).fieldsdefaults to["firstName"]. Non-string entries are dropped.successMessagedefaults to "Thanks! You're subscribed."
Returns 201.
Get, update and delete
GET /api/v1/forms/:id
PATCH /api/v1/forms/:id
DELETE /api/v1/forms/:id
PATCH accepts name (cannot be empty), listId (a list id, or null to detach), fields (an array of strings), successMessage and style (an object). DELETE returns 204.
The API does not expose a form's display mode or trigger settings. Set those in the dashboard.
Submitting a form
The embedUrl is a public endpoint. It needs no API key, so a browser on your own site can post to it directly. It allows cross-origin requests.
POST /api/forms/:id/submit
Send JSON or a standard form post with email (required) and optionally firstName and lastName:
curl -X POST https://flomailr.com/api/forms/FORM_ID/submit \
-H "Content-Type: application/json" \
-d '{"email":"ada@example.com","firstName":"Ada"}'
A successful post returns the form's success message:
{ "ok": true, "message": "Thanks! You're subscribed." }
- An invalid or missing email returns
400with{ "error": "..." }. - Each IP address can submit five times in ten minutes. After that the endpoint returns
429. - An address that has bounced returns
400("This email address cannot be re-subscribed."). Other suppressed addresses get the normal success message and are left unchanged. - Whether the new contact is subscribed straight away or must confirm by email first depends on the signup rules. See Double Opt-In.