> ## Documentation Index
> Fetch the complete documentation index at: https://upstash-partnerstash.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Bulk Resume Workflow Runs

> Resume multiple workflow runs at once

The bulk resume feature allows you to resume multiple failed workflow runs from the Dead Letter Queue (DLQ) in a single request, continuing each run from the point of failure rather than starting over.

This is useful when you want to preserve the progress of long-running workflows that partially succeeded before failing, and resume them all efficiently without losing successful step results.

Each resumed workflow is created as a new run. All successfully completed steps from the original runs are preserved, and only the failed or pending steps are executed again.

A maximum of 50 workflow runs can be resumed 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.

You can specify exact DLQ IDs or apply filters to select which workflows to resume.

<Note>
  You may modify the workflow code **after the point of failure**, but changes **before the failed step** are not supported and may cause the resume to fail.

  For more information, see [Handle workflow route code changes](/workflow/howto/changes).
</Note>

## Request Parameters

<ParamField query="dlqIds" type="array">
  A list of DLQ IDs corresponding to the failed workflow runs you want to resume.
</ParamField>

<ParamField query="fromDate" type="integer">
  Optional. Resume workflow runs that failed on or after this unix millisecond timestamp.
</ParamField>

<ParamField query="toDate" type="integer">
  Optional. Resume workflow runs that failed on or before this unix millisecond timestamp.
</ParamField>

<ParamField query="workflowUrl" type="string">
  Optional. Resume workflow runs where the workflow URL matches this value.
</ParamField>

<ParamField query="workflowRunId" type="string">
  Optional. Resume workflow runs matching this specific Run ID or ID prefix.
</ParamField>

<ParamField query="workflowCreatedAt" type="integer">
  Optional. Resume workflow runs created at the specified unix millisecond timestamp.
</ParamField>

<ParamField header="Upstash-Flow-Control-Key" type="string">
  Optional. Override the flow control key for the resumed workflows. If not provided, the original key is reused.
</ParamField>

<ParamField header="Upstash-Flow-Control-Value" type="string">
  Optional. Override the flow control value for the resumed workflows. If not provided, the original value is reused.
</ParamField>

<ParamField header="Upstash-Retries" type="integer">
  Optional. Override the retry configuration for the steps in the resumed workflows.
</ParamField>

## Response

<ResponseField name="cursor" type="string">
  A cursor to paginate through additional matching DLQ entries. If not present, all matching entries have been processed.
</ResponseField>

<ResponseField name="workflowRuns" type="array">
  A list of resumed workflow runs, each containing a new run ID and creation timestamp.
</ResponseField>

## Request Example

<RequestExample>
  ```sh theme={null}
  curl -X POST https://qstash.upstash.io/v2/workflows/dlq/resume \
    -H "Authorization: Bearer <token>" \
    -H "Upstash-Flow-Control-Key: custom-key" \
    -H "Upstash-Flow-Control-Value: parallelism=1" \
    -H "Upstash-Retries: 3"
  ```
</RequestExample>

<ResponseExample>
  ```json theme={null}
  {
    "cursor": "",
    "workflowRuns": [
      {
        "workflowRunId": "wfr_resumed_A",
        "workflowCreatedAt": 1748527971000
      },
      {
        "workflowRunId": "wfr_resumed_B",
        "workflowCreatedAt": 1748527971000
      }
    ]
  }
  ```
</ResponseExample>
