Graine AI
API referenceWorkflows

Publish a workflow

The draft, checked, frozen as the next version.

The draft, checked, frozen as the next version. Runs already under way keep their version.

Rate limit: 2000 requests per minute per organization, counted together with every endpoint that has no stricter limit of its own. Exceeding it returns 429 with Retry-After; the X-RateLimit-* response headers report your remaining allowance on every call.

POST
/v2/workflows/{workflow_id}/publish
/v2/workflows/owf_8a1d4e7c2b90f1a2b3c4d5e6/publish

The Authorization access token

Authorization

Authorization
Required
Bearer <token>

Your Graine API key. Create one in the dashboard under Developers, or via POST /v2/api-keys. Send it as Authorization: Bearer <key>.

In: header

Request Body

application/jsonOptional

revisionRevision | null

The draft revision you checked (409 if it changed).

Minimum: 0

Path Parameters

workflow_id
Required
Workflow Id

The workflow's id.

Response Body

201

The new version.

version
Required
WorkflowVersionSummary

A published version.

warnings
Required
Warnings

What it went ahead with.

401

1100 — missing, unknown or inactive API key. 1101 — a browser session token was presented instead of an API key.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

403

1102 — the key is valid but lacks the scope this endpoint requires, or names another organization. GET /v2/scopes reports what a key holds.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

404

1200 — no such resource in your organization. A resource belonging to another organization answers 404, never 403.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

409

1201 — the resource's current state does not allow this action.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

422

1001 — the body or query failed validation; the message names the first offending field.

error
Required
integer

Stable integer code from the error table. Branch on this, not on the message.

message
Required
string

One human-readable sentence. Wording may change; the code will not.

429

1300 — the per-organization request rate or concurrent-call limit was reached. Carries Retry-After.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

503

1501 — a service this endpoint depends on is unreachable or returned a 5xx.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

curl -X POST "https://api.graine.ai/v2/workflows/owf_8a1d4e7c2b90f1a2b3c4d5e6/publish" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "revision": 3
  }'

The new version.

{
  "version": {
    "id": "owv_5d0c2b9e1f3a4b5c6d7e8f9a",
    "workflow_id": "owf_8a1d4e7c2b90f1a2b3c4d5e6",
    "number": 2,
    "agent_ids": [
      "agt_0123"
    ],
    "from_revision": 3,
    "published_by": "member-live-1a2b3c",
    "published_at": "2026-10-25T09:31:00+00:00",
    "counts": {
      "runs": 120,
      "success": 71,
      "failure": 30,
      "neutral": 19
    }
  },
  "warnings": []
}