Recraft - Crisp Upscale
A Cloud Upscaler That Won't Invent Faces
- image
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
What it is
A hosted detail-preserving upscale from Recraft, reachable as one node in your graph. No ESRGAN weights, no SeedVR2 download, no VRAM. You hand it an image, KIE calls Recraft's crisp-upscale endpoint, and you get a bigger image back on an IMAGE socket.
The reason to care lands on the distinction the upscaling hierarchy makes: pixel upscalers add no new content and therefore cannot hallucinate, while generative upscalers invent detail and rewrite identity along the way. Everyone's rule of thumb is "give a face its own pass" for exactly that reason. This node sits in the non-generative camp as far as intent goes - it's meant to make an image crisper, not to re-imagine it - which makes it a sane choice for product shots, logo boards and anything where a hallucinated pore would be a problem. Recraft as a lab is the design-focused niche: leaderboard-topping, moderately censored, and the interesting one in the room for SVG output rather than photorealism.
The input is a URL, and that's the whole gotcha
Look closely at the panel and you'll notice this node's required field is a STRING, not an IMAGE socket: image, defaulting to a sample file URL, with the author's own tooltip reading "Image to upscale (File URL after upload, not file content)" - accepted types JPEG/PNG/WebP, max 10 MB.
That's not the pack being lazy; the node only converts a field to a native socket when the field name follows the image-URL convention, and this endpoint calls its parameter plain image. So you wire it like this:
- KIE • Upload Image takes your
IMAGEand returnsfirst_url. - Connect
first_url→ this node'simagestring field.
That's one extra node, and it's the step people miss. Pasted-in URLs from anywhere public work too - the upload node is just how you get a local image up there.
Beyond that you get timeout_seconds (1200 by default, up to 7200) and callback_url, which stays empty for normal ComfyUI use. Outputs are the pack standard: image, url, all_urls_json, task_id, raw_json, credits_consumed, credits_left.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
pip install -r ComfyUI-KIE-Nodes-Next/requirements.txt
Then restart ComfyUI and set your key once at Settings → KIE.ai Nodes Next → Connection. The pack validates the key before saving it, masks it in the UI, and keeps it out of workflow JSON. On Windows there's a one-click installer in the repo's dist/ folder if you'd rather double-click than type.
When this is the wrong tool
If you just need more pixels from an already-sharp file, a Lanczos resize or a local ESRGAN pass is free and instant, and the community's numbers on that cheap rung have actually been rising rather than fading. Paying per call to upscale a sharp image is spending money to do what your CPU does in 200ms.
Where this earns its keep: you're on a machine that can't run the generative upscalers decently, the file already looks good and you want it print-sized without new textures, or you need a consistent hosted step in a pipeline you're running across several machines. Also worth flagging - a "crisp" upscale won't rescue a soft or out-of-focus source, because there's no detail to sharpen; the standard fix there is to downscale first and rebuild from a sharper-relative base. And watch the upload ceiling: 10 MB per file means a full-resolution camera export can bounce before the upscale even starts.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | STRING | https://file.aiquickdraw.com/custom-page/akr/section-images/1757169577325ijj8vwvt.jpg | Image to upscale (File URL after upload, not file content; Accepted types: image/jpeg, image/png, image/webp; Max size: 10.0MB) |
| timeout_secondsopt | INT | 120030–7200 | — |
| callback_urlopt | STRING | Optional KIE callback URL. Leave empty for normal ComfyUI use. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| url | STRING | — |
| all_urls_json | STRING | — |
| task_id | STRING | — |
| raw_json | STRING | — |
| credits_consumed | FLOAT | — |
| credits_left | FLOAT | — |