# Run Workflow — Dify

> Run the published workflow of the Dify app that the connected API key belongs to, and return its outputs. Only works for Workflow-type apps: a Chatflow, Chatbot, Agent, or Text Generator app's key returns a not_workflow_app error. Requires…

- Key: `dify-run-workflow`
- Type: Action (Write)
- Version: 0.0.1
- App: Dify (`dify`) — https://pipedream.com/apps/dify.md
- This page (HTML): https://pipedream.com/apps/dify/actions/run-workflow
- Hints: open-world
- Source: https://github.com/PipedreamHQ/pipedream/blob/master/components/dify/actions/run-workflow/run-workflow.mjs

## Description

Run the published workflow of the Dify app that the connected API key belongs to, and return its outputs. Only works for **Workflow**-type apps: a Chatflow, Chatbot, Agent, or Text Generator app's key returns a `not_workflow_app` error. Requires the workflow to be published; an unpublished workflow returns an `invalid_param` error. Use **Get App Parameters** first to learn the input variable names. Example: `Inputs` `{ "city": "San Francisco" }`, `User` `user-123` → `{ workflow_run_id, data: { id, status: "succeeded", outputs: { result: "..." }, total_tokens, elapsed_time } }`. This action uses `blocking` response mode, which waits for the run to finish before returning; long-running workflows on Dify Cloud risk being cut off by the platform's 100-second edge proxy timeout, in which case the run may still complete server-side but this action will not see the result. [See the documentation](https://docs.dify.ai/en/api-reference/workflow-runs/run-workflow)

## Props

| Prop | Type | Required | Description |
|---|---|---|---|
| `inputs` | `object` | No | Values for the app's input variables, keyed by variable name, e.g. { "city": "San Francisco" }. Leave empty ({}) if the app defines no input variables — most chat apps don't. Use Get App Parameters to discover this app's actual variable names and whether each is required. |
| `user` | `string` | Yes | A unique identifier for the end user, defined by you (e.g. an internal user ID or session ID) — not a Dify account. Dify scopes conversations, messages, and files to this value, so reuse the same User across requests for the same end user. When reading conversations or messages, this must match the User value used when they were created — Dify returns an empty page, not an error, for a mismatched value. For List Conversations and List Messages, Dify has no endpoint to list end users: use the User value from the user's request, or ask for it. See the documentation |

## Run it

**MCP**

```ts
import { Client } from "@modelcontextprotocol/sdk/client/index.js"
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"
import { PipedreamClient } from "@pipedream/sdk"

const pd = new PipedreamClient({
  projectId: process.env.PIPEDREAM_PROJECT_ID!,
  clientId: process.env.PIPEDREAM_CLIENT_ID!,
  clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
  projectEnvironment: "production",
})

const accessToken = await pd.rawAccessToken

const transport = new StreamableHTTPClientTransport(
  new URL("https://remote.mcp.pipedream.net/v3"),
  {
    requestInit: {
      headers: {
        Authorization: `Bearer ${accessToken}`,
        "x-pd-project-id": process.env.PIPEDREAM_PROJECT_ID!,
        "x-pd-environment": "production",
        "x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
        "x-pd-app-slug": "dify",
      },
    },
  },
)

const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)

const { tools } = await mcp.listTools()

// listTools() hands your model this tool's input schema, so it can
// fill the arguments itself:
const result = await mcp.callTool({
  name: "dify-run-workflow",
  arguments: {
    inputs: "Inputs",
    user: "User",
  },
})
```

**TypeScript**

```ts
import { PipedreamClient } from "@pipedream/sdk"

const pd = new PipedreamClient({
  projectId: process.env.PIPEDREAM_PROJECT_ID!,
  clientId: process.env.PIPEDREAM_CLIENT_ID!,
  clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
  projectEnvironment: "production",
})

const result = await pd.actions.run({
  id: "dify-run-workflow",
  externalUserId: "{external_user_id}", // any stable ID for this user in your system
  configuredProps: {
    dify: { authProvisionId: "apn_xxxxxxx" },
    inputs: "Inputs",
    user: "User",
  },
})

console.log(result)
```

**cURL**

```bash
curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
  -H "Content-Type: application/json" \
  -H "X-PD-Environment: production" \
  -H "Authorization: Bearer {access_token}" \
  -d '{
    "external_user_id": "{external_user_id}",
    "id": "dify-run-workflow",
    "configured_props": {
      "dify": { "authProvisionId": "apn_xxxxxxx" },
      "inputs": "Inputs",
      "user": "User"
    }
  }'
```

---

- App: https://pipedream.com/apps/dify.md · All apps: https://pipedream.com/apps
