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

# Node Types

> Reference for every Voice Workflow node — conversation, collector, condition, set variable, API request, transfer, end call, and global nodes.

# Node Types

Every Voice Workflow is built from **nodes**. Each node is one *phase* of the
call. At any moment only the **current** node's prompt and tools are active, which
is what keeps the agent on-script as the conversation moves from greet → branch →
collect → end.

Nodes fall into two families, plus a single terminal node:

<CardGroup cols={2}>
  <Card title="Conversational nodes" icon="comments">
    They **own a caller turn** — the agent speaks, the caller replies, and the
    [Director](/docs/voice/workflows/transitions) extracts variables from what was
    said. **Conversation** and **Collector** nodes are conversational.
  </Card>

  <Card title="Internal nodes" icon="bolt">
    They **run instantly** with no caller turn. The flow passes straight through
    them to the next conversational node. **Condition**, **Set Variable**, **API
    Request**, **Knowledge**, **Tool**, and **Transfer** are internal.
  </Card>
</CardGroup>

A workflow always ends at a **Terminal** node — **End Call**.

In the [builder](/docs/voice/workflows/builder) the palette on the left groups
nodes exactly this way: **Conversational**, **Internal**, and **Terminal**.

## All node types

| Node         | Family         | What it does                                                                                                      |
| ------------ | -------------- | ----------------------------------------------------------------------------------------------------------------- |
| Conversation | Conversational | Speaks using a per-node prompt layered over the Global Prompt; can extract and require variables this phase.      |
| Collector    | Conversational | A prebuilt, transcription-hardened collector for one common value (email, phone, name, address, or DTMF).         |
| Condition    | Internal       | Branches by its outgoing **edge** conditions — no caller turn, no spoken output.                                  |
| Set Variable | Internal       | Sets a variable from a template string with `{{variable}}` interpolation.                                         |
| API Request  | Internal       | Calls an external API (the unified API & Webhook tool) and maps response fields into variables.                   |
| Knowledge    | Internal       | Looks up a grounded answer from the agent's knowledge base and branches on whether it was found.                  |
| Tool         | Internal       | Runs one built-in integration (messaging, calendar, CRM…) and maps the result into variables.                     |
| Transfer     | Internal       | Bridges the live call to a human or phone number.                                                                 |
| End Call     | Terminal       | Ends the call with an optional closing message and records an outcome label.                                      |
| Global       | Conversational | A Conversation node marked **Global** that any interruptible node can jump to, handle the situation, then return. |

<Note>
  These are **voice** workflow nodes. They are unrelated to the chat
  [Flow Editor](/docs/workflows), which uses Agent / Tool / Team graph nodes.
</Note>

## Conversation

The workhorse node. It speaks to the caller and drives the conversation forward.

