# Image upscale

> Documentation index for AI agents: [/llms.txt](https://docs.apiindonesia.id/llms.txt). Every page is also available as markdown: add `.md` to the URL.

Enlarge an image 2x, 4x or 8x as an async job, then download the result.

Submit the image as a data URI to get a job_id, poll the job status, then download the file from the job endpoint. Results are kept for 1 hour after the job finishes.

All endpoints need the `x-api-key` header (see [Authentication](https://docs.apiindonesia.id/authentication.md)) and return the standard [envelope](https://docs.apiindonesia.id/errors.md). A successful request costs 2 credits.

## Endpoints on this page

- [`POST /api/v1/image/upscale/2x`](#post-api-v1-image-upscale-2x): Upscale 2x (up to 4 MP output)
- [`POST /api/v1/image/upscale/4x`](#post-api-v1-image-upscale-4x): Upscale 4x (up to 16 MP output)
- [`POST /api/v1/image/upscale/8x`](#post-api-v1-image-upscale-8x): Upscale 8x (up to 64 MP output)
- [`GET /api/v1/image/jobs/{id}`](#get-api-v1-image-jobs-id): Job status
- [`GET /api/v1/image/jobs/{id}/file`](#get-api-v1-image-jobs-id-file): Download the result

## Image Upscale (Super Resolution)

Enlarge an image 2x, 4x, or 8x with detail reconstruction rather than plain interpolation.

- Submit the image as a data URI, receive a job_id, then download the result from our endpoint
- We do not store results: the file lives on the processing CDN for 1 hour after the job finishes, so download it as soon as the status is succeeded
- Input is capped at 1 MB and 1 MP (send JPEG or WebP to stay under it)
- A job that fails is refunded in full
- Checking status or downloading is free

### POST /api/v1/image/upscale/2x

**Upscale 2x (up to 4 MP output).** Upscales an image 2x, accepting up to 1 MP of input and returning at most 4 MP. Costs 250 credits per job. A failed job is refunded in full, and an account that has never topped up can run this tier at most 4 times from the signup bonus (failed jobs do not count).

| Body field | Required | Type | Description |
| --- | --- | --- | --- |
| `image` | yes | string | The image as a data URI: data:image/png;base64,... (PNG, JPEG, or WebP, 1 MB maximum after decoding; use JPEG or WebP). A plain http URL is rejected. |

```bash
curl -X POST "https://use.apiindonesia.id/api/v1/image/upscale/2x" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "content-type: application/json" \
  -d '{"image":"data:image/jpeg;base64,/9j/4AAQSkZJRg..."}'
```

### POST /api/v1/image/upscale/4x

**Upscale 4x (up to 16 MP output).** Upscales an image 4x, accepting up to 1 MP of input and returning at most 16 MP. Costs 1,000 credits per job. This tier requires an account that has topped up at least once.

| Body field | Required | Type | Description |
| --- | --- | --- | --- |
| `image` | yes | string | The image as a data URI (PNG, JPEG, or WebP, 1 MB maximum). |

```bash
curl -X POST "https://use.apiindonesia.id/api/v1/image/upscale/4x" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "content-type: application/json" \
  -d '{"image":"data:image/png;base64,iVBORw0KGgo..."}'
```

### POST /api/v1/image/upscale/8x

**Upscale 8x (up to 64 MP output).** Upscales an image 8x, accepting up to 1 MP of input and returning at most 64 MP. Costs 4,000 credits per job, and this tier also requires an account that has topped up. The output file is large, so plan for the download time and your own storage.

| Body field | Required | Type | Description |
| --- | --- | --- | --- |
| `image` | yes | string | The image as a data URI (PNG, JPEG, or WebP, 1 MB maximum). |

```bash
curl -X POST "https://use.apiindonesia.id/api/v1/image/upscale/8x" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "content-type: application/json" \
  -d '{"image":"data:image/png;base64,iVBORw0KGgo..."}'
```

### GET /api/v1/image/jobs/{id}

**Job status.** Returns the job status (pending, succeeded, or failed) with the result resolution, the failure reason, and the download expiry. This endpoint is free: polling does not consume credits.

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `id` | path | yes | string | The job_id returned by the submit call. |

```bash
curl "https://use.apiindonesia.id/api/v1/image/jobs/6f1c1f0e-6a8f-4f2b-9a1e-0d6b3f0f9a11" \
  -H "x-api-key: YOUR_API_KEY"
```

Example response (shortened):

```json
{
  "success": true,
  "data": {
    "id": "6f1c1f0e-6a8f-4f2b-9a1e-0d6b3f0f9a11",
    "status": "succeeded",
    "tier": "2x",
    "scale": 2,
    "credits_charged": 250,
    "source": {
      "width": 1000,
      "height": 1000
    },
    "result": {
      "width": 2000,
      "height": 2000
    },
    "download_url": "https://use.apiindonesia.id/api/v1/image/jobs/6f1c1f0e-6a8f-4f2b-9a1e-0d6b3f0f9a11/file",
    "download_expires_at": "2026-10-23T15:20:11.000Z",
    "error": null,
    "created_at": "2026-10-23T14:20:11.000Z",
    "completed_at": "2026-10-23T14:20:19.000Z"
  }
}
```

### GET /api/v1/image/jobs/{id}/file

**Download the result.** Streams the result file from the processing CDN to your client.

- Free, only reachable by the account that owns the job
- Only until download_expires_at (1 hour after the job finished)
- After that the answer is 410 RESULT_EXPIRED, because the file really is deleted upstream
- The response is image bytes, not JSON

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `id` | path | yes | string | A job_id owned by your account. |

```bash
curl "https://use.apiindonesia.id/api/v1/image/jobs/id/file" \
  -H "x-api-key: YOUR_API_KEY"
```
