# Gambar ke Excel

Ubah tabel cetak dari tangkapan layar, hasil pemindaian, atau foto menjadi buku kerja XLSX yang dapat diedit.

Dokumentasi resmi: https://img2excel.net/id/docs/api/image-to-excel

`POST /api/v1/image-to-excel`

Ubah tabel cetak dari tangkapan layar, hasil pemindaian, atau foto menjadi buku kerja XLSX yang dapat diedit. Endpoint sinkron menunggu konversi selesai. Konversi yang gagal tidak menggunakan kredit.

## Permintaan

### Header

| Header | Wajib | Keterangan |
| --- | --- | --- |
| `Authorization` | Ya | `Bearer $IMG2EXCEL_API_KEY`. Gunakan kunci API di server. |
| `Content-Type` | Ya | `multipart/form-data` dengan boundary. Biarkan klien HTTP mengatur header ini saat mengirim file. |
| `Idempotency-Key` | Tidak | Kunci idempotensi, maksimal 200 karakter. Disarankan untuk setiap unggahan; gunakan nilai yang sama saat mengulang unggahan tersebut. |

### Isi permintaan

| Kolom | Tipe | Wajib | Keterangan |
| --- | --- | --- | --- |
| `file` | File biner | Ya | Satu gambar PNG, JPG, atau JPEG, maksimal 4 MB. |

Kirim gambar sebagai unggahan file, bukan isi JSON atau URL gambar. Endpoint memilih profil pengenalan secara otomatis.

## Contoh permintaan

Jalankan contoh di server setelah mengatur `IMG2EXCEL_API_KEY`. Python memerlukan `pip install requests`; Node.js memerlukan versi 20 atau lebih baru.


### cURL

```bash
curl --fail-with-body --max-time 330 -i https://img2excel.net/api/v1/image-to-excel \
  -H "Authorization: Bearer $IMG2EXCEL_API_KEY" \
  -H "Idempotency-Key: image-to-excel-001" \
  -F "file=@spreadsheet-photo.jpg"
```


### Python

```python
import os
import requests

with open("spreadsheet-photo.jpg", "rb") as image:
    response = requests.post(
        "https://img2excel.net/api/v1/image-to-excel",
        headers={
            "Authorization": f"Bearer {os.environ['IMG2EXCEL_API_KEY']}",
            "Idempotency-Key": "spreadsheet-photo-001",
        },
        files={"file": ("spreadsheet-photo.jpg", image, "image/jpeg")},
        timeout=330,
    )

response.raise_for_status()
job = response.json()
print(job["result"]["download_url"])
```


### Node.js

```ts
import { readFile } from 'node:fs/promises';

const file = await readFile('spreadsheet-photo.jpg');
const form = new FormData();
form.set('file', new File([file], 'spreadsheet-photo.jpg', { type: 'image/jpeg' }));

const response = await fetch('https://img2excel.net/api/v1/image-to-excel', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.IMG2EXCEL_API_KEY}`,
    'Idempotency-Key': 'spreadsheet-photo-001',
  },
  body: form,
  signal: AbortSignal.timeout(330_000),
});

if (!response.ok) throw new Error(await response.text());
const job = await response.json();
console.log(job.result.download_url);
```




## Respons

**200 OK** — konversi selesai. Unduh file Excel melalui `result.download_url`. URL pada contoh hanyalah ilustrasi.

```json
{
  "id": "job_0123456789abcdef0123456789abcdef",
  "type": "image-to-excel",
  "status": "succeeded",
  "credits_reserved": 1,
  "credits_used": 1,
  "created_at": "2026-10-04T09:00:00.000Z",
  "completed_at": "2026-10-04T09:00:08.000Z",
  "result": {
    "filename": "table_result.xlsx",
    "content_type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    "size_bytes": 17330,
    "download_url": "https://signed-storage-url.example/...",
    "download_url_expires_in": 900
  }
}
```

**422 Unprocessable Entity** — konversi gagal. Respons berisi ID tugas, `status: "failed"`, `error.code`, dan `error.message`. Kredit tidak digunakan.

Jika kunci cocok dengan konversi yang sudah ada, respons menyertakan `Idempotent-Replayed: true`. Tugas selesai mengembalikan `200`; hasil kedaluwarsa, `410`. Jika tugas awal masih mengantre atau diproses, pengulangan mengembalikan `202` dengan `Location`. Periksa URL tersebut tanpa membuat konversi baru.

Lihat seluruh kolom respons di [Tugas dan kesalahan](https://img2excel.net/id/docs/api/jobs). Panggilan sinkron dan asinkron berbagi catatan tugas, batas akun, dan kunci idempotensi untuk setiap jenis konversi.

Endpoint sinkron menunggu konversi selesai. Atur batas waktu klien HTTP menjadi 330 detik. Jika koneksi kehabisan waktu, ulangi dengan `Idempotency-Key` yang sama. Kunci baru memulai konversi baru.

## Konversi asinkron (opsional)

Gunakan `POST /api/v1/image-to-excel/jobs` untuk mengirim tanpa menunggu. Kolom dan autentikasi tetap sama. Tugas baru mengembalikan `202`, ID, dan `Location`. Periksa `GET /api/v1/jobs/{job_id}` setiap 2–3 detik hingga `succeeded`, `failed`, atau `expired`. Jika berhasil, unduh `result.download_url`. Lihat [Tugas dan kesalahan](https://img2excel.net/id/docs/api/jobs).

---

OpenAPI 3.1: https://img2excel.net/api/openapi.json
Dokumentasi API lengkap: https://img2excel.net/id/docs/api/text/llms-full.txt
