Send To Http Webhook
Your finished render, posted to a webhook, the dumb way
- images
- STRING
Send To Http Webhook (class UploadToWebHookHTTP) is the node you add when your ComfyUI box finishes a render and the result needs to leave the machine - land in a Discord channel, a Slack bot, an n8n flow, or a webhook.site test URL - without you dragging a file around. It takes an IMAGE tensor, saves it, and POSTs it to a webhook URL as a multipart form upload. That's the whole job, and it does it with zero configuration beyond a URL.
It ships from jerrywap/ComfyUI_UploadToWebhookHTTP, a small one-node pack. Honest framing up front: this is a thin utility node with essentially no community footprint (0 impressions on comfy.icu, no reddit presence), and the README is a lightly-edited copy of an earlier project - the install example still says git clone .../yourusername/.... So treat it as "works, but nobody's vetting it for you." For a simple push-a-file-to-a-known-endpoint job it's perfectly fine; for anything with auth or headers you'll outgrow it fast.
How it works
The mechanism is short enough to read in the source in a minute. When it runs, it asks ComfyUI for a save path, writes the image (or video) to disk, then does a requests.post with the file under the form field file and your metadata as regular form fields.
- One image in → saves a PNG, uploads it as
image.png. - Multiple frames → stitches them into an MP4 with moviepy (
ImageSequenceClip, H.264) and uploads that instead. - Either way, the POST body carries
other_data(your JSON) plusprompt_idif you filled it in.
The only output is a STRING that always says "Uploading Completed" - more on that trap below.
The inputs that matter
There are six, and five of them are nearly self-explanatory:
images- wire this from VAE Decode (or a video decoder's frames). It's required.webhook_url- where the POST goes. The default is a fakehttps://example.com/path_to_webhook; you will forget to change this at least once.frame_rate- only used when multiple images arrive, to set the MP4's fps (1–60, default 12).save_image- whether the local copy lives in ComfyUI's output folder or its temp folder. Both paths save the file; this just picks where.prompt_id- an optional label posted as a form field. It is manual: the node doesn't pull ComfyUI's real run id, so you type whatever you want to correlate runs server-side.other_data- a multiline JSON box appended to the POST as extra fields. Must be valid JSON; if it isn't, it silently becomes{}.
Install
Easiest is ComfyUI Manager - search "ComfyUI_UploadToWebhookHTTP" and hit install. Or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/jerrywap/ComfyUI_UploadToWebhookHTTP
cd ComfyUI_UploadToWebhookHTTP
bash install.sh # or: pip install -r requirements.txt
Then restart ComfyUI. Dependencies are light: numpy, requests, Pillow, moviepy. The one real dependency gotcha is that the video path needs an ffmpeg binary on your system - moviepy shells out to it, and if it's missing the multi-image branch dies where the PNG branch wouldn't.
Where people get burned
The big one: the node never tells you it failed. Non-2xx responses are just print()ed to the console and the node still returns "Uploading Completed". Check your terminal log, not the node, to see whether the POST actually landed. There's no retry either - one attempt, then it moves on.
Also: there's no auth support. A bare POST with no headers means it works out of the box with webhook.site, Discord, and Slack (their webhook URLs carry the token inside the URL), but anything expecting a Bearer token or an API key is a non-starter. And since the node will happily ship your generation to any URL you type, only point it at endpoints you control - the same reminder that applies to every custom node: installing one runs its code with your permissions, and webhook exfiltration is exactly how the ComfyUI_LLMVISION malware exfiltrated browser data back in 2024. Not this author - but the pattern is the pattern.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| webhook_url | STRING | https://example.com/path_to_webhook | — |
| frame_rate | INT | 121–60 | — |
| save_image | BOOLEAN | true | — |
| prompt_id | STRING | — | |
| other_data | STRING | { "key1": "value1", "key2": "value2" } | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |