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

# Graph Node Types

> Reference for all node types in the agent editor

Nodes are the building blocks of the [Agent Editor](/configure/agent-editor) graph. There are two main categories: **Convo** (conversation flow, what the agent says and does during a call) and **Logic flow** (branching, data, integrations, and internal steps). Function nodes are composable in both; flow branching nodes (Condition, Categorize, Merge, Flow) exist only in logic flows.

<div style={{ textAlign: "left" }}>
  <Tabs>
    <Tab title="Convo">
      <div>
        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/first-message.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=7de4bc78a200afcf48cd0e17b9147187" width="32" height="32" alt="First Message" data-path="images/configure/nodes/first-message.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>First Message</strong></div>
          <div>What the agent says first when the call starts.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/conversation.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=91640e0542283d56ed976391c21b7c5d" width="32" height="32" alt="Conversation" data-path="images/configure/nodes/conversation.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Conversation</strong></div>
          <div>A step in the conversation; add a title to describe what it covers.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/extract-info.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=2db6792cbf7733b271d92c3bf06187c4" width="32" height="32" alt="Extract Info" data-path="images/configure/nodes/extract-info.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Extract Info</strong></div>
          <div>Captures information from the call and saves it to a variable you name.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/end.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=e20c6f6076ca1237708a1ef1d62d4963" width="32" height="32" alt="End" data-path="images/configure/nodes/end.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>End</strong></div>
          <div>Ends the call.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/transfer-call.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=e58f93525a2ea5639fe0ff9e03d6b25c" width="32" height="32" alt="Transfer Call" data-path="images/configure/nodes/transfer-call.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Transfer Call</strong></div>
          <div>Transfers the call to another number.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/pbx-transfer-call.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=66e2a6f9bc195ca5a676c24914ebb566" width="32" height="32" alt="PBX Transfer Call" data-path="images/configure/nodes/pbx-transfer-call.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>PBX Transfer Call</strong></div>
          <div>Transfers the call using your PBX (3CX, Yeastar, Webex, or generic). Configure the number, message, and transfer type.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/function.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=d13fa8789de2bc26023a563518a2115a" width="32" height="32" alt="Function" data-path="images/configure/nodes/function.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Function</strong></div>
          <div>A tool the agent can use during the conversation (e.g. send email, call a webhook, or run an integration).</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/Y4wW7rXuBxhO4n6B/images/configure/nodes/multichannel.svg?fit=max&auto=format&n=Y4wW7rXuBxhO4n6B&q=85&s=043857697cbdb28296e89f32f7ab52ec" width="32" height="32" alt="Multichannel" data-path="images/configure/nodes/multichannel.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Multichannel</strong></div>
          <div>Opens an SMS channel mid-call so the caller can share sensitive information by text rather than voice.</div>
        </div>
      </div>
    </Tab>

    <Tab title="Logic flow">
      <div>
        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/start.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=da54b2271df167d3f2fd2ac86276aa0c" width="32" height="32" alt="Start" data-path="images/configure/nodes/start.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Start</strong></div>
          <div>Where the flow begins.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/condition.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=7158940948eb51398ea6b07dce711417" width="32" height="32" alt="Condition" data-path="images/configure/nodes/condition.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Condition</strong></div>
          <div>Branches the flow based on a condition; choose <strong>If</strong> or <strong>Else</strong>.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/categorize.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=523ff824c2bb972156b1df9ccb27ec17" width="32" height="32" alt="Categorize" data-path="images/configure/nodes/categorize.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Categorize</strong></div>
          <div>Routes the flow to one of several paths based on a question and possible answers (e.g. AI chooses a category).</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/merge.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=49d2941c84d44d571b51725778da9b97" width="32" height="32" alt="Merge" data-path="images/configure/nodes/merge.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Merge</strong></div>
          <div>Brings multiple branches back into a single path.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/flow.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=f3a5a819868c365bcbc7824e245dddbc" width="32" height="32" alt="Flow" data-path="images/configure/nodes/flow.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Flow</strong></div>
          <div>Runs another flow; you can pass variables into it.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/variable.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=50016e56e68579ed3cf6f9d718bb8404" width="32" height="32" alt="Variable" data-path="images/configure/nodes/variable.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Variable</strong></div>
          <div>Sets variables (name and value) for use later in the flow.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/transform.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=3cd0a7233a20ae25e0e01f7a6ae5c2fe" width="32" height="32" alt="Transform" data-path="images/configure/nodes/transform.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Transform</strong></div>
          <div>Reshapes or maps data for use in later steps.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/webhook.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=6e1e569ce0620b6422302534f223e263" width="32" height="32" alt="Webhook" data-path="images/configure/nodes/webhook.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Webhook</strong></div>
          <div>Calls an external URL.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/integration.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=b18b34f4101840dd7cbc6238172ed6a8" width="32" height="32" alt="Integration" data-path="images/configure/nodes/integration.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Integration</strong></div>
          <div>Calls a connected integration (e.g. email, CRM).</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/send-message.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=405a1339dadbc756ee4143132d48764d" width="32" height="32" alt="Send Message" data-path="images/configure/nodes/send-message.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Send Message</strong></div>
          <div>Sends a message to one or more recipients.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/V0HRFobytmahDSDu/images/configure/nodes/call-tag.svg?fit=max&auto=format&n=V0HRFobytmahDSDu&q=85&s=9c8ebca98aeeed764cb6e6c9a3e049ee" width="32" height="32" alt="Call Tag" data-path="images/configure/nodes/call-tag.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Call Tag</strong></div>
          <div>Adds tags to the call for reporting or routing later.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0", borderBottom: "1px solid rgba(128,128,128,0.2)" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/Y4wW7rXuBxhO4n6B/images/configure/nodes/multichannel.svg?fit=max&auto=format&n=Y4wW7rXuBxhO4n6B&q=85&s=043857697cbdb28296e89f32f7ab52ec" width="32" height="32" alt="Multichannel" data-path="images/configure/nodes/multichannel.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Multichannel</strong></div>
          <div>Opens an SMS channel mid-call so the caller can share sensitive information by text rather than voice.</div>
        </div>

        <div style={{ display: "flex", alignItems: "center", gap: "16px", padding: "10px 0" }}>
          <div style={{ flexShrink: 0, width: "36px" }}>
            <img style={{ transform: "translateY(50%)" }} src="https://mintcdn.com/devpro-38b0cd42/Y4wW7rXuBxhO4n6B/images/configure/nodes/extract.svg?fit=max&auto=format&n=Y4wW7rXuBxhO4n6B&q=85&s=c3ba4905a529e3166b3f27a291569c8b" width="32" height="32" alt="Extract" data-path="images/configure/nodes/extract.svg" />
          </div>

          <div style={{ flexShrink: 0, width: "160px" }}><strong>Extract</strong></div>
          <div>Uses the LLM to pull typed fields out of the conversation transcript into named variables.</div>
        </div>
      </div>
    </Tab>
  </Tabs>
</div>

<Info>
  **Edges and conditions.** All nodes support an optional **when** field. This is a plain-language condition the agent evaluates before entering the node (e.g. "caller has confirmed their email").
</Info>

***

<div style={{ overflowX: "hidden" }}>
  ## Node reference

  Fields marked with `*` are required.

  ### Conversation flow

  <AccordionGroup>
    <Accordion title="First Message">
      The opening message the agent speaks when a call begins. Every agent has exactly one First Message node.

      | Field            | Type   | Description                             |
      | ---------------- | ------ | --------------------------------------- |
      | `firstMessage`\* | string | Text spoken at the start of every call. |
    </Accordion>

    <Accordion title="Conversation">
      A dialogue step where the agent follows the instructions you provide. Use the description to tell the agent what to cover, ask, or do in this part of the conversation.

      | Field         | Type   | Description                                                   |
      | ------------- | ------ | ------------------------------------------------------------- |
      | `title`       | string | Short label for this step (shown in the graph).               |
      | `description` | string | Instructions for what the agent should discuss or accomplish. |
      | `when`        | string | Entry condition evaluated before the agent enters this node.  |
    </Accordion>

    <Accordion title="Extract Info">
      Asks the caller for a specific piece of information and stores the answer in a named variable. The variable is set **once per call**; if it already has a value, the node will not overwrite it even if the agent revisits it.

      | Field         | Type                              | Description                                          |                                                     |
      | ------------- | --------------------------------- | ---------------------------------------------------- | --------------------------------------------------- |
      | `variable`\*  | string                            | Name of the variable to store the captured value in. |                                                     |
      | `type`        | `string` \| `number` \| `boolean` | No                                                   | Data type of the expected value. Default: `string`. |
      | `title`       | string                            | Short label for this step.                           |                                                     |
      | `description` | string                            | Instructions for what to ask and how to capture it.  |                                                     |
      | `when`        | string                            | Entry condition.                                     |                                                     |
    </Accordion>

    <Accordion title="Transfer Call">
      Transfers the live call to a phone number or another Vatel agent. Configure the transfer type to control how the handoff is handled at the SIP/telephony layer.

      | Field                | Type                                                   | Description                                                                  |                                                                                                        |
      | -------------------- | ------------------------------------------------------ | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
      | `number`             | string                                                 | Single destination number.                                                   |                                                                                                        |
      | `numbers`            | `{label, number}[]`                                    | Multiple transfer destinations with labels (agent chooses based on context). |                                                                                                        |
      | `transferType`       | `bridge` \| `conference` \| `refer` \| `agent_handoff` | No                                                                           | How the transfer is executed. Default: `bridge`.                                                       |
      | `agentId`            | string                                                 | Target Vatel agent ID. Required when `transferType` is `agent_handoff`.      |                                                                                                        |
      | `pbx`                | `3cx` \| `yeastar` \| `webex` \| `generic`             | No                                                                           | PBX system to route through.                                                                           |
      | `message`            | string                                                 | Message spoken before the transfer begins.                                   |                                                                                                        |
      | `handoffMessageType` | `message` \| `prompt`                                  | No                                                                           | `message` plays the literal text; `prompt` lets the agent generate a closing line. Default: `message`. |
      | `when`               | string                                                 | Entry condition.                                                             |                                                                                                        |

      **Transfer types:**

      * **bridge** - Your platform stays in the media path and bridges the two call legs together for the full duration.
      * **conference** - Caller and destination are joined into a conference room; additional participants can be added.
      * **refer** - Issues a SIP REFER so the caller's endpoint dials the destination directly; your platform exits the call.
      * **agent\_handoff** - Hands the call off to another Vatel agent identified by `agentId`.
    </Accordion>

    <Accordion title="End">
      Ends the call with an optional closing message.

      | Field                | Type                  | Description                          |                                                                                                          |
      | -------------------- | --------------------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------- |
      | `message`            | string                | Message spoken before the call ends. |                                                                                                          |
      | `handoffMessageType` | `message` \| `prompt` | No                                   | `message` plays the literal text; `prompt` lets the agent generate the closing line. Default: `message`. |
      | `when`               | string                | Entry condition.                     |                                                                                                          |
    </Accordion>
  </AccordionGroup>

  ### Logic flow

  <AccordionGroup>
    <Accordion title="Start">
      The entry point of every logic flow. Every flow has exactly one Start node and no configuration fields; connect it to the first node you want to run.
    </Accordion>

    <Accordion title="Condition">
      Evaluates a comparison between two values and branches into an **if** path (true) or an **else** path (false).

      | Field         | Type                                  | Description                           |
      | ------------- | ------------------------------------- | ------------------------------------- |
      | `left`\*      | [InputVariable](/configure/variables) | Left operand of the comparison.       |
      | `right`\*     | [InputVariable](/configure/variables) | Right operand of the comparison.      |
      | `operator`\*  | enum                                  | Comparison operator (see below).      |
      | `title`       | string                                | Label shown on the node in the graph. |
      | `description` | string                                | Notes on what this condition checks.  |
      | `when`        | string                                | Entry condition.                      |

      **Operators:** `eq`, `ne`, `gt`, `lt`, `gte`, `lte`, `is_after`, `is_before`, `contains`, `starts_with`, `ends_with`, `is_empty`, `is_not_empty`, `is_null`, `is_not_null`

      The node produces two outgoing edges: **if** (condition is true) and **else** (condition is false).
    </Accordion>

    <Accordion title="Categorize">
      Uses the LLM to classify a value into one of the categories you define, then routes the flow to the matching branch.

      | Field         | Type                     | Description                                                                                          |
      | ------------- | ------------------------ | ---------------------------------------------------------------------------------------------------- |
      | `question`\*  | string                   | The question or instruction given to the model for classification.                                   |
      | `values`\*    | `{value, description}[]` | The possible categories. Each entry needs a `value` (the label) and a `description` (what it means). |
      | `title`       | string                   | Label shown on the node.                                                                             |
      | `description` | string                   | Internal notes.                                                                                      |
      | `when`        | string                   | Entry condition.                                                                                     |

      Each category in `values` produces its own outgoing edge from the node.
    </Accordion>

    <Accordion title="Merge">
      Joins multiple incoming branches back into a single path. No configuration fields. Connect the outputs of Condition or Categorize branches into a Merge node to continue with shared logic.
    </Accordion>

    <Accordion title="Flow">
      Executes another logic flow and passes variables into it. Use this to keep flows modular and reuse logic across multiple agents or flows.

      | Field         | Type                                     | Description                          |
      | ------------- | ---------------------------------------- | ------------------------------------ |
      | `flowId`      | string                                   | ID of the logic flow to run.         |
      | `variables`\* | [InputVariable](/configure/variables)\[] | Variables to pass into the sub-flow. |
      | `title`       | string                                   | Label shown on the node.             |
      | `description` | string                                   | Internal notes.                      |
      | `when`        | string                                   | Entry condition.                     |
    </Accordion>

    <Accordion title="Variable">
      Sets one or more named variables with literal values. Variables set here are available everywhere in the current call, in both logic flows and the conversation flow.

      | Field            | Type             | Description                                     |
      | ---------------- | ---------------- | ----------------------------------------------- |
      | `declarations`\* | `{key, value}[]` | List of variable names and their values to set. |
      | `title`          | string           | Label shown on the node.                        |
      | `description`    | string           | Internal notes.                                 |
      | `when`           | string           | Entry condition.                                |
    </Accordion>

    <Accordion title="Transform">
      Maps input data into a new JSON structure. Use this to reshape a webhook or integration response before passing it to the next node.

      | Field         | Type   | Description                                                                |
      | ------------- | ------ | -------------------------------------------------------------------------- |
      | `output`\*    | object | JSON object defining the output structure. Values can reference variables. |
      | `title`       | string | Label shown on the node.                                                   |
      | `description` | string | Internal notes.                                                            |
      | `when`        | string | Entry condition.                                                           |
    </Accordion>

    <Accordion title="Extract">
      Uses the LLM to pull one or more typed fields out of the conversation transcript into named variables. Unlike Extract Info (which asks the caller a direct question), this node reads what has already been said.

      | Field         | Type                                     | Description                                                                                                                                                    |
      | ------------- | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
      | `variables`\* | [InputVariable](/configure/variables)\[] | Variables to extract. The `description` field on each variable tells the model what to look for; the `name` field is the variable name the value is stored in. |
      | `title`       | string                                   | Label shown on the node.                                                                                                                                       |
      | `description` | string                                   | Internal notes.                                                                                                                                                |
      | `when`        | string                                   | Entry condition.                                                                                                                                               |
    </Accordion>

    <Accordion title="Webhook">
      Makes an HTTP request to an external URL. Can run synchronously (flow waits for response) or asynchronously (agent keeps talking while the request runs in the background).

      | Field             | Type                                     | Description                                                                       |
      | ----------------- | ---------------------------------------- | --------------------------------------------------------------------------------- |
      | `url`\*           | string                                   | Target endpoint URL. Supports path variables (e.g. `/users/{id}`).                |
      | `method`\*        | string                                   | HTTP method: `GET`, `POST`, `PUT`, `DELETE`, `PATCH`.                             |
      | `headers`\*       | [InputVariable](/configure/variables)\[] | Request headers.                                                                  |
      | `queryParams`\*   | [InputVariable](/configure/variables)\[] | URL query parameters.                                                             |
      | `pathVariables`\* | [InputVariable](/configure/variables)\[] | Values for path variable placeholders in the URL.                                 |
      | `body`\*          | [InputVariable](/configure/variables)    | Request body.                                                                     |
      | `async`           | boolean                                  | If `true`, the agent continues speaking while the request runs. Default: `false`. |
      | `asyncMessage`    | string                                   | Message spoken while waiting. Only used when `async` is `true`.                   |
      | `title`           | string                                   | Label shown on the node.                                                          |
      | `description`     | string                                   | Internal notes.                                                                   |
      | `when`            | string                                   | Entry condition.                                                                  |
    </Accordion>

    <Accordion title="Integration">
      Invokes an operation from a connected integration (HubSpot, Stripe, Resend, etc.). Integrations are configured at the organization level under **Settings → Integrations**.

      | Field               | Type                 | Description                                                                                                       |
      | ------------------- | -------------------- | ----------------------------------------------------------------------------------------------------------------- |
      | `integrationName`\* | string               | Name of the connected integration to call.                                                                        |
      | `operationName`\*   | string               | The specific operation within that integration.                                                                   |
      | `variables`\*       | `{name, variable}[]` | Input parameters for the operation. Each entry maps a parameter name to an [InputVariable](/configure/variables). |
      | `async`             | boolean              | If `true`, the agent continues while the integration runs in the background. Default: `false`.                    |
      | `asyncMessage`      | string               | Message spoken while waiting. Only used when `async` is `true`.                                                   |
      | `title`             | string               | Label shown on the node.                                                                                          |
      | `description`       | string               | Internal notes.                                                                                                   |
      | `when`              | string               | Entry condition.                                                                                                  |
    </Accordion>

    <Accordion title="Send Message">
      Sends an SMS to one or more recipients.

      | Field           | Type                                     | Description                                |
      | --------------- | ---------------------------------------- | ------------------------------------------ |
      | `recipients`\*  | [InputVariable](/configure/variables)\[] | Phone numbers to send the message to.      |
      | `body`\*        | [InputVariable](/configure/variables)    | Message content.                           |
      | `phoneNumberId` | string                                   | ID of the Vatel phone number to send from. |
      | `title`         | string                                   | Label shown on the node.                   |
      | `description`   | string                                   | Internal notes.                            |
      | `when`          | string                                   | Entry condition.                           |
    </Accordion>

    <Accordion title="Mailer Message">
      Sends an email via your connected [MailerSend](/integrations/email/mailersend) integration.

      | Field          | Type                                     | Description                                                     |
      | -------------- | ---------------------------------------- | --------------------------------------------------------------- |
      | `sender`\*     | string                                   | Sender email address (must be a verified domain in MailerSend). |
      | `recipients`\* | [InputVariable](/configure/variables)\[] | Recipient email addresses.                                      |
      | `subject`\*    | [InputVariable](/configure/variables)    | Email subject line.                                             |
      | `body`\*       | [InputVariable](/configure/variables)    | Email body content.                                             |
      | `title`        | string                                   | Label shown on the node.                                        |
      | `description`  | string                                   | Internal notes.                                                 |
      | `when`         | string                                   | Entry condition.                                                |
    </Accordion>

    <Accordion title="Clerk Message">
      Sends a message via your connected [Clerk.chat](https://clerk.chat) integration.

      | Field          | Type                                     | Description                                              |
      | -------------- | ---------------------------------------- | -------------------------------------------------------- |
      | `sender`\*     | string                                   | Sender identifier configured in your Clerk.chat account. |
      | `recipients`\* | [InputVariable](/configure/variables)\[] | Message recipients.                                      |
      | `body`\*       | [InputVariable](/configure/variables)    | Message content.                                         |
      | `title`        | string                                   | Label shown on the node.                                 |
      | `description`  | string                                   | Internal notes.                                          |
      | `when`         | string                                   | Entry condition.                                         |
    </Accordion>

    <Accordion title="Multichannel">
      Opens an SMS channel with the caller mid-call so they can exchange information by text rather than voice. Particularly useful for sensitive or precise input like credit card numbers, addresses, or confirmation codes that are difficult to capture reliably over audio.

      | Field           | Type                                  | Description                                         |
      | --------------- | ------------------------------------- | --------------------------------------------------- |
      | `number`\*      | [InputVariable](/configure/variables) | The caller's phone number to send the SMS to.       |
      | `message`\*     | [InputVariable](/configure/variables) | The opening message sent to start the SMS exchange. |
      | `phoneNumberId` | string                                | ID of the Vatel phone number to send from.          |
      | `title`         | string                                | Label shown on the node.                            |
      | `description`   | string                                | Internal notes.                                     |
      | `when`          | string                                | Entry condition.                                    |
    </Accordion>

    <Accordion title="Call Tag">
      Applies one or more tags to the current call. Tags appear in call history and can be used for filtering, reporting, or routing.

      | Field         | Type                                     | Description                |
      | ------------- | ---------------------------------------- | -------------------------- |
      | `tags`\*      | [InputVariable](/configure/variables)\[] | Tags to apply to the call. |
      | `title`       | string                                   | Label shown on the node.   |
      | `description` | string                                   | Internal notes.            |
      | `when`        | string                                   | Entry condition.           |
    </Accordion>
  </AccordionGroup>
</div>
