# Pengenalan teks pada gambar

> Kenali huruf dan angka di dalam gambar dengan YesCaptcha. ImageToTextTaskOcrBase dan ImageToTextTaskMuggle mengembalikan hasil secara sinkron; ImageToTextTask dan ImageToTextTaskM1 bersifat asinkron dan mendukung huruf besar/kecil, hanya angka, ekspresi hitung, dan batas panjang; model khusus tersedia.

Source: https://docs.yescaptcha.com/id/tasks/image-to-text/ · Last verified: 2026-10-15

> This page was machine-translated from the Chinese version. If anything differs, the Chinese version prevails: https://docs.yescaptcha.com/zh/tasks/image-to-text/

Kirim gambar captcha berupa karakter dalam format Base64, lalu terima huruf dan angka di dalam gambar (`solution.text`). `ImageToTextTaskOcrBase` dikenai biaya 2 poin (≈ $0.30 / 1k) per gambar dan bersifat sinkron: satu permintaan `createTask` langsung mengembalikan hasilnya. Jika Anda memerlukan ketentuan seperti huruf besar/kecil, hanya angka, atau ekspresi hitung, gunakan `ImageToTextTask` yang asinkron.

- POST `https://api.yescaptcha.com/createTask` (Endpoint global)
- POST `https://cn.yescaptcha.com/createTask` (Endpoint Tiongkok)

Isi permintaan berupa JSON, dengan autentikasi memakai `clientKey`.

## Jenis tugas dan harga

| Jenis tugas | Harga | Mode | Catatan |
| --- | --- | --- | --- |
| `ImageToTextTaskOcrBase` | $0.30 / 1k; 2 poin/tugas · ¥2 / 1k | Sinkron |  |
| `ImageToTextTaskMuggle` | $0.30 / 1k; 2 poin/tugas · ¥2 / 1k | Sinkron | Tidak mendukung opsi case/numeric; gunakan project\_name untuk memilih model khusus |
| `ImageToTextTask` | $0.60 / 1k; 4 poin/tugas · ¥4 / 1k | Asinkron |  |
| `ImageToTextTaskM1` | $2.25 / 1k; 15 poin/tugas · ¥15 / 1k | Asinkron |  |

Harga dalam dolar AS adalah perkiraan dengan kurs US$1 ≈ ¥6.67; tugas ditagih dalam poin.

| Kebutuhan | Gunakan |
| --- | --- |
| Captcha huruf dan angka biasa, paling murah dan paling cepat | `ImageToTextTaskOcrBase`, `ImageToTextTaskMuggle` (sinkron) |
| Dikenali dengan model yang dibuat khusus untuk Anda | `ImageToTextTaskMuggle` dengan `project_name` |
| Perlu membedakan huruf besar/kecil, hanya angka, menghitung ekspresi, membatasi panjang | `ImageToTextTask`, `ImageToTextTaskM1` (asinkron) |

Setiap jenis memakai model dan jalur yang berbeda, sehingga hasil untuk gambar yang sama bisa berbeda. Coba semuanya terlebih dahulu, lalu pilih yang terbaik.

## Parameter permintaan

| Kolom | Tipe | Wajib | Deskripsi |
| --- | --- | --- | --- |
| `type` | string | Ya | Jenis tugas; lihat "Jenis tugas dan harga" di halaman ini |
| `body` | string | Ya | Gambar yang dienkode Base64 tanpa prefiks `data:image/...;base64,` dan tanpa baris baru |
| `project_name` | string | Tidak | Nama model khusus, hanya didukung oleh `ImageToTextTaskMuggle`. Jangan diisi untuk memakai model alfanumerik umum. Hubungi Dukungan untuk model khusus (hanya ImageToTextTaskMuggle) |
| `phrase` | boolean | Tidak | true berarti jawaban berisi setidaknya satu spasi (hanya ImageToTextTask, ImageToTextTaskM1) |
| `case` | boolean | Tidak | true berarti jawaban peka huruf besar/kecil (hanya ImageToTextTask, ImageToTextTaskM1) |
| `numeric` | integer | Tidak | 0 tanpa persyaratan; 1 hanya angka; 2 tanpa angka (hanya ImageToTextTask, ImageToTextTaskM1) |
| `math` | boolean | Tidak | true berarti gambar berupa ekspresi matematika dan jawabannya adalah hasilnya (hanya ImageToTextTask, ImageToTextTaskM1) |
| `minLength` | integer | Tidak | Panjang jawaban minimum; 0 berarti tanpa batas (hanya ImageToTextTask, ImageToTextTaskM1) |
| `maxLength` | integer | Tidak | Panjang jawaban maksimum; 0 berarti tanpa batas (hanya ImageToTextTask, ImageToTextTaskM1) |

