# Fields

Choose your questions in the **Builder**, and the rest of the form follows. A new form already has **Name**, **Email**,
**Message**, and **Company** fields, so a contact form is nearly done.

## Create a form

Open **Forms** and create one. Choose a workspace and a name. Formerie turns the name into the handle in your public link,
such as `contact`. New forms start with spam checks turned on, and nothing is public until you publish.

## Add your fields

Open the **Builder** tab to add, reorder, and edit fields. Every change stays in your draft until you publish, so your live
form doesn't move while you work. **Save draft** keeps your place.

| Group | Fields |
| --- | --- |
| Text | Short and long text, password, URL, email, and phone |
| Choices | Checkbox, consent, checkbox group, radio, dropdown, and multi-select |
| Location | Address, street, city, region, province, postal code, country, and coordinates |
| Numbers | Number, integer, decimal, currency, number range, rating, and slider |
| Date and time | Date, time, date and time, date range, and duration |
| Advanced | Hidden field, separator, and content block |

There are no file upload or signature fields.

## Go further with the other tabs

| Tab | What you do there |
| --- | --- |
| **Flow** | Split the form into [steps](/guides/multi-step-forms/), with a summary for each |
| **Conditions** | [Show a question](/guides/conditions/) only when an earlier answer calls for it |
| **Validations** | [Add checks](/guides/validation/) and your own error messages |
| **Processing** | [Clean up answers](/guides/cleaning-answers/), such as trimming spaces |
| **Preview** | Try the form, and fill in sample answers for your test |
| **Settings** | Name, handle, description, form language, submit label, success message, logo, colours, font, density, corners, width, light or dark theme, [spam checks and limits](/guides/spam-protection/), archive, trash, and restore |

## Going further

### A form as JSON

The builder writes a form definition for you, and the server enforces it on every submission. This is part of one. For
every field type and option, see the [form definition reference](/guides/form-reference/).

```json
{
  "allowedOrigins": ["https://example.com"],
  "verification": {
    "provider": "turnstile",
    "mode": "managed",
    "required": true
  },
  "fields": {
    "contact": {
      "type": "object",
      "fields": {
        "name": {
          "type": "string",
          "required": true,
          "max": 120,
          "trim": true
        },
        "email": {
          "type": "email",
          "required": true,
          "max": 254,
          "trim": true,
          "normalizeEmail": true
        }
      }
    },
    "message": {
      "type": "textarea",
      "required": true,
      "max": 5000,
      "trim": true
    }
  }
}
```

Your own code can read the safe part of a definition from [the public schema](/guides/api-reference/#public-schema).
