JSONMessageNotifyTool
Fire a JSON webhook from your workflow when something finishes
- STRING
Long render? Batch queue running overnight? The "ping me when it's done" problem is real, and JSONMessageNotifyTool is the node that solves it with a webhook: give it a URL and a message, and when the graph reaches it, it POSTs your message to that endpoint as JSON. That's the whole job, and it does it with zero ceremony - no auth, no custom headers, no key.
It's one of the eight utilities in ComfyUI-Image-Tools. At its most useful it's the tail of a batch pipeline: process a folder of images, and when the last one's done, tell your backend (or your own server) so a script can pick up the results. If you're running ComfyUI headless-ish or with a queue, this is your completion bell.
How it works
Two steps, both visible in the source. First json.loads(message) parses your message string - and yes, that means the message must be valid JSON. Then requests.post(url, json=...) sends the parsed object as the body of a POST request. Whatever the server replies with becomes the node's output.
Inputs and outputs
url(STRING) - the webhook or endpoint to hit.message(STRING) - the payload, as a JSON string.{"status": "done"}works;done!does not.- Output:
STRING- the server's raw response text, so you can see what the endpoint said.
Install
It ships in a pack, so install the pack:
cd ComfyUI/custom_nodes
git clone https://github.com/knuknX/ComfyUI-Image-Tools
Restart ComfyUI, or install Image Tools via ComfyUI Manager. It needs nothing beyond requests.
Where people get burned
messagemust parse as JSON.json.loadsthrows on anything that isn't valid JSON, and the node errors out - your workflow stops rather than notifying. Plain text is the most common mistake; if you want to send text, wrap it:{"text": "done"}.- No timeout on the request.
requests.postis called bare, so if your endpoint hangs, the node - and everything downstream - waits indefinitely. Make sure the thing you're notifying actually responds. - It's a raw JSON POST with no custom headers. Great for your own server or a generic JSON webhook. Services that demand a specific payload shape or auth headers (a lot of chat integrations, for example) will reject or ignore it. It's a "talk to your own infra" node, not a "magically integrate with everything" one.
- It'll POST to anything you type. The node cheerfully sends whatever JSON you give it to whatever URL you provide. Only wire it to endpoints you control or trust, and don't put secrets in the message if you're unsure who's listening.
Chain it with PreviewJSONNode (same pack) to read the server's response on the canvas, and you've got a tidy little completion-bell setup. Modest, but genuinely handy once a workflow runs long enough to want one.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| url | STRING | — | |
| message | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |