---
title: "Render Workflow Graph"
method: POST
path: "/api/v1/graph/render"
tags: ["Runs"]
---

# Render Workflow Graph

`POST /api/v1/graph/render`

Validates and renders a workflow manifest as SVG without creating a run.

## Request body

- RenderWorkflowGraphRequest
  - `manifest` RunManifest, required — Self-contained workflow run manifest.
    - `version` integer, required — Manifest schema version.
    - `run_id` string, nullable — Optional pre-generated run ID to use instead of allocating a new ULID.
    - `parent_id` string, nullable — Optional orchestration parent run ID. Fork and rewind lineage use separate fields and should not set this value.
    - `title` string, nullable — Optional explicit run title. The server trims leading/trailing whitespace, rejects blank values, rejects control characters and newline characters, and requires at most 100 characters.
    - `cwd` string, required — CLI working directory at invocation time.
    - `git` GitContext — Observable git state captured before the run starts.
      - `origin_url` string, required — Remote origin URL with any embedded credentials removed.
      - `branch` string, required — Current branch name.
      - `sha` string, nullable — Current commit SHA, when known.
      - `dirty` 'clean' | 'dirty' | 'unknown', required
      - `push_outcome` union, required — Outcome of the CLI's best-effort pre-run push.
        - PreRunPushOutcomeNotAttempted
          - `type` 'not_attempted', required
        - PreRunPushOutcomeSucceeded
          - `type` 'succeeded', required
          - `remote` string, required
          - `branch` string, required
        - PreRunPushOutcomeFailed
          - `type` 'failed', required
          - `remote` string, required
          - `branch` string, required
          - `message` string, required
        - PreRunPushOutcomeSkippedNoRemote
          - `type` 'skipped_no_remote', required
        - PreRunPushOutcomeSkippedRemoteMismatch
          - `type` 'skipped_remote_mismatch', required
          - `remote` string, required
          - `repo_origin_url` string, required
    - `goal` ManifestGoal — Resolved goal with provenance.
      - `type` 'value' | 'file' | 'graph', required
      - `text` string, required — Resolved goal content.
      - `path` string, nullable — Original goal file path when the goal came from a file.
    - `args` ManifestArgs — Sparse command-local args that affect run settings.
      - `model` string
      - `provider` string
      - `environment` string — Named environment slug to select for the run.
      - `docker_image` string — Per-run environment image override.
      - `verbose` boolean
      - `dry_run` boolean
      - `auto_approve` boolean
      - `preserve_sandbox` boolean
      - `label` string[]
      - `input` string[] — Raw repeated CLI input overrides, each in `KEY=VALUE` form.
    - `target` ManifestTarget, required
      - `identifier` string, required — What the user typed.
      - `path` string, required — Resolved path that keys into the workflows map.
    - `configs` ManifestConfig[]
      - `type` 'project' | 'user', required
      - `path` string, nullable
      - `source` string, nullable
    - `workflows` object, required
  - `format` 'svg'
  - `direction` 'lr' | 'tb'

## Response `200`

Rendered graph image

## Other responses

- `400` — Invalid manifest or workflow

## Changes

- **2026-05-23** `41937812f640` — 1 warning, 1 info
  - removed the request property `manifest/args/sandbox`
  - added the new optional request property `manifest/args/environment`

[Change history](https://skmtc.dev/fabro-sh/apis/fabro-run-api/changes/api/v1/graph/render/post.md)

---

[API](https://skmtc.dev/fabro-sh/apis/fabro-run-api.md) · [All operations](https://skmtc.dev/fabro-sh/apis/fabro-run-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/fabro-sh/fabro-run-api/revisions/57aaacdfd18e/schema)
