# Validate Workflow Definition

Check a body for Set Workflow Definition without saving anything: it runs the same steps in a transaction that is always rolled back, so it finds every problem the write would, each with its JSON Pointer into the body. Code the configurations bring is checked as the write checks it. The ids in refs and the keys in inputKeys belong to this check, which keeps nothing: the real write gives new ids, so read them from Set Workflow Definition's answer.

`POST https://connect.mindcloud.co/v2/workflows/:workflowId/definition/validate`

Permissions: `workflow:edit`.

## Parameters

### Path

- `workflowId` (string, required): The workflow's id.

### Headers

- `X-Company-Id` (string): Optional. The id of the organization to act in. Leave it out to act in the API key's own organization. A key can also act in its child organizations, and, with "Use this key across all of your organizations" on, in every organization its creator can open in the app. List them with GET /v2/companies. Every response's X-Company-Id header names the organization it acted in. See [Organizations](https://mindcloud.co/docs/api/rest/introduction/organizations).

### Body

- `triggers` (array, required): Every trigger, as you want it.
  Every trigger the draft should have: { id } for one it has, { ref, app, action? } for a new one, each with name, isDisabled and configuration as you want them. A trigger left out is removed.
- `steps` (array, required): Every step, as a tree.
  Every step the draft should have, as a tree in execution order: { id } for one it has, { ref, app, action? } for a new one, each with name, isDisabled and configuration, holding its steps in body (a loop, folder or batch step) or then and else (an If/Else). A step left out is removed with the steps it holds.
- `id` (string): Read-only: Get Workflow Definition answers it, and it is accepted so a read can be sent back, then ignored unless it names another workflow. Change the workflow itself with Update Workflow.
  Read-only: change the workflow itself with Update Workflow.
- `name` (string): Read-only: Get Workflow Definition answers it, and it is accepted so a read can be sent back, then ignored. Change the workflow itself with Update Workflow.
  Read-only: change the workflow itself with Update Workflow.
- `type` (string): Read-only: Get Workflow Definition answers it, and it is accepted so a read can be sent back, then ignored. Change the workflow itself with Update Workflow.
  Read-only: change the workflow itself with Update Workflow.
- `isActive` (boolean): Read-only: Get Workflow Definition answers it, and it is accepted so a read can be sent back, then ignored. Change the workflow itself with Update Workflow.
  Read-only: change the workflow itself with Update Workflow.
- `environmentId` (string): Read-only: Get Workflow Definition answers it, and it is accepted so a read can be sent back, then ignored. Change the workflow itself with Update Workflow.
  Read-only: change the workflow itself with Update Workflow.
- `tags` (array): Read-only: Get Workflow Definition answers it, and it is accepted so a read can be sent back, then ignored. Change the workflow itself with Update Workflow.
  Read-only: change the workflow itself with Update Workflow.
- `version` (string): Read-only: Get Workflow Definition answers it, and it is accepted so a read can be sent back, then ignored. Change the workflow itself with Update Workflow.
  Read-only: change the workflow itself with Update Workflow.
- `publishedVersion` (string): Read-only: Get Workflow Definition answers it, and it is accepted so a read can be sent back, then ignored. Change the workflow itself with Update Workflow.
  Read-only: change the workflow itself with Update Workflow.
- `changesSincePublish` (number): Read-only: Get Workflow Definition answers it, and it is accepted so a read can be sent back, then ignored. Change the workflow itself with Update Workflow.
  Read-only: change the workflow itself with Update Workflow.
- `revision` (string): Read-only: Get Workflow Definition answers it, and it is accepted so a read can be sent back, then ignored. Change the workflow itself with Update Workflow.
  Read-only: change the workflow itself with Update Workflow.

## Example request

```bash
curl --request POST \
  --url 'https://connect.mindcloud.co/v2/workflows/Wq3kZ8pLx2Nb/definition/validate' \
  --header 'Authorization: Bearer $MINDCLOUD_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "triggers": [
    {
      "ref": "hook",
      "app": "webhook"
    }
  ],
  "steps": [
    {
      "ref": "users",
      "app": "slack",
      "action": "list-users"
    }
  ],
  "id": "Wq3kZ8pLx2Nb",
  "name": "Sync new orders",
  "type": "workflow",
  "isActive": true,
  "environmentId": "null",
  "tags": [],
  "version": "draft",
  "publishedVersion": "0.0.3",
  "changesSincePublish": 2,
  "revision": "r_8a01ddd954aa23f1cc6776b32a2acccd"
}'
```

## Response fields

- `valid` (boolean): True when Set Workflow Definition would accept this body as it is now.
- `revision` (string): The revision of the draft it was checked against.
- `issues` (array of objects): Valid: Validate Workflow's check of the draft as it would be written (path points into definition). Not valid: every problem with the body (path points into the body).
  - `severity` (string): error blocks publishing; warning does not.
    Allowed values:
      - `error`
      - `warning`
  - `code` (string): What is wrong, UPPER_SNAKE (SCHEDULE_INCOMPLETE, STEP_NOT_CONFIGURED, MISSING_GRAPH_REFERENCE, ...).
  - `message` (string): What is wrong, for a person.
  - `stepId` (string): The step or trigger it is about. Null for the workflow as a whole.
  - `path` (string): Where that step sits in Get Workflow Definition, as a JSON Pointer (/steps/1/body/0). Null for the workflow as a whole.
- `refs` (object): The id each new step and trigger got in this check, by its ref. These ids are not kept: Set Workflow Definition gives new ones.
- `inputKeys` (array of objects): For each step this check created that a Map step reads: the name its code would read it by, input['<key>'], as in Set Workflow Definition's answer. It ends in the last four characters of the step's id, in capitals, so the key from this check is not the one the real write gives; use Set Workflow Definition's inputKeys.
  - `mapStepId` (string): The Map step.
  - `stepId` (string): The new step it reads.
  - `ref` (string): The new step's ref in the body.
  - `key` (string): The name the Map step's code reads it by: input['<key>'].
- `definition` (object): The definition as Set Workflow Definition would write it, as Get Workflow Definition answers it. Null when not valid.
  - `id` (string): The workflow's id.
  - `name` (string): The workflow's name.
  - `type` (string): workflow, or function for a workflow other workflows call.
  - `isActive` (boolean): Whether the published version runs on its triggers.
  - `environmentId` (string): The environment the workflow runs in. Null for the default environment.
  - `tags` (array): Ids of the tags on the workflow.
  - `version` (string): The version this answer describes: draft, or the saved version label.
  - `publishedVersion` (string): The version that runs. Null when the workflow was never published.
  - `changesSincePublish` (number): How many draft edits are not published yet.
  - `revision` (string): The draft's revision: send it in If-Match on your next change to the draft. The response's ETag header is the same value. Null when reading a saved version, which never changes.
  - `triggers` (array): What starts the workflow. A workflow can have several.
    - `id` (string): The trigger's id.
    - `name` (string): The trigger's display name.
    - `appSlug` (string): What starts the workflow: schedule, webhook, runWorkflow (when another workflow calls it), or the app whose event does.
    - `appVersion` (string): The app version the trigger is pinned to. For a built-in trigger (Schedule, Webhook, When called), the version of the built-in app it was added with, "0" or "0.0.1" (some older ones hold "draft" or null); it does not change what the trigger does.
    - `actionId` (string): The app event the trigger listens for. Null for a built-in trigger.
    - `isDisabled` (boolean): True when the trigger is turned off.
    - `isConfigured` (boolean): Whether the trigger passed the editor's validation. Null when it was never validated.
  - `steps` (array): The steps, top level first, in execution order. A step that holds others carries them in body (a loop, folder or batch step) or then and else (an If/Else).
    - `id` (string): The step's id. Stable across edits; never positional.
    - `number` (number): The number the editor shows for this step, in execution order. Null for a folder, which the editor does not number.
    - `name` (string): The step's display name.
    - `appSlug` (string): The app the step runs, or the built-in step type (iterate, ifElse, map, ...).
    - `appVersion` (string): The app version the step is pinned to. For a built-in step (If, Loop, Map, ...), the version of the built-in app it was added with, "0" or "0.0.1" (some older ones hold "draft" or null); it does not change what the step does.
    - `actionId` (string): The app action the step runs. Null for a built-in step type.
    - `functionId` (string): The function this step calls, for a function call step.
    - `parentStepId` (string): The step this one sits inside (a loop, group, folder or if/else). Null at the top level.
    - `slot` (string): Where the step sits in its parent: steps (the top level), body (a loop, group or folder), then or else (an if/else lane).
      Allowed values:
        - `steps`
        - `body`
        - `then`
        - `else`
    - `depth` (number): How deeply the step is nested. 0 at the top level.
    - `isDisabled` (boolean): True when the step is turned off and runs skip it.
    - `isConfigured` (boolean): Whether the step passed the editor's validation (required values set, connection chosen). Null when it was never validated.
    - `body` (array): Steps nested inside this one, in order. Present when it has any; each has the same keys.
    - `then` (array): Steps nested inside this one, in order. Present when it has any; each has the same keys.
    - `else` (array): Steps nested inside this one, in order. Present when it has any; each has the same keys.
