---
title: FatalError
description: Throw to mark a step as permanently failed without retrying.
docs_index: /llms.txt
lastUpdated: 2026-10-13
type: reference
summary: Throw FatalError in a step to mark it as permanently failed and prevent retries.
prerequisites:
  - /docs/foundations/errors-and-retries
related:
  - /docs/api-reference/workflow/retryable-error
---

> For an index of all documentation, see [/llms.txt](/llms.txt).

When a `FatalError` is thrown in a step, it indicates that the workflow should not retry a step, marking it as failure.

You should use this when you don't want a specific step to retry.

```typescript lineNumbers
import { FatalError } from "workflow"

async function fallibleWorkflow() {
    "use workflow"
    await fallibleStep();
}

async function fallibleStep() {
    "use step"
    throw new FatalError("Fallible!") // [!code highlight]
}
```

## API signature

### Constructor

`new FatalError(message)`

| Parameter | Type     | Description        |
| --------- | -------- | ------------------ |
| `message` | `string` | The error message. |

### Properties

### Static methods

#### `FatalError.is(value)`

Type-safe check for `FatalError` instances. Preferred over `instanceof` because it works across module boundaries and VM contexts.

```typescript
import { FatalError } from "workflow"
declare const error: unknown; // @setup

if (FatalError.is(error)) {
  // error is typed as FatalError
}
```

---

For a semantic overview of all documentation, see [/sitemap.md](/sitemap.md)

For an index of all available documentation, see [/llms.txt](/llms.txt)

For agent-facing discovery, including API and MCP surfaces, see [/agents.md](/agents.md)