How to Solve MTCaptcha
The box above is a live MTCaptcha widget. This page shows two ways to solve MTCaptcha and get a verified v1 token: by calling the CapSkip HTTP API from your own code, or by routing the captcha service your tools already call to CapSkip. CapSkip is an unlimited MTCaptcha solver that runs locally on your device, so there are no per solve fees and nothing leaves your machine.
Option 1: Solve MTCaptcha with the CapSkip HTTP API
Building automation, a scraper or a bot? Send this page's MTPublic site key and URL to the CapSkip app with one request, poll for the result, and CapSkip hands back a verified MTCaptcha token you can submit like a real one. The API uses the standard in.php / res.php endpoints, so it works from Python, Node.js, PHP, C# or any other language that can make an HTTP call.
MTPublic-C8YHBQqYE
https://capskip.com/captcha-demo/mtcaptcha/
Before you start
CapSkip solves locally. Download and run the CapSkip desktop app and keep it open in the background. Your code talks to it on 127.0.0.1:8080, so there are no cloud calls and no per solve fees.
Send the MTCaptcha to CapSkip
Post this page's sitekey and pageurl to in.php with method=mt_captcha. CapSkip answers at once with a task ID.
import time
import requests
API = "http://127.0.0.1:8080" # the CapSkip app on your machine
KEY = "YOUR_API_KEY"
# 1. Submit the MTCaptcha shown on this page
task = requests.post(f"{API}/in.php", data={
"key": KEY,
"method": "mt_captcha",
"sitekey": "MTPublic-C8YHBQqYE",
"pageurl": "https://capskip.com/captcha-demo/mtcaptcha/",
"json": 1,
}).json()["request"]
# 2. Poll until the token is ready
while True:
time.sleep(3)
res = requests.get(f"{API}/res.php", params={
"key": KEY, "action": "get", "id": task, "json": 1,
}).json()
if res["request"] != "CAPCHA_NOT_READY":
break
token = res["request"] # the v1(...) verified token
print(token)const API = 'http://127.0.0.1:8080'; // the CapSkip app on your machine
const KEY = 'YOUR_API_KEY';
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
(async () => {
// 1. Submit the MTCaptcha shown on this page
const submit = await fetch(`${API}/in.php`, {
method: 'POST',
body: new URLSearchParams({
key: KEY,
method: 'mt_captcha',
sitekey: 'MTPublic-C8YHBQqYE',
pageurl: 'https://capskip.com/captcha-demo/mtcaptcha/',
json: '1',
}),
}).then((r) => r.json());
// 2. Poll until the token is ready
let res;
do {
await sleep(3000);
res = await fetch(`${API}/res.php?key=${KEY}&action=get&id=${submit.request}&json=1`)
.then((r) => r.json());
} while (res.request === 'CAPCHA_NOT_READY');
const token = res.request; // the v1(...) verified token
console.log(token);
})();<?php
$api = 'http://127.0.0.1:8080'; // the CapSkip app on your machine
$key = 'YOUR_API_KEY';
// 1. Submit the MTCaptcha shown on this page
$ch = curl_init("$api/in.php");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => http_build_query([
'key' => $key,
'method' => 'mt_captcha',
'sitekey' => 'MTPublic-C8YHBQqYE',
'pageurl' => 'https://capskip.com/captcha-demo/mtcaptcha/',
'json' => 1,
]),
]);
$task = json_decode(curl_exec($ch), true)['request'];
// 2. Poll until the token is ready
do {
sleep(3);
$res = json_decode(file_get_contents(
"$api/res.php?key=$key&action=get&id=$task&json=1"
), true);
} while ($res['request'] === 'CAPCHA_NOT_READY');
$token = $res['request']; // the v1(...) verified token
echo $token;using System.Text.Json;
const string Api = "http://127.0.0.1:8080"; // the CapSkip app on your machine
const string Key = "YOUR_API_KEY";
var http = new HttpClient();
// 1. Submit the MTCaptcha shown on this page
var submit = await http.PostAsync($"{Api}/in.php", new FormUrlEncodedContent(new Dictionary<string, string>
{
["key"] = Key,
["method"] = "mt_captcha",
["sitekey"] = "MTPublic-C8YHBQqYE",
["pageurl"] = "https://capskip.com/captcha-demo/mtcaptcha/",
["json"] = "1",
}));
string task = JsonDocument.Parse(await submit.Content.ReadAsStringAsync())
.RootElement.GetProperty("request").GetString()!;
// 2. Poll until the token is ready
string token;
do
{
await Task.Delay(3000);
var res = JsonDocument.Parse(await http.GetStringAsync(
$"{Api}/res.php?key={Key}&action=get&id={task}&json=1"));
token = res.RootElement.GetProperty("request").GetString()!;
} while (token == "CAPCHA_NOT_READY");
Console.WriteLine(token); // the v1(...) verified tokenYou get a verified token that starts with v1(, valid for this site key and this page, ready to submit. It works once and only for a few minutes, so ask for it just before you send the form.
Use the token
Put the token into the widget's hidden mtcaptcha-verifiedtoken field and submit the form. Your server then checks it with MTCaptcha's checktoken call and its private key. Note that this demo verifies through the widget's own callback, so it checks the token the widget produced rather than one you place in the field.
// 1. Drop the solved token into the hidden field the widget submits
document.querySelector('[name="mtcaptcha-verifiedtoken"]').value = token;
// 2. ...then submit your form.Invisible MTCaptcha and page actions
In invisible (low friction) mode most visitors never see a picture, and MTCaptcha only shows one when a visit looks suspicious. The same request covers it, and CapSkip answers the picture if one is asked for. If the page's mtcaptchaConfig sets an action, send it with the job, since the token is tied to it.
POST http://127.0.0.1:8080/in.php
key=YOUR_API_KEY
method=mt_captcha
sitekey=MTPublic-SITEKEY_FROM_THE_PAGE
pageurl=https://the-protected-site.com/login
action=login
json=1
GET http://127.0.0.1:8080/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1
{"status":1,"request":"v1(2f7e3c1a,b7c6…)"}The API also accepts a proxy and proxytype, which spreads steady volume over several addresses. JSON clients can send the same job as a createTask of type MTCaptchaTask or MtCaptchaTaskProxyless, with isInvisible for low friction widgets.
The full list of request parameters, response fields and error codes lives in the CapSkip API docs.
Option 2: Send your existing solver-service code to CapSkip
Already solving MTCaptcha through a pay-per-captcha service such as 2Captcha, CapMonster Cloud or CapSolver? You do not have to rewrite a line. The CapSkip app includes a service emulator that speaks those services' own APIs locally: pick the service you use, click Add to hosts file, and every request your bot, scraper or off-the-shelf tool already sends to it is answered by CapSkip on your own machine, for a flat price instead of a per-solve bill.
Pick your service
Open the CapSkip app and choose the service your code already talks to: 2Captcha, RuCaptcha, SolveCaptcha, CapMonster Cloud, CapSolver or DeathByCaptcha.
Add to hosts file
One click in the app points that service's domain at CapSkip, so the calls your tool makes are answered on your own machine instead of going out to a paid API.
Run your tool unchanged
Same API key, same request, same polling loop. CapSkip replies in that service's own format and your code gets a verified MTCaptcha token back.
Nothing below changes when you switch. It is the same call your code makes today, except that MTCaptcha is now solved locally and a verified token comes back from CapSkip:
POST https://2captcha.com/in.php
key=YOUR_EXISTING_API_KEY
method=mt_captcha
sitekey=MTPublic-C8YHBQqYE
pageurl=https://capskip.com/captcha-demo/mtcaptcha/
GET https://2captcha.com/res.php?key=YOUR_EXISTING_API_KEY&action=get&id=2122988149
OK|v1(2f7e3c1a,b7c6…) the verified token, solved by CapSkipClient libraries work the same way: a createTask / getTaskResult pair with MTCaptchaTask, DeathByCaptcha type 18, or any wrapper built on one of these services, keeps working once the emulator is on. The full request and response reference lives in the CapSkip API docs.
More on solving MTCaptcha
Guides for the tools and languages people usually pair with this demo.
About this MTCaptcha demo
This page is a live MTCaptcha demo where you can test how MTCaptcha works and watch it get solved in real time. MTCaptcha is a privacy-focused CAPTCHA that shows a short line of distorted characters, partly covered by a coloured ellipse, with a box to type them into and buttons for audio and a new picture. Sites that want less friction switch on its invisible mode, which lets most visitors through and only shows the picture to the ones it doubts. Use it to explore MTCaptcha token generation, the mtcaptcha-verifiedtoken value, and the checktoken verification that websites rely on to protect forms, logins and signups from spam, abuse and bots.
Developers, testers and automation engineers can use this MTCaptcha test page to check integrations, validate a setup and benchmark how fast CapSkip solves MTCaptcha. Whether you need to solve MTCaptcha once or automate thousands of solves, CapSkip works two ways: a plain HTTP API you can call from any language, and drop-in emulation of the captcha services you may be paying per solve today, both with unlimited solving on one flat price. Both are driven by the same desktop AI captcha solver, installed once and running on your own machine, so nothing is queued on a remote server and nothing is billed per solve. See the MTCaptcha solver page for the full picture.
