For test suites that keep failing at the same step

Your End-To-End Test Does Not Fail. It Stops At The Checkbox.

A CAPTCHA in a signup or checkout flow makes that path untestable end to end, so teams either disable protection in test environments - which stops testing the real thing - or skip the journey entirely. A solving API is one way to keep the flow intact, used deliberately and only against systems you own or are authorised to test.

Keeps end-to-end coverage on protected journeys Same API and error codes as any other integration Published latencies let you set sane test timeouts For systems you own or are authorised to test

Get started

The two bad options teams usually pick

Disable the protection, or stop testing the journey

Turning CAPTCHA off in staging means the tested path is no longer the shipped path - the exact difference that hides bugs. Skipping the journey leaves signup, checkout or password reset without end-to-end cover, which is usually where regressions hurt most.

  • A staging-only flow is not the flow users get
  • Untested journeys are the expensive ones to break
  • Manual QA does not run on every commit
  • Both options quietly reduce real coverage
Disable the protection, or stop testing the journey
What We Do

Where a solving API fits in a test suite

Deliberate, scoped, and only against systems you control.

End-to-end coverage on protected journeys

Signup, login, checkout and password reset are the flows most likely to carry a challenge and most costly to regress. Solving it in the test keeps the assertion on the real user journey instead of a weakened copy of it.

Timeouts you can actually set

Published per-type latency bands give you real numbers for test timeouts - under 0.5s for image, up to 60s for reCAPTCHA v2. That is the difference between a flaky suite and a deterministic one.

Deterministic failure branches

CAPCHA_NOT_READY, ERROR_UNSOLVABLE and ERROR_ZERO_BALANCE mean different things. A test harness can distinguish 'still working' from 'genuinely failed' from 'your account needs attention' rather than reporting one red cross.

Fits whatever your suite is written in

Plain HTTP against in.php and res.php, with examples in cURL, Python, Node.js, PHP, Go, Java, .NET, Ruby, Rust and Postman - no SDK lock-in to fight with in a runner.

One endpoint Predictable timing Documented errors Language coverage

Using this responsibly

CAPTCHA solving has legitimate uses and illegitimate ones. This page is about the first.

Test what you own or are authorised to test

The legitimate case is your own application, or a system you have written permission to test. Automated solving against a third party you have no relationship with is a different activity with different consequences.

Respect robots.txt, rate limits and terms of service

Automation that ignores published limits creates load someone else pays for, and it is usually a reliable route to being blocked outright.

Not a route around authentication

A CAPTCHA is a bot check, not an auth check. Nothing here helps with credentials, payment authorisation or account access, and it should not be used to try.

Scope it to the journeys that need it

Most of a suite does not touch a challenge at all. Solving belongs on the handful of protected journeys, not wired in globally.

Scope it deliberately

Which journeys actually need this

Most of a test suite never meets a challenge. Wiring solving in globally adds cost and latency to tests that did not need it - keep it on the handful of protected paths where coverage would otherwise be lost.

  • Signup, login, checkout and password reset
  • Keep it off the fast feedback loop
  • Budget the slow types explicitly
  • Only against systems you own or may test
Why Us

Why this way

The practical case, in four lines.

Coverage on the journeys that matter most

Signup and checkout are the flows most likely to carry a challenge and the most expensive to regress.

No environment-only configuration

Disabling protection in staging means the tested path stops matching the shipped path.

Timeouts from published numbers

Per-type latency bands give real values for test timeouts instead of arbitrary sleeps.

Failure signal you can read

Documented codes let CI distinguish still-working from genuinely failed from account attention.

Good to Know

Practical questions

Q 1

Should we just disable CAPTCHA in staging instead?

It is the common choice and it has a real cost: the tested path stops matching the shipped path. If your protection is configured differently per environment, that configuration is itself untested.

Q 2

Will this make our suite slow?

It depends on type. Image CAPTCHAs are published at under 0.5s; reCAPTCHA v2 can take up to 60s. Budget the slow types deliberately and keep them off the fast feedback loop.

Q 3

How do we keep the API key out of the repo?

Same as any other secret - inject it from your CI secret store at runtime. Use YOUR_API_KEY style placeholders in committed examples, and rotate if one leaks.

Q 4

Is it legal to solve CAPTCHAs?

The technique is not the question - what you point it at is. Testing systems you own or are authorised to test is ordinary QA. Using it against third parties can breach their terms and, depending on jurisdiction and purpose, more than that. Get authorisation.

Q 5

Can we use it for accessibility testing?

That is a recognised use case - CAPTCHAs are a known accessibility barrier, and testing how your own flows behave for users who struggle with them is legitimate work.

Tell us what your suite keeps failing on

Keep the journey under test

One API, documented timings and deterministic error codes - the things a test harness actually needs.

Get API key