API Documentation
Maruai Solver ใช้ format เดียวกับ 2captcha — ส่งรูปภาพ base64 แล้วรับคำตอบผ่าน task ID
Base URL
https://api-captcha.maruai-solver.org
Format
multipart/form-data หรือ x-www-form-urlencoded
CompatibleWith
2captcha API v1

🔑 Authentication
ทุก request ต้องส่ง API Key ใน field key

API Key ได้จากหน้า Dashboard หลัง Login ด้วย Discord

key = "d2f2850274b69a42cf26f50467928a30"   # ตัวอย่าง — ใช้ key ของตัวเองเท่านั้น

🔄 API Flow
การส่งรูปภาพแบ่งเป็น 2 ขั้นตอน
1
Submit Task
POST รูปภาพ base64 ไปที่ /in.php → ได้ OK|{task_id} กลับมา
⚡ โควต้าถูกหัก 1 credit ทันทีที่ submit สำเร็จ
2
Poll Result
GET ผลลัพธ์จาก /res.php?action=get&key=...&id={task_id}
ถ้าได้ PROCESSING ให้รอแล้ว retry ทุก 1–3 วินาที
3
Get Answer
เมื่อ server แก้เสร็จจะได้ OK|{answer} กลับมา

POST /in.php
ส่งภาพ captcha เพื่อให้ server ประมวลผล
Request Parameters
ParameterTypeRequiredDescription
key string required API Key ของคุณ
method string required ระบุ base64 เสมอ
body string required ภาพ captcha เข้ารหัสเป็น Base64
type string optional ค่าเริ่มต้น: ImageToTextTask
imginstructions string optional คำสั่งพิเศษให้ solver เช่น hopscotch, click
Response
✅ สำเร็จ
OK|86f4a1c2d3e5   # task_id สำหรับ poll ผล
❌ Error
ERROR_KEY_DOES_NOT_EXIST    # key ไม่ถูกต้องหรือไม่มีในระบบ
ERROR_ZERO_CAPTCHA_FILESIZE  # โควต้าหมด หรือ key ถูก disable
ERROR_WRONG_USER_KEY         # ขาด parameter ที่จำเป็น

GET /res.php
ดึงผลลัพธ์ของ task ที่ submit ไว้
Query Parameters
ParameterTypeRequiredDescription
action string required ระบุ get เสมอ
key string required API Key ของคุณ (ต้อง key เดิมที่ submit)
id string required Task ID ที่ได้จาก /in.php
Response
OK|answer_text          # ได้ผลลัพธ์แล้ว
PROCESSING               # ยังประมวลผลอยู่ — retry ทุก 1–3 วินาที
ERROR_CAPTCHA_UNSOLVABLE # แก้ไม่ได้ (ภาพไม่ชัด ฯลฯ)
ERROR_WRONG_CAPTCHA_ID   # task_id ไม่ถูกต้อง

🐍 Python Example
ตัวอย่างการใช้งานแบบ polling loop
import requests
import time
import base64

API_KEY  = "YOUR_API_KEY_HERE"
BASE_URL = "https://api-captcha.maruai-solver.org"

# 1. โหลดรูปแล้วแปลงเป็น base64
with open("captcha.png", "rb") as f:
    img_b64 = base64.b64encode(f.read()).decode()

# 2. Submit task
resp = requests.post(f"{BASE_URL}/in.php", data={
    "key":    API_KEY,
    "method": "base64",
    "body":   img_b64,
    "type":   "ImageToTextTask",
})

if not resp.text.startswith("OK|"):
    raise Exception(f"Submit error: {resp.text}")

task_id = resp.text.split("|")[1]
print(f"Task ID: {task_id}")

# 3. Poll ผล
for attempt in range(20):
    time.sleep(2)
    r = requests.get(f"{BASE_URL}/res.php", params={
        "action": "get",
        "key":    API_KEY,       # ← ต้องใส่ key ด้วย!
        "id":     task_id,
    })
    if r.text == "PROCESSING":
        print(f"  Attempt {attempt+1}: still processing...")
        continue
    if r.text.startswith("OK|"):
        answer = r.text.split("|")[1]
        print(f"✅ Answer: {answer}")
        break
    print(f"❌ Error: {r.text}")
    break
