Upstash Workflow JS
UpstashOfficialCreated by Upstash
- Skill
- Tool integration
- Cloud and DevOps
- MIT
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The Upstash Workflow SDK enables developers to create reliable, multi-step workflows within serverless environments. By leveraging QStash, it allows functions to survive timeouts, retries, and restarts, effectively managing long-running processes that span minutes or days without keeping the underlying function execution active. It supports complex orchestration patterns, including step-by-step execution, external API calls, event waiting, human-in-the-loop approvals, and sophisticated flow control.
What it does
- Exposes serverless endpoints for durable workflow execution.
- Manages multi-step processes that persist across function restarts and timeouts.
- Provides tools for flow control, including concurrency, rate limiting, and parallelism.
- Supports advanced patterns like cross-workflow invocation and waiting for external events.
- Enables local development and testing via the QStash dev server.
- Facilitates human-in-the-loop workflows and real-time updates.
When to use it
- When building long-running tasks that exceed standard serverless function execution limits.
- When implementing saga or orchestration patterns in a distributed system.
- When you need reliable background jobs with built-in checkpointing and retries.
- When building AI agents or orchestrators that require stateful, multi-step execution.
- When integrating human approval steps into automated backend processes.
Advantages
- Eliminates the need to hold serverless functions open for long durations.
- Built-in support for retries, failure callbacks, and dead-letter queues.
- Seamless integration with popular serverless platforms like Vercel and Cloudflare Workers.
- Simplifies complex state management for asynchronous operations.
Usage examples
- “How do I define a basic two-step workflow using the Upstash SDK?”
- The agent provides a code snippet using the serve() function and context.run() to define sequential steps that persist across execution.
- “How can I trigger a workflow from my existing backend code?”
- The agent demonstrates initializing the Workflow Client with a QStash token and using the trigger() method to initiate the workflow URL.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/upstash/upstash-workflow-js/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip upstash-workflow-js.zip -d .agents/skills
Documentation by Upstash
Upstash Workflow SDK
Bundled docs and source
Before writing or debugging SDK code, check node_modules/@upstash/workflow/docs/ for bundled docs and node_modules/@upstash/workflow/src/ for readable TypeScript source. Read and search the relevant files when present; otherwise use the references in this skill.
Quick Start
The Upstash Workflow SDK lets you expose serverless workflow endpoints and run them reliably using QStash under the hood.
Install:
npm install @upstash/workflowDefine a simple workflow endpoint:
import { serve } from "@upstash/workflow";
export const { POST } = serve(async (context) => {
await context.run("step-1", () => console.log("step 1"));
await context.run("step-2", () => console.log("step 2"));
});Trigger it from your backend:
import { Client } from "@upstash/workflow";
const client = new Client({ token: process.env.QSTASH_TOKEN! });
await client.trigger({ url: "https://your-app.com/api/workflow" });Other Skill Files
These files contain the full documentation. Use them for details, patterns, and advanced behavior.
basics:
basics/serve – How to expose workflow endpoints.
basics/context – Full API for workflow
context(steps, waits, webhooks, events, invoke, etc.).basics/client – Using the Workflow client to trigger, cancel, inspect, and notify runs.
features:
features/invoke – Cross‑workflow invocation.
features/reliability – Retries, failure callbacks, and DLQ.
features/flow-control – Rate limits, concurrency, and parallelism.
features/wait-for-event – Notify and wait-for-event patterns.
features/webhooks – Webhook creation and consumption.
how to:
how-to/local-dev – Local QStash dev server (auto via
QSTASH_DEV=true) and tunneling.how-to/realtime – Realtime and human‑in‑the‑loop workflows.
how-to/migrations – Migrating workflows safely.
how-to/middleware – Adding middleware to workflows.
other files:
rest-api – Low-level REST endpoints for interacting with QStash/Workflow.
troubleshooting – Common debugging and environment issues.
agents – Using Workflow with agents, orchestrators, and automation patterns.
Files
- ATTRIBUTION.mdAdded by AutoGineer892 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md3.4 KiB
- agents.md6.7 KiB
- basics/client.md4.1 KiB
- basics/context.md5.1 KiB
- basics/serve.md2.4 KiB
- features/flow-control.md3.9 KiB
- features/invoke.md2.6 KiB
- features/retries-failures-reliability.md6.3 KiB
- features/wait-for-event.md2.8 KiB
- features/webhooks.md2.5 KiB
- how-to/local-dev.md5.0 KiB
- how-to/middleware.md4.7 KiB
- how-to/migrations.md4.8 KiB
- how-to/realtime.md4.8 KiB
- rest-api.md6.6 KiB
- troubleshooting.md4.8 KiB
rest-api.md
Workflow REST API Skill
This Skill provides TypeScript-focused guidance for interacting with the Upstash QStash Workflow Dead Letter Queue (DLQ) REST API. It includes practical usage examples, consolidated patterns, and key considerations for safely restarting, resuming, listing, deleting, and inspecting failed workflow runs.
The goal is to help agents construct correct TypeScript API requests, handle optional fields, and avoid common pitfalls when working with workflow recovery operations.
Core Concepts
• DLQ Entries represent failed workflow runs containing metadata such as payload, headers, timestamps, failure callback state, and workflow configuration.
• Restart recreates the entire workflow run from the beginning (fresh execution, no preserved state).
• Resume creates a new run continuing from the failed step (preserves successful steps).
• Bulk operations process up to 50 DLQ entries per request and may return a cursor for pagination.
• Flow-Control and Retry Overrides are passed via headers and apply only to the newly created workflow run.
Be careful: changing workflow code before the failed step may cause resume operations to break.
HTTP Endpoints Overview
Below is a complete summary of the API endpoints supported by this skill.
• GET /v2/workflows/dlq — List DLQ entries with filtering.
• GET /v2/workflows/dlq/{dlqId} — Retrieve a single DLQ entry.
• DELETE /v2/workflows/dlq/{dlqId} — Delete a DLQ entry.
• POST /v2/workflows/dlq/restart/{dlqId} — Restart a workflow from scratch.
• POST /v2/workflows/dlq/resume/{dlqId} — Resume a workflow from point of failure.
• POST /v2/workflows/dlq/restart — Bulk restart (up to 50).
• POST /v2/workflows/dlq/resume — Bulk resume (up to 50).
• POST /v2/workflows/dlq/callback/{dlqId} — Rerun a failed failure-callback.
• GET /v2/flowControl and /v2/flowControl/{key} — Flow-control inspection.
TypeScript Usage Patterns
Below is a single integrated example illustrating several endpoints, optional query parameters, header overrides, and response field handling.
import fetch from "node-fetch";
const token = process.env.QSTASH_TOKEN;
const base = "https://qstash.upstash.io/v2";
async function example() {
// 1. List DLQ items with filters
const list = await fetch(
`${base}/workflows/dlq?workflowUrl=https://my.app/workflow&fromDate=1700000000000`,
{
headers: { Authorization: `Bearer ${token}` },
}
).then((r) => r.json());
const firstDlqId = list.messages?.[0]?.dlqId;
// 2. Restart or Resume a specific run (headers may override flow control or retries)
const restart = await fetch(`${base}/workflows/dlq/restart/${firstDlqId}`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Upstash-Flow-Control-Key": "my-key", // optional
"Upstash-Flow-Control-Value": "parallelism=1", // optional
"Upstash-Retries": "3", // optional
},
}).then((r) => r.json());
// 3. Bulk resume using filters and cursor handling
const bulkResume = await fetch(`${base}/workflows/dlq/resume`, {
method: "POST",
headers: { Authorization: `Bearer ${token}` },
body: JSON.stringify({
fromDate: 1700000000000,
workflowUrl: "https://my.app/workflow",
dlqIds: [firstDlqId], // optional; filters also supported
}),
}).then((r) => r.json());
// 4. Rerun failure callback
const callback = await fetch(`${base}/workflows/dlq/callback/${firstDlqId}`, {
method: "POST",
headers: { Authorization: `Bearer ${token}` },
}).then((r) => r.json());
// 5. Delete a DLQ entry
await fetch(`${base}/workflows/dlq/${firstDlqId}`, {
method: "DELETE",
headers: { Authorization: `Bearer ${token}` },
});
// 6. Inspect Flow-Control
const fc = await fetch(`${base}/flowControl/my-key`, {
headers: { Authorization: `Bearer ${token}` },
}).then((r) => r.json());
console.log({ list, restart, bulkResume, callback, fc });
}Key Fields and Behaviors
Request Query Fields
• dlqIds: string[] — Exact DLQ IDs for targeting specific failed runs (bulk restart/resume).
• fromDate / toDate: number — Millisecond timestamps; inclusive range filters.
• workflowUrl: string — Filters by workflow endpoint URL.
• workflowRunId: string — Can match full run ID or prefix.
• workflowCreatedAt: number — Timestamp filter for creation time.
• responseStatus: number — Filter by HTTP status of failed run.
• callerIP: string — Filter by origin IP.
• failureCallbackState: string — Filter runs whose failure callback succeeded or failed.
• cursor: string — Pagination cursor; returned by list & bulk ops.
• count: number — Limit for listing DLQ entries (default/max 100).
Header Overrides
These apply only when creating a new workflow run (restart or resume).
• Upstash-Flow-Control-Key — Override flow-control key.
• Upstash-Flow-Control-Value — Override flow-control config (e.g., "parallelism=1").
• Upstash-Retries — Override step retry configuration.
All are optional; original values are reused if omitted.
Response Fields
• cursor?: string — If returned, additional entries exist.
• workflowRuns: { workflowRunId: string; workflowCreatedAt: number }[] — Returned by bulk restart/resume.
• message objects (DLQ list/get) include:
workflowRunId, workflowCreatedAt, workflowUrl
responseStatus, responseHeader, responseBody
failureCallbackInfo.state — Identify failed callbacks.
dlqId — Unique DLQ entry identifier.
Pitfalls & Best Practices
• Resume only works if workflow code before the failed step stays unchanged. Any change may cause resume to fail.
• Bulk operations process max 50 items. Always check cursor to continue processing.
• Deleting a DLQ entry is permanent; once removed, it cannot be resumed or restarted.
• Failure callback reruns are independent and do not affect workflow execution. They only retry the failure-notification step.
• Prefix matching on workflowRunId can unintentionally match more runs than expected—use full ID for precision.
Recommended Patterns
• Fetch → Check cursor → Continue looping for bulk operations.
• Always log failureCallbackInfo.state to determine whether a callback rerun is required.
• Apply header overrides sparingly; flow-control misconfiguration may stall large batches.
• Prefer filtering in bulk operations instead of manually passing large dlqIds arrays.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Node.js
Security
What our scanner noticed· Medium risk
- Possible data-exfiltration endpoints
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Upstash
- Publisher
- Upstash (Official)
- Source
- upstash/skills · skills/upstash-workflow-js · commit 9f9e3e5
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Upstash or Upstash.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download upstash-workflow-js.zip