> For the complete documentation index, see [llms.txt](https://docs.a4b.vn/xflow/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.a4b.vn/xflow/developer-guide/workflow-states-reference/switch-state.md).

# Switch State

| Parameter           | Description                                                                                                                                   | Type    | Required                                  |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ----------------------------------------- |
| name                | Unique State name. Must follow the Serverless Workflow Naming Convention                                                                      | string  | yes                                       |
| type                | State type                                                                                                                                    | string  | yes                                       |
| dataConditions      | Defined if the Switch state evaluates conditions and transitions based on state data.                                                         | array   | yes (if `eventConditions` is not defined) |
| eventConditions     | Defined if the Switch state evaluates conditions and transitions based on arrival of events.                                                  | array   | yes (if `dataConditions` is not defined   |
| stateDataFilter     | State data filter                                                                                                                             | object  | no                                        |
| onErrors            | States error handling and retries definitions                                                                                                 | array   | no                                        |
| timeouts            | State specific timeout settings                                                                                                               | object  | no                                        |
| defaultCondition    | Default transition of the workflow if there is no matching data conditions or event timeout is reached. Can be a transition or end definition | object  | yes                                       |
| compensatedBy       | Unique name of a workflow state which is responsible for compensation of this state                                                           | string  | no                                        |
| usedForCompensation | If `true`, this state is used to compensate another state. Default is `false`                                                                 | boolean | no                                        |
| metadata            | Metadata information                                                                                                                          | object  | no                                        |

**Example:**

<table><thead><tr><th>JSON</th><th>YAML</th></tr></thead><tbody><tr><td><pre class="language-json"><code class="lang-json">{
     "name":"check-visa-status",
     "type":"switch",
     "eventConditions": [
        {
          "eventRef": "visa-approved-event",
          "transition": "handle-approved-visa"
        },
        {
          "eventRef": "visa-rejected-event",
          "transition": "handle-rejected-visa"
        }
     ],
     "timeouts": {
       "eventTimeout": "PT1H"
     },
     "defaultCondition": {
        "transition": "handle-no-visa-decision"
     }
}
</code></pre></td><td><pre class="language-yaml"><code class="lang-yaml">name: check-visa-status
type: switch
eventConditions:
- eventRef: visa-approved-event
  transition: handle-approved-visa
- eventRef: visa-rejected-event
  transition: handle-rejected-visa
timeouts:
  eventTimeout: PT1H
defaultCondition:
  transition: handle-no-visa-decision
</code></pre></td></tr></tbody></table>

Switch states can be viewed as workflow gateways: they can direct transitions of a workflow based on certain conditions. There are two types of conditions for switch states:

* Data-based conditions
* Event-based conditions

These are exclusive, meaning that a switch state can define one or the other condition type, but not both.

At times multiple defined conditions can be evaluated to `true` by runtime implementations. Conditions defined first take precedence over conditions defined later. This is backed by the fact that arrays/sequences are ordered in both JSON and YAML. For example, let's say there are two `true` conditions: A and B, defined in that order. Because A was defined first, its transition will be executed, not B's.

In case of data-based conditions definition, switch state controls workflow transitions based on the states data. If no defined conditions can be matched, the state transitions is taken based on the `defaultCondition` property. This property can be either a `transition` to another workflow state, or an `end` definition meaning a workflow end.

For event-based conditions, a switch state acts as a workflow wait state. It halts workflow execution until one of the referenced events arrive, then making a transition depending on that event definition. If events defined in event-based conditions do not arrive before the states `eventTimeout` property expires, state transitions are based on the defined `defaultCondition` property.

The `timeouts` property can be used to define state specific timeout settings. Switch states can define the `stateExecTimeout` setting. If `eventConditions` is defined, the switch state can also define the `eventTimeout` property. For more information on workflow timeouts reference the Workflow Timeouts section.
