Skip to content
easycaptcha.to
Documentation

API reference

HTTP methods, paths, authentication, request bodies and response bodies for the customer API.

Base URL and formats

See the Python and JavaScript token examplesfor a complete task flow, or download the OpenAPI specificationto generate a client. Read burst and fastfor concurrency, priority and pricing details.

The API base URL is https://api.easycaptcha.to. JSON requests use Content-Type: application/json. Successful response bodies use application/json, unless the endpoint returns 204 with no body.

Task identifiers use the full task_ TypeID prefix. Timestamps use UTC RFC 3339. USD balances use integer strings in microcents, with 100,000,000 microcents per dollar.

Using a NopeCHA, 2Captcha, or CapSolver client? See the vendor compatibility APIs for dedicated hostnames and request formats.

Authentication

Task integrations send Authorization: Bearer YOUR_API_KEY. API keys cannot manage accounts or create other API keys.

Endpoint index

hCaptcha recognition payload schema

Shared response object schemas

Errors

HTTP errors return an application/problem+json body. See all problem types and the error schema. Private resources owned by another account return the same 404 as unknown resources. All endpoints can also return method_not_allowed, unsupported_media_type where applicable, or service errors.

A transport failure without a response has no error body. Do not automatically repeat a write after an ambiguous timeout. Check the resource state first when an identifier is available.

Submit a task

POST /v1/task

Create one paid task. The response can wait for completion using hold.

Authentication

API key. Enterprise token tasks require explicit account whitelisting.

Request body

FieldTypePresenceDescription
typestringRequiredhcaptcha_recognition, hcaptcha_token or hcaptcha_enterprise_token.
taskprovider objectRecognition onlyThe hCaptcha challenge object; see the recognition payload schema below.
sitekeystringToken typesSite key for the target hCaptcha integration.
urlstring, URLToken typesURL of the page with the hCaptcha integration.
rqdatastringEnterprise onlyEnterprise request data. Only explicitly whitelisted accounts can submit this task type.
holdnumberOptionalWait in seconds. Default 0, maximum 30. This does not set the task's lifetime.
Submit a task request body
{
  "type": "hcaptcha_token",
  "sitekey": "YOUR_SITEKEY",
  "url": "https://example.com",
  "hold": 30
}

Response

202 application/json when queued or running after hold. 200 application/json when completed or failed during hold. Both return the Task body below.

FieldTypePresenceDescription
task_idtask TypeIDAlwaysUse this identifier to retrieve the task and submit feedback.
typestringAlwayshcaptcha_recognition, hcaptcha_token or hcaptcha_enterprise_token.
statusstringAlwaysqueued, running, completed or failed.
created_atRFC 3339 timestampAlwaysUTC creation time.
completed_attimestamp or nullAlwaysCompletion time when available.
expires_attimestamp or nullAlwaysResult expiry time when available.
resultobject or nullAlwaysCompleted token tasks contain token, a string. Recognition results are keyed by the original task_key: booleans for binary tasks, selection arrays for area tasks, and placement arrays for drag/drop tasks.
errorproblem object or nullAlwaysFailed task's stored Problem Details, without numeric status. See the problems reference.
Submit a task response body
{
  "task_id": "task_01m40t5ag0e008000000000001",
  "type": "hcaptcha_token",
  "status": "queued",
  "created_at": "2026-10-03T12:00:00Z",
  "completed_at": null,
  "expires_at": null,
  "result": null,
  "error": null
}

A task continues when hold ends or the client disconnects. Do not automatically repeat this POST after an ambiguous timeout.

The default JSON body limit is 4 MiB. Unknown types and invalid values are rejected before admission.

Recognition task fields, image inputs, task counts, and drag entities are validated before the task is charged or queued.

Errors

invalid_request, invalid_credentials, insufficient_balance, forbidden, account_suspended, payload_too_large, rate_limited.

Get a task

GET /v1/task/{task_id}

Read an immediate task snapshot. This endpoint does not wait for completion.

Authentication

API key belonging to the task's account.

Path and query parameters

FieldTypePresenceDescription
task_idtask TypeIDPath, requiredIdentifier returned by task submission.

Request body

No request body.

