---
title: "Replace the graph"
method: PUT
path: "/workflows/{id}/graph"
tags: ["Workflows"]
---

# Replace the graph

`PUT /workflows/{id}/graph`

## Request

- Base URL: `https://api.poststack.dev`
- URL: `https://api.poststack.dev/workflows/{id}/graph`
- Auth: one of:
  - HTTP bearer
  - OAuth 2
    - Authorization code: `https://poststack.dev/oauth/authorize`
    - Token URL: `https://poststack.dev/oauth/token`
- TypeScript: <https://skmtc.dev/poststack/apis/poststack-api/docs/workflows/:id/graph/put.ts> (a function with typed inputs; its response is checked against the schema)

Atomic full replace (max 500 nodes, 1,000 edges).

## Path parameters

- `id` string, required

## Request body

- PutWorkflowGraphInput
  - `nodes` object[], required
    - `public_id` string, required
    - `type` 'trigger' | 'send_email' | 'wait' | 'condition' | 'webhook', required
    - `config` object, required
    - `canvas_x` number, required
    - `canvas_y` number, required
  - `edges` object[], required
    - `from_public_id` string, required
    - `to_public_id` string, required
    - `branch` 'match' | 'no_match', nullable

## Response `200`

The stored graph.

- object
  - `graph` WorkflowGraph, required
    - `nodes` object[], required
      - `public_id` string, required
      - `type` 'trigger' | 'send_email' | 'wait' | 'condition' | 'webhook', required
      - `config` object, required
      - `canvas_x` number
      - `canvas_y` number
    - `edges` object[], required
      - `from_public_id` string, required
      - `to_public_id` string, required
      - `branch` 'match' | 'no_match', nullable

## Other responses

- `400`: Validation failed — `error` names each offending field (`field: message`).
- `401`: Missing, malformed or unknown credentials (`WWW-Authenticate: Bearer …` is set).
- `403`: The credential lacks the `workflows:manage` scope (body `{ error: "insufficient_scope", required, missing }`), or the team is suspended.
- `404`: No such resource on this team.
- `409`: The workflow is active — pause it before editing.
- `422`: Duplicate node id, self-edge, an edge to a missing node, or more than one edge per branch out of a node.
- `429`: Rate limited (60/min). `Retry-After` gives the seconds to wait; `X-RateLimit-*` headers are sent on every response.

## Changes

- **2026-09-30** `4dc1e20989c8`: 21 warning
  - added the new `daily_limit_exceeded` enum value to the `anyOf[#/components/schemas/Error]/code` response property for the response status `403`
  - added the new `daily_limit_exceeded` enum value to the `code` response property for the response status `400`
  - added the new `daily_limit_exceeded` enum value to the `code` response property for the response status `401`
  - added the new `daily_limit_exceeded` enum value to the `code` response property for the response status `404`
  - …17 more
- **2026-09-29** `ef5b22b98333`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/poststack/apis/poststack-api/changes/workflows/:id/graph/put.md)

---

[API](https://skmtc.dev/poststack/apis/poststack-api.md) - [All operations](https://skmtc.dev/poststack/apis/poststack-api/llms.txt) - [OpenAPI document](https://skmtc.dev/poststack/apis/poststack-api/revisions/0d3971e3a670?raw)
