---
title: "Sign up through a form"
description: "Where a published form's visitors post. It takes no credential, so call it from a browser or your own server, from any origin."
url: "https://openemail.uk/docs/api/forms/subscribe"
area: "API"
category: "Mailbox"
---

# Sign up through a form

Where a published form's visitors post. It takes no credential, so call it from a browser or your own server, from any origin.

`POST /subscribe/{formId}`

## POST /subscribe/{formId}

Where a published form's visitors post. It takes no credential, so call it from a browser or your own server, from any origin.

## Example

Send the answers keyed by field key, at the top level or under `values`. With `Accept: application/json` or a JSON body the answer is JSON. A plain HTML form is redirected with a 303 instead.

**curl**

```
curl -X POST "$OE/subscribe/frm_3b9d2e7a1c4f80d56e2a9b14" -H 'content-type: application/json' -d '{
  "email": "ann@example.com",
  "first_name": "Ann",
  "consent": true
}'
```

**Response**

```
{
  "object": "form_subscription",
  "formId": "frm_3b9d2e7a1c4f80d56e2a9b14",
  "outcome": "pending",
  "redirectUrl": null
}
```

> `outcome` is `added` when the person is in the audiences now, or `pending` on a double opt-in form, where they join once they confirm by email. That email goes out after this answer, unless this form emailed the address in the last ten minutes or the address has had five from this workspace today.

> A missing or wrong answer is a 422 `invalid_form_submission`. The error carries `fields`, a list of `{ "key", "error" }` with reasons such as `required`, `email` or `option`.

> A paused form answers 409 `form_closed`, an unknown or unpublished one 404 `form_not_found`, and too many sign-ups from one network 429 `form_rate_limited`. A plain HTML form gets a 303 to the hosted page instead.

> Answers to keys the form does not have are ignored, and keys starting `oe_` are never stored. `oe_source` names the page the form was on, and defaults to the `Referer` header.