Response

200 application/json. A failed task is also returned with HTTP 200 and an embedded problem in error.

FieldTypePresenceDescription
task_idtask TypeIDAlwaysUse this identifier to retrieve the task and submit feedback.
typestringAlwayshcaptcha_recognition, hcaptcha_token or hcaptcha_enterprise_token.
statusstringAlwaysqueued, running, completed or failed.
created_atRFC 3339 timestampAlwaysUTC creation time.
completed_attimestamp or nullAlwaysCompletion time when available.
expires_attimestamp or nullAlwaysResult expiry time when available.
resultobject or nullAlwaysCompleted token tasks contain token, a string. Recognition results are keyed by the original task_key: booleans for binary tasks, selection arrays for area tasks, and placement arrays for drag/drop tasks.
errorproblem object or nullAlwaysFailed task's stored Problem Details, without numeric status. See the problems reference.
Get a task response body
{
  "task_id": "task_01m40t5ag0e008000000000001",
  "type": "hcaptcha_token",
  "status": "completed",
  "created_at": "2026-10-03T12:00:00Z",
  "completed_at": "2026-10-03T12:00:10Z",
  "expires_at": "2026-10-03T12:05:10Z",
  "result": {
    "token": "HCAPTCHA_TOKEN"
  },
  "error": null
}

The default result retention window is five minutes after completion. Save the result promptly. An expired, unknown or non-owned task returns task_not_found.

Errors

invalid_request, invalid_credentials, task_not_found, account_suspended, rate_limited.

Report a task outcome

POST /v1/task/{task_id}/feedback

Report whether an owned, completed and still-retained task succeeded in use. Feedback is used to improve AI performance.

Authentication

API key belonging to the task's account.

Path and query parameters

FieldTypePresenceDescription
task_idtask TypeIDPath, requiredThe completed task's identifier.

Request body

FieldTypePresenceDescription
successbooleanRequiredtrue for a successful observed outcome, false otherwise.
Report a task outcome request body
{
  "success": true
}

Response

204 No Content. No response body.

Repeating identical feedback is a no-op. Conflicting feedback returns 409.

Errors

invalid_request, invalid_credentials, task_not_found, conflict, rate_limited.

Get recent task history

GET /v1/task-history

Get your latest 50 admitted tasks from the past seven days, newest first. No request body or query parameters. History contains summaries only, with no payloads, solutions or tokens.

Authentication

API key.

Request body

No request body.

Response

200 application/json.

FieldTypePresenceDescription
currencystring, "USD"AlwaysCost currency.
itemsarray, at most 50AlwaysRecent task summaries, newest first.
items[].task_idtask TypeIDAlwaysOriginal task identifier.
items[].typestringAlwaysRecognition, token or enterprise token capability.
items[].statuspending | completed | failedAlwaysPending covers queued/running work; completed means a valid solution was accepted.
items[].cost_microcentsdecimal integer stringAlwaysOriginal charge including group and mode pricing, before any charge reversal.
items[].created_atRFC 3339 timestampAlwaysAdmission time.
items[].completed_attimestamp or nullAlwaysTerminal outcome time; null while pending.
Get recent task history response body
{
  "currency": "USD",
  "items": [
    {
      "task_id": "task_01m40t5ag0e008000000000001",
      "type": "hcaptcha_recognition",
      "status": "completed",
      "cost_microcents": "20000",
      "created_at": "2026-10-04T12:00:00Z",
      "completed_at": "2026-10-04T12:00:02Z"
    }
  ]
}

Entries are retained for at most seven days and may disappear sooner when newer tasks exceed the 50-entry limit. Financial records and aggregate usage have separate retention.

Errors

invalid_credentials, account_suspended, rate_limited, service_unavailable.

Get your task rates

GET /v1/rates

Read your current effective prices, including custom pricing and mode multipliers. No request body or query parameters.

Authentication

API key.

Request body

No request body.

Response

200 application/json.

