HeyForm · Schema
HeyForm Form
Schema for a HeyForm conversational form object including its fields, settings, logic, and metadata.
FormsSurveysQuizzesPollsConversational FormsOpen SourceWebhooksNo-CodeForm BuilderSelf-Hosted
Properties
| Name | Type | Description |
|---|---|---|
| id | string | Unique form identifier (nanoid, 12 characters). |
| name | string | Display name of the form. |
| teamId | string | Identifier of the workspace/team that owns this form. |
| memberId | string | Identifier of the team member who created the form. |
| projectId | string | Identifier of the project (folder) this form belongs to. |
| fields | array | Ordered list of form fields (questions, statements, etc.). |
| hiddenFields | array | Hidden fields pre-populated via URL parameters or integrations. |
| logics | array | Conditional logic rules that control field visibility and branching. |
| variables | array | Calculated variables (e.g. score accumulators) used in logic and thank-you pages. |
| settings | object | |
| theme | object | |
| suspended | boolean | Whether the form has been suspended by the platform. |
| retentionAt | string | Timestamp when archived/trashed form will be permanently deleted. |
| fieldsUpdatedAt | integer | Unix timestamp of the last fields update (used for cache busting). |
| createdAt | string | ISO 8601 creation timestamp. |
| updatedAt | string | ISO 8601 last-updated timestamp. |
JSON Schema
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://api-evangelist.github.io/heyform/json-schema/heyform-form.json",
"title": "HeyForm Form",
"description": "Schema for a HeyForm conversational form object including its fields, settings, logic, and metadata.",
"type": "object",
"required": ["id", "name", "teamId", "fields"],
"properties": {
"id": {
"type": "string",
"description": "Unique form identifier (nanoid, 12 characters).",
"example": "abc123xyz789"
},
"name": {
"type": "string",
"description": "Display name of the form.",
"example": "Customer Feedback Survey"
},
"teamId": {
"type": "string",
"description": "Identifier of the workspace/team that owns this form."
},
"memberId": {
"type": "string",
"description": "Identifier of the team member who created the form."
},
"projectId": {
"type": "string",
"description": "Identifier of the project (folder) this form belongs to."
},
"fields": {
"type": "array",
"description": "Ordered list of form fields (questions, statements, etc.).",
"items": {
"$ref": "#/definitions/FormField"
}
},
"hiddenFields": {
"type": "array",
"description": "Hidden fields pre-populated via URL parameters or integrations.",
"items": {
"type": "object",
"properties": {
"id": { "type": "string" },
"name": { "type": "string" }
}
}
},
"logics": {
"type": "array",
"description": "Conditional logic rules that control field visibility and branching.",
"items": {
"$ref": "#/definitions/FormLogic"
}
},
"variables": {
"type": "array",
"description": "Calculated variables (e.g. score accumulators) used in logic and thank-you pages.",
"items": {
"$ref": "#/definitions/FormVariable"
}
},
"settings": {
"$ref": "#/definitions/FormSettings"
},
"theme": {
"$ref": "#/definitions/FormTheme"
},
"suspended": {
"type": "boolean",
"description": "Whether the form has been suspended by the platform."
},
"retentionAt": {
"type": "string",
"format": "date-time",
"description": "Timestamp when archived/trashed form will be permanently deleted."
},
"fieldsUpdatedAt": {
"type": "integer",
"description": "Unix timestamp of the last fields update (used for cache busting)."
},
"createdAt": {
"type": "string",
"format": "date-time",
"description": "ISO 8601 creation timestamp."
},
"updatedAt": {
"type": "string",
"format": "date-time",
"description": "ISO 8601 last-updated timestamp."
}
},
"definitions": {
"FormField": {
"type": "object",
"required": ["id", "kind"],
"properties": {
"id": {
"type": "string",
"description": "Unique field identifier within the form."
},
"title": {
"description": "Question or label text (rich text, stored as array of paragraphs or plain string).",
"oneOf": [
{ "type": "string" },
{ "type": "array", "items": { "type": "string" } }
]
},
"description": {
"description": "Helper text shown below the question.",
"oneOf": [
{ "type": "string" },
{ "type": "array", "items": { "type": "string" } }
]
},
"kind": {
"type": "string",
"description": "Field type determining the input widget and answer format.",
"enum": [
"short_text",
"long_text",
"multiple_choice",
"picture_choice",
"yes_no",
"rating",
"opinion_scale",
"date",
"time",
"number",
"email",
"url",
"phone_number",
"file_upload",
"payment",
"signature",
"thank_you",
"statement",
"welcome",
"group"
]
},
"validations": {
"type": "object",
"description": "Validation rules for the field.",
"properties": {
"required": {
"type": "boolean",
"description": "Whether the respondent must provide an answer."
},
"min": {
"type": "number",
"description": "Minimum numeric value or selection count."
},
"max": {
"type": "number",
"description": "Maximum numeric value or selection count."
}
}
},
"properties": {
"type": "object",
"description": "Field-type-specific configuration (e.g. choices for multiple_choice).",
"properties": {
"choices": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "string" },
"label": { "type": "string" },
"image": { "type": "string", "format": "uri" }
}
}
},
"allowMultiple": { "type": "boolean" },
"randomize": { "type": "boolean" },
"steps": { "type": "integer" },
"shape": { "type": "string", "enum": ["star", "heart", "thumb"] }
}
},
"layout": {
"type": "object",
"description": "Visual layout configuration for the field card.",
"properties": {
"mediaType": {
"type": "string",
"enum": ["image", "video"]
},
"mediaUrl": {
"type": "string",
"format": "uri"
},
"align": {
"type": "string",
"enum": ["split_left", "split_right", "float_left", "float_right", "inline"]
},
"brightness": {
"type": "number",
"minimum": -100,
"maximum": 100
}
}
}
}
},
"FormLogic": {
"type": "object",
"description": "A conditional logic rule that evaluates field answers and jumps to a target.",
"properties": {
"id": { "type": "string" },
"fieldId": {
"type": "string",
"description": "The field this logic rule is attached to."
},
"conditions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": { "type": "string" },
"fieldId": { "type": "string" },
"comparison": {
"type": "string",
"enum": ["is", "is_not", "contains", "not_contains", "starts_with",
"ends_with", "is_empty", "is_not_empty", "greater_than",
"less_than", "greater_equal", "less_equal"]
},
"value": {}
}
}
},
"operator": {
"type": "string",
"enum": ["and", "or"]
},
"action": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": ["navigate", "calculator", "required"]
},
"fieldId": { "type": "string" },
"value": {}
}
}
}
},
"FormVariable": {
"type": "object",
"description": "A variable that can accumulate values or store calculations across submissions.",
"properties": {
"id": { "type": "string" },
"name": { "type": "string" },
"kind": {
"type": "string",
"enum": ["number", "text"]
},
"value": {}
}
},
"FormSettings": {
"type": "object",
"description": "Form behaviour and access control settings.",
"properties": {
"active": {
"type": "boolean",
"description": "Whether the form is published and accepting responses."
},
"requirePassword": {
"type": "boolean",
"description": "Whether respondents must enter a password to access the form."
},
"password": {
"type": "string",
"description": "Password string (only stored server-side, never returned in public API)."
},
"captchaKind": {
"type": "string",
"enum": ["none", "google_recaptcha_v3", "geetest"],
"description": "Anti-bot captcha mechanism."
},
"filterSpam": {
"type": "boolean",
"description": "Whether AI-based spam filtering is enabled."
},
"allowArchive": {
"type": "boolean",
"description": "Whether submitted responses are stored (archived) on the server."
},
"enableQuotaLimit": {
"type": "boolean",
"description": "Whether a maximum submission count limit is enforced."
},
"quotaLimit": {
"type": "integer",
"description": "Maximum number of submissions allowed when enableQuotaLimit is true."
},
"enableIpLimit": {
"type": "boolean",
"description": "Whether per-IP submission rate limiting is enabled."
},
"ipLimitCount": {
"type": "integer",
"description": "Maximum submissions per unique IP when enableIpLimit is true."
},
"enableExpirationDate": {
"type": "boolean",
"description": "Whether the form automatically closes after a certain date."
},
"expirationDate": {
"type": "string",
"format": "date-time",
"description": "Date and time after which the form stops accepting responses."
}
}
},
"FormTheme": {
"type": "object",
"description": "Visual theming options for the form.",
"properties": {
"fontFamily": { "type": "string" },
"screenBackground": { "type": "string" },
"buttonBackground": { "type": "string" },
"buttonText": { "type": "string" },
"questionText": { "type": "string" },
"answerText": { "type": "string" },
"backgroundColor": { "type": "string" }
}
}
}
}