Tutorial API Upscale Gambar dengan Node.js dan Python
Langkah demi langkah memakai API Upscale Gambar: ubah gambar jadi data URI, kirim job, cek status, lalu unduh hasil PNG. Lengkap dengan kode Node.js, Python, dan daftar kode error.

Panduan ini menunjukkan cara memakai API Upscale Gambar dari awal sampai file hasil tersimpan di disk: mengubah gambar menjadi data URI, mengirim job, mengecek status, lalu mengunduh hasilnya. Contoh kode tersedia dalam Node.js dan Python.
Yang Anda Butuhkan
- API key dari dashboard.apiindonesia.id. Akun baru mendapat bonus 3.000 kredit, cukup untuk mencoba tier 2x.
- Gambar PNG, JPEG, atau WebP berukuran maksimum 1 MB dan maksimum 1 MP (misalnya 1000×1000 atau 1200×800).
Alur Singkat
| Langkah | Endpoint | Biaya |
|---|---|---|
| 1. Kirim job | POST /api/v1/image/upscale/{2x|4x|8x} |
250 / 1.000 / 4.000 kredit |
| 2. Cek status | GET /api/v1/image/jobs/{job_id} |
Gratis |
| 3. Unduh hasil | GET /api/v1/image/jobs/{job_id}/file |
Gratis |
Base URL: https://use.apiindonesia.id. Semua request memakai header x-api-key.
Upscale berjalan asinkron. Submit langsung menjawab 202 Accepted dengan job_id, lalu Anda mengecek status setiap beberapa detik. Pada uji kami, job 2x untuk foto 800×600 selesai dalam sekitar 6 detik.
Langkah 1: Ubah Gambar Menjadi Data URI
API hanya menerima gambar sebagai data URI (data:image/jpeg;base64,...). URL http biasa sengaja ditolak, jadi Anda tidak perlu meng-hosting gambar di mana pun.
Contoh Lengkap: Node.js (18+)
import { readFile, writeFile } from 'node:fs/promises'
const API = 'https://use.apiindonesia.id/api/v1/image'
const headers = { 'x-api-key': process.env.API_INDONESIA_KEY }
const sleep = (ms) => new Promise((r) => setTimeout(r, ms))
async function upscale(path, tier = '2x') {
// 1. Data URI
const bytes = await readFile(path)
const mime = path.endsWith('.png') ? 'image/png' : path.endsWith('.webp') ? 'image/webp' : 'image/jpeg'
const image = `data:${mime};base64,${bytes.toString('base64')}`
// 2. Kirim job
const submit = await fetch(`${API}/upscale/${tier}`, {
method: 'POST',
headers: { ...headers, 'Content-Type': 'application/json' },
body: JSON.stringify({ image }),
})
const job = await submit.json()
if (submit.status !== 202) throw new Error(`${job.error.code}: ${job.error.message}`)
// 3. Cek status sampai selesai
let status
do {
await sleep(3000)
status = (await (await fetch(`${API}/jobs/${job.data.job_id}`, { headers })).json()).data
} while (status.status === 'pending')
if (status.status === 'failed') throw new Error(`${status.error.code}: ${status.error.message}`)
// 4. Unduh hasil (PNG), dalam 1 jam
const file = await fetch(status.download_url, { headers })
await writeFile(`upscaled-${tier}.png`, Buffer.from(await file.arrayBuffer()))
return status.result // { width, height }
}
console.log(await upscale('produk.jpg', '2x'))
Contoh Lengkap: Python
import base64, os, time, requests
API = "https://use.apiindonesia.id/api/v1/image"
HEADERS = {"x-api-key": os.environ["API_INDONESIA_KEY"]}
def upscale(path, tier="2x"):
mime = "image/png" if path.endswith(".png") else "image/webp" if path.endswith(".webp") else "image/jpeg"
with open(path, "rb") as f:
image = f"data:{mime};base64,{base64.b64encode(f.read()).decode()}"
submit = requests.post(f"{API}/upscale/{tier}", json={"image": image}, headers=HEADERS)
body = submit.json()
if submit.status_code != 202:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
job_id = body["data"]["job_id"]
while True:
time.sleep(3)
status = requests.get(f"{API}/jobs/{job_id}", headers=HEADERS).json()["data"]
if status["status"] != "pending":
break
if status["status"] == "failed":
raise RuntimeError(f"{status['error']['code']}: {status['error']['message']}")
result = requests.get(status["download_url"], headers=HEADERS)
with open(f"upscaled-{tier}.png", "wb") as f:
f.write(result.content)
return status["result"]
print(upscale("produk.jpg", "2x"))
Contoh Respons Status
{
"success": true,
"data": {
"id": "2fa711a4-deca-42df-90c2-fde8e528de17",
"status": "succeeded",
"tier": "2x",
"credits_charged": 250,
"source": { "width": 800, "height": 600 },
"result": { "width": 1600, "height": 1200 },
"download_url": "https://use.apiindonesia.id/api/v1/image/jobs/2fa711a4-deca-42df-90c2-fde8e528de17/file",
"download_expires_at": "2026-10-23T09:34:55.583Z",
"error": null
}
}
Kode Error yang Perlu Ditangani
| Status | Kode | Artinya |
|---|---|---|
| 400 | INVALID_IMAGE |
Bukan data URI PNG/JPEG/WebP yang valid |
| 400 | IMAGE_TOO_LARGE |
Lebih dari 1 MB atau lebih dari 1 MP |
| 402 | INSUFFICIENT_CREDITS |
Saldo kredit tidak cukup |
| 403 | TIER_REQUIRES_TOPUP |
Tier 4x/8x butuh akun yang pernah top up |
| 403 | BONUS_UPSCALE_LIMIT |
Jatah 4 job dari bonus pendaftaran sudah terpakai |
| 410 | RESULT_EXPIRED |
Lewat 1 jam, kirim ulang gambarnya |
| 502 | UPSTREAM_UNAVAILABLE |
Pemroses sedang bermasalah, tidak ada biaya |
Request yang ditolak tidak memotong kredit, dan job yang gagal setelah diterima dikembalikan penuh.
Tips
- Kompres dulu ke JPEG atau WebP kalau PNG Anda di atas 1 MB. Untuk upscale, JPEG kualitas 90 sudah cukup.
- Simpan hasil di storage Anda sendiri. Hasil hanya tersedia 1 jam dan kami tidak menyimpan salinannya.
- Batch: kirim satu request per gambar dan simpan
job_id-nya. Cek status itu gratis.
FAQ
Kenapa API tidak menerima URL gambar? Supaya server kami tidak bisa diarahkan mengambil URL sembarangan. Gambar dikirim sebagai data URI, jadi Anda juga tidak perlu meng-hosting gambar di mana pun.
Berapa lama satu job upscale?
Biasanya beberapa detik. Pada uji kami, foto 800×600 di tier 2x selesai dalam sekitar 6 detik. Cek status setiap 3 detik sesuai poll_after_seconds.
Apa yang terjadi kalau saya terlambat mengunduh?
Setelah 1 jam, endpoint unduh menjawab 410 RESULT_EXPIRED dan Anda perlu mengirim ulang gambarnya.
Format apa yang dihasilkan? PNG, dengan ukuran sesuai skala tier: 2x, 4x, atau 8x dari ukuran input.
Mulai Sekarang
Ambil API key di dashboard.apiindonesia.id/register, lihat halaman produk API Upscale Gambar, dan baca use case-nya di API Upscale Gambar untuk Foto Produk Marketplace.
