Search

Search HiAPI models, tools, and resources.

Back to blog
Tutorial3 min read

How to Use Recraft Crisp Upscale API: One Field, 2× Size

Prompt-free, single-field image_url, $0.004-per-image faithful 2× upscaling.

HiAPI EditorialRecraftAPI IntegrationImage Upscaling

TL;DR

  • Recraft Crisp Upscale (recraft/crisp-upscale) does one thing: it doubles an image's width and height with crisper edges and texture while keeping the content and lettering exactly as they were. No prompt — the request body is a single image_url. Try it on the model page; new accounts get 200 free credits.
  • $0.004 per image: 1,000 images cost $4.00, and $10 buys about 2,500; input size never changes the price (full tiers on the pricing page).
  • Everything runs on HiAPI /v1/tasks: submit for a taskId, poll, download from output[0].url (JPEG, no transparency).

What it does

  • Faithful upscaling, not repainting: dial textures, skin wrinkles, and poster small print get sharper while content, composition, and text stay untouched — lettered assets won't "become a different image" at 2×.
  • One field to call: pass a public URL in image_url (JPEG / PNG / WebP, ≤10 MB); no prompt, no scale option.
  • Built for product photos, lettered posters, and design assets: any case where "the image is right, the resolution isn't."
  • Where it doesn't fit: 4K-grade repainted detail, or changing the content along the way, calls for generative repainting (see the resolution tutorial); Crisp Upscale only doubles the size without redrawing.
  • The output is one JPEG; for transparent results, upscale first, then remove the background (see the background-removal guide).

Here's a real "original → 2×" pair:

Original 640×640Upscaled 1280×1280
Watch originalWatch upscaled

recraft/crisp-upscale, 640×640 → 1280×1280, $0.004. The guilloché dial, brushed steel, and small dial text stay crisp at double size.

Open the model page and upload one →

Two ways to start

Browser, 3 steps: open the model page → upload the image → hit upscale. One image is $0.004.

API, 3 steps: POST /v1/tasks to submit → take the taskId → poll to success, then download. For batches, loop those three steps once per image.

curl: your first image

curl -X POST https://api.hiapi.ai/v1/tasks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: your-unique-key-001" \
  -d '{
  "model": "recraft/crisp-upscale",
  "input": {
    "image_url": "https://static.hiapi.ai/gallery/2026/10/4fdfd6b43b638849.jpg"
  }
}'

That's the whole request body — any extra field (like prompt or scale) returns a 400.

Python: submit, poll, download

import time, uuid, requests

BASE = "https://api.hiapi.ai/v1/tasks"
HEADERS = {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json",
}

payload = {
    "model": "recraft/crisp-upscale",
    "input": {
        "image_url": "https://example.com/your-image.jpg",
    },
}

resp = requests.post(
    BASE,
    headers={**HEADERS, "Idempotency-Key": str(uuid.uuid4())},
    json=payload,
    timeout=30,
)
resp.raise_for_status()
task_id = resp.json()["taskId"]

while True:
    task = requests.get(f"{BASE}/{task_id}", headers=HEADERS, timeout=30).json()
    print(task["status"])
    if task["status"] in ("success", "fail"):
        break
    time.sleep(5)

if task["status"] == "success":
    image_url = task["output"][0]["url"]   # temporary URL — download promptly
    img = requests.get(image_url, timeout=60)
    with open("upscaled.jpg", "wb") as f:
        f.write(img.content)
    print("saved upscaled.jpg")

Parameters

FieldRequiredValuesNotes
image_urlyespublic http/https URLJPEG / PNG / WebP, up to 10 MB

That's it. The scale is fixed at 2× on both axes; there is no prompt and no output-format field.

Errors you'll actually hit

StatusMeaningWhat to do
400 INVALID_REQUESTimage_url missing, not an http/https URL, or extra fields like prompt / scale sentKeep only image_url in the body
402 INSUFFICIENT_QUOTAOut of credits (no charge)Top up and retry
429 RATE_LIMITEDRate limitedSlow your submissions
409 / 422 IDEMPOTENCY_KEY_*Same idempotency key resubmittedGenerate a fresh key

Terminal failures use TASK_FAILED, TASK_TIMEOUT, and similar codes; failed tasks are not billed.

Before you ship

  • Callbacks: pass "callback": {"url": "https://..."} at the request top level.
  • Persist outputs: output[0].url is temporary — download it right away.
  • Latency: one image usually takes 10 seconds to about a minute; don't poll too aggressively.
  • Transparency: the output is JPEG without an alpha channel; upscale first, then remove backgrounds.
  • Batch math is simple: five images per SKU = $0.02; 1,000 catalog assets = $4.00 — submit them in one batch; each task is timed independently.
  • Source quality sets the ceiling: 2× sharpens edges, but blurred areas will not grow new detail; test one key asset before batching.

FAQ

Is it really 2×?

Yes — both axes double (640×640 → 1280×1280, 480×640 → 960×1280). The scale is fixed with no 4× option; run it twice for more.

Does the lettering change?

No. Poster text keeps its exact letterforms — nothing rewritten or added.

How much is one image?

$0.004 each, or $4.00 per 1,000; input size never changes the price. Failed tasks are not billed, and validation rejections never bill.

Can I send base64?

No. image_url needs a public http/https URL; upload local files to your storage first.

How long does one take?

Usually 10 seconds to about a minute; batch jobs queue per image, so submit in waves when time matters.

Next: take one of your product shots and upscale it on the model page; five real "original → 2×" pairs are in the examples page; the same-source test against generative repainting is in the comparison.

Generate it with HiAPI

Choose a model, enter your prompt, and see the result.

HiAPI Blog

Related articles

HiAPI

Generate it with HiAPI

Start generating