Nodes/ComfyUI-Image-Tools/JSONMessageNotifyTool
ComfyUI Node

JSONMessageNotifyTool

Fire a JSON webhook from your workflow when something finishes

By knuknX·Created 3 years ago·Updated 2 years ago· 3
JSONMessageNotifyTool
    • STRING
    url
    message

    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

    • message must parse as JSON. json.loads throws 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.post is 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.

    CategoryTools

    Inputs (2)

    NameTypeDefaultDescription
    urlSTRING
    messageSTRING

    Outputs (1)

    NameTypeDescription
    STRINGSTRING