# Hosted forms

> How the Forms app hosts form pages for an automation, either starting a run on every submission or pausing a run until one person fills in a form, with the field types and limits.

The **Forms** app serves form pages from APIANT, with no external form service. A form is a list of fields that Claude or the assistant writes for you; the page is rendered by the platform and every submission is validated on the server before an automation sees it.

## Two ways to use a form

| Shape | Operations | URL | Use it for |
|---|---|---|---|
| Form trigger | **Form submitted (instant)** trigger | One stable URL. Every submission starts a new run. | Intake forms, surveys, contact pages |
| Form sent during a run | **Create form**, then **Await form submission** or **Await form submission with timeout** | One URL per run. The run pauses until the form is submitted. | Sign-off with details, collecting a signature, asking a person for missing data |

Describe what you want in plain English, for example: "When someone submits a project intake form with their email, department and a PDF brief, create a task in Asana." Claude builds the form fields, the trigger and the steps, and gives you the form URL when it commits the automation.

### Form trigger

The form trigger URL stays the same across submissions. Each valid submission starts a run whose trigger data holds the submitted values, keyed by field name. After submitting, the visitor sees a waiting page. If the automation shows another form later in the run, the waiting page moves the visitor on to it; otherwise it shows a confirmation.

The form page only renders while the automation is on. Visitors to a form whose automation is off see the message "This form's automation is not turned on."

![A hosted APIANT form titled Equipment request, with a text block, a required Full name field, a Department dropdown, a Details text area, a file upload and a signature pad above the Submit button.](https://lptryjqgqoknvmzotyvz.supabase.co/storage/v1/object/public/images/docs-images/1789500943675-apiant-ai-docs-hosted-form-page.webp)

A hosted form shows its title, each field with its help text, and a Submit button.

### Form sent during a run

**Create form** returns a **Form URL**. A step you add sends that URL to the person (by email, chat or any other app), and **Await form submission** pauses the run until they submit.

When the run resumes, the await step outputs:

| Output | Value |
|---|---|
| `Submission` | The submitted values, keyed by field name |
| `Submitted` | Set when the person submitted the form |
| `Halted` | Set when the person pressed the optional halt button |
| `Timed out` | Set when the deadline on **Await form submission with timeout** passed |

All four outputs are present on every resume, so a condition step can branch on them. On timeout, `Submission` is empty.

The **Form URL** from **Create form** is a session page. It shows whatever the run is presenting: the pending form, a waiting message while the run works, the next form, and finally the completion message. To ask one person for several forms in a row, chain **Create form** and **Await form submission** pairs in one automation and send only the first URL.

While the run works between forms, the page shows the waiting message you set and updates on its own.

## Form options

These options apply to **Create form**. Ask Claude for any of them by name.

| Option | Effect |
|---|---|
| **Form title** | Heading shown above the fields |
| **Waiting message** | Text shown while the run processes after a submission. **Update form waiting message** changes it mid-run. |
| **Halt button text** | Adds a second button that resumes the run with `Halted` set and no values |
| **Submit button text** | Caption of the submit button. Blank shows "Submit". |
| **Submit action** | What the page does after the submission: an `http(s)://` URL redirects the visitor; plain text becomes the confirmation message shown when the run finishes; blank shows the default confirmation |
| **Auto submit** | Renders nothing and submits immediately, for forms whose values are already filled in |
| **Account required** | Sends a signed-out visitor to an APIANT sign-in page before showing the form. The run receives the signed-in person's ID and name. Accepts `true` or `false` only. |

| Theme options | **Controls color**, **Controls color dark**, **Highlight color** (6-digit hex), **Corner radius** (px), **Background image** and **Background image style** (stretched, tiled or unstretched) |

## Field types

| Type | Renders | Value in the run |
|---|---|---|
| `text`, `multiline` | Text input, text area. Optional `pattern` (regular expression). | Text |
| `select`, `radio` | Dropdown, radio group. Requires `options`. | Text |
| `multiselect` | Checkbox list. Requires `options`. | List of text values |
| `date`, `time`, `datetime` | Browser date and time pickers | `YYYY-MM-DD`, `HH:MM`, `YYYY-MM-DDTHH:MM` |
| `checkbox`, `switch` | Checkbox, toggle | True or false |
| `number`, `slider` | Number input, slider (`min`, `max`, `step`; slider defaults to 0 to 100) | Number |
| `rating_stars` | Star rating (`max_stars`, default 5) | Whole number |
| `rating_scale` | Numbered buttons (`min`, `max`, default 1 to 10) | Whole number |
| `color` | Color picker | `#rrggbb` |
| `country` | Country dropdown | Text |
| `signature` | Draw-to-sign pad | PNG image as a data URL |
| `file` | File upload (`accept` extension list, `max_size_bytes`, default 10 MB) | Public URL of the uploaded file |
| `captcha_math` | "What is A + B?" check | Validated only, not passed to the run |

Display-only elements render but never reach the run: `text_block`, `html` (scripts and iframes are removed), `image`, `divider`, `spacer`, `download_link` and `copy_button`.

Every field has a `name` (the key in the submitted data), and can have a `label`, `required` and `helptext`. Field names must be unique, and a form needs at least one input field. The page runs no custom JavaScript, and dropdown options are fixed in the form definition.

Empty optional fields still arrive in the run: as empty text, `null` for `number`, `slider`, `rating_stars` and `rating_scale`, `false` for checkboxes and switches, and an empty list for `multiselect`.

## Limits and security

- Form trigger submissions count against your plan's monthly form submission limit, not the instant trigger limit. Over the limit, the form page shows a limit message instead of the form. See [Plans, usage and billing](/docs/account/plans-and-limits).
- Uploaded files are stored in APIANT's temporary file store and removed on a schedule. Copy a file to another app in the same run if you need to keep it.
- A form trigger URL is public: treat it like a page on your website. A form URL sent during a run works like a password for that run. `captcha_math` deters bots but does not identify the visitor; use **Account required** for that.
- A run cannot pause for a form inside a parallel branch, inside an automation called and waited on by another automation, or in a run started by a polling or collector trigger. Use a webhook or manual trigger for automations that send forms.

## Troubleshooting

| Symptom | Cause and fix |
|---|---|
| The form page says the form's automation is not turned on | The automation is off. Ask Claude to turn it on. |
| A person lost the form link for a paused run | Ask Claude for the pending form link for that run. The link returned resumes that one form only; for a run that shows several forms in a row, keep the first **Form URL** when the automation is built. |
| A submission shows an error and the run never starts | The value failed validation (a required field is empty, a `pattern` did not match, or a file is too large or the wrong type). The page shows the message; nothing is recorded. |
| The form shows a limit message | The account reached its monthly form submission limit. |
| A step reads an empty value | The step references a field name that does not match the form. Field names are case-sensitive and may contain spaces. |

## Next steps

- [Human approval](/docs/interfaces/approvals)
- [Delays, snooze and waits](/docs/automations/delays)
- [Conditions, loops and parallel branches](/docs/automations/control-flow)
- [Public URLs](/docs/reference/urls)
