Captcha: Capy Puzzle
Capy Puzzle is a Japanese jigsaw captcha: the user drags a puzzle piece to complete an image. We return the solution token you submit to the target site.
Overview
Single endpoint, predictable JSON. Send POST /v1/query with the
tool field set to captcha_capy.
curl -X POST https://api.serp-base.com/v1/query \
-H "Content-Type: application/json" \
-d '{"tool": "captcha_capy", "sitekey": "PUZZLE_xxx", "url": "https://site.com/login", "api_server": "https://jp.api.capy.me/"}'
Parameters
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
sitekey | string | yes | Capy captcha key (starts with PUZZLE_) | PUZZLE_h4k2THJgd5dR5jYrKRHdddaSEp7aDN |
url | string | yes | Full URL of the page with the captcha | https://www.capy.me/products/puzzle_captcha/ |
api_server | string | no | Capy API cluster. Default jp.api.capy.me | https://jp.api.capy.me/ |
Code examples
cURL
curl -X POST https://api.serp-base.com/v1/query \
-H "Content-Type: application/json" \
-d '{"tool": "captcha_capy", "sitekey": "PUZZLE_xxx", "url": "https://site.com/login", "api_server": "https://jp.api.capy.me/"}'
Python
import requests
r = requests.post("https://api.serp-base.com/v1/query", json={
"tool": "captcha_capy", "sitekey": "PUZZLE_xxx", "url": "https://site.com/login", "api_server": "https://jp.api.capy.me/"
})
print(r.json()["data"])
JavaScript
const r = await fetch('https://api.serp-base.com/v1/query', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
"tool": "captcha_capy", "sitekey": "PUZZLE_xxx", "url": "https://site.com/login", "api_server": "https://jp.api.capy.me/"
})
});
const { data } = await r.json();
PHP
$ch = curl_init('https://api.serp-base.com/v1/query');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"tool": "captcha_capy", "sitekey": "PUZZLE_xxx", "url": "https://site.com/login", "api_server": "https://jp.api.capy.me/"}',
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
Response
{
"ok": true,
"data": {
"solution": "0xax50x0xkx50x0xux50x..."
}
}
Tip: pass api_server exactly as it appears in the target page
source (inside the Capy widget init). Using the wrong cluster is the most common
reason for a solve failure.
Payment
Pay per request with USDC on Base via the x402 protocol. Gas is paid by the facilitator — you only need USDC in your wallet.
- Network: Base mainnet (
eip155:8453) - Asset: USDC
- Price: $15.00 per 1,000 requests — charged only when data is returned
- Test: Base Sepolia (
eip155:84532) with free USDC from Circle faucet
No payment is taken when a service fails. We run the work first and settle afterwards.
Errors
| Code | Meaning | Action |
|---|---|---|
402 | Payment required | Sign the payment and retry with X-PAYMENT |
400 | Bad parameters | Check required fields above |
422 | Data could not be produced | Nothing charged — retry later |
429 | Rate limited | Back off and retry |
503 | Tool temporarily unavailable | Retry later — nothing charged |
Related tools
Captcha: image to text · Captcha: reCAPTCHA V2 · Captcha: reCAPTCHA V3 · Captcha: hCaptcha · Captcha: Cloudflare Turnstile Captcha: Cloudflare Challenge · Captcha: Yandex SmartCaptcha