---
title: "Get a workflow node"
method: GET
path: "/v1/workflows/{workflowId}/nodes/{nodeId}"
tags: ["Workflow nodes"]
---

# Get a workflow node

`GET /v1/workflows/{workflowId}/nodes/{nodeId}`

Retrieve detailed data for a single workflow node.

## Response `200`

Successful.

- union
  - object — Detailed workflow node returned from read operations. The exact fields depend on `typeName`.
    - `id` string, required
    - `workflowId` string, required
    - `typeName` 'SignupTrigger', required
    - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
    - `workflowRevisionId` string, nullable, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation. Will be `null` for workflows without a revision token yet.
  - object — Detailed workflow node returned from read operations. The exact fields depend on `typeName`.
    - `id` string, required
    - `workflowId` string, required
    - `typeName` 'EventTrigger', required
    - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
    - `eventName` string — The name of the event pattern that triggers this node.
    - `eventProperties` WorkflowEventProperty[] — The properties of the event pattern, which can be used in emails.
      - `name` string, required
      - `type` 'string' | 'number' | 'boolean' | 'date', required
    - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
    - `workflowRevisionId` string, nullable, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation. Will be `null` for workflows without a revision token yet.
  - object — Detailed workflow node returned from read operations. The exact fields depend on `typeName`.
    - `id` string, required
    - `workflowId` string, required
    - `typeName` 'ContactPropertyTrigger', required
    - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
    - `contactPropertyQuery` WorkflowContactPropertyQuery, required — Define the contact property change that triggers the workflow. In update requests, `key` must resolve to an existing contact property that is available for Contact Updated triggers. Hidden or unsupported fields, such as `createdAt`, `notes`, and computed contact properties, are rejected.
      - `key` string, required — The camel-cased `key` of the contact property to query. The property must exist for the team and must be available for Contact Updated triggers.
      - `is` WorkflowContactPropertyComparison, required — For Contact Updated triggers, the API validates `operator` against the selected contact property's type and the side of the comparison. The `was` comparison can use any operator supported by the selected property type. The `is` comparison uses the same operators, except number and boolean properties cannot use `empty`. String properties support `any`, `equal`, `not_equal`, `contains`, `not_contains`, `empty`, and `not_empty`. Number properties support `any`, `greater_than`, `less_than`, `numeric_equal`, `numeric_not_equal`, `empty`, and `not_empty`. Boolean properties support `any`, `true`, `false`, `empty`, and `not_empty`. Date properties support `any`, `empty`, `not_empty`, `after`, `before`, and `between`.
        - `value` union, required
          - string
          - number
          - boolean
        - `operator` 'any' | 'contains' | 'not_contains' | 'empty' | 'not_empty' | 'equal' | 'not_equal' | 'greater_than' | 'less_than' | 'true' | 'false' | 'numeric_equal' | 'numeric_not_equal' | 'after' | 'before' | 'between', required — The comparison operator. It must be valid for the selected contact property's type and for the `is` or `was` side of the comparison. Number and boolean properties allow `empty` on `was`, but not on `is`.
      - `was` WorkflowContactPropertyComparison, required — For Contact Updated triggers, the API validates `operator` against the selected contact property's type and the side of the comparison. The `was` comparison can use any operator supported by the selected property type. The `is` comparison uses the same operators, except number and boolean properties cannot use `empty`. String properties support `any`, `equal`, `not_equal`, `contains`, `not_contains`, `empty`, and `not_empty`. Number properties support `any`, `greater_than`, `less_than`, `numeric_equal`, `numeric_not_equal`, `empty`, and `not_empty`. Boolean properties support `any`, `true`, `false`, `empty`, and `not_empty`. Date properties support `any`, `empty`, `not_empty`, `after`, `before`, and `between`.
        - `value` union, required
          - string
          - number
          - boolean
        - `operator` 'any' | 'contains' | 'not_contains' | 'empty' | 'not_empty' | 'equal' | 'not_equal' | 'greater_than' | 'less_than' | 'true' | 'false' | 'numeric_equal' | 'numeric_not_equal' | 'after' | 'before' | 'between', required — The comparison operator. It must be valid for the selected contact property's type and for the `is` or `was` side of the comparison. Number and boolean properties allow `empty` on `was`, but not on `is`.
    - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
    - `workflowRevisionId` string, nullable, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation. Will be `null` for workflows without a revision token yet.
  - object — Detailed workflow node returned from read operations. The exact fields depend on `typeName`.
    - `id` string, required
    - `workflowId` string, required
    - `typeName` 'AddToListTrigger', required
    - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
    - `mailingListId` string, nullable, required — The ID of the mailing list that triggers the workflow.
    - `reEligible` boolean, required — If `true`, the contacts will be able to enter this workflow every time the trigger is matched. If `false`, contacts will only ever enter this workflow once. Matches the "Trigger frequency" option in the UI.
    - `workflowRevisionId` string, nullable, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation. Will be `null` for workflows without a revision token yet.
  - object — Detailed workflow node returned from read operations. The exact fields depend on `typeName`.
    - `id` string, required
    - `workflowId` string, required
    - `typeName` 'BlankTrigger', required
    - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
    - `workflowRevisionId` string, nullable, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation. Will be `null` for workflows without a revision token yet.
  - object — Detailed workflow node returned from read operations. The exact fields depend on `typeName`.
    - `id` string, required
    - `workflowId` string, required
    - `typeName` 'AudienceFilter', required
    - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
    - `audienceFilter` AudienceFilter, nullable — A tree of audience conditions combined with `match`.
      - `match` 'all' | 'any', required
      - `conditions` AudienceFilterCondition[], required
        - union
          - PropertyCondition — Matches contacts by a property value.
            - `type` 'property', required
            - `key` string, required — The contact property name.
            - `operator` 'any' | 'contains' | 'notContains' | 'equals' | 'notEquals' | 'greaterThan' | 'lessThan' | 'isTrue' | 'isFalse' | 'empty' | 'notEmpty' | 'dateEmpty' | 'dateNotEmpty' | 'after' | 'before' | 'between', required
            - `value` union — The comparison value. Omitted for value-less operators (e.g. `isTrue`, `empty`). A `{ from, to }` object for `between`.
              - …
          - OptInCondition — Matches contacts by mailing-list opt-in status.
            - `type` 'optIn', required
            - `status` 'accepted' | 'pending' | 'rejected' | 'null', nullable, required
          - ActivityCondition — Matches contacts by their activity on a campaign or workflow.
            - `type` 'activity', required
            - `action` 'sent' | 'opened' | 'clicked', required
            - `negate` boolean, required
            - `target` 'campaign' | 'workflow' | 'workflowEmail', required
            - `id` string, required — The ID of the campaign, workflow, or workflow email.
    - `audienceSegmentId` string
    - `appliesDownstream` boolean, required — If `true`, the audience filter will apply to all downstream nodes. If `false`, the audience filter will only apply to the current node. Matches the "Filter scope" option in the UI.
    - `workflowRevisionId` string, nullable, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation. Will be `null` for workflows without a revision token yet.
  - object — Detailed workflow node returned from read operations. The exact fields depend on `typeName`.
    - `id` string, required
    - `workflowId` string, required
    - `typeName` 'TimerAction', required
    - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
    - `amount` number, required — The amount of time to wait before triggering the next node. Set to `0` to move to the next node immediately.
    - `unit` 'm' | 'h' | 'd', required — The unit of time for the timer action node. m = minutes, h = hours, d = days.
    - `workflowRevisionId` string, nullable, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation. Will be `null` for workflows without a revision token yet.
  - object — Detailed workflow node returned from read operations. The exact fields depend on `typeName`.
    - `id` string, required
    - `workflowId` string, required
    - `typeName` 'SendEmailAction', required
    - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
    - `emailMessageId` string, required — The ID of the email message to send. To edit this email, use the `POST /v1/email-messages/{emailMessageId}` endpoint.
    - `subject` string, required
    - `workflowRevisionId` string, nullable, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation. Will be `null` for workflows without a revision token yet.
  - object — Detailed workflow node returned from read operations. The exact fields depend on `typeName`.
    - `id` string, required
    - `workflowId` string, required
    - `typeName` 'ExitAction', required
    - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
    - `workflowRevisionId` string, nullable, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation. Will be `null` for workflows without a revision token yet.
  - object — Detailed workflow node returned from read operations. The exact fields depend on `typeName`.
    - `id` string, required
    - `workflowId` string, required
    - `typeName` 'BranchNode', required
    - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
    - `workflowRevisionId` string, nullable, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation. Will be `null` for workflows without a revision token yet.
  - object — Detailed workflow node returned from read operations. The exact fields depend on `typeName`.
    - `id` string, required
    - `workflowId` string, required
    - `typeName` 'ExperimentBranchNode', required
    - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
    - `samplingRate` number, required — The percentage of contacts that will be sent to variant branches, between `0` and `100`. The remaining percentage will be sent to the control branch. `100` sends all contacts to variant branches.
    - `workflowRevisionId` string, nullable, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation. Will be `null` for workflows without a revision token yet.
  - object — Detailed workflow node returned from read operations. The exact fields depend on `typeName`.
    - `id` string, required
    - `workflowId` string, required
    - `typeName` 'VariantNode', required
    - `nextNodeIds` string[], required — The IDs of the nodes that are downstream of this node.
    - `isControl` boolean — Whether this is the control variant of an experiment.
    - `workflowRevisionId` string, nullable, required — The current workflow revision token. Pass the latest value as `expectedRevisionId` on the next workflow mutation. Will be `null` for workflows without a revision token yet.

## Other responses

- `400` — Invalid `workflowId` or `nodeId`.
- `401` — Invalid API key.
- `404` — Workflow or workflow node not found.
- `405` — Wrong HTTP request method.

---

[API](https://skmtc.net/loops/apis/loops-openapi-spec.md) · [All operations](https://skmtc.net/loops/apis/loops-openapi-spec/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/loops/loops-openapi-spec/revisions/9cc087257f0d/schema)
