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-Key or apikey header
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.

ParamTypeNotes
imagesmultipart/form-dataOne or more files under the images field
imagesapplication/jsonObject 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"]