Get Download URL for Generated Files
The KIE Utility Nobody Notices
- raw_json
- first_url
- task_id
What it's for
This is the least glamorous node in the pack and possibly the most quietly useful one. It does one thing: takes a URL that KIE produced - a temp link from any of the image, video or audio models - and asks KIE's common API to convert it into a direct download URL.
Why would you care? Because everything KIE hands back lives on a temp bucket, and temp buckets expire. If your workflow ends with "generate, grab the URL, feed that URL into another service or a spreadsheet or a Discord webhook," you've built a pipeline on top of a link that has a shelf life. This node is the one-line fix: run the generated URL through it before you store or forward it.
It's the generic sibling of the 4o Image specific conversion node. That one needs a task ID because it's scoped to the 4o Image API. This one works off the common KIE endpoint (/api/v1/common/download-url), takes a single URL, and doesn't care which model produced it. If you're holding a link and you don't know or don't want to care which family it came from, this is the node.
How it works
POST the URL, get JSON back. The pack authenticates with your saved KIE key, sends the request, and maps the response into its utility output shape rather than a media shape - deliberately, because a URL conversion is metadata, not a file fetch.
That's worth being explicit about, since it explains what looks like a strange output layout: this node does not download the file, does not produce an IMAGE, VIDEO or AUDIO socket, and does not start a poll loop waiting for anything. It's a single request/response round trip, which is also why it finishes basically instantly compared to a generation node.
Inputs and outputs
One required input, and it's exactly what you'd hope:
url- the URL to convert. The tooltip is a terse "Image URL (Required)", which is the documentation's own wording and undersells it; the endpoint is the common one, and the thing you feed it is whatever generated URL you're trying to make durable.
timeout_seconds (optional, default 1200, min 30, max 7200) is the only other input. Default is fine.
Outputs use the utility triple, not the media signature - and this trips people up:
raw_json- the full pretty-printed response. The converted URL is somewhere in here, and this is the only place the complete payload appears.first_url- the first URL the pack could extract from the response. For a conversion call, this is the practical output you want: the new direct download URL as a STRING.task_id- there isn't one for this endpoint, so expect it empty. It exists because the pack keeps one output shape for all utility nodes.
So: first_url is your wire-out, and raw_json is where you look when first_url comes back empty. Feed first_url into a download node, a text-combine node, or whatever your pipeline does with links.
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
pip install -r ComfyUI-KIE-Nodes-Next/requirements.txt
Restart, then set the key once at Settings → KIE.ai Nodes Next → Connection - same key as every other node in the pack, saved in ComfyUI's user config directory rather than in your workflow JSON. There's nothing model-shaped to install: requirements.txt is requests, Pillow, numpy, PyYAML. The README also ships a Windows one-click installer under dist/ that takes care of ComfyUI Desktop's unusual user-data paths.
Headless servers can skip the settings panel entirely by exporting KIE_API_KEY, which the pack prefers over any locally saved key.
Where people get burned
The big one: expecting pixels. People add this node instead of a download node and then wonder why they can't preview anything. It converts a link; it doesn't fetch a file.
Second, using it after the link has expired. The conversion endpoint needs a live source URL. Once a temp link is dead, there's nothing to convert - this node can't resurrect it any more than the 4o-specific one can. Convert early, ideally in the same run that produced the URL.
Third, a blank first_url. That usually means the response didn't contain anything the pack's URL extraction recognised. Open raw_json before assuming the node is broken - the pack's extraction is generic and an unusual response shape lands there rather than in the convenience socket.
And the standing caveat for anything in this pack: it's a reseller API wrapper, so your prompts and URLs leave your machine, and the metering is per call. This particular call costs almost nothing, but it is a call. For what it saves you in dead links, that's a trade most pipelines should take.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| url | STRING | Image URL (Required) | |
| timeout_secondsopt | INT | 120030–7200 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| raw_json | STRING | — |
| first_url | STRING | — |
| task_id | STRING | — |