curl --request POST \
--url https://api.ninetile.io/v1/solves \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "hcaptcha",
"sitekey": "00000000-0000-0000-0000-000000000000",
"url": "https://target.example/login"
}
'import requests
url = "https://api.ninetile.io/v1/solves"
payload = {
"type": "hcaptcha",
"sitekey": "00000000-0000-0000-0000-000000000000",
"url": "https://target.example/login"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'hcaptcha',
sitekey: '00000000-0000-0000-0000-000000000000',
url: 'https://target.example/login'
})
};
fetch('https://api.ninetile.io/v1/solves', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ninetile.io/v1/solves",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'type' => 'hcaptcha',
'sitekey' => '00000000-0000-0000-0000-000000000000',
'url' => 'https://target.example/login'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ninetile.io/v1/solves"
payload := strings.NewReader("{\n \"type\": \"hcaptcha\",\n \"sitekey\": \"00000000-0000-0000-0000-000000000000\",\n \"url\": \"https://target.example/login\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ninetile.io/v1/solves")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"hcaptcha\",\n \"sitekey\": \"00000000-0000-0000-0000-000000000000\",\n \"url\": \"https://target.example/login\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ninetile.io/v1/solves")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"hcaptcha\",\n \"sitekey\": \"00000000-0000-0000-0000-000000000000\",\n \"url\": \"https://target.example/login\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"object": "solve",
"type": "hcaptcha",
"status": "pending",
"sitekey": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"url": "<string>",
"token": "<string>",
"user_agent": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"reason": "<string>",
"retryable": true,
"docs_url": "<string>"
},
"charged_usd": 123,
"proxy_bytes": null,
"created_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z",
"queue_ms": 123,
"resolve_ms": 123,
"warnings": [
{
"code": "user_agent_not_applied",
"message": "<string>"
}
]
}{
"id": "<string>",
"object": "solve",
"type": "hcaptcha",
"status": "pending",
"sitekey": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"url": "<string>",
"token": "<string>",
"user_agent": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"reason": "<string>",
"retryable": true,
"docs_url": "<string>"
},
"charged_usd": 123,
"proxy_bytes": null,
"created_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z",
"queue_ms": 123,
"resolve_ms": 123,
"warnings": [
{
"code": "user_agent_not_applied",
"message": "<string>"
}
]
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}Create a solve
Creates a solve and reserves its price. Without wait, the initial response is normally 202. wait holds the request for 1–90 seconds; a completed solve is returned with 200, otherwise the open solve is returned with 202. Poll GET /solves/ to retrieve later results. Successful solves cost $0.00075; unsuccessful solves are not charged.
curl --request POST \
--url https://api.ninetile.io/v1/solves \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "hcaptcha",
"sitekey": "00000000-0000-0000-0000-000000000000",
"url": "https://target.example/login"
}
'import requests
url = "https://api.ninetile.io/v1/solves"
payload = {
"type": "hcaptcha",
"sitekey": "00000000-0000-0000-0000-000000000000",
"url": "https://target.example/login"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'hcaptcha',
sitekey: '00000000-0000-0000-0000-000000000000',
url: 'https://target.example/login'
})
};
fetch('https://api.ninetile.io/v1/solves', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ninetile.io/v1/solves",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'type' => 'hcaptcha',
'sitekey' => '00000000-0000-0000-0000-000000000000',
'url' => 'https://target.example/login'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ninetile.io/v1/solves"
payload := strings.NewReader("{\n \"type\": \"hcaptcha\",\n \"sitekey\": \"00000000-0000-0000-0000-000000000000\",\n \"url\": \"https://target.example/login\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.ninetile.io/v1/solves")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"hcaptcha\",\n \"sitekey\": \"00000000-0000-0000-0000-000000000000\",\n \"url\": \"https://target.example/login\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ninetile.io/v1/solves")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"hcaptcha\",\n \"sitekey\": \"00000000-0000-0000-0000-000000000000\",\n \"url\": \"https://target.example/login\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"object": "solve",
"type": "hcaptcha",
"status": "pending",
"sitekey": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"url": "<string>",
"token": "<string>",
"user_agent": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"reason": "<string>",
"retryable": true,
"docs_url": "<string>"
},
"charged_usd": 123,
"proxy_bytes": null,
"created_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z",
"queue_ms": 123,
"resolve_ms": 123,
"warnings": [
{
"code": "user_agent_not_applied",
"message": "<string>"
}
]
}{
"id": "<string>",
"object": "solve",
"type": "hcaptcha",
"status": "pending",
"sitekey": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"url": "<string>",
"token": "<string>",
"user_agent": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"reason": "<string>",
"retryable": true,
"docs_url": "<string>"
},
"charged_usd": 123,
"proxy_bytes": null,
"created_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z",
"queue_ms": 123,
"resolve_ms": 123,
"warnings": [
{
"code": "user_agent_not_applied",
"message": "<string>"
}
]
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"param": "<string>",
"request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}Authorizations
Ninetile API key, sent as Authorization: Bearer <key>. Keys are issued in the dashboard.
Query Parameters
Wait this many seconds for a final result (1–90). If omitted, return without waiting.
1 <= x <= 90Body
hcaptcha, hcaptcha_enterprise hCaptcha sitekey UUID.
HTTP or HTTPS URL of the page containing the challenge.
2048^https?://Fresh hCaptcha rqdata, when the page provides one.
16384Accepted but not applied. The solve response provides the user agent to use when submitting the token.
512Optional public HTTP or HTTPS proxy. SOCKS proxies are not supported.
Response
Solve reached a final state while waiting.
^solve_hcaptcha, hcaptcha_enterprise pending, solving, solved, failed, cancelled, expired hCaptcha response token when the solve succeeds; otherwise null. Token is cleared after 7 days.
Show child attributes
Show child attributes
Final charge; null until the solve is final.
Currently always null.
Show child attributes
Show child attributes