Model Download Batch (JSON)
Same batch downloader, but the JSON is the interface
- passthrough
- passthrough
- download_result
Model Download Batch (JSON) is the exact same download node as Model Download Batch, minus the table UI. Instead of a list editor with Add/Remove buttons, you get a plain multiline text box where you type - or paste, or have another node generate - the manifest JSON directly. Same core, same aria2c engine, same download_result output that feeds the pack's "(Downloaded)" loaders.
So why does this variant exist? Three reasons.
Sharing. A table UI doesn't travel. A JSON block does. If you're sending someone a workflow that needs six models, you can paste the manifest into a comment, a gist, or a code block in your README, and they paste it straight in.
Scripting and generation. You can have a node build the manifest for you - a URL-list node, a text processor, whatever - and feed its string output into this node's manifest_json input. The plain version's widget is a hand-operated table; this one is a programmable input.
Versioning. Manifests are config. Keeping them as text you can diff beats remembering what you clicked in a table.
The manifest schema
It's a JSON array with at least one object per file. The fields, from the README:
url(required) - HTTP/HTTPS URL, e.g.https://huggingface.co/owner/repo/resolve/main/anima-model.safetensorsmodel_type(required) - one of the thirteen categories:checkpoints,diffusion_models,text_encoders,vae,loras,controlnet,embeddings,upscale_models,onnx,sam3,llm,ultralytics_bbox,ultralytics_segmsubfolder- nests the file under the model root, e.g."anima"filename- defaults to whatever the server's response or URL resolves toid- how the loaders reference this file; defaults to the filename without its final extensionsplit- 1–16, default 16; parallel connections per file foraria2
For the JSON version, the README recommends always setting an explicit id. The reason: if you leave it out and the URL resolves to model.fp16.safetensors, your ID becomes model.fp16 - and the loaders match on that string. An explicit, stable id is the difference between a manifest that quietly breaks when a filename changes and one that doesn't.
Civitai URLs need special handling here, since the API URL tells you nothing about the filename. The table UI has a "Resolve filename / ID" button for exactly that; in the JSON version you're on your own, which is another argument for spelling out id and filename by hand for Civitai entries.
Wiring it up
Inputs: manifest_json (the JSON) and an optional arbitrary-type passthrough. Outputs: passthrough (passes its input through untouched) and download_result, which you connect to any "(Downloaded)" loader with the matching id. Like its sibling it's an output node that reruns every queue, so the downloads fire on each run - and existing files get skipped, not re-downloaded.
Install and gotchas
Same as the pack's other nodes: ComfyUI Manager search for "ComfyUI Model Batch Downloader", or git clone https://github.com/watarika/ComfyUI-Model-Batch-Downloader.git into ComfyUI/custom_nodes, then restart. No pip dependencies. You do need aria2c on the PATH that starts ComfyUI - that's the one external requirement and it isn't installed for you.
Troubleshooting is the shared pack list: aria2c is required means install the binary; Hugging Face 401/403 means check HF_TOKEN in the environment; Civitai 403 means use the civitai.red/api/download/models/{id} URL and check CIVITAI_API_TOKEN. And duplicate id means two entries claim the same ID - assign one a unique id. Invalid JSON gets rejected up front with a clear error, which is the nicest part of the text-input life.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| manifest_json | STRING | [] | — |
| passthroughopt | * | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| passthrough | * | — |
| download_result | DOWNLOAD_RESULT | — |