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

# Nodes: Input, Review, Approve, Deny, Output

> The nodes every flow starts and ends with, and the Review node that hands a case to an analyst.

export const Shot = ({id, alt, caption}) => <Frame caption={caption}>
    <img className="block dark:hidden rounded-lg" src={`/images/guides/${id}.light.png`} alt={alt} loading="lazy" decoding="async" />
    <img className="hidden dark:block rounded-lg" src={`/images/guides/${id}.dark.png`} alt={alt} loading="lazy" decoding="async" />
  </Frame>;

Every node panel starts with **Label** and **Description**. The label is what analysts and the timeline show; write it for them.

## Input / Trigger

The entry point. **Input Schema** lists the fields the submitted payload must carry: name, type, required, nullable and an optional description. Payloads that do not match are rejected at submission with a 400. Fields are available downstream as `input.<name>`.

<Shot id="engineer/node-01-input" alt="Input node panel" caption="Schema of the payload the flow expects." />

## Review (waits for an analyst)

Parks the case in a review queue and pauses until an analyst acts or the timeout elapses.

* **Queue** — one of the queues in **Settings → Queues**.
* **Timeout (hours)** — after this the **timeout** outcome fires.
* **Risk score** — a number or an expression (for example `vars.risk_pct`) shown to the analyst as the case's score.
* **Custom actions** — extra outcomes analysts see under **Workflow actions**, for example **Escalate to senior**. Each becomes an outgoing handle.

Every handle (**approve**, **deny**, **timeout** and each custom action) must be wired to a node that reaches a terminal, or activation is refused.

<Shot id="engineer/node-02-review" alt="Review node panel" caption="Queue, timeout, risk score and custom actions." />

## Approve (ends the flow)

Emits an approved decision. **Risk score** is optional and recorded with the decision.

<Shot id="engineer/node-03-approve" alt="Approve node panel" caption="Approve." />

## Deny (ends the flow)

Emits a declined decision. **Decline reason** is recorded with the decision and can interpolate values, for example `Risk score ${vars.risk_pct} exceeded threshold`.

<Shot id="engineer/node-04-deny" alt="Deny node panel" caption="Deny with an interpolated reason." />

## Output (ends a callable workflow)

Only in flows marked **Callable as subflow**. **Output fields** map names to expressions; the parent's Subflow node receives them. A callable flow emits no decision.

<Shot id="engineer/node-05-output" alt="Output node panel" caption="What the child returns to the parent." />
