Field Types
WorkApps 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 length: 255 characters (default)
- Example value:
"Buy milk"
1{ "key": "title", "name": "Title", "type": "text", "required": true }
textarea
Multi-line plain text.
- Max length: 5000 characters (default)
- Example value:
"This is a longer description\nwith multiple lines."
1{ "key": "description", "name": "Description", "type": "textarea", "required": false }
number
Numeric value — integer or decimal.
- Optional constraints:
min,max,decimal_places - These are configured in the WorkApps dashboard when defining the field in the Schema Builder.
- Example values:
42,3.14,0
1{ "key": "quantity", "name": "Quantity", "type": "number", "required": true }
boolean
True/false toggle.
- Example values:
true,false
1{ "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.
- options: required array of string values
1{2 "key": "priority",3 "name": "Priority",4 "type": "select",5 "required": true,6 "options": ["low", "medium", "high", "critical"]7}
multi_select
Multiple choices from a predefined list. Stored as an array of strings.
- options: required array of string values
- Example value:
["frontend", "backend"]
1{2 "key": "tags",3 "name": "Tags",4 "type": "multi_select",5 "required": false,6 "options": ["frontend", "backend", "design", "devops"]7}
date
Calendar date without time.
- Format:
YYYY-MM-DD - Example value:
"2026-04-01"
1{ "key": "due_date", "name": "Due Date", "type": "date", "required": false }
datetime
Date and time with timezone.
- Format: ISO 8601 (
YYYY-MM-DDTHH:mm:ssZ) - Example value:
"2026-04-01T14:30:00Z"
1{ "key": "scheduled_at", "name": "Scheduled At", "type": "datetime", "required": false }
Email address. Validated as a properly-formatted email.
- Example value:
"[email protected]"
1{ "key": "contact_email", "name": "Contact Email", "type": "email", "required": true }
url
Web URL. Validated as a properly-formatted URL.
- Example value:
"https://example.com/profile"
1{ "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.
- Stored as: string (fileId)
- Example value:
"01JA..." - Upload flow: See File Uploads
- Reading: When you read a record, the
filefield value is thefileIdstring. To get a download URL, callsdk.getFileUrl(fileId)— see File Uploads & Downloads.
1{ "key": "attachment", "name": "Attachment", "type": "file", "required": false }
relation
A reference to a record in another entity within the same app. The value stored in the field is the ULID of the target record.
- related_entity: the
keyof the target entity (e.g."projects") - display_field: optional field key on the target entity to use as a display label
- Example value:
"01JA..."
1{2 "key": "project_id",3 "name": "Project",4 "type": "relation",5 "required": false,6 "related_entity": "projects",7 "display_field": "name"8}
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"