| Setting                    | What it controls                                                                                                                                  |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Prompt**                 | A per-node prompt that is layered **over** the shared [Global Prompt](/docs/voice/workflows/transitions). It governs only this phase of the call. |
| **First Message**          | An optional opening line. Only the **opening** node greets the caller — set the First Message on your Start node.                                 |
| **Extract**                | The list of variables to capture from what the caller says during this phase.                                                                     |
| **Require**                | Variables that **must** be captured before the flow may leave this node. The node re-asks until they're filled.                                   |
| **Model / Voice override** | Optionally run this single node on a different model or voice.                                                                                    |
| **Interruptible**          | Whether [Global nodes](#global-nodes) are allowed to interrupt this node.                                                                         |

<Info>
  **Extract** vs. **Require:** *extract* tells the Director which variables to listen
  for this turn; *require* additionally blocks the transition until those variables
  are captured. A variable can be extracted without being required.
</Info>

## Collector

A **Collector** is a prebuilt, transcription-hardened node tuned to reliably
capture one common value over the phone, where spelled-out emails and digit
strings are easy to mishear.

Available collectors:

| Collector | Captures                     |
| --------- | ---------------------------- |
| Email     | An email address.            |
| Phone     | A phone number.              |
| Name      | A caller's name.             |
| Address   | A postal address.            |
| DTMF      | Keypad digits (touch-tones). |

Reach for a Collector instead of a plain Conversation node whenever a phase exists
only to capture one of these values cleanly.

## Condition

An internal node that **routes** without speaking. It has a single output, and the
branching lives entirely on its outgoing **edges** — each edge carries its own
condition.

* **Equation edges** are checked first, deterministically, first-true-wins.
* An **Unconditional** edge acts as the "else".

Because a Condition node takes no caller turn, the flow passes straight through it
to the next conversational node. See
[Transitions, Variables & the Director](/docs/voice/workflows/transitions) for how
edge conditions are written and resolved.

<Note>
  A Condition node branches by **edge conditions**, not by true/false handles. To add
  a branch, draw another edge from its output and give that edge a condition.
</Note>

## Set Variable

An internal node that assigns a variable from a **template string**, with
`{{variable}}` interpolation so you can compose new values from existing ones — for
example setting `{{full_name}}` from `{{first_name}} {{last_name}}`. It runs
instantly and passes through to the next conversational node.

## API Request

An internal node that calls an external service and feeds the result back into the
workflow. It reuses the unified **API & Webhook** tool (`api_connect`), with three
modes — **API Endpoints**, **Webhook**, and **Free-form Request** — and a
**Response → Variable** mapping that lands response fields into workflow variables
so a downstream **Condition** can branch on them.

The chosen endpoint's parameters are filled from workflow variables of the same
name (extract-before-call), and on a failed call the node follows its **error
edge** so the call never hangs.

See [API Request Node](/docs/voice/workflows/api-request) for the full
configuration, including the Configure API modal, auth options, OpenAPI import, and
a worked example.

## Knowledge

An internal node that looks up a **grounded answer** from the agent's
[knowledge base](/docs/knowledge) at this exact step, stores the answer in a
variable, and lets the flow **branch on whether anything was found**. By default it
searches for the caller's latest message, so dropping a Knowledge node right after a
question "just works".

Unlike letting the agent decide on its own (which may answer from memory and get it
wrong), the Knowledge node makes the lookup **guaranteed and on-script** — and a
following Conversation node reads the stored answer back to the caller.

See [Knowledge Node](/docs/voice/workflows/knowledge) for configuration, the
found/not-found branching pattern, and a worked example.

## Tool

An internal node that runs **one built-in integration** — send an SMS, create a
calendar event, look up an order, push to a CRM — at this exact step, and maps the
result into variables. It uses the **same** tools you attach to an agent.

Where the **API Request** node calls *your own* APIs, the **Tool** node runs the
platform's built-in integrations. Like the agent deciding on its own, an agent
*might* call a tool — the Tool node makes the action **guaranteed** at the point you
place it.

See [Tool Node](/docs/voice/workflows/tool) for configuration, input/result
mapping, and a worked example.

## Transfer

An internal node that **bridges the live call** to a human agent or a phone number.
Use it when the caller needs a person, or when the workflow has done its job and the
rest of the call belongs to a human.

## End Call

The **terminal** node. Place it wherever a path through the workflow finishes.

| Setting             | What it controls                                                                               |
| ------------------- | ---------------------------------------------------------------------------------------------- |
| **Closing message** | An optional final line the agent says before hanging up.                                       |
| **Outcome**         | A label recorded for the run (e.g. `booked`, `not_interested`) so you can see how calls ended. |

Use distinct outcome labels on different End Call nodes to make your call results
easy to read after the fact.

## Global nodes

Any **Conversation** node can be marked **Global**. A Global node is not part of the
linear path — instead it has an **enter-condition** (a prompt or an equation) and
becomes reachable from **any interruptible node** the moment its enter-condition
matches.

This is how you handle things that can come up at any point in the call — a caller
raising a pricing objection, asking to speak to a human, or going off-script. When
the enter-condition matches:

1. The flow **jumps** to the Global node, which handles the situation.
2. When it's done, the flow **returns** to the node the caller was on.

A **cooldown** (measured in turns) prevents a Global node from re-triggering
immediately after it returns.

<Note>
  A node only reaches Globals if its **Interruptible** toggle is on. Turn it off on
  nodes where an interruption would be disruptive (for example, mid-way through
  collecting a sensitive value).
</Note>

Global enter-conditions are written and evaluated like any other condition — see
[Transitions, Variables & the Director](/docs/voice/workflows/transitions) for the
resolution order (equation edges, then prompt edges, then global enter-conditions).

<Tip>
  Keep each Conversation node focused: **one phase = one job**. A node that only
  greets, or only confirms the appointment date, gives the Director a small, clear set
  of variables to extract and edges to choose from — which makes routing more
  accurate and the call faster.
</Tip>

## Next steps

<CardGroup cols={2}>
  <Card title="Transitions, Variables & the Director" icon="right-left" href="/docs/voice/workflows/transitions">
    How edges, conditions, variables, and the Director move the call between nodes.
  </Card>

  <Card title="API Request Node" icon="plug" href="/docs/voice/workflows/api-request">
    Configure outbound API calls and map responses into variables.
  </Card>

  <Card title="The Workflow Builder" icon="diagram-project" href="/docs/voice/workflows/builder">
    Add, connect, and arrange nodes on the canvas.
  </Card>

  <Card title="Workflow Templates" icon="table-list" href="/docs/voice/workflows/templates">
    Start from Lead Qualification, Appointment Booking, or Support Triage.
  </Card>
</CardGroup>
