All nodes/Integrations/HTTP & Web
HTTP Request
Performs an HTTP request (GET/POST/PUT/PATCH/DELETE/HEAD) and returns the response status, headers and body. Supports JSON/text/form bodies, a form with files (multipart) and a whole file as the body, bearer/basic/custom-header auth, and templates in the URL, headers and body. The response can be saved as a file in the workspace files and passed on through the File port.
Type in the graph: http_request
Exec
An error output can be enabled to handle failures on their own path.
Try it
Minimal working scenario
- Execute + Data
- Data
Runs as pasted
When to use it
The general-purpose step to any HTTP API that has no node of its own. When a dedicated node exists — Telegram, amoCRM, Bitrix24, calendar, email — use it: authentication, pagination and error shapes are already handled there. To read a web page as text for a model there is Fetch Webpage; for an MCP server there is MCP Tool.
This node is a graph step, not an agent tool: it has no tool_out port, so a model cannot
call it. To hand an agent an HTTP call of your own, wrap it in a
WF tool.
How it works
The URL, headers, query parameters, body and the auth fields are all rendered as templates,
so {{ inputs.input.id }}, {{ variables.token }} and {{ secret.API_KEY }} work in any of
them.
Headers, Query Parameters and a form body are a JSON object written as text. Invalid
JSON fails the node with a direct message. For GET and HEAD no body is sent, whatever the
field contains.
The node has two outputs: Success carries execution onward, and Service response returns the
response object — status_code, ok, headers, body, text, url, elapsed_ms. text
is always the raw string; body is parsed as JSON only when Parse JSON Response is on and
the server sent a Content-Type containing json, otherwise it holds the same string.
Requests to private networks and loopback are blocked, and every redirect hop is validated again. The response is truncated at Max response size (bytes) (1,000,000 by default, 10,000,000 ceiling). The timeout defaults to 30 seconds with a maximum of 120; a plan may lower both.
Files: download and send
Download a file. Set Response to “Save as file”. The body is not decoded; it is saved
as is to the workspace files — in the conversation’s folder (sessions/<conversation>/out/) or
the run’s (executions/<run>/out/), labelled “Downloaded by a scenario” in the Files tab. A
File port appears: wire it to the files port of Message and the
model receives the image or PDF as an attachment rather than as a string. The name comes from
the File name field, then the Content-Disposition header, then the URL. A file larger than
Max file size (20 MB by default, 50 MB ceiling) fails the step — a PDF cut short would open
nowhere. A 4xx/5xx response is never saved as the file.
Send a file. Body type “Form with files (multipart)” sends multipart/form-data: the text
fields from Body (a JSON object) plus every file on the Files port under the name in
File field name. “File” sends one file as the whole body, with its type as Content-Type.
Wire a downloaded file, an attachment from a message, or the output of
Write XLSX into Files — the writer nodes have the same
File port. Do not set your own Content-Type for multipart: the form boundary is added for
you.
Saved files count toward the plan’s file quota and are kept until deleted in the Files tab.
Common mistakes
- Expecting the response on
Success. The value comes out of theService responseport — wire a data edge from it, or read{{ nodes.<id>.output.body }}. - Forgetting how 4xx/5xx is handled. Fail on 4xx/5xx is on by default, so anything
outside 2xx goes to the
Erroroutput. To inspect the status yourself, turn it off: thenSuccessfires and you decide fromokandstatus_code. - Reading
bodywhen the response was not JSON. A server sending JSON astext/plainleaves you a string to parse. - Mistaking a truncated response for the server’s answer. A large JSON stops parsing once it is cut — raise the byte limit.
Inputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Inputinput | Execute + Dataexecute_data | — | Execution trigger and optional payload available in templates |
Filesfiles | Datadata | file | Files to send: form fields for 'Form with files', the whole body for 'File'. Connect a download, a written spreadsheet or an attachment. shown when body_type = "multipart" or "file" |
Outputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Service responseoutput | Datadata | object | |
Filefile | Datadata | file | shown when response_format = "file" |
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
Custom Header Nameauth_header_name | string | Authorization | Header name for custom_header auth type shown when «Authorization» = Custom header |
Auth Token / Passwordauth_token | string | "" | Bearer token, basic-auth password, or custom-header value secret shown when «Authorization» = Bearer token | Login and password | Custom header |
Authorizationauth_type | string | none | How this request authenticates. The value goes in the field below. Options: |
Basic Usernameauth_username | string | "" | Username for basic auth shown when «Authorization» = Login and password |
Bodybody | string | "" | Request body. For 'json' — JSON string; for 'form' and 'form with files' — JSON object of key/value pairs sent as text fields. supports templates shown when «Body type» = JSON | Plain text | Form | Form with files (multipart) |
Body typebody_type | string | none | What the request carries. 'Form' sends application/x-www-form-urlencoded; 'Form with files' sends multipart/form-data with the files from the Files port; 'File' sends one file from the Files port as the whole body. Options: |
Fail on 4xx/5xxfail_on_status | boolean | true | Route to Error output on non-2xx responses (otherwise always Success with ok=False) |
File field namefile_field | string | file | Form field the files from the Files port are sent under. Several files repeat the same field. shown when «Body type» = Form with files (multipart) |
File namefile_name | string | "" | Name to save the downloaded file under. Empty — taken from the Content-Disposition header, then from the URL. supports templates shown when «Response» = Save as file |
Follow redirectsfollow_redirects | boolean | true | Follow a 3xx redirect to the address the server points at. |
Headersheaders | string | "" | JSON object of request headers, e.g. {"X-Foo": "bar"} supports templates |
Max file size (bytes)max_file_bytes | integer | 20000000 | A larger file fails the step instead of being saved cut short. shown when «Response» = Save as file |
Max response size (bytes)max_response_bytes | integer | 1000000 | Truncate response body if it exceeds this size shown when «Response» = Text |
Methodmethod | string | GET | HTTP method Options: |
Parse JSON Responseparse_json | boolean | true | Decode response body as JSON when Content-Type is application/json shown when «Response» = Text |
Query Parametersquery_params | string | "" | JSON object of URL query parameters, e.g. {"page": 1} supports templates |
Responseresponse_format | string | text | Text: the body is decoded and available as body/text. File: the body is saved to the workspace files as is and handed on through the File port — use it to download a PDF, an image or a spreadsheet. Options: |
Timeout (seconds)timeout_seconds | number | 30 | Request timeout |
URLurl | string | "" | Target URL (http/https). Templates in {{ }} supported. supports templates |
| Advanced | |||
Proxyproxy_url | string | "" | Send this request through a proxy: http://, https://, socks5:// or socks5h:// (credentials may be inline). Empty = direct. The platform's own route is never applied here — this node calls addresses you choose, so the route is yours to choose too. supports templates |
Shared fields
Every node has these three — the platform adds them, not the node author.
expose_error_output— When enabled, show an execution output to connect nodes that run if this step fails.