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
View JSON Schema on GitHub

JSON Schema

whatsapp-flow-json-schema.json Raw ↑
{
  "$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"
        }
      }
    }
  }
}