HTTP API for solving hCaptcha challenges on any site. Submit the captcha fields from the target service, receive a verified token and the headers to retry your request.
Every API request (except / and /v1/health) requires an API key sent as an HTTP header:
X-API-Key: your-api-key-uuid
Requests without a valid X-API-Key header return 401 Unauthorized.
Accepts hCaptcha challenge data for any target host and returns a solved token.
| Header | Required | Description |
|---|---|---|
Content-Type | Yes | application/json |
X-API-Key | Yes | Your API key (UUID) |
Send a JSON object with the captcha fields from the target service's challenge response. Only the fields below are required — you do not need to send captcha_key or captcha_service.
| Field | Required | Description |
|---|---|---|
captcha_sitekey | Yes | Dynamic hCaptcha site key from the challenge response |
captcha_host | Yes | Target site hostname (e.g. discord.com, example.com) — without https:// |
captcha_rqdata | Yes | Enterprise rqdata — must be passed to the challenge or it will fail |
captcha_rqtoken | Recommended | Challenge request token — echo back to the target API via X-Captcha-Rqtoken |
captcha_session_id | Recommended | Session ID — echo back via X-Captcha-Session-Id |
{
"captcha_sitekey": "a9b5fb07-92ff-493f-86fe-352a2803b3df",
"captcha_host": "discord.com",
"captcha_rqdata": "NpQAwki50ByiW9bA16ORoLwoqJAK+lli++HGo9JpzGQqlHh5YRJCVgQmZET91Azw8Ew3NvMPFKO5otO13QFlh+p9hQ73jGXELsyzpVrSy7XenLKZjP0ZhXaGpESvM5SiHghRNdqfK4DwFw==eCjJIAfUkwLnY7m/",
"captcha_rqtoken": "Ikk0VU5GVFhMa2p0SFNNSUZiZEF5YWgvdGZ2Wm45MjFiczFzbnM4cjU3Z3A5dkVKYTdIeFVFRlYyYWpUekRIejZCZ3pxTWc9PVZhTnVXL01LWEQ5UlpYWUEi.alFkGQ.erb42PkoZ_BnN_h32eVSB150WGM",
"captcha_session_id": "d857885d-f307-4c13-9b94-0178beed48a6"
}
{
"status": "success",
"request_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"captcha_token": "P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"captcha_host": "discord.com",
"elapsed_ms": 4821,
"levels_solved": 3,
"discord_headers": {
"X-Captcha-Key": "P1_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"X-Captcha-Session-Id": "d857885d-f307-4c13-9b94-0178beed48a6",
"X-Captcha-Rqtoken": "Ikk0VU5GVFhMa2p0SFNNSUZiZEF5YWgvdGZ2..."
}
}
{
"status": "error",
"error": "solve_failed",
"message": "Human-readable description",
"request_id": "...",
"elapsed_ms": 12000
}
error | Meaning |
|---|---|
missing_api_key | No X-API-Key header provided |
invalid_api_key | API key not recognized |
missing_fields | Required JSON fields absent |
invalid_json | Body is not valid JSON |
solve_failed | Captcha could not be solved |
timeout | Solve exceeded time limit |
queue_full | Server at capacity — retry later |
internal_error | Unexpected server error |
curl -X POST "https://solver.discorium.cc/v1/solve" \ -H "Content-Type: application/json" \ -H "X-API-Key: YOUR_API_KEY" \ -d '{ "captcha_sitekey": "a9b5fb07-92ff-493f-86fe-352a2803b3df", "captcha_host": "discord.com", "captcha_rqdata": "NpQAwki50ByiW9bA16ORoLwoqJAK+lli++HGo9JpzGQqlHh5YRJCVgQmZET91Azw8Ew3NvMPFKO5otO13QFlh+p9hQ73jGXELsyzpVrSy7XenLKZjP0ZhXaGpESvM5SiHghRNdqfK4DwFw==eCjJIAfUkwLnY7m/", "captcha_rqtoken": "Ikk0VU5GVFhMa2p0SFNNSUZiZEF5YWgvdGZ2Wm45MjFiczFzbnM4cjU3Z3A5dkVKYTdIeFVFRlYyYWpUekRIejZCZ3pxTWc9PVZhTnVXL01LWEQ5UlpYWUEi.alFkGQ.erb42PkoZ_BnN_h32eVSB150WGM", "captcha_session_id": "d857885d-f307-4c13-9b94-0178beed48a6" }'
import requests resp = requests.post( "https://solver.discorium.cc/v1/solve", headers={ "Content-Type": "application/json", "X-API-Key": "YOUR_API_KEY", }, json={ "captcha_sitekey": captcha["captcha_sitekey"], "captcha_host": "discord.com", "captcha_rqdata": captcha["captcha_rqdata"], "captcha_rqtoken": captcha.get("captcha_rqtoken"), "captcha_session_id": captcha.get("captcha_session_id"), }, timeout=130, ) data = resp.json() if data["status"] == "success": headers = data["discord_headers"] # Retry your original Discord request with these headers retry = requests.post(original_url, json=original_body, headers={**your_headers, **headers})
const res = await fetch("https://solver.discorium.cc/v1/solve", { method: "POST", headers: { "Content-Type": "application/json", "X-API-Key": "YOUR_API_KEY", }, body: JSON.stringify({ captcha_sitekey: captcha.captcha_sitekey, captcha_host: "discord.com", captcha_rqdata: captcha.captcha_rqdata, captcha_rqtoken: captcha.captcha_rqtoken, captcha_session_id: captcha.captcha_session_id, }), }); const data = await res.json();
When Discord returns a captcha challenge, retry your original request and attach the headers from discord_headers:
| Header | Value |
|---|---|
X-Captcha-Key | The solved captcha_token |
X-Captcha-Session-Id | Same captcha_session_id from the challenge (if present) |
X-Captcha-Rqtoken | Same captcha_rqtoken from the challenge (if present) |
Captcha data is single-use. Always use fresh values from the latest Discord 400 response. Tokens expire quickly — solve and retry immediately.
Public health check. No authentication required.
Service statistics. Requires X-API-Key.