PHP CAPTCHA Solver for Laravel, Symfony and Plain cURL
One Composer package turns reCAPTCHA, Turnstile and GeeTest checks, or the text in a CAPTCHA image, into values your cURL, Guzzle or Laravel code can post. CapSkip does the solving on hardware you control.
- PHP 8.0 and newer
- Only curl and json
- Unmetered queue workers
$solver = new CapSkip();
$token = $solver->recaptcha([
'sitekey' => '6Le-wvkS…',
'url' => 'example.com/signup',
]);03AGdBq27…0.12s · $0.00Every PHP CAPTCHA solver exists for one awkward moment: your cURL handle or Guzzle client asks for a page and gets a challenge back instead of the markup it was built to parse. Install capskip/capskip with Composer and that challenge goes to the CapSkip desktop app, running on Windows hardware you own or rent, which sends back a reCAPTCHA or Turnstile token, a GeeTest v3 answer, or the text of an image, ready for your next POST.
The client keeps your vendor folder lean: it asks for PHP 8.0 or newer with the curl and json extensions and installs nothing else. Each challenge family gets its own method, so recaptcha() handles v2, v3 and Enterprise, turnstile() covers both the embedded widget and Cloudflare's full-page check, geetest() takes the v3 slider, normal() reads distorted text in about 0.1 seconds, and altcha(), capy(), captchafox(), friendlyCaptcha() and amazonWaf() round out the list.
Your PHP can keep running wherever it runs today. Set the client's host option to the machine with CapSkip, and every server, container or cron box that can reach it solves through one flat license from $35 a month. Nothing on the invoice depends on how many forms you submit.
Keep CAPTCHA work out of the request cycle. Each solve holds its PHP process until the answer arrives, so dispatch it to a queue job or a cron script and let your pages respond at normal speed. Start as many workers as the solver machine can feed: the plan is flat, so extra processes add nothing to the bill. Read the Laravel queue guide
Built for Composer projects and PHP workers
Two PHP extensions, nothing else
The package needs PHP 8.0 or newer with curl and json enabled. It adds no other runtime dependency, so it never fights the versions your framework already locks in composer.lock.
Every queue worker on one license
Artisan commands, cron runs and long-lived workers all draw from the same unmetered plan. More processes raise throughput up to what the machine can handle, while the monthly price stays put.
At home in Laravel and Symfony
Register a single CapSkip instance as a singleton in a Laravel service provider or as a Symfony service. With no framework ties, a bare PHP script uses it just as easily.
Answers shaped for Guzzle and cURL
Take $result['code'] and drop it into Guzzle form_params or your CURLOPT_POSTFIELDS array, keyed by whatever field name the target form submits, g-recaptcha-response being the usual one.
Pairs with Panther and php-webdriver
When a site expects a real browser, drive it with Symfony Panther or php-webdriver, let CapSkip solve the challenge, then inject the returned token into the form before you click submit.
Blocking calls with a 300-second ceiling
Every call is synchronous, and a reCAPTCHA solve may keep polling for up to 300 seconds by default. That suits CLI processes and queue jobs far better than a web request with a short time limit.
Three routes from a PHP project to CapSkip
<?php
// composer require capskip/capskip
require 'vendor/autoload.php';
use CapSkip\CapSkip;
$solver = new CapSkip(['host' => '127.0.0.1', 'port' => 8080]);
$result = $solver->recaptcha(
'YOUR_SITEKEY',
'https://example.com/page-with-recaptcha'
);
echo $result['code']; // g-recaptcha-response tokenReplace YOUR_SITEKEY and the example URL with your target, run the file from the command line, and it prints a reCAPTCHA token for your form post.
Browser extension for manual sessions
When you are the one clicking through a site, say while testing your own signup form, the Chrome or Firefox add-on lets the running CapSkip app clear each challenge, no PHP needed.
The Composer SDK for your code
Require capskip/capskip, then pick the method that matches each challenge from scripts, commands and workers. Sibling clients exist for Python, Node.js and .NET when other services need one.
Local API for inherited 2Captcha code
A PHP class built around the 2Captcha or Anti-Captcha API keeps sending its requests unchanged: the CapSkip app speaks those formats and answers from your own machine.
Try the PHP client against a live reCAPTCHA
Our reCAPTCHA v2 demo page loads the real widget. Aim the snippet above at it, run it from your terminal, and a working token prints out, long before you point it at a production site.
From composer require to your first token
-
Set up the solver machine
Pick one Windows desktop or VPS that your PHP hosts can reach and install CapSkip there. It then handles the solving for every server, container and cron job you point at it. Download the installer
-
Sign in with a trial or a plan
Use the login from the trial (500 solves, a 3-day window, no card required) or from a monthly plan. Every tier unlocks the same CAPTCHA types. Get the free trial
-
Require the package and solve
Run composer require capskip/capskip, create one client with the solver host, and call the method for your challenge from a CLI script or a queue job. Browse the API docs
A local PHP solver next to 2Captcha and CapSolver
How the CapSkip Composer client measures up against the per-solve services many PHP projects begin with.
| Feature | CapSkip | 2Captcha / CapSolver |
|---|---|---|
| What you pay for | One monthly fee from $35, solves never counted | Each solve, priced per 1,000 |
| Where challenges get solved | Inside the CapSkip app, on hardware you run | Remote API servers or a human solving farm |
| Bill as your queue grows | Unchanged, whatever the job count | Climbs with every job that meets a CAPTCHA |
| Who sees the challenge | Only your own machines | A third-party service receives it |
| Parallel PHP workers | No thread cap; your server sets the pace | More throughput means paying for more solves |
| Getting it into PHP | composer require capskip/capskip, or keep a 2Captcha client | The vendor's own client library |
| Image CAPTCHA turnaround | Roughly 0.1 seconds, solved on the spot | A network round trip plus queue time |
Pricing
Stop paying per solve
Choose your license
Bronze License
$35/ month
Instant license activation
Billed monthly. Cancel from your account whenever you like.
Same features. More machines, more throughput.
Every machine solves as fast as its own CPU and memory allow. More machines run more threads at the same time, so Silver solves twice as many CAPTCHAs at once and Gold three times as many.
- Unlimited solving, no daily cap
- Unlimited threads, speed scales with your hardware
- 90% to 100% recognition accuracy
- Drop-in replacement for the major solving service APIs
- Works with almost any tool, no coding required
- REST API, SDKs and a browser extension
- Free training when a new CAPTCHA type appears
- Runs on your machine, nothing leaves it
Every CAPTCHA type CapSkip solves is on every license. See the coverage band
Just want to try it first?
Start with a free 3-day trial and solve 500 CAPTCHAs of any type on your own targets.
Related CAPTCHA solvers & guides
Solve CAPTCHA in PHP: the cURL and Guzzle workflow
Most PHP code meets a CAPTCHA halfway through a scripted form post: a cURL handle or a Guzzle client fetches the page, spots a challenge, and needs a valid answer before the POST can leave. The routine below keeps that session intact from fetch to submit.
First, gather the inputs from the HTML you already downloaded. reCAPTCHA and Turnstile need the data-sitekey value and the page URL. GeeTest v3 needs a freshly issued gt and challenge pair, because each challenge works once and goes stale in about a minute. An image CAPTCHA needs the picture itself, fetched with the same cookie jar as the form so it belongs to your session. hCaptcha needs the same pair as reCAPTCHA, the data-sitekey and the page URL, sent with method=hcaptcha.
Next, call the matching method on your client. For invisible reCAPTCHA, give recaptcha() its invisible option; for v3, set version to v3 and supply the page's own action label. The turnstile() method also accepts the data and pagedata values when you face a full Cloudflare challenge page. The call blocks until the answer arrives, so run it from a CLI process or a queue job.
Finally, put the answer where the site looks for it. Add $result['code'] to your POST fields under the response field name the form uses; for GeeTest, return the challenge, validate and seccode values the way the site's own front end would; after a Cloudflare challenge page, repeat the request with the userAgent CapSkip handed back. Submit promptly, since tokens expire within minutes, and if you solved through a proxy, send the POST through that same proxy.
Related guides: Laravel queue CAPTCHA jobs · reCAPTCHA v2 in PHP · Cloudflare Turnstile in PHP
Which Composer package do I install for CAPTCHA solving?
What does a reCAPTCHA call look like from PHP code?
Does the Turnstile method handle the full-page Cloudflare check too?
Why does my web request time out while CapSkip is solving?
How do I run many solves at the same time from PHP?
What does the GeeTest v3 call give back to PHP?
Can I keep a PHP class written for the 2Captcha API?
Will CapSkip read an image CAPTCHA that cURL downloaded?
Give your PHP queue unmetered CAPTCHA solving
Install the app, add one Composer package, and let your workers solve as often as the job demands. Your bill is fixed whether the queue holds ten jobs or ten thousand.