`body` adalah encoding Base64 dari file gambar. Gambar WebP dikonversi secara otomatis.

> **Perhatian:** Jangan sertakan awalan `data:image/...;base64,` dan jangan ada baris baru di dalam Base64.

## Contoh permintaan

POST https://api.yescaptcha.com/createTask

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "ImageToTextTaskOcrBase",
    "body": "BASE64_IMAGE"
  }
}
```

Kode lengkap (membaca `captcha.png` di direktori saat ini):

**curl**

```bash
# Replace BASE64_IMAGE with the Base64-encoded image
curl -s https://api.yescaptcha.com/createTask \
  -H 'Content-Type: application/json' \
  -d '{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "ImageToTextTaskOcrBase",
    "body": "BASE64_IMAGE"
  }
}'
```

**Python**

solve.py

```python
import os
import base64

import requests

API = "https://api.yescaptcha.com"
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]  # Read the clientKey from an environment variable

def call(method, payload):
    r = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30)
    data = r.json()
    if data.get("errorId"):
        raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
    return data

def solve(task):
    return call("createTask", {"task": task})["solution"]

# Base64-encode the image (no data: prefix)
with open("captcha.png", "rb") as f:
    image_b64 = base64.b64encode(f.read()).decode()

solution = solve({
    "type": "ImageToTextTaskOcrBase",
    "body": image_b64,
})
print(solution["text"])
```

**Node.js**

solve.mjs

```js
import { readFileSync } from 'node:fs';

const API = 'https://api.yescaptcha.com';
const CLIENT_KEY = process.env.YESCAPTCHA_CLIENT_KEY; // Read the clientKey from an environment variable

async function call(method, payload) {
  const res = await fetch(`${API}/${method}`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ clientKey: CLIENT_KEY, ...payload }),
  });
  const data = await res.json();
  if (data.errorId) throw new Error(`${data.errorCode}: ${data.errorDescription}`);
  return data;
}

async function solve(task) {
  const { solution } = await call('createTask', { task });
  return solution;
}

// Base64-encode the image (no data: prefix)
const imageB64 = readFileSync('captcha.png').toString('base64');

const solution = await solve({
  type: "ImageToTextTaskOcrBase",
  body: imageB64,
});
console.log(solution.text);
```

Tugas asinkron dengan ketentuan tambahan:

POST https://api.yescaptcha.com/createTask

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "ImageToTextTask",
    "body": "BASE64_IMAGE",
    "case": true,
    "numeric": 0,
    "minLength": 4,
    "maxLength": 6
  }
}
```

## Hasil

Jenis sinkron langsung mengembalikan hasil di `createTask`:

```json
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "text": "LMResm"
  },
  "taskId": "2376919c-1863-11ec-a012-94e6f7355a0b"
}
```

Jenis asinkron (`ImageToTextTask`, `ImageToTextTaskM1`) lebih dulu mengembalikan `taskId`, lalu lakukan polling (memeriksa berkala) dengan `getTaskResult` setiap 5 detik. Setelah selesai, format `solution` sama.

| Kolom | Tipe | Deskripsi |
| --- | --- | --- |
| `text` | string | Teks yang berhasil dikenali |

## Model khusus

Model umum dapat dipakai untuk semua captcha huruf dan angka, tetapi akurasinya sedikit lebih rendah daripada model yang dilatih khusus. Jika gambar yang ingin Anda kenali selalu memiliki satu gaya yang sama, [hubungi dukungan](https://docs.yescaptcha.com/id/help/contact.md) untuk membuat model khusus, lalu tentukan modelnya dengan `ImageToTextTaskMuggle` dan `project_name`.

## Pertanyaan umum

### Apakah poin dipotong jika hasilnya salah?

Untuk jenis sinkron, poin dipotong setiap kali hasil dikembalikan, meskipun hasilnya salah. Anda bisa membandingkan dengan jenis lain, atau meminta model khusus.

### Saya mendapat `ERROR_ZERO_CAPTCHA_FILESIZE` atau `ERROR_PARSE_IMAGE_FAIL`?

Base64 gambar tidak lengkap, atau memakai awalan `data:` atau ada baris baru. Periksa encoding-nya, lihat [Kode error](https://docs.yescaptcha.com/id/api/errors.md).

## Contoh terkait

-   [Mulai cepat](https://docs.yescaptcha.com/id/getting-started/quickstart.md): mengirim permintaan pertama dengan `ImageToTextTaskOcrBase`
-   [Contoh Python](https://docs.yescaptcha.com/id/samples/python.md)
