> For the complete documentation index, see [llms.txt](https://sevenval.gitbook.io/flat/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sevenval.gitbook.io/flat/develop/cookbook/error-flow.md).

# Handling Errors with an Error Flow

The [*error flow*](/flat/develop/reference/openapi-4/routing.md#error-flow) is triggered when certain severe errors occur while processing the flow, or when the [`error` action](/flat/develop/reference/actions/error.md) is invoked. It is typically used to produce custom error messages or headers, or set the HTTP status. Another example is augmenting the [access log](/flat/develop/administration/logging.md) with [custom log fields](/flat/develop/cookbook/custom-logging.md).

In your `swagger.yaml`, point the top-level property `x-flat-error` to a flow file:

```yaml
…
x-flat-error:
  flow: error.xml       # ⬅ error flow
…
```

In this example, we use `error.xml` to format a custom error message:

```markup
<flow>
  <template>
    {
      "CustomError":  {
        "Message": {{ $error/message }},
        "Info": {{ $error/info }}
      }
    }
  </template>
  <set-response-headers>
    {
      "Status": {{ $error/status }},
      "Error-Code": {{ $error/code }}
    }
  </set-response-headers>
</flow>
```

This will ensure that all errors that trigger the error flow will produce a consistent status, error message and headers.

## Triggers

Error triggers are

* [schema violations](/flat/develop/reference/openapi-7/validation.md),
* [security violations (JWT)](/flat/develop/reference/openapi-5/security.md),
* [request errors](/flat/develop/reference/actions/request.md#options),
* or the [`error` action](/flat/develop/reference/actions/error.md)

## See also

* [Error Flow](/flat/develop/reference/openapi-4/routing.md#error-flow)
* [`$error`](/flat/develop/reference/variables.md#usderror)