FieldTypePresenceDescription
currencystring, "USD"AlwaysPricing currency.
burst_multipliernumberAlwaysBurst price multiplier; standard rate 1.5×.
fast_multipliernumberAlwaysFast price multiplier; standard rate 1.2×.
ratesobjectAlwaysContains hcaptcha_recognition, hcaptcha_token and hcaptcha_enterprise_token rates.
rates.<type>.standard_microcentsdecimal integer stringAlwaysBase price per recognition group or token task.
Get your task rates response body
{
  "currency": "USD",
  "rates": {
    "hcaptcha_recognition": {
      "standard_microcents": "10000"
    },
    "hcaptcha_token": {
      "standard_microcents": "200000"
    },
    "hcaptcha_enterprise_token": {
      "standard_microcents": "500000"
    }
  },
  "burst_multiplier": 1.5,
  "fast_multiplier": 1.2
}

1 USD = 100,000,000 microcents. Recognition groups contain nine binary tiles or one area/drag image.

For multiple groups, multiply the standard price by the group count and selected mode multiplier, then round upward once.

Rates apply to new requests. Existing charges retain their original prices.

Errors

invalid_credentials, account_suspended, rate_limited, service_unavailable.

Get available balance

GET /v1/balance

Read the account's available USD credit.

Authentication

API key.

Request body

No request body.

Response

200 application/json.

FieldTypePresenceDescription
currencystring, "USD"AlwaysBalance currency.
balance_microcentsdecimal integer stringAlwaysSigned USD microcents. 1 USD = 100,000,000 microcents. Use integer or decimal arithmetic.
Get available balance response body
{
  "currency": "USD",
  "balance_microcents": "100000000"
}

Errors

invalid_credentials, account_suspended, rate_limited.

List public extensions

GET /v1/extensions

List extensions available to the caller. Anonymous callers see only public extensions; a valid session applies account visibility and permission rules.

Authentication

Optional session. Anonymous callers see only public extensions; a valid session applies account visibility and permission rules.

Path and query parameters

FieldTypePresenceDescription
cursorstringQuery, optionalPagination cursor from next_cursor.
limitintegerQuery, optionalPage size, default 50 and maximum 100.

Request body

No request body.

Response

200 application/json. A page containing items and next_cursor (null when there are no more results).

FieldTypePresenceDescription
itemsExtension[]AlwaysPublic extensions visible without an account.
next_cursorstring or nullAlwaysCursor for the next page.

Errors

invalid_request, rate_limited.

Get the latest extension version

GET /v1/extensions/{extension_id}/version/@latest

Get metadata and a temporary download link for the latest stable release.

Authentication

None.

Path and query parameters

FieldTypePresenceDescription
extension_idextension TypeIDPath, requiredOwning package identifier.

Request body

No request body.

Response

200 application/json. The response describes the selected version and its download link.

FieldTypePresenceDescription
extension_version_idextension_version TypeIDAlwaysRelease identifier.
extension_idextension TypeIDAlwaysOwning package.
versionSemVer stringAlwaysRelease version, including any prerelease suffix.
prereleasebooleanAlwaysWhether this is a prerelease.
browserstring, "chromium"AlwaysTarget browser family.
filenamestringAlwaysDownload filename.
sizeintegerAlwaysPackage size in bytes.
sha25664-character hex stringAlwaysPackage checksum.
release_notesstringAlwaysNotes for this release.
download_urlstring, URLAlwaysTemporary signed package download link.
expires_atRFC 3339 timestampAlwaysDownload link expiry.

Errors

invalid_request, not_found, rate_limited.

Get available extension releases

GET /v1/extensions/{extension_id}/releases

Get the latest stable release and the newest prerelease only when it is newer than stable. Each includes a temporary download link.

Authentication

None.

Path and query parameters

FieldTypePresenceDescription
extension_idextension TypeIDPath, requiredOwning package identifier.

Request body

No request body.

Response

200 application/json. Either release can be null. An extension with no available releases returns both as null.

FieldTypePresenceDescription
stableVersion | nullAlwaysLatest stable release.
prereleaseVersion | nullAlwaysNewest prerelease newer than stable; also available when no stable exists.

Errors

invalid_request, not_found, rate_limited.

Get an extension release

GET /v1/extensions/{extension_id}/version/{version_id}

Get a specific release and a fresh signed download link. Unavailable releases return 404.

Authentication

