Skip to main content
Pause a workflow and ask one workspace member to choose from a list of options, provide a text response, or approve/reject a gate before the workflow continues. Use this when a workflow can gather or prepare candidate options automatically, but a person needs to make the final selection. For example, an RSS step can fetch new articles, then a Human in the Loop step can ask a teammate which article should be researched next.

Configuration

FieldDescription
Question / approval titleThe main question or title shown to the recipient on the approval page and in the notification. In Approval mode, this is the approval title.
Response modeChoose Choices for a selectable list, Text area for a required typed answer, or Approval for fixed Approve/Reject actions.
Options sourceA variable expression that resolves to an array, such as {{rss_step.output.items}}. Only used in Choices mode.
Label pathOptional relative path used as each option’s visible label, such as title or source.title.
Value pathOptional relative path used as the selected value, such as url or metadata.slug.
Description pathOptional relative path used as supporting text for each option, such as summary or content.excerpt.
RecipientThe workspace member allowed to make the choice when the notification channel is Email.
Notification channelEmail or Telegram.
Telegram destinationThe connected Fetch Hive bot destination used when the notification channel is Telegram.
Link TTLHow long the approval link token remains valid before the recipient must request a fresh link.
Wait timeoutHow long the workflow waits before the step fails or continues according to the failure behavior.
The label, value, and description fields are paths relative to each item in the options array. They only apply in Choices mode. The editor can suggest paths from the first sample item when the options source resolves from existing step output or start-input examples. Nested same-name fields can be disambiguated with full paths, such as source.title and author.title. Duplicate keys in the same JSON object cannot be distinguished after JSON parsing.

Output

The step always returns the same top-level object so later steps can be wired before the workflow runs. Choices mode returns the selected option:
{
  "response_type": "choice",
  "choice": {
    "id": "option_1",
    "label": "Example article",
    "value": "https://example.com/article",
    "description": "Short summary",
    "raw": {}
  },
  "text": "",
  "files": [],
  "metadata": {}
}
Before a run completes, downstream steps can still be wired against the same empty shape:
{
  "text": "",
  "files": [],
  "choice": {
    "id": "",
    "label": "",
    "value": "",
    "description": "",
    "raw": {}
  },
  "metadata": {},
  "response_type": "choice"
}
Text mode returns the typed answer:
{
  "text": "Submitted answer",
  "files": [],
  "choice": {
    "id": "",
    "label": "",
    "value": "",
    "description": "",
    "raw": {}
  },
  "metadata": {},
  "response_type": "text"
}
Approval mode returns the selected decision. Approve lets the workflow continue:
{
  "text": "",
  "files": [],
  "choice": {
    "id": "approved",
    "label": "Approved",
    "value": "approved",
    "description": "",
    "raw": { "approved": true }
  },
  "metadata": {
    "approved": true,
    "rejected": false
  },
  "response_type": "approval"
}
Reject intentionally stops the workflow and marks the run as completed:
{
  "text": "",
  "files": [],
  "choice": {
    "id": "rejected",
    "label": "Rejected",
    "value": "rejected",
    "description": "",
    "raw": { "approved": false }
  },
  "metadata": {
    "approved": false,
    "rejected": true
  },
  "response_type": "approval"
}
Downstream steps reference the actual step identifier shown in the workflow builder. For example, if this step is step_5, use:
VariableUse
{{step_5.output.text}}The submitted text answer in Text area mode. Empty in Choices mode.
{{step_5.output.choice.value}}The selected option value in Choices mode.
{{step_5.output.choice.label}}The selected option label in Choices mode.
{{step_5.output.choice.description}}The selected option description in Choices mode.
{{step_5.output.choice.raw.url}}A field from the original selected option object, when that field exists.
{{step_5.output.metadata.approved}}true when Approval mode was approved.
{{step_5.output.metadata.rejected}}true when Approval mode was rejected.
{{step_5.output.response_type}}choice, text, or approval, depending on how the recipient responded.

Runtime

The workflow is paused while waiting for the recipient. Fetch Hive sends a short-lived approval link by the configured notification channel. Email mode sends to the selected recipient. Telegram mode sends to the selected Telegram destination. If the link expires, the recipient can request a fresh link from the approval page. Only the configured recipient can view and submit the choice, and they must still belong to the workflow workspace. In Approval mode, Approve resumes the workflow normally. Reject is treated as an intentional stop: Fetch Hive records the rejected output, skips remaining workflow steps, and marks the workflow run as completed rather than failed.

API Behavior

Deployed workflows that contain Human in the Loop must run asynchronously with a callback URL. Synchronous API invocation returns a validation error because the workflow cannot finish until the human response is submitted.

Cost

Human in the Loop uses a fixed workflow-step credit charge and does not call an LLM by itself.

Notes

  • Human in the Loop does not support step-level parallelization.
  • Human in the Loop cannot be placed inside an iteration body in the current version.
  • If the wait timeout expires, the step follows its configured failure behavior: terminate or continue.
  • A timeout is not the same as Reject. Timeouts follow the failure behavior; Reject completes the run intentionally.