550W Image Task Query
The node that tells you when the eraser actually finished
- result_json
What this node is actually for
Erasing a watermark on the 550W service is a job, not a function call. You submit an image, you get back JSON containing a task ID, and the pixels appear later. FiftyWImageQuery ("550W Image Task Query", labeled "550W 图片任务查询" in the Chinese build of the pack) is the node that asks is it done yet. You hand it the task ID, it hands you the task's current JSON.
It belongs in exactly one place in the chain:
Native Image Erase (or Remove Image Watermark) → Image Task Query → Image Result → Preview / Save Image
The submission nodes return a task ID, not an image, so without this node you're holding a receipt and no picture.
Inputs and output
Two fields you'll care about, one you can ignore.
- task_id - the ID out of the submission JSON. Paste the value, not the whole blob, and not with quotes around it. This is a text widget rather than a socket, so there's no wiring the submission straight into it; you're copy-pasting a token by hand. Clumsy, but worth knowing before you build around it.
- language -
enorzh-CN. Despite what the name suggests, this picks the language of the node's error messages, not the server region and not the account. Region is baked into the package build; the Chinese distribution is a separate package with different node IDs and its own key/purchase pages. - auth_mode (optional) -
api_key(default) oroauth. Explicit by design: choosing OAuth never silently falls back to whatever API key happens to be in the environment.
Output: result_json, a single STRING of the service's response, verbatim.
Why it re-runs every single time you hit Queue
Under the hood it posts to the service's task-detail endpoint with your credentials (OAuth mode GETs the task instead) and returns the reply untouched - nothing parsed, nothing cached. The node declares IS_CHANGED as NaN, the idiom custom nodes use to opt out of ComfyUI's execution cache and fire on every run. For a poller that's exactly right: queue, read the JSON, queue again. Without it, ComfyUI would hand you the stale pending from thirty seconds ago. It runs even with nothing wired to it, because it's registered as an output node.
Install
ComfyUI Manager, search the pack title 550W Watermark & Text Eraser, install, restart. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/sunshinehu/comfyui-550w-media
cd comfyui-550w-media
python -m pip install -r requirements.txt # use ComfyUI's interpreter
Requirements are light - requests, requests-toolbelt and keyring. No torch reinstall, no ffmpeg, no model files, and this node never touches your GPU. Python 3.11+.
Credentials come from the environment, not from widgets:
export FIFTYW_API_KEY="..." # https://eraser.550wai.com/api/
export FIFTYW_USER_NO="..."
Set those in whatever launches ComfyUI and restart. Keeping them out of the node is the right call - widget values get saved into every workflow you share.
Where people get burned
A perfectly good-looking task ID can still fail with the terse "Invalid input". The image query validates the ID against an 8–128 character pattern of letters, digits and ._:- before any request goes out, so a stray quote, a space or a placeholder like test fails locally.
Second trap: don't re-submit to "fix" a slow task. A request with an unknown outcome should be queried, never replayed - a replay is a fresh charge.
Third: wiring this node into Image Result while the task is still pending. A pending task is not a result, and Image Result says so plainly.
If you'd rather not pay per image
Worth saying plainly, because it's the real decision: an instruction-editing model you already have removes a watermark or overlaid text from a sentence, no mask needed - Qwen-Image-Edit is the Apache-2.0 one people reach for. And mask-and-inpaint still owns one thing nothing else does: unmasked pixels come back bit-identical, so you can strip a logo without the rest of the frame drifting.
The service wins on grunt work: a few hundred scraped images, same watermark position, no GPU time, no masking, a JSON you can loop over. That's a fair trade if you're fine with the file leaving your machine - which is the whole mechanism of an API node, not a bug, and the category where you should actually read what a pack does before installing it.
One thing to know about this pack specifically: it has essentially no community footprint - nothing in the reddit corpus mentions the author, the repo or the service. Not an accusation, just a "you're early, read the source" note. The request code is short and boring, which is the best thing you can say about a node that holds your key.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| language | COMBO | en | 2 options: zh-CN, en |
| task_id | STRING | — | |
| auth_modeopt | COMBO | api_key | 2 options: api_key, oauth |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| result_json | STRING | — |