# Cloudflare Turnstile

> Dapatkan token Cloudflare Turnstile dengan YesCaptcha: TurnstileTaskProxyless, TurnstileTaskProxylessM1, dan TurnstileTask dengan proxy sendiri, beserta parameter, contoh, dan hasil yang dikembalikan; serta perbedaannya dengan halaman verifikasi Cloudflare.

Source: https://docs.yescaptcha.com/id/tasks/turnstile/ · Last verified: 2026-10-21

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

Tugas Cloudflare Turnstile mengembalikan sebuah token (`token`) yang dikirim ke situs target untuk lolos verifikasi. `TurnstileTaskProxyless` berharga 25 poin (≈ $3.75 / 1k) per tugas dan bersifat asinkron: panggil `createTask` terlebih dahulu, lalu `getTaskResult` setiap 5 detik. Jika gagal atau waktu habis, poin dikembalikan otomatis.

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

Body permintaan berupa JSON, diautentikasi dengan `clientKey`. Hasil harus dicek di endpoint yang sama dengan tempat tugas dibuat.

## Kapan digunakan

Halaman web memiliki kotak verifikasi Cloudflare (“Pastikan Anda adalah manusia”) yang tertanam di dalam formulir, dan halaman memuat skrip dari `challenges.cloudflare.com/turnstile`.

Jika seluruh halaman diblokir Cloudflare dan menampilkan “Just a moment…” atau “Checking your browser”, itu adalah halaman verifikasi Cloudflare, bukan Turnstile. Gunakan [Halaman verifikasi Cloudflare](https://docs.yescaptcha.com/id/tasks/cloudflare-challenge.md). Perbedaannya dijelaskan di [Mengenali jenis captcha](https://docs.yescaptcha.com/id/guides/identify-captcha.md).

## Jenis tugas dan harga

| Jenis tugas | Harga | Mode | Catatan |
| --- | --- | --- | --- |
| `TurnstileTaskProxyless` | $3.75 / 1k; 25 poin/tugas · ¥25 / 1k | Asinkron |  |
| `TurnstileTaskProxylessM1` | $4.50 / 1k; 30 poin/tugas · ¥30 / 1k | Asinkron |  |
| `TurnstileTask` | $3.75 / 1k; 25 poin/tugas · ¥25 / 1k | Asinkron | Proxy sendiri |

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

-   `TurnstileTaskProxyless` dan `TurnstileTaskProxylessM1` memiliki parameter yang sama tetapi jalur berbeda, sehingga bisa saling menjadi cadangan.
-   `TurnstileTask` memuat captcha lewat proxy Anda sendiri, sehingga field proxy harus diisi.

## Parameter permintaan

| 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) Turnstile, biasanya diawali 0x |
| `pageAction` | string | Tidak | `action` yang diteruskan halaman ke Turnstile (opsi `turnstile.render`, atau `data-action` pada elemen widget), misalnya `login`. Tidak diperlukan di sebagian besar kasus; tambahkan hanya jika tugas terus gagal |
| `data` | string | Tidak | `cData` yang diteruskan halaman ke Turnstile (opsi `turnstile.render`, atau `data-cdata` pada elemen widget), misalnya `c0bd4b36-7419-4e18-83c6-378699f2a9a2`. Tidak diperlukan di sebagian besar kasus; tambahkan hanya jika tugas terus gagal |
| `proxyType` | string | Beberapa jenis | Protokol proxy: `http`, `https`, `socks4`, atau `socks5` (Wajib untuk TurnstileTask) |
| `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 TurnstileTask) |
| `proxyPort` | integer | Beberapa jenis | Port proxy (Wajib untuk TurnstileTask) |
| `proxyLogin` | string | Tidak | Nama pengguna proxy, jika proxy memerlukan autentikasi (hanya TurnstileTask) |
| `proxyPassword` | string | Tidak | Kata sandi proxy, jika proxy memerlukan autentikasi (hanya TurnstileTask) |
| `userAgent` | string | Tidak | User-Agent browser. Jika hasil berisi `userAgent`, gunakan nilai tersebut saat Anda mengirimkan token (hanya TurnstileTask) |

`websiteKey` biasanya diawali `0x`. Cara menemukannya ada di [Mencari parameter Turnstile](https://docs.yescaptcha.com/id/guides/find-turnstile-parameters.md).

### Jika tugas tetap gagal: pageAction dan data

Pada umumnya cukup mengirim `websiteURL` dan `websiteKey`, kedua parameter ini tidak diperlukan. Jika Anda yakin `websiteURL` dan `websiteKey` sudah benar tetapi tugas tetap gagal, periksa apakah halaman mengirim `action` dan `cData` saat memanggil Turnstile (opsi `turnstile.render`, atau `data-action` dan `data-cdata` pada elemen kotak verifikasi). Jika ada, sertakan apa adanya:

-   `pageAction`: isi dengan `action` dari halaman, misalnya `login`
-   `data`: isi dengan `cData` dari halaman, misalnya `c0bd4b36-7419-4e18-83c6-378699f2a9a2`

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

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY",
    "pageAction": "login",
    "data": "c0bd4b36-7419-4e18-83c6-378699f2a9a2"
  }
}
```

## Contoh permintaan

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

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY"
  }
}
```

**curl**

```bash
curl -s https://api.yescaptcha.com/createTask \
  -H 'Content-Type: application/json' \
  -d '{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY"
  }
}'

# 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": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY",
})
print(solution["token"])
```

**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: "TurnstileTaskProxyless",
  websiteURL: "https://example.com/login",
  websiteKey: "0x4AAAAAAA_SITE_KEY",
});
console.log(solution.token);
```

Ganti `websiteURL` dan `websiteKey` dengan nilai dari situs target.

## Hasil yang dikembalikan

```json
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "token": "0.ufq5RgSVZd11DPSX1brdrxnEs28KcVlKj2ORchqxSy2q9yAW6ciq3hriXDF4x...",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36"
  }
}
```

| Kolom | Tipe | Deskripsi |
| --- | --- | --- |
| `token` | string | Token yang harus dikirim ke situs target. Sekali pakai; kirim secepat mungkin |
| `userAgent` | string | User-Agent yang digunakan untuk mendapatkan token. Gunakan nilai ini saat mengirim token, meskipun berbeda dari yang Anda kirim |

Isikan `token` ke field `cf-turnstile-response` di halaman (atau field yang diminta API situs target) lalu kirim. Gunakan `userAgent` yang dikembalikan sebagai User-Agent pada permintaan pengiriman.

Saat masih diproses, hasilnya adalah `{"errorId": 0, "status": "processing"}`; periksa lagi 5 detik kemudian. Jika terjadi error, tangani berdasarkan `errorCode`, lihat [Kode error](https://docs.yescaptcha.com/id/api/errors.md).

## Pertanyaan umum

### Berapa lama token berlaku?

Hanya untuk sekali pakai. Sebaiknya segera dikirim setelah diterima (token Turnstile biasanya kedaluwarsa dalam beberapa menit, ditentukan oleh Cloudflare).

### Setelah dikirim, situs tetap menolak?

Pastikan `websiteURL` adalah halaman tempat kotak verifikasi muncul, `websiteKey` benar, dan pengiriman memakai `userAgent` yang dikembalikan. Jika halaman mengirim `action` dan `cData`, sertakan sebagai `pageAction` dan `data`, lihat [Jika tugas tetap gagal](#). Jika situs juga memeriksa IP, gunakan `TurnstileTask` dan kirim lewat proxy yang sama.

## Tutorial terkait

-   [Mengenali jenis captcha](https://docs.yescaptcha.com/id/guides/identify-captcha.md)
-   [Mencari parameter Turnstile](https://docs.yescaptcha.com/id/guides/find-turnstile-parameters.md)
