Captcha Solver API
Solves 3-digit BLS captcha images. Accepts multipart uploads or JSON with base64 images, authenticates via API key, returns index-keyed digit codes.
- Base URL
- https://captcha.mostaxdev.com
- Auth
X-API-Keyorapikeyheader- Billing
- 1 token per image. Refunded on failure.
quick start
curl -X POST "https://captcha.mostaxdev.com/solve" \ -H "X-API-Key: YOUR_API_KEY" \ -F "images=@captcha_1.png" \ -F "images=@captcha_2.png"
Authentication
Every request to /solve requires an API key in one of two headers:
headers
X-API-Key: YOUR_API_KEY # or apikey: YOUR_API_KEY
Tokens are charged per image, not per request. A request with 9 images costs 9 tokens. If the request fails before processing, tokens are refunded.
POST
/solve
Primary endpoint. Solves one or more BLS captcha images.
| Param | Type | Notes |
|---|---|---|
| images | multipart/form-data | One or more files under the images field |
| images | application/json | Object keyed by index: {"0": "data:image/png;base64,..."} |
Multipart
curl
curl -X POST "https://captcha.mostaxdev.com/solve" \ -H "X-API-Key: YOUR_API_KEY" \ -F "images=@captcha_0.png" \ -F "images=@captcha_1.png" \ -F "images=@captcha_2.png"
JSON body
curl
curl -X POST "https://captcha.mostaxdev.com/solve" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"images": {
"0": "data:image/png;base64,iVBORw0KGgoAAA...",
"1": "data:image/png;base64,iVBORw0KGgoAAA...",
"2": "data:image/png;base64,iVBORw0KGgoAAA..."
}
}'
Response
200 ok
{
"solution": {
"0": "123",
"1": "456",
"2": "789"
}
}
Response keys are string indexes matching request order. Values are always 3-digit strings.
Errors
All errors return {"detail": "..."}.
400Malformed JSON, missing
images, or no valid images supplied.401Missing or invalid API key.
403Valid key but insufficient tokens.
415Unsupported content type.
500Internal server error.
503Solver busy. Retry.
Client Examples
python — multipart
import requests
resp = requests.post(
"https://captcha.mostaxdev.com/solve",
headers={"X-API-Key": "YOUR_API_KEY"},
files=[
("images", ("0.png", open("0.png", "rb"), "image/png")),
("images", ("1.png", open("1.png", "rb"), "image/png")),
],
timeout=60,
)
resp.raise_for_status()
print(resp.json()["solution"])
python — base64 json
import base64, requests
def encode(path):
with open(path, "rb") as f:
return "data:image/png;base64," + base64.b64encode(f.read()).decode()
resp = requests.post(
"https://captcha.mostaxdev.com/solve",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"images": {"0": encode("0.png"), "1": encode("1.png")}},
timeout=60,
)
print(resp.json()["solution"])
javascript — fetch
const res = await fetch(
"https://captcha.mostaxdev.com/solve",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": apiKey,
},
body: JSON.stringify({ images }),
}
);
const { solution } = await res.json();
javascript — formdata
const form = new FormData();
for (const blob of imageBlobs) {
form.append("images", blob, "captcha.png");
}
const res = await fetch(
"https://captcha.mostaxdev.com/solve",
{
method: "POST",
headers: { "X-API-Key": apiKey },
body: form,
}
);
const { solution } = await res.json();
c# — httpclient
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", apiKey);
using var form = new MultipartFormDataContent();
foreach (var path in imagePaths)
{
var bytes = File.ReadAllBytes(path);
form.Add(new ByteArrayContent(bytes), "images", Path.GetFileName(path));
}
var res = await client.PostAsync(
"https://captcha.mostaxdev.com/solve", form);
res.EnsureSuccessStatusCode();
var json = await res.Content.ReadFromJsonAsync<JsonElement>();
var solution = json.GetProperty("solution");
go
body := &bytes.Buffer{}
w := multipart.NewWriter(body)
for _, path := range imagePaths {
f, _ := os.Open(path)
part, _ := w.CreateFormFile("images", filepath.Base(path))
io.Copy(part, f)
f.Close()
}
w.Close()
req, _ := http.NewRequest("POST",
"https://captcha.mostaxdev.com/solve", body)
req.Header.Set("Content-Type", w.FormDataContentType())
req.Header.Set("X-API-Key", apiKey)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var result struct {
Solution map[string]string `json:"solution"`
}
json.NewDecoder(resp.Body).Decode(&result)
php — curl
$ch = curl_init("https://captcha.mostaxdev.com/solve");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["X-API-Key: $apiKey"],
CURLOPT_POSTFIELDS => [
"images[0]" => new CURLFile("0.png", "image/png"),
"images[1]" => new CURLFile("1.png", "image/png"),
],
]);
$response = curl_exec($ch);
curl_close($ch);
$solution = json_decode($response, true)["solution"];
ruby
require "net/http"
require "json"
uri = URI("https://captcha.mostaxdev.com/solve")
form = Net::HTTP::Post.new(uri)
form["X-API-Key"] = api_key
form.set_form(
image_paths.map { |p|
["images", File.open(p), { filename: File.basename(p) }]
},
"multipart/form-data"
)
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h|
h.request(form)
}
solution = JSON.parse(res.body)["solution"]