> ## Documentation Index
> Fetch the complete documentation index at: https://loops.so/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Get workflow node details

> Retrieve full configuration and settings for a single workflow node, including trigger, action, delay, branch, and filter properties.

<Warning>
  Workflow API endpoints are currently in alpha and are subject to change.
</Warning>

## Request

### Path parameters

<ParamField path="id" type="string" required>
  The ID of the workflow.
</ParamField>

<ParamField path="nodeId" type="string" required>
  The ID of the workflow node.
</ParamField>

## Response

### Success

The response body is a workflow node. The shape depends on `typeName`.

<Expandable title="SignupTrigger" defaultOpen={false}>
  <ResponseField name="id" type="string" required>
    The node ID.
  </ResponseField>

  <ResponseField name="workflowId" type="string" required>
    The workflow ID.
  </ResponseField>

  <ResponseField name="typeName" type="string" required>
    `SignupTrigger`
  </ResponseField>

  <ResponseField name="nextNodeIds" type="array" required>
    IDs of the nodes that follow this node in the workflow.
  </ResponseField>
</Expandable>

<Expandable title="EventTrigger" defaultOpen={false}>
  <ResponseField name="id" type="string" required>
    The node ID.
  </ResponseField>

  <ResponseField name="workflowId" type="string" required>
    The workflow ID.
  </ResponseField>

  <ResponseField name="typeName" type="string" required>
    `EventTrigger`
  </ResponseField>

  <ResponseField name="nextNodeIds" type="array" required>
    IDs of the nodes that follow this node in the workflow.
  </ResponseField>

  <ResponseField name="eventName" type="nullable string">
    The event name that starts the workflow.
  </ResponseField>

  <ResponseField name="eventProperties" type="array">
    Event properties referenced by the trigger.

    <Expandable title="event property" defaultOpen={false}>
      <ResponseField name="name" type="string" required />

      <ResponseField name="type" type="string" required>
        One of `string`, `number`, `boolean`, or `date`.
      </ResponseField>
    </Expandable>
  </ResponseField>

  <ResponseField name="reEligible" type="boolean" required>
    Whether contacts can re-enter the workflow (matches the [Trigger frequency](/workflows/triggers#trigger-frequency) setting in the app).
  </ResponseField>
</Expandable>

<Expandable title="ContactPropertyTrigger" defaultOpen={false}>
  <ResponseField name="id" type="string" required>
    The node ID.
  </ResponseField>

  <ResponseField name="workflowId" type="string" required>
    The workflow ID.
  </ResponseField>

  <ResponseField name="typeName" type="string" required>
    `ContactPropertyTrigger`
  </ResponseField>

  <ResponseField name="nextNodeIds" type="array" required>
    IDs of the nodes that follow this node in the workflow.
  </ResponseField>

  <ResponseField name="contactPropertyQuery" type="nullable object" required>
    The contact property condition, or `null`.

    <Expandable title="contactPropertyQuery" defaultOpen={false}>
      <ResponseField name="key" type="string" required />

      <ResponseField name="is" type="object" required>
        The contact property's current value comparison.

        <Expandable title="comparison" defaultOpen={false}>
          <ResponseField name="value" type="string | number | boolean" required />

          <ResponseField name="operator" type="string" required>
            One of `any`, `contains`, `not_contains`, `empty`, `not_empty`, `equal`, `not_equal`, `greater_than`, `less_than`, `true`, `false`, `numeric_equal`, `numeric_not_equal`, `date_empty`, `date_not_empty`, `after`, `before`, `between`, `campaign`, `any_loop_email`, `specific_loop_email`, `accepted_opt_in`, `rejected_opt_in`, `pending_opt_in`, or `not_opt_in`.
          </ResponseField>
        </Expandable>
      </ResponseField>

      <ResponseField name="was" type="object" required>
        The contact property's previous value comparison. Uses the same shape as `is`.
      </ResponseField>
    </Expandable>
  </ResponseField>

  <ResponseField name="reEligible" type="boolean" required>
    Whether contacts can re-enter the workflow. Matches the [Trigger frequency](/workflows/triggers#trigger-frequency) setting in the app.
  </ResponseField>
</Expandable>

<Expandable title="AddToListTrigger" defaultOpen={false}>
  <ResponseField name="id" type="string" required>
    The node ID.
  </ResponseField>

  <ResponseField name="workflowId" type="string" required>
    The workflow ID.
  </ResponseField>

  <ResponseField name="typeName" type="string" required>
    `AddToListTrigger`
  </ResponseField>

  <ResponseField name="nextNodeIds" type="array" required>
    IDs of the nodes that follow this node in the workflow.
  </ResponseField>

  <ResponseField name="reEligible" type="boolean" required>
    Whether contacts can re-enter the workflow. Matches the [Trigger frequency](/workflows/triggers#trigger-frequency) setting in the app.
  </ResponseField>
</Expandable>

<Expandable title="BlankTrigger" defaultOpen={false}>
  <ResponseField name="id" type="string" required>
    The node ID.
  </ResponseField>

  <ResponseField name="workflowId" type="string" required>
    The workflow ID.
  </ResponseField>

  <ResponseField name="typeName" type="string" required>
    `BlankTrigger`
  </ResponseField>

  <ResponseField name="nextNodeIds" type="array" required>
    IDs of the nodes that follow this node in the workflow.
  </ResponseField>
</Expandable>

<Expandable title="AudienceFilter" defaultOpen={false}>
  <ResponseField name="id" type="string" required>
    The node ID.
  </ResponseField>

  <ResponseField name="workflowId" type="string" required>
    The workflow ID.
  </ResponseField>

  <ResponseField name="typeName" type="string" required>
    `AudienceFilter`
  </ResponseField>

  <ResponseField name="nextNodeIds" type="array" required>
    IDs of the nodes that follow this node in the workflow.
  </ResponseField>

  <ResponseField name="audienceFilter" type="object">
    The audience filter configuration.

    <Expandable title="audienceFilter" defaultOpen={false}>
      <ResponseField name="match" type="string" required>
        How conditions are combined. One of `all` or `any`.
      </ResponseField>

      <ResponseField name="conditions" type="array" required>
        Audience filter conditions.
      </ResponseField>
    </Expandable>
  </ResponseField>

  <ResponseField name="audienceSegmentId" type="string">
    The audience segment ID when one is selected.
  </ResponseField>
</Expandable>

<Expandable title="TimerAction" defaultOpen={false}>
  <ResponseField name="id" type="string" required>
    The node ID.
  </ResponseField>

  <ResponseField name="workflowId" type="string" required>
    The workflow ID.
  </ResponseField>

  <ResponseField name="typeName" type="string" required>
    `TimerAction`
  </ResponseField>

  <ResponseField name="nextNodeIds" type="array" required>
    IDs of the nodes that follow this node in the workflow.
  </ResponseField>

  <ResponseField name="amount" type="number" required>
    The wait duration.
  </ResponseField>

  <ResponseField name="unit" type="string" required>
    The wait unit. One of `m`, `h`, `d`, or `s`.
  </ResponseField>
</Expandable>

<Expandable title="SendEmailAction" defaultOpen={false}>
  <ResponseField name="id" type="string" required>
    The node ID.
  </ResponseField>

  <ResponseField name="workflowId" type="string" required>
    The workflow ID.
  </ResponseField>

  <ResponseField name="typeName" type="string" required>
    `SendEmailAction`
  </ResponseField>

  <ResponseField name="nextNodeIds" type="array" required>
    IDs of the nodes that follow this node in the workflow.
  </ResponseField>

  <ResponseField name="emailMessageId" type="string">
    The ID of the email message sent by this node. Pass this to [Get email
    message](/api-reference/get-email-message) and [Update email
    message](/api-reference/update-email-message) to read or edit the email's
    content (subject, LMX body, sender, and more).
  </ResponseField>

  <ResponseField name="subject" type="string">
    The email subject line.
  </ResponseField>
</Expandable>

<Expandable title="ExitAction" defaultOpen={false}>
  <ResponseField name="id" type="string" required>
    The node ID.
  </ResponseField>

  <ResponseField name="workflowId" type="string" required>
    The workflow ID.
  </ResponseField>

  <ResponseField name="typeName" type="string" required>
    `ExitAction`
  </ResponseField>

  <ResponseField name="nextNodeIds" type="array" required>
    IDs of the nodes that follow this node in the workflow.
  </ResponseField>
</Expandable>

<Expandable title="BranchNode" defaultOpen={false}>
  <ResponseField name="id" type="string" required>
    The node ID.
  </ResponseField>

  <ResponseField name="workflowId" type="string" required>
    The workflow ID.
  </ResponseField>

  <ResponseField name="typeName" type="string" required>
    `BranchNode`
  </ResponseField>

  <ResponseField name="nextNodeIds" type="array" required>
    IDs of the nodes that follow this node in the workflow.
  </ResponseField>

  <ResponseField name="evalStrategy" type="string">
    How branch conditions are evaluated.
  </ResponseField>
</Expandable>

<Expandable title="ExperimentBranchNode" defaultOpen={false}>
  <ResponseField name="id" type="string" required>
    The node ID.
  </ResponseField>

  <ResponseField name="workflowId" type="string" required>
    The workflow ID.
  </ResponseField>

  <ResponseField name="typeName" type="string" required>
    `ExperimentBranchNode`
  </ResponseField>

  <ResponseField name="nextNodeIds" type="array" required>
    IDs of the nodes that follow this node in the workflow.
  </ResponseField>

  <ResponseField name="samplingRate" type="number" required>
    The percentage of contacts included in the experiment.
  </ResponseField>

  <ResponseField name="url" type="string">
    The webhook URL for webhook experiments.
  </ResponseField>

  <ResponseField name="experimentId" type="string">
    The experiment ID.
  </ResponseField>

  <ResponseField name="experimentType" type="string" required>
    Either `webhook` or `autosplit`.
  </ResponseField>
</Expandable>

<Expandable title="VariantNode" defaultOpen={false}>
  <ResponseField name="id" type="string" required>
    The node ID.
  </ResponseField>

  <ResponseField name="workflowId" type="string" required>
    The workflow ID.
  </ResponseField>

  <ResponseField name="typeName" type="string" required>
    `VariantNode`
  </ResponseField>

  <ResponseField name="nextNodeIds" type="array" required>
    IDs of the nodes that follow this node in the workflow.
  </ResponseField>

  <ResponseField name="variantId" type="string">
    The variant ID.
  </ResponseField>

  <ResponseField name="isControl" type="boolean">
    Whether this variant is the control.
  </ResponseField>
</Expandable>

### Error

A `400 Bad Request` is returned if `id` or `nodeId` is invalid.

A `404 Not Found` is returned if the workflow or node does not exist.

If the API key is invalid (or workflow API is not enabled for your team), a
`401 Unauthorized` is returned.

<ResponseField name="message" type="string" required>
  An error message describing what went wrong.
</ResponseField>

<ResponseExample>
  ```json SignupTrigger theme={"dark"}
  {
    "id": "node_signup_01",
    "workflowId": "wfl8n3q1w7x2m9k4p6r0t5y8zab2cd",
    "typeName": "SignupTrigger",
    "nextNodeIds": ["node_timer_01"]
  }
  ```

  ```json EventTrigger theme={"dark"}
  {
    "id": "node_event_01",
    "workflowId": "wfl8n3q1w7x2m9k4p6r0t5y8zab2cd",
    "typeName": "EventTrigger",
    "nextNodeIds": ["node_email_01"],
    "eventName": "purchase_completed",
    "eventProperties": [
      { "name": "productId", "type": "string" },
      { "name": "amount", "type": "number" }
    ],
    "reEligible": false
  }
  ```

  ```json ContactPropertyTrigger theme={"dark"}
  {
    "id": "node_property_01",
    "workflowId": "wfl8n3q1w7x2m9k4p6r0t5y8zab2cd",
    "typeName": "ContactPropertyTrigger",
    "nextNodeIds": ["node_email_01"],
    "contactPropertyQuery": {
      "key": "plan",
      "is": {
        "value": "pro",
        "operator": "equal"
      },
      "was": {
        "value": "free",
        "operator": "equal"
      }
    },
    "reEligible": true
  }
  ```

  ```json AddToListTrigger theme={"dark"}
  {
    "id": "node_list_01",
    "workflowId": "wfl8n3q1w7x2m9k4p6r0t5y8zab2cd",
    "typeName": "AddToListTrigger",
    "nextNodeIds": ["node_email_01"],
    "reEligible": false
  }
  ```

  ```json BlankTrigger theme={"dark"}
  {
    "id": "node_blank_01",
    "workflowId": "wfl8n3q1w7x2m9k4p6r0t5y8zab2cd",
    "typeName": "BlankTrigger",
    "nextNodeIds": []
  }
  ```

  ```json AudienceFilter theme={"dark"}
  {
    "id": "node_filter_01",
    "workflowId": "wfl8n3q1w7x2m9k4p6r0t5y8zab2cd",
    "typeName": "AudienceFilter",
    "nextNodeIds": ["node_email_01"],
    "audienceFilter": {
      "match": "all",
      "conditions": [
        {
          "type": "property",
          "key": "plan",
          "operator": "equals",
          "value": "pro"
        }
      ]
    },
    "audienceSegmentId": "seg_01hxyz"
  }
  ```

  ```json TimerAction theme={"dark"}
  {
    "id": "node_timer_01",
    "workflowId": "wfl8n3q1w7x2m9k4p6r0t5y8zab2cd",
    "typeName": "TimerAction",
    "nextNodeIds": ["node_email_01"],
    "amount": 1,
    "unit": "d"
  }
  ```

  ```json SendEmailAction theme={"dark"}
  {
    "id": "node_email_01",
    "workflowId": "wfl8n3q1w7x2m9k4p6r0t5y8zab2cd",
    "typeName": "SendEmailAction",
    "nextNodeIds": ["node_exit_01"],
    "emailMessageId": "cmn5zia4i0017tzli8ric8giv",
    "subject": "Welcome to Loops"
  }
  ```

  ```json ExitAction theme={"dark"}
  {
    "id": "node_exit_01",
    "workflowId": "wfl8n3q1w7x2m9k4p6r0t5y8zab2cd",
    "typeName": "ExitAction",
    "nextNodeIds": []
  }
  ```

  ```json BranchNode theme={"dark"}
  {
    "id": "node_branch_01",
    "workflowId": "wfl8n3q1w7x2m9k4p6r0t5y8zab2cd",
    "typeName": "BranchNode",
    "nextNodeIds": ["node_variant_a", "node_variant_b"],
    "evalStrategy": "first_match"
  }
  ```

  ```json ExperimentBranchNode theme={"dark"}
  {
    "id": "node_experiment_01",
    "workflowId": "wfl8n3q1w7x2m9k4p6r0t5y8zab2cd",
    "typeName": "ExperimentBranchNode",
    "nextNodeIds": ["node_variant_a", "node_variant_b"],
    "samplingRate": 50,
    "url": "https://example.com/webhook",
    "experimentId": "exp_01hxyz",
    "experimentType": "autosplit"
  }
  ```

  ```json VariantNode theme={"dark"}
  {
    "id": "node_variant_a",
    "workflowId": "wfl8n3q1w7x2m9k4p6r0t5y8zab2cd",
    "typeName": "VariantNode",
    "nextNodeIds": ["node_email_01"],
    "variantId": "var_01hxyz",
    "isControl": true
  }
  ```

  ```json Error response theme={"dark"}
  {
    "message": "Workflow node not found."
  }
  ```
</ResponseExample>
