HTTP Request (WebAPI)
The node that's just HTTP — no key, no AI, surprisingly handy
- response_json
- response_text
- status_code
- response_headers
The name says "WebAPI" but the truth is simpler and honestly more useful: this node just makes an HTTP request. No model, no AI, no API key required by default - it sends a GET, POST, PUT, or DELETE to a URL and hands you back whatever came back. It's a plain web client inside your graph, and that's exactly the kind of plumbing that unlocks a surprising number of workflows: fetch a JSON config from a server, hit a status endpoint, submit a job to an external API, ping a webhook you control.
The inputs are a REST client's honest basics: url, method (GET/POST/PUT/DELETE), headers and body as JSON text widgets (parsed as JSON if valid, ignored if not), and an optional timeout (default 10s). Outputs are response_json (parsed if the server sent JSON), response_text (the raw string - your fallback when it isn't JSON), status_code, and response_headers.
The design detail that makes it workflow-safe: it catches exceptions internally. A refused connection, a timeout, a malformed response - instead of crashing your queue, it returns status_code = 0 with the error message in response_text. That's a deliberate choice, and it means you can wire status_code into a conditional gate downstream and branch on success vs. failure like any other logic. Not every request node does this; it's the reason this one is actually usable in a loop.
Where it shines is composing with the rest of the pack's Web API corner. HTTP Request to submit a job → Endpoint Poller to wait on it → JSON Field Extractor to pull the result out → Response Saver to write it to disk. That's a complete async-job client built from four nodes, no code. The default url is https://httpbin.org/get, which is a free echo endpoint - fine for a first test, but you'll replace it with something real immediately.
Two things to keep in view. First, the dependency: this node needs requests, which ComfyUI does not ship by default. The pack's requirements.txt declares it; install with pip install -r requirements.txt from the OmniNodes folder (or pip install requests into ComfyUI's Python). If it's missing, the node errors cleanly rather than crashing. Second, the security posture - this is a node that holds whatever you put in headers (tokens, API keys) and makes outbound calls by design. That's precisely the shape of node that has been abused in this ecosystem before. Keep secrets out of workflows you share, prefer HTTPS, and if a Web API node is too convenient - paste a key, it just works - be more suspicious, not less.
One more honest note: as an HTTP client it's deliberately minimal. No retries, no redirect handling beyond what requests does by default, no automatic retry backoff. For a serious integration you'd want a real API wrapper pack with retry logic. For "I need to fetch a JSON file or submit a job from inside my graph," this is plenty, and it stays out of your way.
Install
Part of OmniNodes:
cd ComfyUI/custom_nodes
git clone https://github.com/TensorVizion/OmniNodes
cd OmniNodes
pip install -r requirements.txt
Restart ComfyUI, or install "OmniNodes" via ComfyUI Manager and run pip install requests.
Troubleshooting
status_code = 0, error text inresponse_text- the request never completed. Check the URL, your network, and thattimeoutisn't too small.ModuleNotFoundError: requests- dependency missing; see above.- Server says 400/422 - check
headers(Content-Typematters for JSON bodies) and thatbodyparses as valid JSON.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| url | STRING | https://httpbin.org/get | — |
| method | COMBO | 4 options: GET, POST, PUT, DELETE | |
| headers | STRING | {"Content-Type": "application/json"} | — |
| body | STRING | {} | — |
| timeoutopt | FLOAT | 10.001–60 | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| response_json | JSON | — |
| response_text | STRING | — |
| status_code | INT | — |
| response_headers | JSON | — |