Benchmarks

Two measurements, because they answer two questions.

A single percentage that blurs them is worth nothing to anyone deciding whether to buy. One is the number you experience; the other is the number that says which kinds of puzzle the model is good at.

  • On real captchas — the client driving a real browser against the vendors' own public demo pages, end to end, until the vendor accepts.
  • On static images — the model alone, answering a held-out set of real captured puzzles, with no browser involved.

The browser number is always the lower of the two, and always the more honest one: a correct answer still has to be clicked, in the right place, before the widget's own timeout, past whatever the vendor thinks of the mouse that moved.

Every figure here is a count over a dated run against a named model. Nothing is extrapolated and nothing is rounded up.

On real captchas

Driven in a browser, until the vendor accepted.

Each row is one puzzle type driven on the vendor's own public demo page through the hosted API, with every attempt scored. Counts, not percentages: at these sample sizes a percentage implies a precision the count does not have, and the count is the thing you can actually reason about.

A row is the whole widget, not one puzzle. Vendors ask again — hCaptcha usually wants two rounds, reCAPTCHA keeps going until it is satisfied, and a later round is often a different shape from the one that opened. A row is named for the puzzle the vendor opened with, and the time covers every round after it. That is both the honest reading and the stronger claim.

The median is challenge-visible to verified: the span from the puzzle appearing to the vendor accepting. Page load, the checkbox and the widget's own boot are the site's latency, not ours, and are excluded.

Measured 2026-08-19 against CaptchaKraken v1.2 Twilight, the model the hosted API serves by default. Every clip on the home page comes out of this same run.

VendorPuzzleSolvedMedian
hCaptchaImage select12/1210.5s
hCaptchaCanvas puzzle50/5015.1s
GeeTestOrdered icon click10/109.0s
GeeTestIcon crush9/107.1s
GeeTestGobang10/106.8s
GeeTest3×3 photo grid10/107.8s
GeeTestSlide jigsaw10/107.6s
hCaptchaDrag puzzle not scored
reCAPTCHA4×4 tile grid9/108.7s
reCAPTCHA3×3 tile grid11/119.3s
reCAPTCHA3×3 dynamic8/1038.2s
GeeTestCycling line art9/1039.5s
hCaptchaAnimated36/3645.0s
184/189scored attempts solved

One row is supplied, not scored: a puzzle type we can demonstrate but have not measured in a scored run, because the vendor deals it too rarely to have collected one. Its figures are asserted by hand, so this page prints neither of them, and it is left out of the total above. It is labelled because a hand-written number that looks exactly like a measured one is the thing most worth labelling.

On static images

The model alone, one screenshot at a time.

The model answering 1,715 real captured puzzles it has never trained on, with no browser involved. Scored the way a widget scores: exact set match, pass or fail per puzzle, with the vendor's own leeway. No partial credit — a partially-correct grid answer is a rejected captcha.

Every real capture is held out; nothing hand-labelled is trained on. These measure skill rather than memorisation.

The n column is how many held-out captures of that puzzle we hold. Where it is small, read the rate loosely — a row over three captures moves 33 points on one puzzle, which is why the denominator is printed beside every rate rather than left out to tidy the table.

Measured 2026-09-06 against CaptchaKraken v1.2 Twilight. These are percentages rather than counts because the denominator is in the row beside them; the table above has no such column, which is why it prints counts.

VendorPuzzlenSolved
BotDetectDistorted text2896%
GeeTestCanvas puzzle7499%
GeeTestGobang2696%
GeeTestSlide jigsaw2391%
GeeTestOrdered icon click2588%
GeeTestIcon crush2483%
GeeTestNine-tile icon grid1283%
GeeTestSlide to fit (v3)1173%
LeminCropped image11100%
MTCaptchaDistorted text2997%
Prosopo3x3 photo grid1173%
TencentSlide jigsaw1292%
YandexDistorted text2365%
YiDunSlide jigsaw12100%
YiDunOrdered icon click1292%
YiDunPicture click1479%
hCaptchaOdd shape out1100%
hCaptchaClick on the path2100%
hCaptchaDifferent-sized pieces1100%
hCaptchaDrag to target10100%
hCaptchaConnect images5100%
hCaptchaOverlapping lines2100%
hCaptchaRotating object (animated)5100%
hCaptchaArc match3100%
hCaptchaTile flip (animated)4100%
hCaptchaLine ends2396%
hCaptchaClick past the lines1694%
hCaptcha3x3 property grid13792%
hCaptchaMost similar or different7186%
hCaptchaClick items in a grid8483%
hCaptchaTower stack (animated)1283%
hCaptchaNumbered pieces2080%
hCaptchaList selection3876%
hCaptchaClick by trait8776%
hCaptchaShape fit1573%
hCaptchaOdd animal (animated)1070%
hCaptchaHighest jumper967%
hCaptchaSilhouette match4665%
hCaptchaLine pieces560%
hCaptchaHighest value (animated)1457%
hCaptchaOdd one out (animated)250%
hCaptchaDrag into slot8342%
hCaptchaDeviating arrow1242%
hCaptchaConnect the path5838%
hCaptchaParking lot333%
hCaptchaMissing piece2429%
hCaptchaSpiral gap425%
hCaptchaGrowing item (animated)80%
reCAPTCHA3x3 tile grid32771%
reCAPTCHA4x4 tile grid22744%
71.8%overall, weighted by captures held

Weighted by how many captures of each puzzle we hold, across 50 puzzle types — the same arithmetic as scoring all 1,715 captures in one pile. A flat average of the rows would let a type we hold one capture of push the headline as hard as reCAPTCHA's 327.

The gap

Why the two tables disagree.

A puzzle can score well on static images and badly in a browser, and the reasons are worth naming because a self-hoster will hit them too.

An animated puzzle has to be recorded before it can be read

A still screenshot of a cycling board is a picture of one frame, and the answer may belong to a frame that has already gone. Those rows carry the longest medians in the table above.

A drag has to land

Two boxes correct out of two is a solve; one out of two is a rejection. The static score gives partial geometry credit that the widget never gives.

The vendor gets a vote

A correct answer clicked by a mouse the vendor dislikes is still a failed captcha. Nothing about the model's answer changes that.

Grids are sent with the cell numbers drawn on, and this is not cosmetic: on raw un-numbered screenshots the same model scores 0% on 4x4, because it has to invent a numbering convention for sixteen cells of one continuous photograph. If you are building your own client, draw the overlay — the performance guide has the details.

Reproducing it

The browser figures ship as an example.

It drives the vendors' own demo pages through the hosted API and prints two clocks per attempt: the solve span, which is what the medians above measure, and the total, which adds page load and the demo page's own reveal click.

# in a clone of the open-source client
cd js && npm run demo

The static-image figures are measured against a held-out corpus of real captures that is not distributed. The method is stated above in full, so its shape is reproducible against your own captures.

The same two tables are in the client repository as docs/benchmarks.md. The docs have the request shape, the prompts and the rate card.