CAPTCHA の種類 · funcaptcha
Arkose Labs FunCaptcha 解決 API:FunCaptcha トークンを取得
SolveHub API で Arkose Labs FunCaptcha を解決:公開鍵、サイト URL、チャレンジコンテキスト(blob)、ブラウザー情報、プロキシ。フィールド、cURL 例、結果トークン、トラブルシューティング。
許可された QA 自動化とブラウザー連携向けです。テスト権限のあるサイトと業務フローでのみ使用してください。
POST /v1/tasks に Authorization: Bearer <API_KEY>、Content-Type: application/json、Idempotency-Key 付きで送信します。事前にリアルタイム料金で利用可能か確認し、作成から照会までの流れはクイックスタートを参照してください。可用性について:Arkose FunCaptcha は検知の仕組みとチャレンジの更新が非常に頻繁なため、解決成功率はいつでも低下する可能性があり、短期間まったく解決できなくなることもあります。この種別は可用性と成功率を保証しません。高い可用性が必要な業務には使用しないでください。失敗したタスクは課金されず、仮押さえ額は全額返金されます。連携側でリトライとフォールバックを用意してください。
Arkose Labs FunCaptcha の完全な解決:プロキシと、同一の実際のチャレンジから取得した challengeInfo(ページとチャレンジの設定)および browserInfo(再現するブラウザー)を指定します。プラットフォームはこれらをそのまま解決サービスに渡し、成功すると Arkose トークンを返します。すべての値は実際のページとブラウザーから取得してください。捏造した値は通常検知されるか、すぐに失敗します。
リクエストフィールド
外側の type と task は必須です。以下の task.* のパスはすべて task オブジェクト内にあります。フィールド名は大文字と小文字を区別します。長さの制限は UTF-8 のバイト数で計算します。
| フィールド | 型 | 必須 | 制限 | 説明 |
|---|---|---|---|---|
type |
文字列 | はい | funcaptcha 固定 |
プラットフォームのタスク種別。 |
task |
JSON オブジェクト | はい | ≤ 7 MiB | この種別のタスクパラメーター。 |
task.proxy |
ポート付きのプロキシ URL | はい | ≤ 2048 バイト | 解く際に使用するプロキシ。protocol://user:pass@host:port または protocol://ip:port の形式で、protocol は http、https、socks5、ポートは 1–65535。 |
task.challengeInfo |
オブジェクト | はい | 下表を参照 | キャプチャとフィンガープリントの設定。 |
task.browserInfo |
オブジェクト | はい | 下表を参照 | 再現するブラウザーの設定。 |
challengeInfo フィールド
全 41 フィールドで、そのうち 12 個が必須です。任意フィールドを省略すると既定の動作になります。指定する場合は表の型である必要があり、そうでない場合は作成リクエストが 400 INVALID_TASK を返します。表にないフィールドは拒否されます。
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
challengeInfo.publicKey |
空でない文字列 | はい | サイトの Arkose 公開鍵(ページ内の data-pkey / public_key の値)。 |
challengeInfo.site |
空でない文字列 | はい | キャプチャが表示されるサイト。 |
challengeInfo.surl |
空でない文字列 | はい | サイトの Arkose サービス URL(例:https://xxx.arkoselabs.com)。 |
challengeInfo.apiUrl |
空でない文字列 | いいえ | キャプチャの api.js の完全な URL。 |
challengeInfo.capiMode |
空でない文字列 | はい | キャプチャのモード(lightbox、inline など)。 |
challengeInfo.styleTheme |
空でない文字列 | はい | キャプチャのスタイルテーマ(通常は default)。 |
challengeInfo.locationHref |
空でない文字列 | はい | キャプチャを表示するページ(iframe)の location.href。 |
challengeInfo.documentReferrer |
空でない文字列 | はい | そのページの document.referrer。 |
challengeInfo.documentTitle |
空でない文字列 | いいえ | そのページの document.title。 |
challengeInfo.iframeUrl |
空でない文字列 | いいえ | キャプチャ iframe の URL。 |
challengeInfo.ancestorOrigins |
文字列の配列 | はい | location.ancestorOrigins のリスト。空配列も可。 |
challengeInfo.treeIndex |
整数の配列 | はい | ページのフレームツリー内での位置(例:[0])。空配列も可。 |
challengeInfo.treeStructure |
空でない文字列 | はい | フレームツリー構造の文字列(例:"[[]]")。 |
challengeInfo.languageEnabled |
真偽値 | はい | カスタム言語が有効かどうか。 |
challengeInfo.jsfEnabled |
真偽値 | はい | JavaScript フォントが有効かどうか。 |
challengeInfo.appMode |
真偽値 | いいえ | ブラウザーではなくアプリ内で実行される場合は true。 |
challengeInfo.uniqueFingerprint |
真偽値 | いいえ | 既定のアルゴリズムではなく毎回新しいフィンガープリントを使用する。 |
challengeInfo.oldFingerprint |
真偽値 | いいえ | ランダム性を高めるため古いフィンガープリントを使用する。 |
challengeInfo.overrideFingerprint |
真偽値 | いいえ | フィンガープリントの Sec-Ch-Ua と User-Agent を送信した値で上書きする。 |
challengeInfo.syntheticFingerprint |
真偽値 | いいえ | フィンガープリントに合成データを混ぜる。 |
challengeInfo.randomProtoChain |
真偽値 | いいえ | ランダムなプロトタイプチェーンハッシュを使用する。 |
challengeInfo.randomVideoExtended |
真偽値 | いいえ | 拡張ビデオコーデック情報をランダムにする。 |
challengeInfo.staticSpeechData |
真偽値 | いいえ | 既定の音声データを使用する。 |
challengeInfo.customTimezoneOffset |
整数 | いいえ | タイムゾーンオフセット(分)。JavaScript の getTimezoneOffset() と同じ。 |
challengeInfo.historyLength |
整数 | いいえ | 含める閲覧履歴の長さ(history.length)。 |
challengeInfo.noIframe |
真偽値 | いいえ | キャプチャが別の iframe で読み込まれない場合は true。 |
challengeInfo.lowBandwidthMode |
真偽値 | いいえ | 低帯域モード:最新の capi 情報を使い不要なリクエストを減らす。検知されたり誤った capi 情報を使う可能性がある。 |
challengeInfo.storageAccess |
真偽値 | いいえ | Sec-Fetch-Storage-Access ヘッダーを使用するかどうか。 |
challengeInfo.solvePOW |
真偽値 | いいえ | プルーフ・オブ・ワーク(PoW)が出た場合に解く。 |
challengeInfo.cookieTimestamp |
真偽値 | いいえ | タイムスタンプ Cookie を含めるかどうか。 |
challengeInfo.disableArid |
真偽値 | いいえ | ARID Cookie と X-Ark-Arid ヘッダーを無効にする。 |
challengeInfo.disableAridCookie |
真偽値 | いいえ | ARID Cookie のみを無効にする。 |
challengeInfo.disableCookies |
真偽値 | いいえ | すべての Cookie を無効にする。 |
challengeInfo.disableCookiesAnalytics |
真偽値 | いいえ | 分析用 Cookie を無効にする。 |
challengeInfo.disableGT2Cookies |
真偽値 | いいえ | gt2/public_key エンドポイントの Cookie を無効にする。 |
challengeInfo.disableNavigatorCookies |
真偽値 | いいえ | navigator Cookie(navigator.cookieEnabled)を無効にする。 |
challengeInfo.powPause |
真偽値 | いいえ | CPU が PoW を解く際の自然な待ち時間を再現する。 |
challengeInfo.exploitMode |
真偽値 | いいえ | プロキシを使わず高速な方法で解く。 |
challengeInfo.skipHighWaves |
真偽値 | いいえ | 6 ウェーブ以上のチャレンジは解かずにエラーで終了する。 |
challengeInfo.submitAnswerPause |
真偽値 | いいえ | 回答送信時に自然な待ち時間を入れる。 |
challengeInfo.extraData |
オブジェクト | いいえ | FunCaptcha に data[<キー>] として送る追加データ(例:Roblox の {"blob": "..."})。 |
browserInfo フィールド
全 16 フィールドで、そのうち 5 個(User-Agent、Linux、Mac、Mobile、Safari)が必須です。User-Agent、Sec-Ch-Ua、Accept-Language などは同じ実際のブラウザーから取得し、プラットフォームのフラグと一致させてください。
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
browserInfo.Accept-Language |
空でない文字列 | いいえ | Accept-Language ヘッダー(例:en-US,en;q=0.9)。 |
browserInfo.Cache |
真偽値 | いいえ | ブラウザーキャッシュを使用するかどうか。 |
browserInfo.Cookie |
空でない文字列 | いいえ | 解く際に使用する Cookie。 |
browserInfo.DNT |
真偽値 | いいえ | Do Not Track ヘッダーを付けるかどうか(Brave などに適する)。 |
browserInfo.HTTP3 |
真偽値 | いいえ | HTTP/3 を使用するかどうか。プロキシが HTTP/3 に対応している必要がある。 |
browserInfo.Linux |
真偽値 | はい | Linux 端末として振る舞うかどうか。 |
browserInfo.Mac |
真偽値 | はい | Mac 端末として振る舞うかどうか。 |
browserInfo.Mobile |
真偽値 | はい | モバイル端末として振る舞うかどうか。 |
browserInfo.Safari |
真偽値 | はい | Safari ブラウザーとして振る舞うかどうか。 |
browserInfo.Sec-Ch-Ua |
空でない文字列 | いいえ | Sec-Ch-Ua ヘッダー。 |
browserInfo.Sec-Ch-Ua-Platform |
空でない文字列 | いいえ | Sec-Ch-Ua-Platform ヘッダー(例:"Windows")。 |
browserInfo.User-Agent |
空でない文字列 | はい | User-Agent ヘッダー。Linux/Mac/Mobile/Safari の設定と一致させる。 |
browserInfo.dataBrands |
空でない文字列 | いいえ | フィンガープリントで使用する data brands。 |
browserInfo.languages |
空でない文字列 | いいえ | 使用する言語。通常は Accept-Language と一致させる。 |
browserInfo.randomTLS |
真偽値 | いいえ | ランダムな TLS フィンガープリントを使う。HTTP/3 は使えなくなる。 |
browserInfo.userbrowser |
空でない文字列 | いいえ | userbrowser の値。User-Agent と少し異なる場合がある。 |
作成リクエストの例
以下の例には必須フィールドとよく使うヘッダーのみが含まれています。値はすべてプレースホルダーなので、ページの実際の値に置き換えてください。
{
"type": "funcaptcha",
"task": {
"proxy": "http://user:pass@203.0.113.10:8080",
"challengeInfo": {
"publicKey": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"site": "https://example.com",
"surl": "https://example.arkoselabs.com",
"capiMode": "lightbox",
"styleTheme": "default",
"locationHref": "https://example.com",
"documentReferrer": "https://example.com",
"ancestorOrigins": [
"https://example.com"
],
"treeIndex": [
0
],
"treeStructure": "[[]]",
"languageEnabled": true,
"jsfEnabled": true
},
"browserInfo": {
"Accept-Language": "en-US,en;q=0.9",
"Linux": false,
"Mac": false,
"Mobile": false,
"Safari": false,
"Sec-Ch-Ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36"
}
}
}
cURL での呼び出し
例の Key、サイト情報、プロキシを実際の値に置き換えてください。同じ業務リクエストでは Idempotency-Key を変えないでください。
curl -sS -X POST 'https://www.tiam.codes/v1/tasks' \
-H 'Authorization: Bearer sh_REPLACE_ME' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: example-funcaptcha-0001' \
--data-binary @- <<'JSON'
{
"type": "funcaptcha",
"task": {
"proxy": "http://user:pass@203.0.113.10:8080",
"challengeInfo": {
"publicKey": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"site": "https://example.com",
"surl": "https://example.arkoselabs.com",
"capiMode": "lightbox",
"styleTheme": "default",
"locationHref": "https://example.com",
"documentReferrer": "https://example.com",
"ancestorOrigins": [
"https://example.com"
],
"treeIndex": [
0
],
"treeStructure": "[[]]",
"languageEnabled": true,
"jsfEnabled": true
},
"browserInfo": {
"Accept-Language": "en-US,en;q=0.9",
"Linux": false,
"Mac": false,
"Mobile": false,
"Safari": false,
"Sec-Ch-Ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36"
}
}
}
JSON
作成レスポンスと照会
作成に成功すると HTTP 202 が返り、status は通常最初は queued です。taskId を保存し、約 2~3 秒ごとに GET /v1/tasks/{taskId} を呼び出してください。この種別のソフトタイムリミットは 180 秒です。解決中のステータスは dispatching または processing、終了後は completed または failed です。タイムリミットを過ぎても結果が得られないタスクは uncertain になります。元のタスクの照会を続け、新しい冪等キーで作り直さないでください。
結果フィールド
status=completed のとき、solution は次のオブジェクトです:
| フィールド | 型 | 読み取り方 |
|---|---|---|
solution.solution |
文字列 | 対象サイトに送信する Arkose トークン(通常は fc-token / verification-token などに設定)。` |
solution.gameInfo.gameType |
整数 | 今回のチャレンジのゲーム種別。 |
solution.gameInfo.variant |
文字列 | チャレンジのバリアント。silent_pass は回答なしで通過したことを示します。 |
solution.gameInfo.waves |
整数 | 回答したウェーブ数。0 はサイレント通過。 |
solution.gameInfo.solveTime |
数値 | 解決にかかった時間(秒)。 |
成功レスポンスの例:
{
"taskId": "5a1c6c55-7f3b-4c5d-9a7e-2f0d8e1b9c21",
"type": "funcaptcha",
"status": "completed",
"priceMicros": 2000,
"traceId": "0f3b2d7e-91a4-4c62-8a51-7d2e9c4b1f08",
"solution": {
"gameInfo": {
"gameType": 4,
"solveTime": 0.32,
"variant": "silent_pass",
"waves": 0
},
"solution": "XXXXXXXXXXXXXXXXX.XXXXXXXXXX|r=eu-west-1|meta=3|metabgclr=transparent|metaiconclr=%23757575|maintxtclr=%23b8b8b8|guitextcolor=%23474747|pk=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX|at=40|sup=1|rid=1|ag=101|cdn_url=https%3A%2F%2Fexample.arkoselabs.com%2Fcdn%2Ffc|surl=https%3A%2F%2Fexample.arkoselabs.com|smurl=https%3A%2F%2Fexample.arkoselabs.com%2Fcdn%2Ffc%2Fassets%2Fstyle-manager"
},
"createdAt": "2026-10-13T08:00:00Z",
"finishedAt": "2026-10-13T08:00:06Z"
}
失敗レスポンスの例:
{
"taskId": "5a1c6c55-7f3b-4c5d-9a7e-2f0d8e1b9c21",
"type": "funcaptcha",
"status": "failed",
"priceMicros": 2000,
"traceId": "0f3b2d7e-91a4-4c62-8a51-7d2e9c4b1f08",
"errorCode": "TASK_FAILED",
"failureReason": "Too many waves to solve, make skipHighWaves false in challengeInfo to solve anyway",
"createdAt": "2026-10-13T08:00:00Z",
"finishedAt": "2026-10-13T08:00:04Z"
}
失敗とトラブルシューティング
失敗したタスク(status=failed)は課金されず、仮押さえ額は全額返金されます。failureReason には解決サービスが返した具体的な理由が入ります。よくある理由と対処:
| failureReason(例) | 原因 | 対処 |
|---|---|---|
Too many waves to solve, make skipHighWaves false in challengeInfo to solve anyway |
チャレンジが 6 ウェーブ以上で、challengeInfo.skipHighWaves が true。 |
skipHighWaves を false にする(または省略する)して新しいタスクを作成する。 |
Failed to get proxy / IP information |
プロキシに接続できない、または出口 IP を取得できない。 | プロキシのアドレス、ポート、認証情報、利用可否を確認する。 |
Incorrect proxy format. Please use protocol://user:pass@host:port or protocol://ip:port |
プロキシの形式が解決サービスに受け付けられない。 | protocol://user:pass@host:port の形式で指定する。 |
HTTP/3 proxies must be used on Roblox right now |
解決サービスは現在 Roblox に HTTP/3 プロキシを必須としており、使用中のプロキシが条件を満たさない。 | HTTP/3 対応のプロキシに変更して再試行する。 |
Unsupported surl |
この surl はまだサポートされていない。 |
surl が実際のページから取得したものか確認し、それでも未対応の場合はプラットフォームのサポートに連絡する。 |
再送信する際は新しい Idempotency-Key を使用してください(同じキーでは元の失敗タスクが返ります)。フィールドの型や必須項目が正しくない場合、作成リクエストは直ちに 400 INVALID_TASK を返し、タスクは作成されず課金もされません。
作成リクエストでよくあるエラーは 400 INVALID_TASK、402 INSUFFICIENT_BALANCE、429 TASK_LIMIT_EXCEEDED、503 TYPE_UNAVAILABLE です。作成済みタスクが失敗した場合の公開エラーコードは TASK_FAILED または TASK_TIMEOUT で、uncertain には TASK_UNCERTAIN が対応します。詳細は プラットフォーム API リファレンス を参照してください。
関連ドキュメント
最終更新: