# reCAPTCHA v2

> Dapatkan token reCAPTCHA v2 (versi biasa, tak terlihat, dan Enterprise) dengan YesCaptcha: jenis tugas dan harga, parameter permintaan, contoh curl/Python/Node.js, serta format hasil.

Source: https://docs.yescaptcha.com/id/tasks/recaptcha-v2/ · 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/recaptcha-v2/

Tugas reCAPTCHA v2 mengembalikan sebuah token (`gRecaptchaResponse`). Kirim token itu ke situs target untuk lolos verifikasi, tanpa perlu mengklik gambar. Jenis yang paling umum, `NoCaptchaTaskProxyless`, berharga 15 poin (≈ $2.25 / 1k) per tugas dan bersifat asinkron: buat tugas dengan `createTask`, lalu panggil `getTaskResult` setiap 5 detik untuk mengambil hasilnya. Tugas yang gagal dikenali atau melewati batas waktu otomatis mendapat pengembalian poin.

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

Isi permintaan berupa JSON, diautentikasi dengan `clientKey` (ClientKey Anda, salin dari dasbor [yescaptcha.com](https://yescaptcha.com/)). Ambil hasil di endpoint yang sama dengan tempat Anda membuat tugas.

## Kapan digunakan

-   Halaman menampilkan kotak centang “Saya bukan robot” (I’m not a robot): versi biasa.
-   Tidak ada kotak centang, dan soal gambar baru muncul setelah tombol kirim diklik: versi tak terlihat. Tambahkan `"isInvisible": true`.
-   Halaman memuat `recaptcha/enterprise.js`, atau alamat permintaannya mengandung `enterprise`: versi Enterprise. Gunakan jenis yang namanya memuat `Enterprise`.

Jika Anda tidak yakin termasuk yang mana, lihat [Mengenali jenis captcha](https://docs.yescaptcha.com/id/guides/identify-captcha.md). Jika tingkat keberhasilan token kurang memuaskan, Anda bisa beralih ke [pengenalan gambar reCAPTCHA v2](https://docs.yescaptcha.com/id/tasks/recaptcha-classification.md): API memberi tahu gambar mana yang harus diklik, lalu Anda mengkliknya sendiri di browser.

## Jenis tugas dan harga

| Jenis tugas | Harga | Mode | Catatan |
| --- | --- | --- | --- |
| `NoCaptchaTaskProxyless` | $2.25 / 1k; 15 poin/tugas · ¥15 / 1k | Asinkron |  |
| `RecaptchaV2TaskProxyless` | $3.00 / 1k; 20 poin/tugas · ¥20 / 1k | Asinkron | Parameter sama dengan NoCaptchaTaskProxyless tetapi lewat jalur berbeda; keduanya bisa dipakai sebagai cadangan satu sama lain |
| `NoCaptchaTask` | $2.25 / 1k; 15 poin/tugas · ¥15 / 1k | Asinkron | Proxy sendiri |
| `RecaptchaV2EnterpriseTaskProxyless` | $3.00 / 1k; 20 poin/tugas · ¥20 / 1k | Asinkron |  |
| `RecaptchaV2EnterpriseTask` | $3.00 / 1k; 20 poin/tugas · ¥20 / 1k | Asinkron | Proxy sendiri |

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

-   `NoCaptchaTaskProxyless` dan `RecaptchaV2TaskProxyless` memiliki parameter yang sama tetapi jalur berbeda. Jika salah satu tingkat keberhasilannya kurang memuaskan, coba yang lain.
-   Jenis yang namanya tidak memuat `Proxyless` (`NoCaptchaTask`, `RecaptchaV2EnterpriseTask`) memuat captcha melalui proxy Anda sendiri, sehingga perlu mengirim `proxyType`, `proxyAddress`, `proxyPort`, dan field terkait. Gunakan jenis ini jika situs target memeriksa IP pengunjung.

## Parameter permintaan

Field pada objek `task` di `createTask`:

| Kolom | Tipe | Wajib | Deskripsi |
| --- | --- | --- | --- |
| `type` | string | Ya | Jenis tugas; lihat "Jenis tugas dan harga" di halaman ini |
| `websiteURL` | string | Ya | URL lengkap halaman yang menampilkan captcha. Isi dengan situs tempat Anda melihat captcha, bukan domain penyedia captcha |
| `websiteKey` | string | Ya | Kunci situs (sitekey), ada di sumber halaman atau permintaan jaringan; biasanya tidak berubah |
| `isInvisible` | boolean | Tidak | Isi true untuk varian invisible; jangan diisi jika bukan |
| `proxyType` | string | Beberapa jenis | Protokol proxy: `http`, `https`, `socks4`, atau `socks5` (Wajib untuk NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `proxyAddress` | string | Beberapa jenis | Alamat IP atau hostname proxy. Alamat lokal atau privat seperti 127.0.0.1 atau 192.168.x.x tidak akan berfungsi karena server kami tidak dapat menjangkaunya (Wajib untuk NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `proxyPort` | integer | Beberapa jenis | Port proxy (Wajib untuk NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `proxyLogin` | string | Tidak | Nama pengguna proxy, jika proxy memerlukan autentikasi (hanya NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `proxyPassword` | string | Tidak | Kata sandi proxy, jika proxy memerlukan autentikasi (hanya NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `userAgent` | string | Tidak | User-Agent browser. Jika hasil berisi `userAgent`, gunakan nilai tersebut saat Anda mengirimkan token (hanya NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `enterprisePayload` | object | Tidak | Parameter tambahan untuk versi enterprise, misalnya nilai `s` reCAPTCHA Enterprise: `{"s": "..."}`. Jangan diisi jika halaman tidak menggunakannya (hanya RecaptchaV2EnterpriseTaskProxyless, RecaptchaV2EnterpriseTask) |

Cara menemukan `websiteURL` dan `websiteKey` ada di [Mencari parameter reCAPTCHA](https://docs.yescaptcha.com/id/guides/find-recaptcha-parameters.md).

## Contoh permintaan

Menggunakan halaman demo resmi Google:

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

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "NoCaptchaTaskProxyless",
    "websiteURL": "https://www.google.com/recaptcha/api2/demo",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
  }
}
```

Kode lengkap (membuat tugas, memeriksa setiap 5 detik, mencetak token). Sebelum dijalankan, simpan ClientKey Anda di variabel lingkungan `YESCAPTCHA_CLIENT_KEY`:

**curl**

```bash
curl -s https://api.yescaptcha.com/createTask \
  -H 'Content-Type: application/json' \
  -d '{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "NoCaptchaTaskProxyless",
    "websiteURL": "https://www.google.com/recaptcha/api2/demo",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
  }
}'

# Returns {"errorId":0,"taskId":"..."}; then poll every 5 seconds:
curl -s https://api.yescaptcha.com/getTaskResult \
  -H 'Content-Type: application/json' \
  -d '{"clientKey": "YOUR_CLIENT_KEY", "taskId": "TASK_ID"}'
```

**Python**

solve.py

```python
import os
import time

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):
    task_id = call("createTask", {"task": task})["taskId"]
    for _ in range(36):  # Poll every 5 seconds, for up to about 3 minutes
        time.sleep(5)
        result = call("getTaskResult", {"taskId": task_id})
        if result.get("status") == "ready":
            return result["solution"]
    raise TimeoutError(task_id)

solution = solve({
    "type": "NoCaptchaTaskProxyless",
    "websiteURL": "https://www.google.com/recaptcha/api2/demo",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
})
print(solution["gRecaptchaResponse"])
```

**Node.js**

solve.mjs

```js
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 { taskId } = await call('createTask', { task });
  for (let i = 0; i < 36; i++) { // Poll every 5 seconds, for up to about 3 minutes
    await new Promise((r) => setTimeout(r, 5000));
    const result = await call('getTaskResult', { taskId });
    if (result.status === 'ready') return result.solution;
  }
  throw new Error(`timeout: ${taskId}`);
}

const solution = await solve({
  type: "NoCaptchaTaskProxyless",
  websiteURL: "https://www.google.com/recaptcha/api2/demo",
  websiteKey: "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
});
console.log(solution.gRecaptchaResponse);
```

Untuk versi Enterprise, jika halaman mengirim nilai `s` ke reCAPTCHA, masukkan nilai itu ke `enterprisePayload`:

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

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "RecaptchaV2EnterpriseTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "SITE_KEY_OF_THE_PAGE",
    "enterprisePayload": {
      "s": "S_VALUE_FROM_THE_PAGE"
    }
  }
}
```

Dengan proxy sendiri:

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

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "NoCaptchaTask",
    "websiteURL": "https://www.google.com/recaptcha/api2/demo",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
    "proxyType": "http",
    "proxyAddress": "proxy.example.com",
    "proxyPort": 8080,
    "proxyLogin": "user",
    "proxyPassword": "pass"
  }
}
```

## Hasil

`createTask` mengembalikan ID tugas:

```json
{
  "errorId": 0,
  "taskId": "61138bb6-19fb-11ec-a9c8-0242ac110006"
}
```

Gunakan ID itu untuk memanggil `getTaskResult`. Saat tugas masih diproses, responsnya `{"errorId": 0, "status": "processing"}`; periksa lagi 5 detik kemudian. Jika sudah selesai, responsnya:

```json
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "gRecaptchaResponse": "03AGdBq25SxXT-pmSeBXjzScW-EiocHwwpwqtk1QXlJnGnU..."
  }
}
```

| Kolom | Tipe | Deskripsi |
| --- | --- | --- |
| `gRecaptchaResponse` | string | Token yang harus dikirim ke situs target. Sekali pakai, berlaku sekitar 120 detik; gunakan dalam 60 detik |

Sebuah tugas diproses paling lama sekitar 110 detik. Jika melewati batas itu, responsnya `ERROR_TASK_TIMEOUT` dan poin dikembalikan. Saat terjadi error, `errorId` bernilai 1; tangani berdasarkan `errorCode`, lihat [Kode error](https://docs.yescaptcha.com/id/api/errors.md). Cara mengirim token setelah Anda mendapatkannya ada di [Menyelesaikan reCAPTCHA dengan token](https://docs.yescaptcha.com/id/guides/submit-recaptcha-token.md).

> **Tips:** Token hanya bisa dipakai sekali dan berlaku sekitar 120 detik. Sebaiknya kirim dalam 60 detik setelah diterima.

## Pertanyaan umum

### Mengapa token untuk situs yang sama kadang lolos dan kadang tidak?

Situs target yang menentukan. Situs memberi skor pada setiap verifikasi dan menetapkan ambang batas yang bisa diubah kapan saja, sehingga tingkat keberhasilan berbeda di tiap situs dan tidak semua token lolos. Anda bisa membandingkan dengan jenis tugas lain untuk captcha yang sama, atau beralih ke [pengenalan gambar](https://docs.yescaptcha.com/id/tasks/recaptcha-classification.md).

### Berapa lama token berlaku?

Token hanya bisa dipakai sekali dan berlaku sekitar 120 detik. Sebaiknya kirim dalam 60 detik setelah diterima. Masa berlaku ditentukan oleh Google.

### Apakah poin dipotong jika pengenalan gagal?

Tidak. Tugas yang mengembalikan `ERROR_CAPTCHA_UNSOLVABLE` atau melewati batas waktu otomatis mendapat pengembalian poin, lihat [Penagihan dan pengembalian poin](https://docs.yescaptcha.com/id/getting-started/billing.md).

## Tutorial terkait

-   [Mengenali jenis captcha](https://docs.yescaptcha.com/id/guides/identify-captcha.md)
-   [Mencari parameter reCAPTCHA](https://docs.yescaptcha.com/id/guides/find-recaptcha-parameters.md)
-   [Menyelesaikan reCAPTCHA dengan token](https://docs.yescaptcha.com/id/guides/submit-recaptcha-token.md)
-   [Klik gambar reCAPTCHA v2 dengan Selenium](https://docs.yescaptcha.com/id/guides/recaptcha-click-selenium.md)
