Blocks

Web request

The web request step: call any HTTP API — templated URL, headers, and body; the decoded response body becomes the next step's payload.

Call any HTTP API. The workhorse Act step: templated URL, headers, and body; the decoded response becomes the next step's payload.

Config

The web request step in the Inspector Method, URL, optional auth connection, headers, body, timeout.

  • Method + URL — the URL is template-rendered: https://api.example.com/users/{{ payload.id }}.
  • Auth — optional. Bind a connection and the right auth header (bearer / basic / api-key) is injected automatically; public endpoints need nothing.
  • Headers / body — both template-rendered. The body is only sent for POST / PUT / PATCH; JSON or plain text.
  • On failure — 2xx routes ok; non-2xx or a transport failure fails the run by default. Set continue to route a {ok: false, error} payload out the error port instead.

Output

The next step's payload is the decoded response body — no wrapper. A GET returning {"fact": "..."}{{ payload.fact }}.

Two special cases:

  • A bare JSON array (or scalar) response is wrapped as {"value": [...]} — payloads are always maps. Loop over payload["value"].
  • Status and headers aren't on the payload; when you need them, they're on the raw output by step id: steps.<id>.output.status.

Patterns

  • Fetch → understand → act — the canonical chain: web request → AI stepsend.
  • Scrape — GET a page → extract HTML.
  • Fan out — fetch a list → loop over payload["value"] → fetch each detail.

Gotchas

  • Never leave a templated URL segment that can render empty…/users/{{ payload.id }} with a missing id produces a malformed path, and many APIs answer those with misleading 403s, not 404s.
  • Reference the field that holds the API's answer, not the value you sent (an FX response's rates.USD, not your amount).