---
title: "Bulk Restart Workflows from DLQ"
method: POST
path: "/v2/workflows/dlq/restart"
tags: ["DLQ"]
---

# Bulk Restart Workflows from DLQ

`POST /v2/workflows/dlq/restart`

## Request

- Base URL: `https://qstash-eu-central-1.upstash.io`
- URL: `https://qstash-eu-central-1.upstash.io/v2/workflows/dlq/restart`
- Auth: one of:
  - HTTP bearer
  - API key in query parameter `qstash_token`
- TypeScript: <https://skmtc.dev/upstash/apis/upstash-workflow-rest-api/docs/v2/workflows/dlq/restart/post.ts> (a function with typed inputs; its response is checked against the schema)

Restart multiple failed workflow runs from the DLQ. Each workflow will start from the beginning.

Unlike resume, which continues from where workflows failed, restart executes the entire workflows
from the first step. New workflow run IDs are generated and all steps will be executed again.

A maximum of 50 workflow runs can be restarted per request. If more runs are available, a cursor is returned, which can be used in subsequent requests to continue the operation. When no cursor is returned, all entries have been processed.
Each restarted workflow run is assigned a new random Run ID.

## Query parameters

- `dlqIds` string[]
- `cursor` string
- `count` integer
- `fromDate` integer
- `toDate` integer
- `workflowUrl` string[]
- `workflowRunId` string
- `workflowCreatedAt` integer
- `label` string[]
- `failureFunctionState` string[]
- `callerIp` string[]
- `flowControlKey` string[]

## Headers

- `Upstash-Retries` integer
- `Upstash-Delay` string
- `Upstash-Retry-Delay` string
- `Upstash-Flow-Control-Key` string
- `Upstash-Flow-Control-Value` string
- `Upstash-Label` string
- `Upstash-Failure-Callback` string

## Response `200`

Workflows restarted successfully

- object
  - `workflowRuns` object[]: Array of restarted workflow runs.
    - `workflowRunId` string: The ID of the restarted workflow run (a new ID is generated for each restarted run).
    - `workflowCreatedAt` integer: The timestamp when the restarted workflow run was created (Unix timestamp in milliseconds).
  - `cursor` string: Pagination cursor to use in subsequent requests. If empty, all matching workflows have been processed.

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `404`: Some DLQ messages were not found
- `500`: Internal Server Error

## Changes

- **2026-06-25** `4fcd7653bd06`: 4 info
  - for the `query` request parameter `callerIp`, the type was generalized from `string` to `array`
  - for the `query` request parameter `failureFunctionState`, the type was generalized from `string` to `array`
  - for the `query` request parameter `flowControlKey`, the type was generalized from `string` to `array`
  - for the `query` request parameter `workflowUrl`, the type was generalized from `string` to `array`
- **2026-05-15** `4cbcb5c2eac1`: 1 info
  - for the `query` request parameter `label`, the type was generalized from `string` to `array`

[Operation history](https://skmtc.dev/upstash/apis/upstash-workflow-rest-api/changes/v2/workflows/dlq/restart/post.md)

---

[API](https://skmtc.dev/upstash/apis/upstash-workflow-rest-api.md) - [All operations](https://skmtc.dev/upstash/apis/upstash-workflow-rest-api/llms.txt) - [OpenAPI document](https://skmtc.dev/upstash/apis/upstash-workflow-rest-api/revisions/251bee05a7ec?raw)
