GoRunner

Apply one operation to many workflows

Requires scope workflow:write
POST
/api/workflows/bulk

Applies a single operation to up to 200 workflows. It is BEST-EFFORT PER WORKFLOW and always answers 200 when the request itself is well formed: each id lands in succeeded or in failed with its own message, so one workflow that cannot be activated never blocks the rest. Always read the result body — a 200 does not mean every id worked.

Operations: activate runs the same publish validation and trigger registration as POST /api/workflows/{id}/publish (a workflow that fails validation fails only its own entry); pause takes a live workflow offline; delete deletes permanently, including its runs and their stored payloads; addTags MERGES the given tags into each workflow's existing set (deduplicated case-insensitively, refused per-workflow past 50 tags) — it does not replace, use PUT /api/workflows/{id}/tags for that; move files each workflow into folderId (send null to un-file).

This route does NOT accept Idempotency-Key. Every operation it offers is naturally repeatable except delete, whose second attempt simply fails that id.

Authorization

bearerAuth
AuthorizationBearer <token>

An API token: Authorization: Bearer grt_…. Mint one in the app under Settings → Workspace → API tokens; the raw value is shown once. Scopes confine the token — see x-permission on each operation.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/workflows/bulk" \  -H "Content-Type: application/json" \  -d '{    "op": "addTags",    "ids": [      "8a3172d2-1e17-49b3-9482-f9d97cea2848"    ],    "tags": [      "prod"    ]  }'
{  "data": {    "op": "activate",    "succeeded": [      "e1794397-6c94-46c1-a460-b264efd4c81b"    ],    "failed": [      {        "id": "string",        "error": "string"      }    ]  }}