CAPTCHA Solving
Read NexCaptcha products and prices and each product's parameter model, submit solving tasks, list task records, and query results. Submitting a task takes only the product code and adapter; the server pre-charges the current price. Failed or expired tasks are refunded automatically by the server.
Recommended flow: pick a product with /captcha/products → read its parameters with /captcha/schema → submit with /captcha/buy → poll /captcha/query until a terminal state. For CAPTCHAs on a page, the captchaInspect and captchaApply automation actions collect the parameters and fill in the answer. For the conventions shared by all service endpoints, see Service and authentication.
For page CAPTCHAs through MCP, call nex_browser_captcha_prepare for free, then call nex_browser_captcha_submit with only prepareId to charge directly, and call nex_browser_captcha_complete with the same ID. Later grid rounds return nextPrepareId and nextPreparation; submit the new preparation as needed, without quotation or fee confirmation.
Normal Grid continuation is not a solving failure; follow the returned continuation instructions without duplicate submissions. A confirmed failed/expired task or site-rejected answer may reconcile the original task and billing, acquire a fresh challenge and retry automatically. Interactive recovery defaults to at most 3 attempts including the first; a new paid submission counts toward that limit. Unknown payment/task outcomes permit querying the original record, not duplicate purchases. Insufficient balance stops further spending.
Showing 5 of 5 endpoints
/captcha/productsList solving products
Lists the currently enabled CAPTCHA solving products and their per-request prices; productCode is used to read the parameter model and submit tasks.
Request parameters
None
Notes
- price does not need further multiplication or rounding.
- Before submitting a task, call /captcha/schema to read the product's parameter requirements.
Response fields
| Field | Type | Description |
|---|---|---|
contextId | string | Sign-in and team context identifier for this request, usable as X-Nex-Service-Context in subsequent requests |
data | object[] | Product list |
data[].productCode | string | Product code, case-sensitive |
data[].name | string | Product name |
data[].description | string | Product description |
data[].price | number | Per-request price, USDT, already rounded up to 3 decimal places by the server; the server calculates the actual charge |
data[].iconBase64 | string | Product icon, may be null |
data[].sortOrder | number | Sort value |
Response example
{
"code": 0,
"msg": "成功",
"data": [
{
"productCode": "RECAPTCHA_V2",
"name": "reCAPTCHA v2",
"description": "产品描述",
"price": 0.005,
"iconBase64": null,
"sortOrder": 2
}
],
"contextId": "a3f5c2e1b7d94c0e8f6a1b2c3d4e5f60a3f5c2e1b7d94c0e8f6a1b2c3d4e5f6"
}
/captcha/schemaGet product parameter model
Reads the product's current adapter parameter schema, examples, result contract, and integration flow notes; free, and no task is created.
Request parameters
| Field | Type | Required | Description |
|---|---|---|---|
productCode | string | Required | Product code, must exactly match /captcha/products, with case and spaces preserved |
Notes
- An empty or whitespace-only productCode returns -1100; products not recognized upstream return a server error code with the original msg preserved.
- Notes are returned according to Accept-Language; parameter names and raw schema descriptions are not guaranteed to be translated.
Response fields
| Field | Type | Description |
|---|---|---|
contextId | string | Sign-in and team context identifier for this request, usable as X-Nex-Service-Context in subsequent requests |
data.productCode | string | Product code |
data.schema | object | JSON Schema of adapter, including constraints such as required, oneOf, allowed values, and extra fields |
data.example | object | Minimal placeholder example; must be replaced with real parameters from the target page |
data.integration | object | Applicable flows, input sources, result type resultSchema, and limitations |
data.integration.readiness | string | Integration status; DOCUMENTATION_REQUIRED means the documentation is incomplete and paid tasks must not be created based on it |
data.integration.workflows | string[] | Allowed flows, e.g. HTTP_SUBMIT, BROWSER_RESULT, BROWSER_INTERACTION |
data.workflowGuide | object | General flow, completion stages, and failure handling guidance |
Response example
{
"code": 0,
"msg": "成功",
"data": {
"productCode": "RECAPTCHA_V2",
"schema": {
"type": "object",
"required": [
"websiteURL",
"websiteKey"
],
"properties": {
"websiteURL": {
"type": "string"
},
"websiteKey": {
"type": "string"
}
}
},
"example": {
"websiteURL": "https://example.com/register",
"websiteKey": "<site-key>"
},
"integration": {
"readiness": "READY",
"workflows": [
"HTTP_SUBMIT",
"BROWSER_RESULT"
],
"resultKind": "TOKEN",
"resultSchema": {
"type": "object"
}
},
"workflowGuide": {}
},
"contextId": "a3f5c2e1b7d94c0e8f6a1b2c3d4e5f60a3f5c2e1b7d94c0e8f6a1b2c3d4e5f6"
}
/captcha/buySubmit solving task
Creates an asynchronous solving task from the product and adapter parameters and pre-charges one fee; successful creation does not mean the CAPTCHA has been solved.
Request parameters
| Field | Type | Required | Description |
|---|---|---|---|
productCode | string | Required | Product code, from /captcha/products |
adapter | object | Required | Product parameter object; fill in the real challenge parameters according to the schema from /captcha/schema. Some products allow {}, but it cannot be omitted or null |
Notes
- After business parameter validation, the request is submitted once and the server calculates and charges the current price. The client does not pre-check prices, stock, or plans; the server validates permission and balance.
- Not retried automatically after submission; on timeout or an unclear result, check /captcha/records and /billing/trades first instead of purchasing again.
- Returns -1100 if an identical purchase under the same sign-in and team is still processing; also returns -1100 if no team is selected.
- The server calculates the fee at the current price; adapter is not stored in the task record and is not echoed.
- This endpoint only creates the solving task; it does not submit the answer to the target website for you.
Response fields
| Field | Type | Description |
|---|---|---|
contextId | string | Sign-in and team context identifier for this request, usable as X-Nex-Service-Context in subsequent requests |
data | object | Newly created task record, state is initially CREATED |
data.id | number | Local task ID, used for queries |
data.userId | number | Submitting user ID |
data.teamId | number | Team ID at submission time |
data.taskId | string | Upstream task ID, not used as a query parameter |
data.productCode | string | Product code |
data.price | number | Actual pre-charged amount, unchanged after a refund |
data.product | string | JSON text of the product snapshot at submission time |
data.state | string | State: CREATED, SUBMITTING, PROCESSING, SUCCEEDED, FAILED, EXPIRED |
data.solution | string | JSON text of the answer object, may contain text, token, or product-specific fields |
data.createdAt | string | Creation time |
data.updatedAt | string | Update time |
Response example
{
"code": 0,
"msg": "成功",
"data": {
"id": 101,
"userId": 1001,
"teamId": 2001,
"taskId": "upstream-task-7f3a",
"productCode": "RECAPTCHA_V2",
"price": 0.005,
"product": "{\"productCode\":\"RECAPTCHA_V2\",\"name\":\"reCAPTCHA v2\",\"price\":0.005}",
"state": "CREATED",
"solution": "{}",
"createdAt": "2026-10-23 10:00:00",
"updatedAt": "2026-10-23 10:00:00"
},
"contextId": "a3f5c2e1b7d94c0e8f6a1b2c3d4e5f60a3f5c2e1b7d94c0e8f6a1b2c3d4e5f6"
}
/captcha/recordsSolving task records
Pages through the current user's solving tasks in the current team, in all states.
Request parameters
| Field | Type | Required | Description |
|---|---|---|---|
page | number | Optional | Page number, default 1 |
size | number | Optional | Page size, default 20, max 1000 |
keyword | string | Optional | Keyword, fuzzy-matches productCode |
Notes
- Returned in descending order of local ID; after a refund, price is still the original pre-charged amount. See /billing/trades for the refund transaction.
Response fields
| Field | Type | Description |
|---|---|---|
contextId | string | Sign-in and team context identifier for this request, usable as X-Nex-Service-Context in subsequent requests |
data.count | number | Total number of matching records |
data.size | number | Page size, echoes the request value |
data.page | number | Current page number, echoes the request value |
data.total | number | Total number of pages |
data.data | object[] | Records on the current page |
data.data[].id | number | Local task ID, used for queries |
data.data[].userId | number | Submitting user ID |
data.data[].teamId | number | Team ID at submission time |
data.data[].taskId | string | Upstream task ID, not used as a query parameter |
data.data[].productCode | string | Product code |
data.data[].price | number | Actual pre-charged amount, unchanged after a refund |
data.data[].product | string | JSON text of the product snapshot at submission time |
data.data[].state | string | State: CREATED, SUBMITTING, PROCESSING, SUCCEEDED, FAILED, EXPIRED |
data.data[].solution | string | JSON text of the answer object, may contain text, token, or product-specific fields |
data.data[].createdAt | string | Creation time |
data.data[].updatedAt | string | Update time |
Response example
{
"code": 0,
"msg": "成功",
"data": {
"count": 1,
"size": 20,
"page": 1,
"total": 1,
"data": [
{
"id": 101,
"userId": 1001,
"teamId": 2001,
"taskId": "upstream-task-7f3a",
"productCode": "RECAPTCHA_V2",
"price": 0.005,
"product": "{\"productCode\":\"RECAPTCHA_V2\",\"name\":\"reCAPTCHA v2\",\"price\":0.005}",
"state": "SUCCEEDED",
"solution": "{\"token\":\"03AFcWeA...\"}",
"createdAt": "2026-10-23 10:00:00",
"updatedAt": "2026-10-23 10:00:00"
}
]
},
"contextId": "a3f5c2e1b7d94c0e8f6a1b2c3d4e5f60a3f5c2e1b7d94c0e8f6a1b2c3d4e5f6"
}
/captcha/queryGet solving result
Queries the progress and answer of a single local task; for non-terminal states, the server refreshes it from upstream.
Request parameters
| Field | Type | Required | Description |
|---|---|---|---|
id | number | Required | Local task ID, not the upstream taskId |
Notes
- Query every 3 to 5 seconds; SUCCEEDED, FAILED, and EXPIRED are terminal, so stop polling once one is reached. At most 5 requests per 3 seconds per user.
- FAILED and EXPIRED tasks are automatically refunded at the original price by the server; network errors or unknown states do not count as failures and are not refunded. There is no cancel or manual refund endpoint.
- Tasks that do not exist, belong to another user, or are not in the current team return -1005.
Response fields
| Field | Type | Description |
|---|---|---|
contextId | string | Sign-in and team context identifier for this request, usable as X-Nex-Service-Context in subsequent requests |
data | object | Updated task record |
data.id | number | Local task ID, used for queries |
data.userId | number | Submitting user ID |
data.teamId | number | Team ID at submission time |
data.taskId | string | Upstream task ID, not used as a query parameter |
data.productCode | string | Product code |
data.price | number | Actual pre-charged amount, unchanged after a refund |
data.product | string | JSON text of the product snapshot at submission time |
data.state | string | State: CREATED, SUBMITTING, PROCESSING, SUCCEEDED, FAILED, EXPIRED |
data.solution | string | JSON text of the answer object, may contain text, token, or product-specific fields |
data.createdAt | string | Creation time |
data.updatedAt | string | Update time |
Response example
{
"code": 0,
"msg": "成功",
"data": {
"id": 101,
"userId": 1001,
"teamId": 2001,
"taskId": "upstream-task-7f3a",
"productCode": "RECAPTCHA_V2",
"price": 0.005,
"product": "{\"productCode\":\"RECAPTCHA_V2\",\"name\":\"reCAPTCHA v2\",\"price\":0.005}",
"state": "SUCCEEDED",
"solution": "{\"token\":\"03AFcWeA...\"}",
"createdAt": "2026-10-23 10:00:00",
"updatedAt": "2026-10-23 10:00:12"
},
"contextId": "a3f5c2e1b7d94c0e8f6a1b2c3d4e5f60a3f5c2e1b7d94c0e8f6a1b2c3d4e5f6"
}