WhatsApp · Schema
WhatsApp Flow JSON
Schema for WhatsApp Flow JSON definitions uploaded via the Flows API. Defines the UI screens, components, and navigation logic for interactive flows within WhatsApp conversations.
Properties
| Name | Type | Description |
|---|---|---|
| version | string | Flow JSON schema version (e.g., '7.0') |
| data_api_version | string | Data exchange protocol version (e.g., '3.0') |
| routing_model | object | Screen transition rules |
| screens | array |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://developers.facebook.com/schemas/whatsapp/flow-json.json",
"title": "WhatsApp Flow JSON",
"description": "Schema for WhatsApp Flow JSON definitions uploaded via the Flows API. Defines the UI screens, components, and navigation logic for interactive flows within WhatsApp conversations.",
"type": "object",
"required": ["version", "screens"],
"properties": {
"version": {
"type": "string",
"description": "Flow JSON schema version (e.g., '7.0')"
},
"data_api_version": {
"type": "string",
"description": "Data exchange protocol version (e.g., '3.0')"
},
"routing_model": {
"type": "object",
"description": "Screen transition rules"
},
"screens": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/$defs/Screen"
}
}
},
"$defs": {
"Screen": {
"type": "object",
"required": ["id", "layout"],
"properties": {
"id": {
"type": "string",
"description": "Unique screen identifier"
},
"title": {
"type": "string",
"description": "Navigation bar title"
},
"terminal": {
"type": "boolean",
"default": false,
"description": "Whether this screen marks flow completion"
},
"success": {
"type": "boolean",
"default": true,
"description": "Business outcome indicator for terminal screens"
},
"refresh_on_back": {
"type": "boolean",
"default": false,
"description": "Re-query endpoint when navigating back to this screen"
},
"data": {
"description": "Dynamic data from previous screens or data exchange endpoint"
},
"layout": {
"$ref": "#/$defs/Layout"
}
}
},
"Layout": {
"type": "object",
"required": ["type", "children"],
"properties": {
"type": {
"type": "string",
"const": "SingleColumnLayout"
},
"children": {
"type": "array",
"maxItems": 50,
"items": {
"$ref": "#/$defs/Component"
}
}
}
},
"Component": {
"type": "object",
"required": ["type"],
"properties": {
"type": {
"type": "string",
"enum": [
"TextHeading",
"TextSubheading",
"TextBody",
"TextCaption",
"RichText",
"Image",
"EmbeddedLink",
"TextInput",
"TextArea",
"Dropdown",
"RadioButtonsGroup",
"CheckboxGroup",
"ChipsSelector",
"DatePicker",
"CalendarPicker",
"PhotoPicker",
"DocumentPicker",
"OptIn",
"NavigationList",
"Footer",
"Form"
],
"description": "Component type"
},
"text": {
"type": "string",
"description": "Text content for display and link components"
},
"name": {
"type": "string",
"description": "Form field name for input components"
},
"label": {
"type": "string",
"description": "Label for input components"
},
"required": {
"type": "boolean",
"description": "Whether the input field is required"
},
"visible": {
"description": "Visibility condition (boolean or dynamic reference)"
},
"enabled": {
"description": "Enabled state (boolean or dynamic reference)"
},
"input_type": {
"type": "string",
"enum": ["TEXT", "NUMBER", "EMAIL", "PASSWORD", "PASSCODE", "PHONE"],
"description": "Input type for TextInput"
},
"min_chars": {
"type": "integer",
"description": "Minimum character count for TextInput"
},
"max_chars": {
"type": "integer",
"description": "Maximum character count for TextInput"
},
"pattern": {
"type": "string",
"description": "Regex validation pattern for TextInput"
},
"helper_text": {
"type": "string",
"description": "Helper text for input components"
},
"error_message": {
"type": "string",
"description": "Custom error message for validation failures"
},
"init_value": {
"description": "Initial value for input components"
},
"data_source": {
"type": "array",
"description": "Data source for selection components (Dropdown, RadioButtonsGroup, CheckboxGroup, ChipsSelector)",
"items": {
"$ref": "#/$defs/DataSourceItem"
}
},
"min_selected_items": {
"type": "integer",
"description": "Minimum selections for multi-select components"
},
"max_selected_items": {
"type": "integer",
"description": "Maximum selections for multi-select components"
},
"min_date": {
"type": "string",
"description": "Minimum date for DatePicker/CalendarPicker"
},
"max_date": {
"type": "string",
"description": "Maximum date for DatePicker/CalendarPicker"
},
"mode": {
"type": "string",
"enum": ["SINGLE_DATE", "DATE_RANGE", "MULTIPLE_DATES"],
"description": "Selection mode for CalendarPicker"
},
"source": {
"type": "string",
"enum": ["INPUT", "CAMERA"],
"description": "Source for PhotoPicker"
},
"src": {
"type": "string",
"description": "Image source URL for Image component"
},
"width": {
"type": "integer",
"description": "Image width"
},
"height": {
"type": "integer",
"description": "Image height"
},
"scale_type": {
"type": "string",
"description": "Image scaling type"
},
"alt_text": {
"type": "string",
"description": "Alt text for Image component"
},
"markdown": {
"type": "boolean",
"description": "Enable markdown rendering for TextBody/TextCaption"
},
"font_weight": {
"type": "string",
"description": "Font weight for text components"
},
"strikethrough": {
"type": "boolean",
"description": "Strikethrough text for TextBody/TextCaption"
},
"on_click_action": {
"$ref": "#/$defs/Action"
},
"on_select_action": {
"$ref": "#/$defs/Action"
},
"children": {
"type": "array",
"description": "Child components for Form and Layout",
"items": {
"$ref": "#/$defs/Component"
}
},
"list_items": {
"type": "array",
"maxItems": 20,
"description": "Navigation items for NavigationList"
}
}
},
"DataSourceItem": {
"type": "object",
"required": ["id", "title"],
"properties": {
"id": {
"type": "string",
"description": "Unique item identifier"
},
"title": {
"type": "string",
"description": "Display text"
},
"description": {
"type": "string",
"description": "Optional description"
},
"image": {
"type": "string",
"description": "Base64-encoded image"
}
}
},
"Action": {
"type": "object",
"required": ["name"],
"properties": {
"name": {
"type": "string",
"enum": ["navigate", "data_exchange", "complete", "update_data", "open_url"],
"description": "Action type"
},
"next": {
"type": "object",
"description": "Target screen for navigate action",
"properties": {
"type": {
"type": "string",
"const": "screen"
},
"name": {
"type": "string",
"description": "Target screen ID"
}
}
},
"payload": {
"description": "Data payload to send with the action. Use ${form.field_name} for form references."
},
"url": {
"type": "string",
"format": "uri",
"description": "URL for open_url action"
}
}
}
}
}