---
title: "Get a workflow"
method: GET
path: "/workflows/{workflow_id}"
tags: ["Workflows"]
---

# Get a workflow

`GET /workflows/{workflow_id}`

## Request

- Base URL: `https://api.reacherapp.com/public/v1`
- URL: `https://api.reacherapp.com/public/v1/workflows/{workflow_id}`
- Auth: API key in header `x-api-key` and API key in header `x-shop-id`

One workflow with both definitions: `definition` is the draft being edited, `published_definition` is what the runtime is actually walking. They differ whenever `has_unpublished_changes` is true — a change only reaches creators at `POST /workflows/{id}/publish`.

## Path parameters

- `workflow_id` string, required: The workflow's uuid, as `POST /workflows/list` returns it.

## Response `200`

Successful Response

- EnvelopeWorkflowPublic
  - `data` WorkflowPublic, required: One workflow with both documents.
    - `workflow_id` string, required
    - `shop_id` integer, required
    - `name` string, required
    - `description` string, nullable
    - `status` string, required: draft, running, paused, archived or template.
    - `version` integer, required: Incremented on each publish.
    - `trigger_type` string, required: creator_matches or recurring.
    - `step_count` integer, required
    - `branch_count` integer, required
    - `has_unpublished_changes` boolean, required: The draft differs from what the runtime is walking.
    - `created_from` object, nullable
    - `published_at` string, nullable
    - `created_at` string, required
    - `updated_at` string, required
    - `enrolled` integer: Creators the trigger has admitted.
    - `in_progress` integer: Creators still walking it.
    - `sends` integer
    - `reached` integer
    - `gmv` number
    - `definition` object, required: The draft being edited. The workflow document. Not schematized here, because the node set still grows and this is also Cruva's `formatVersion: 1` format — but it IS validated: an unknown step type is refused, unknown keys are dropped, and defaults are filled in on read, so this is not byte-identical to what was written. GET /workflows/templates returns working examples and GET /workflows/conditions the rule vocabulary for this shop.
    - `published_definition` object, nullable: What the runtime is actually walking, or null if never published. Differs from `definition` whenever `has_unpublished_changes` is true.
    - `settings` object, required: Exclusions, daily message and invite limits, and timezone — the DRAFT settings, the pair of `definition`. A running workflow uses the settings captured at its last publish, so when `has_unpublished_changes` is true these are not yet the ones governing live outreach. There is no published-settings field to read them from yet (CORE-8947).

## Other responses

- `404`: No such workflow in this shop.
- `422`: Validation Error

## Changes

> 76 revisions in range; 1 not diffed.

- **2026-10-20** `9353ed4982e8`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/reacherapp/apis/reacher-data-api/changes/workflows/:workflow_id/get.md)

---

[API](https://skmtc.dev/reacherapp/apis/reacher-data-api.md) - [All operations](https://skmtc.dev/reacherapp/apis/reacher-data-api/llms.txt) - [OpenAPI document](https://skmtc.dev/reacherapp/apis/reacher-data-api/revisions/63ce74b30b5a?raw)
