> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usehasp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Field Types

> All 12 HASP field types — stored format, validation rules, and schema examples.

HASP entities support 12 field types. Each field has a `key` (slug), `name` (display label), `type`, and optional validation rules.

## Summary

| Type           | Stored As       | Use For                                       |
| -------------- | --------------- | --------------------------------------------- |
| `text`         | string          | Short labels, names (max 255 chars)           |
| `textarea`     | string          | Long descriptions, notes (max 5000 chars)     |
| `number`       | number          | Quantities, prices, scores                    |
| `boolean`      | boolean         | Yes/no toggles                                |
| `select`       | string          | Status, priority (single choice from options) |
| `multi_select` | string\[]       | Tags, categories (multiple choices)           |
| `date`         | YYYY-MM-DD      | Calendar dates                                |
| `datetime`     | ISO 8601        | Timestamps with time                          |
| `email`        | string          | Email addresses (validated format)            |
| `url`          | string          | Web URLs (validated format)                   |
| `file`         | string (fileId) | File attachments                              |
| `relation`     | string (ULID)   | Cross-entity reference (record ID)            |

`select` and `multi_select` must define an `options` array.

***

## text

Single-line plain text. Max 255 characters.

```json theme={null}
{ "key": "title", "name": "Title", "type": "text", "required": true }
```

## textarea

Multi-line plain text. Max 5000 characters.

```json theme={null}
{ "key": "description", "name": "Description", "type": "textarea", "required": false }
```

## number

Numeric value — integer or decimal. Optional constraints: `min`, `max`, `decimal_places` (configured in the Schema Builder).

```json theme={null}
{ "key": "quantity", "name": "Quantity", "type": "number", "required": true }
```

## boolean

True/false toggle.

```json theme={null}
{ "key": "is_complete", "name": "Completed", "type": "boolean", "required": false }
```

## select

Single choice from a predefined list. The stored value must exactly match one of the defined options.

```json theme={null}
{
  "key": "priority",
  "name": "Priority",
  "type": "select",
  "required": true,
  "options": ["low", "medium", "high", "critical"]
}
```

## multi\_select

Multiple choices from a predefined list. Stored as an array of strings.

```json theme={null}
{
  "key": "tags",
  "name": "Tags",
  "type": "multi_select",
  "required": false,
  "options": ["frontend", "backend", "design", "devops"]
}
```

## date

Calendar date without time. Format: `YYYY-MM-DD`.

```json theme={null}
{ "key": "due_date", "name": "Due Date", "type": "date", "required": false }
```

## datetime

Date and time with timezone. Format: ISO 8601 (`YYYY-MM-DDTHH:mm:ssZ`).

```json theme={null}
{ "key": "scheduled_at", "name": "Scheduled At", "type": "datetime", "required": false }
```

## email

Email address. Validated as a properly-formatted email.

```json theme={null}
{ "key": "contact_email", "name": "Contact Email", "type": "email", "required": true }
```

## url

Web URL. Validated as a properly-formatted URL.

```json theme={null}
{ "key": "website", "name": "Website", "type": "url", "required": false }
```

## file

File attachment. The value stored in the record is a `fileId` ULID returned from the file upload flow. See [File Uploads & Downloads](/app-builder/sdk/file-uploads).

```json theme={null}
{ "key": "attachment", "name": "Attachment", "type": "file", "required": false }
```

## relation

A reference to a record in another entity within the same app. The stored value is the ULID of the target record.

```json theme={null}
{
  "key": "project_id",
  "name": "Project",
  "type": "relation",
  "required": false,
  "related_entity": "projects",
  "display_field": "name"
}
```

When you read a record that has a relation field, the value is the target record's `id` string. To load the referenced record's data, call `sdk.getRecord(relatedEntityKey, value)`.

***

## System Fields

Every record automatically includes these read-only fields — never include them in create/update payloads:

| Field        | Type          | Description                      |
| ------------ | ------------- | -------------------------------- |
| `id`         | string (ULID) | Unique record ID                 |
| `created_by` | string (ULID) | User who created the record      |
| `updated_by` | string (ULID) | User who last updated the record |
| `created_at` | datetime      | Creation timestamp               |
| `updated_at` | datetime      | Last update timestamp            |

***

## Naming Conventions

* **Field keys**: `snake_case`, lowercase — `due_date`, `is_complete`, `contact_email`
* **Field names**: Title Case — "Due Date", "Completed", "Contact Email"
* **Entity keys**: `snake_case`, plural — `tasks`, `contacts`, `inventory_items`
* **Entity names**: Title Case, plural — "Tasks", "Contacts"