None.

Path and query parameters

FieldTypePresenceDescription
extension_idextension TypeIDPath, requiredOwning package identifier.
version_idextension_version TypeIDPath, requiredRelease identifier.

Request body

No request body.

Response

200 application/json. A Version object with a temporary signed download link.

Errors

invalid_request, not_found, rate_limited.

hCaptcha recognition payload

Send {"type":"hcaptcha_recognition","task":{…}} toPOST /v1/task. The task field is the challenge object itself. You may also include an optional top-level sitekeystring for site-specific challenge and outcome attribution. Include these challenge fields:

FieldTypePresenceDescription
request_typestringRequiredimage_label_binary, image_label_area_select, or image_drag_drop.
requester_questionstring or localized objectRequiredNonblank text, or string values by locale with a nonblank en entry.
requester_question_exampleimage input or image input arrayOptionalOne example image or an image array. May be omitted, null, an empty string, or an empty array.
tasklistimage task arrayRequiredBinary: exactly 9, 18, or 27 tiles. Area selection and drag/drop: exactly 1, 2, or 3 tasks.
tasklist[].task_keystringRequiredOriginal hCaptcha task identifier, unique within the task list.
tasklist[].datapoint_uriimage inputRequiredBase64 image/video data URI for this tile or full challenge background. Remote URLs are rejected.
tasklist[].entitiesentity arrayDrag/drop onlyBetween 1 and 5 entities for each drag/drop task.
tasklist[].entities[].entity_idstringDrag/drop onlyRequired draggable entity identifier, unique within this task image.
tasklist[].entities[].coords[number, number]Drag/drop onlyOriginal x and y coordinates; retained for entities that are not moved.
tasklist[].entities[].entity_uriimage inputDrag/drop onlyImage content for the draggable entity.
tasklist[].entities[].size[number, number]Drag/drop onlyPositive finite width and height in pixels in the original challenge.

A media input is a nonempty data:image/png;base64,… ordata:video/webm;base64,… URI containing valid base64 data. HTTP(S) and other remote media URLs are rejected. This applies to task images, videos, drag entities, and question examples.

Additional fields inside the challenge are preserved. Image arrays in place of the challenge object and text_free_entry are rejected. Validation runs before charging or queue admission.

Recognition is billed per challenge group: nine binary tiles, one area-selection image, or one drag/drop image. Requests with two or three groups cost twice or three times the base price. Burst and fast multipliers apply to the total, with fractional microcents rounded upward once.

Recognition results are objects keyed by the original task_key. Binary images are processed in consecutive groups of nine, then each tile maps to a boolean: true selects that tile.

Area selection maps each task key to an array of{entity_coords, entity_name} objects. Points use[x, y]; rectangles use [x, y, x+w, y+h]. The name is a zero-based number in click order, starting again for each image.

Drag/drop maps each task key to one placement per entity, in task entity order. Each placement has entity_coords: [x, y] andentity_name equal to the original entity_id. Entities the worker did not move retain their original coords.

Worker coordinates and dimensions use absolute pixels inside the image, video, or canvas. Empty area selections return []. A failed worker group returnsnull under each affected task key.

Response models

Extension version responses use the definition below.

Version

FieldTypePresenceDescription
extension_version_idextension_version TypeIDAlwaysRelease identifier.
extension_idextension TypeIDAlwaysOwning package.
versionSemVer stringAlwaysRelease version, including any prerelease suffix.
prereleasebooleanAlwaysWhether this is a prerelease.
browserstring, "chromium"AlwaysTarget browser family.
filenamestringAlwaysDownload filename.
sizeintegerAlwaysPackage size in bytes.
sha25664-character hex stringAlwaysPackage checksum.
release_notesstringAlwaysNotes for this release.
download_urlstring, URLAlwaysTemporary signed package download link.
expires_atRFC 3339 timestampAlwaysDownload link expiry.

Get started with easycaptcha

Build your next integration with easycaptcha.

Create an account, get your API key, and start submitting hCaptcha jobs. Use typed Python and JavaScript SDKs or integrate directly over HTTP.

Create an accountExplore the API

Prepaid credit. Check pricing before submitting paid tasks.