🐘 PHP Example
<?php
$API_KEY  = "YOUR_API_KEY_HERE";
$BASE_URL = "https://api-captcha.maruai-solver.org";

// 1. Submit
$imgB64 = base64_encode(file_get_contents("captcha.png"));
$ch = curl_init("$BASE_URL/in.php");
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => "key=$API_KEY&method=base64&type=ImageToTextTask&body=" . urlencode($imgB64),
    CURLOPT_RETURNTRANSFER => true,
]);
$res = curl_exec($ch);
curl_close($ch);

if (!str_starts_with($res, "OK|")) die("Submit error: $res");
$taskId = explode("|", $res)[1];

// 2. Poll
for ($i = 0; $i < 20; $i++) {
    sleep(2);
    $r = file_get_contents("$BASE_URL/res.php?action=get&key=$API_KEY&id=$taskId");
    if ($r === "PROCESSING") continue;
    if (str_starts_with($r, "OK|")) {
        echo "Answer: " . explode("|", $r)[1];
        break;
    }
    echo "Error: $r";
    break;
}
?>
🌐 JavaScript (Node.js) Example
const fs   = require("fs");
const axios = require("axios");

const API_KEY  = "YOUR_API_KEY_HERE";
const BASE_URL = "https://api-captcha.maruai-solver.org";

async function solveCaptcha(imagePath) {
    const imgB64 = fs.readFileSync(imagePath).toString("base64");

    // 1. Submit
    const { data: submitRes } = await axios.post(`${BASE_URL}/in.php`,
        new URLSearchParams({ key: API_KEY, method: "base64", type: "ImageToTextTask", body: imgB64 })
    );
    if (!submitRes.startsWith("OK|")) throw new Error(`Submit: ${submitRes}`);
    const taskId = submitRes.split("|")[1];

    // 2. Poll
    for (let i = 0; i < 20; i++) {
        await new Promise(r => setTimeout(r, 2000));
        const { data } = await axios.get(`${BASE_URL}/res.php`, {
            params: { action: "get", key: API_KEY, id: taskId }  // ← key จำเป็น!
        });
        if (data === "PROCESSING") continue;
        if (data.startsWith("OK|")) return data.split("|")[1];
        throw new Error(`Solver: ${data}`);
    }
    throw new Error("Timeout");
}

solveCaptcha("captcha.png").then(ans => console.log("Answer:", ans));

⚠️ Error Codes
ErrorHTTPสาเหตุ
ERROR_KEY_DOES_NOT_EXIST403API Key ไม่ถูกต้อง, ไม่มีในระบบ, หรือถูก disable
ERROR_ZERO_CAPTCHA_FILESIZE403โควต้าหมด (0 credits เหลือ)
ERROR_WRONG_USER_KEY400ขาด parameter ที่จำเป็น: key หรือ body
ERROR_WRONG_CAPTCHA_ID404task_id ไม่ถูกต้อง หรือเป็น key คนอื่น
ERROR_CAPTCHA_UNSOLVABLE200แก้ captcha ไม่ได้ (ภาพไม่ชัด หรือ server error)

💳 Quota System
📊 Quota Package
  • หักทีละ 1 credit ต่อ 1 task ที่ submit สำเร็จ
  • หักทันที ไม่ว่าจะ solve ได้หรือไม่
  • ไม่มีวันหมดอายุ — ใช้ได้จนกว่า credit จะหมด
  • ตรวจสอบยอดได้ที่หน้า Dashboard
♾️ Unlimited Package
  • ไม่หัก credit — ใช้ได้ไม่อั้น
  • มีกำหนดวันหมดอายุ (1 / 7 / 15 / 30 วัน)
  • เมื่อหมดอายุ key จะหยุดทำงานทันที
โควต้าหัก ตอน submit (/in.php) ไม่ใช่ตอนรับผล (/res.php) — ควรตรวจสอบ key ก่อน submit