Call Remote URL
An HTTP Request Node That Doesn't Want Your API Key
- passthrough
- PASSTHROUGH
- STATUS_CODE
- RESPONSE_BODY
The name is refreshingly honest: this node calls a remote URL. No model, no client, no "it also improves your seed." You give it a URL and an HTTP method, it makes a request from the machine running ComfyUI, and it hands you back the status code and the body. That's the whole feature, and it's exactly what a surprising number of workflows quietly need.
What do you do with a generic HTTP call inside a Comfy graph? Plenty:
- Ping a webhook when a generation finishes - your own automation server, a Discord bot, a home-automation endpoint.
- Trigger an external service mid-workflow: start a job on a local service, hit a control endpoint on your server.
- Fetch a status or a value from an API and feed it into the JSON nodes in this same pack.
Note what it is not: this is not an API-wrapper node that holds a credential and calls a model provider. It stores no key, and there's no built-in "call GPT" behavior. You can paste a header into the headers widget if a service needs auth, but the node doesn't manage or remember anything for you. That's a genuine plus in an ecosystem where a "handy network node" is exactly the shape a malicious phone-home takes - a plain HTTP client you can read is about as low-risk as network nodes get.
The inputs that matter
url- the target. Plain string.method- dropdown with GET, POST, PUT, DELETE, HEAD, PATCH.passthrough- any type, echoed to thePASSTHROUGHoutput. Its real job is execution ordering: connect whatever you want to run first here, and this node is guaranteed to execute after it.body(optional) - request body, e.g. the JSON payload for a POST.headers(optional) - a JSON string of headers, default{}.
Three outputs: PASSTHROUGH (your value back), STATUS_CODE (INT), and RESPONSE_BODY (STRING). Wire RESPONSE_BODY into Map JSON To Property (same pack) and you've got a cheap little API client without leaving the canvas.
Gotchas, from reading the source
The call runs server-side over Python's requests library - so it happens on the machine hosting ComfyUI, with that machine's network access. If a request throws (bad URL, refused connection, timeout), the node doesn't crash the graph; it returns status 500 and puts an error string in the response body. That's graceful but easy to misread - a 500 doesn't necessarily mean the server returned 500, it can mean the request itself failed. Check RESPONSE_BODY before assuming the endpoint is angry at you.
There's no timeout widget, so an endpoint that hangs will hang the node. If you're calling flaky services, pair it with Wait For Milliseconds or keep your targets fast and local.
Install
Part of comfyui-sg-nodes by sebagallo. ComfyUI Manager → search comfyui-sg-nodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/sebagallo/comfyui-sg-nodes
Restart ComfyUI; it appears under SGNodes/Network. No model downloads, and the only runtime dependency (requests) comes with ComfyUI already.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| url | STRING | Target URL string | |
| method | COMBO | HTTP method (GET, POST, etc.) | |
| passthrough | COMFY_MATCHTYPE_V3 | Any type, passed through to output. Useful for execution ordering. | |
| bodyopt | STRING | Request body string | |
| headersopt | STRING | {} | JSON string of request headers |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| PASSTHROUGH | COMFY_MATCHTYPE_V3 | — |
| STATUS_CODE | INT | — |
| RESPONSE_BODY | STRING | — |