SolveHub

Getting started

CAPTCHA Solver API Quick Start: Create a Task in 3 Steps

Integrate the SolveHub CAPTCHA solving API in minutes: get an API key, POST /v1/tasks with an Idempotency-Key, poll GET /v1/tasks/{taskId} and read the solution. cURL examples included.

For authorized QA automation and browser integration. Use only on websites and workflows you have permission to test.

Account, Key and available balance

Register an account and verify your email first (registration requires an email code). New accounts can also bind Telegram to claim 0.10 USD of trial credit and complete a first integration without topping up. If self-service is available in the console, activate it to receive a first Key; you can also bind a Key issued by SolveHub. When self-service is unavailable, contact SolveHub for a Key: email registration alone does not authorize task requests. In the Key page, check tasks permission, expiry, IP restrictions and spending limits, then fund your balance using the current console options. Prices are public; balance and Key status belong to your own account.

  1. Obtain an API Key with the tasks permission from the console, then call GET /v1/prices to confirm that available is true for your target type. The production base URL is https://www.tiam.codes. The local API address is http://127.0.0.1:8080.
  2. Prepare the task parameters according to the CAPTCHA type section in the left sidebar. Submit the outer type and inner task to POST /v1/tasks, sending Authorization: Bearer <API_KEY>, Content-Type: application/json, and an Idempotency-Key of 8–128 characters. Do not include clientKey, taskType, or keys for any other service in the request.
  3. Save the returned taskId. Poll GET /v1/tasks/{taskId} roughly every 2–3 seconds until the status is completed, failed, or cancelled; read the solution of a completed task. Keep waiting on queued, dispatching, and processing. For uncertain, keep the original task and continue polling or contact support; do not blindly recreate it with a new Idempotency-Key.
export SOLVEHUB_URL='https://www.tiam.codes'
export SOLVEHUB_API_KEY='sh_REPLACE_ME'
curl -sS -X POST "$SOLVEHUB_URL/v1/tasks" \
  -H "Authorization: Bearer $SOLVEHUB_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: your-order-12345' \
  -d '{"type":"turnstile","task":{"websiteURL":"https://example.com","websiteKey":"SITE_KEY"}}'
# Save taskId from the response, then poll:
curl -sS -H "Authorization: Bearer $SOLVEHUB_API_KEY" \
  "$SOLVEHUB_URL/v1/tasks/TASK_ID"

A successful creation returns HTTP 202 with fields such as taskId,status,priceMicros,traceId. Once completed, solution returns the result for the CAPTCHA type; result fields differ between types. A successful task is charged at the price frozen at creation time; a definite failure or cancellation refunds the reserved amount. On a network timeout or 5xx, retry with the same Idempotency-Key and the same request body, then query the original task. Idempotency records are kept for only about 25 hours; for long-term deduplication, store the taskId.

The "sample result" snippets below show only the solution field of a completed task. Tokens, cookies, recognized text, and proxies are all placeholder values; read the real result from your own GET /v1/tasks/{taskId} response. Do not rely on the sample values or parse the solution of different types as a single format.

Types that require a custom proxy use proxyType:"http", proxyAddress, and a string proxyPort; the address and port must be provided together. When an optional proxy is omitted, the platform handles the network requests. If a task was solved through a proxy, you usually also need to keep the same egress IP and the returned useragent when consuming the cookies, token, or verification payload. API Keys and proxy credentials should be stored only on the server side.

Testing an authorized Arkose Labs integration? Read the FunCaptcha solver API guide for its required proxy, challenge and browser fields before creating a task.

Platform create and query responses

A successful creation (HTTP 202) returns the platform task object:

{"taskId":"00000000-0000-4000-8000-000000000001","type":"turnstile","status":"queued","priceMicros":200,"traceId":"00000000-0000-4000-8000-000000000002","createdAt":"2026-10-05T00:00:00Z"}

A successful GET /v1/tasks/{taskId} returns the same task object. When status=completed, read solution; when failed, check for TASK_FAILED or TASK_TIMEOUT; when uncertain, the error is TASK_UNCERTAIN, the amount remains reserved, and you should keep querying the original task. priceMicros is the per-task price frozen at creation time, in USD micros (millionths of a dollar).

You can view public list prices on Live prices, or call GET /v1/prices directly. Customers with contracted pricing can call GET /v1/me/prices with their own API Key to see their effective unit prices; the final charge is the priceMicros in the task creation response.

Related documentation

Start with cURLCreate account

Last updated: