> ## Documentation Index
> Fetch the complete documentation index at: https://docs.acedata.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# Cloudflare Turnstile 프로토콜 인식 API 연동 설명

> Cloudflare Turnstile Captcha Service API guide - Ace Data Cloud

본 문서에서는 사용자가 Turnstile CAPTCHA를 인식하고 클릭할 필요 없이 Website Key를 제출하여 백그라운드에서 자동으로 디코딩하고 검증을 완료할 수 있는 Cloudflare Turnstile 프로토콜 인식 API 연동 방법을 소개합니다.

## 신청 절차

Cloudflare Turnstile 프로토콜 인식 API를 사용하려면 먼저 [Ace Data Cloud 콘솔](https://platform.acedata.cloud/console/applications)에서 API Token을 받아야 합니다. 이 Token은 나중에 사용할 수 있도록 보관합니다.

![](https://cdn.acedata.cloud/dvc3cg.jpg)

로그인 또는 등록이 되어 있지 않으면 자동으로 로그인 페이지로 리디렉션되어 등록 및 로그인을 요청합니다. 완료 후 현재 페이지로 자동으로 돌아옵니다.

**하나의 API Token으로 플랫폼의 모든 서비스를 호출할 수 있으며, 각 서비스마다 별도로 신청할 필요가 없습니다.** 처음 신청 시 무료 크레딧이 제공되어 무료로 체험할 수 있습니다. 크레딧이 부족할 경우 [콘솔](https://platform.acedata.cloud/console/coin)에서 일반 잔액을 충전할 수 있습니다.

> 📘 전체 문서: [Cloudflare Turnstile 프로토콜 인식 API →](https://platform.acedata.cloud/documents/captcha-token-turnstile)

## 기본 사용

먼저 기본 사용 방법을 이해해야 합니다. 처리할 Turnstile CAPTCHA가 있는 웹사이트의 URL을 입력하면 처리된 결과를 얻을 수 있습니다. 먼저 `website_url` 필드를 간단히 전달해야 합니다. 우리의 예시 웹사이트는 `https://react-turnstile.vercel.app`이며, `website_url` 페이지에서 `website_key`를 가져와야 합니다. 이 웹페이지를 열고 F12를 눌러 콘솔에 들어가서 Element 페이지에서 `cf-turnstile`을 전역 검색하면 Turnstile을 포함하는 컨테이너 요소를 찾을 수 있습니다. 여기서 `data-sitekey`에 해당하는 문자열이 `website_key`의 값입니다.

설정된 Request Headers는 다음과 같습니다:

* `accept`: 어떤 형식의 응답 결과를 받고 싶은지, 여기서는 `application/json`으로 JSON 형식으로 입력합니다.
* `authorization`: API를 호출하는 키로, 신청 후 드롭다운에서 직접 선택할 수 있습니다.

또한 Request Body를 설정합니다:

* `website_url`: CAPTCHA를 처리할 웹사이트의 URL입니다.
* `website_key`: Cloudflare Turnstile에서의 웹사이트 키 식별자(sitekey)입니다.
* `action`: 선택적 매개변수로, 대상 웹사이트가 Turnstile 구성 요소에 사용자 정의 `action`을 설정한 경우에만 전달해야 합니다.
* `cdata`: 선택적 매개변수로, 대상 웹사이트가 Turnstile 구성 요소에 사용자 정의 `cData`를 설정한 경우에만 전달해야 합니다.

"Try" 버튼을 클릭하면 테스트를 진행할 수 있으며, 다음과 같은 결과를 얻을 수 있습니다:

```json theme={null}
{
  "token": "0.mNQ2f9uP6mQ0y3H5Q8bqO7iM......",
  "started_at": 1784885653.0,
  "finished_at": 1784885665.4,
  "elapsed": 12.4
}
```

반환된 결과는 여러 필드로 구성되어 있으며, 다음과 같이 설명할 수 있습니다:

* `token`: 이번 Cloudflare Turnstile CAPTCHA 작업 처리 후의 검증 결과입니다.
* `started_at`, `finished_at`: 이번 요청의 처리 시작 및 결과 생성 시간으로, Unix 타임스탬프(초, 부동 소수점)입니다.
* `elapsed`: 이번 처리의 총 소요 시간(초)입니다.

처리된 Turnstile CAPTCHA의 검증 결과를 얻었으며, 이를 POST 또는 목표 웹사이트에 제출하는 데 사용할 수 있습니다. 한 번만 사용할 수 있으며 유효 기간은 120초로, 60초 이내에 사용하는 것이 좋습니다. 제출 시 일반적으로 해당 token을 `cf-turnstile-response` 매개변수로 함께 목표 웹사이트에 전송하며, token 검증에 해당하는 Python 코드는 다음과 같습니다:

```python theme={null}
import requests

token = '{token}'

data = {
    'cf-turnstile-response': token
}

response = requests.post('https://react-turnstile.vercel.app', data=data)

if response.status_code == 200:
    print(response.text)
```

또한 해당 연동 코드를 생성하고 싶다면 직접 복사하여 사용할 수 있습니다. 예를 들어 CURL의 코드는 다음과 같습니다:

```shell theme={null}
curl -X POST 'https://api.acedata.cloud/captcha/token/turnstile' \
-H 'accept: application/json' \
-H 'authorization: Bearer {token}' \
-H 'content-type: application/json' \
-d '{
  "website_key": "0x4AAAAAAADnPIDROrmt1Wwj",
  "website_url": "https://react-turnstile.vercel.app"
}'
```

Python의 연동 코드는 다음과 같습니다:

```python theme={null}
import requests

url = "https://api.acedata.cloud/captcha/token/turnstile"

headers = {
    "accept": "application/json",
    "authorization": "Bearer {token}",
    "content-type": "application/json"
}

payload = {
    "website_key": "0x4AAAAAAADnPIDROrmt1Wwj",
    "website_url": "https://react-turnstile.vercel.app"
}

response = requests.post(url, json=payload, headers=headers)
print(response.text)
```

## 비동기 모드 (async)

기본적으로 API는 동기 차단 방식입니다: 한 번의 요청은 token 처리가 완료될 때까지 기다립니다. 여러 디코더를 회전시키는 경우(multi-solver rotation) "작업을 제출한 후 즉시 task\_id를 받고 다른 디코더를 조정한 후 나중에 결과를 읽으러 돌아오고 싶다면" 요청 본문에 `async: true`를 전달할 수 있습니다.

`async: true`를 전달하면 인터페이스는 즉시 `task_id`를 반환하며, 차단 대기하지 않습니다:

```json theme={null}
{
  "task_id": "61138bb6-19aa-11ec-a9c8-0242ac110002",
  "trace_id": "2efa9340-b21b-4e26-9e14-4aac95f343ab"
}
```

진행 상황을 확인하려면 해당 `task_id`를 사용하여 `POST /captcha/tasks`를 조회할 수 있습니다(3\~5초마다 조회하는 것이 좋습니다). 이 인터페이스는 작업 처리를 촉발하거나 진행하지 않습니다; 조회하지 않거나, 네트워크가 끊기거나, 클라이언트를 종료하더라도 서버는 계속해서 처리를 진행합니다:

```shell theme={null}
curl -X POST 'https://api.acedata.cloud/captcha/tasks' \
-H 'accept: application/json' \
-H 'authorization: Bearer {token}' \
-H 'content-type: application/json' \
-d '{
  "task_id": "61138bb6-19aa-11ec-a9c8-0242ac110002"
}'
```

처리 중에는 `status: processing`이 반환되며, 처리 완료 시에는 `status: ready`와 token이 반환됩니다:

```json theme={null}
{
  "success": true,
  "task_id": "61138bb6-19aa-11ec-a9c8-0242ac110002",
  "status": "ready",
  "token": "0.mNQ2f9uP6mQ0y3H5Q8bqO7iM......"
}
```

과금 설명: 비동기 모드에서는 작업 생성 및 "처리 중" 상태 조회는 과금되지 않습니다; **클라이언트가 최초로 성공적인 결과를 읽을 때 한 번 과금됩니다**(기존 동기 모드 가격과 동일). 서버는 작업을 자율적으로 진행하지만, 백그라운드에서 먼저 완료되더라도 조기 과금되지 않습니다. 작업이 120초 이내에 성공하지 않으면 HTTP 504 `timeout`으로 종료되며, 과금되지 않습니다. `/captcha/tasks`는 작업을 진행하지 않습니다.

> 설명: Cloudflare Turnstile은 현재 자체 프록시(Bring Your Own Proxy)를 지원하지 않으므로 이 인터페이스는 `proxy` 매개변수를 수용하지 않습니다; 전달할 경우 `400 invalid_proxy`가 반환됩니다.

## 오류 처리

API를 호출할 때 오류가 발생하면 API는 해당 오류 코드와 정보를 반환합니다. 예를 들어:

* `400 token_mismatched`：잘못된 요청, 누락되었거나 잘못된 매개변수 때문일 수 있습니다.
* `400 invalid_proxy`：잘못된 요청, 이 캡차 유형에 대해 프록시가 지원되지 않습니다.
* `401 invalid_token`：권한 없음, 잘못되었거나 누락된 인증 토큰입니다.
* `429 too_many_requests`：요청이 너무 많습니다, 비율 제한을 초과했습니다.
* `500 api_error`：내부 서버 오류, 서버에서 문제가 발생했습니다.

### 오류 응답 예시

```json theme={null}
{
  "success": false,
  "error": {
    "code": "api_error",
    "message": "fetch failed"
  },
  "trace_id": "2cf86e86-22a4-46e1-ac2f-032c0f2a4e89"
}
```

## 결론

이 문서를 통해 Cloudflare Turnstile 프로토콜 인식 API를 사용하여 사용자가 Turnstile 캡차를 인식하고 클릭할 필요 없이 웹사이트 키를 제출함으로써 백그라운드에서 자동으로 디코딩하고 검증을 완료할 수 있는 방법을 이해하셨습니다. 이 문서가 해당 API를 더 잘 연동하고 사용하는 데 도움이 되기를 바랍니다. 질문이 있으시면 언제든지 기술 지원 팀에 문의해 주십시오.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.