← Blog
Artikel

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.

Mulai Sekarang

Mulai Integrasi
Hari Ini

Daftar gratis dan dapatkan bonus 3.000 kredit (Rp3.000) setelah email diverifikasi, ambil API key, lalu langsung call endpoint pertama Anda. Tanpa kartu kredit, tanpa proses approval yang ribet.

Visualisasi gelombang titik