.NET / C# SDK

C# CAPTCHA Solver for Async .NET Code, Selenium and Playwright

Reference one NuGet package, await a token or the text of an image CAPTCHA, and let CapSkip do the work on a Windows PC or server you control, with no meter on how often your .NET code asks.

Windows x64·Runs locally, so no CAPTCHA leaves your machine
  • MIT-licensed NuGet SDK
  • .NET Standard 2.0
  • Flat monthly license
CAPTCHAs a month40,000
40.0k250.0k
Metered elsewhere, about $1.40 per 1,000$56.00
CapSkip Bronze, flat$35.00
$21.00stays in your pocketevery month, at this volume

Adding a C# CAPTCHA solver to a .NET solution should feel like adding any other dependency, and with CapSkip it does: run dotnet add package CapSkip, create a CapSkipClient and await the answer. The package itself is a thin, MIT-licensed wrapper. The real work is done by the CapSkip desktop app, installed wherever you keep Windows (a workstation, a cloud VPS, a dedicated server), so challenges never travel to a remote solving farm.

Each CAPTCHA family gets its own awaitable method. RecaptchaAsync takes the checkbox, invisible, v3 and Enterprise flavors of Google's widget; TurnstileAsync handles Cloudflare widgets as well as full challenge pages; GeetestAsync accepts a fresh GeeTest v3 gt and challenge pair; AltchaAsync, CapyAsync, CaptchaFoxAsync, FriendlyCaptchaAsync and AmazonWafAsync cover the rest. When all you need is a CAPTCHA reader in C#, NormalAsync turns a distorted text image into characters in about 0.1 seconds.

Because the client targets .NET Standard 2.0, one reference serves a .NET 8 worker, a .NET Framework 4.6.1 WinForms utility and a Selenium test project alike. The license is a flat monthly subscription starting at $35, and a solution already wired to 2Captcha or CapSolver can keep that client: the CapSkip app answers it locally.

Two ways in, one engine. Start fresh with the NuGet SDK, or leave a working 2Captcha or CapSolver .NET client exactly as it is: switch on that service's emulator inside CapSkip and add it to the hosts file, and its requests get solved on your machine instead. Either path ends at the same unmetered license. Browse the API reference

What this .NET CAPTCHA solver gives your C# code

Task-based methods with cancellation

Every solve returns a Task of SolveResult and accepts a CancellationToken, so a stopping host or an aborted ASP.NET Core request can drop a pending solve cleanly.

One reference from Framework 4.6.1 to .NET 9

Compiled against .NET Standard 2.0, the same package loads in .NET 6 through 9, .NET Core 2.0 and later, and aging .NET Framework 4.6.1 desktop utilities.

Task.WhenAll at a flat price

Fan out fifty solves with Task.WhenAll or a SemaphoreSlim-throttled loop. The price stays the same, so concurrency is capped by the machine running CapSkip, not by your invoice.

CAPTCHA-trained OCR instead of Tesseract

NormalAsync accepts the image as a path on disk, a URL or base64 text and returns its characters in about 0.1 seconds. It reads thousands of warped CAPTCHA styles that general OCR stumbles on.

Selenium, Playwright for .NET, PuppeteerSharp

The SDK never drives your browser. Read the sitekey with FindElement or GetAttributeAsync, await the token, then inject it through IJavaScriptExecutor or EvaluateAsync before clicking submit.

Typed results and a typed exception tree

SolveResult exposes Code, UserAgent and the GeeTest Challenge, Validate and Seccode values as properties, while NetworkException, TimeoutException, ValidationException and ApiException all derive from CapSkipError.

Pick the route that matches your .NET project

C#
// dotnet add package CapSkip
using CapSkip;

var solver = new CapSkipClient(host: "127.0.0.1", port: 8080);

var result = await solver.RecaptchaAsync(
    "YOUR_SITEKEY",
    "https://example.com/page-with-recaptcha");

Console.WriteLine(result.Code); // token

Await RecaptchaAsync with the site key and page URL; result.Code then holds the token your form post or browser session submits next.

Extension for hands-on browser work

Stepping through a sign-up or checkout yourself while debugging? The Chrome or Firefox add-on notices each CAPTCHA and has the running app solve it, with no C# written at all.

A NuGet CAPTCHA solver package

Add it to any .NET project and call strongly typed async methods. Teams on Python, Node.js or PHP get sibling SDKs built around the same solving engine.

Local API for existing .NET clients

A C# client written for 2Captcha or a similar service keeps sending its usual requests. CapSkip answers that protocol on your own network, so nothing needs rewriting.

Aim a test project at a live reCAPTCHA page

Before CapSkip goes into production code, point a scratch console app at our hosted reCAPTCHA v2 demo. It loads the real widget, so you can watch RecaptchaAsync bring back a token that actually works.

From NuGet restore to the first solved CAPTCHA

  1. Run CapSkip on a Windows box

    Put CapSkip on whichever Windows workstation, VPS or dedicated server your .NET code can reach, then leave it running in the background while you build. Download the installer

  2. Activate a plan or the trial

    Buy a Bronze, Silver or Gold subscription, or claim the free 3-day trial with its 500 solves, and enter the emailed credentials in the app to activate it. Start the free trial

  3. Add the package and await

    Run dotnet add package CapSkip, point CapSkipClient at the host and port shown in the app, and await the method for your CAPTCHA type from a console app, service or test. See every SDK

CapSkip vs 2Captcha and CapSolver from C# code

How a local, flat-priced solver stacks up against a metered cloud API once your .NET services run at volume.

FeatureCapSkip2Captcha / CapSolver
What you pay forOne subscription from $35 monthly, nothing per solveEach solve, charged per 1,000, pay as you go
Where the CAPTCHA is solvedInside CapSkip, on Windows hardware you ownOn the vendor's servers, sometimes by human workers
Bill after a busy monthUnchanged, however many tasks you awaitedClimbs with every solve and every retry
Who sees the challengeNobody else: it stays on your networkA third party receives every challenge you send
Parallel solvesAs many threads as your CPU and memory carryExtra throughput usually costs extra
Getting it into .NETNuGet package, or keep your old client through emulationThe vendor's own client library
Image CAPTCHA turnaroundAbout 0.1 seconds, with no remote queueEach image uploaded, queued and polled over the internet

Pricing

Stop paying per solve

Choose your license

Bronze License

$35/ month

Subscribe to Bronze

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.

Start the free trial

How to solve CAPTCHAs in C#, from HttpClient to Hangfire jobs

In .NET code a CAPTCHA tends to appear in one of three places: an HttpClient that posts a form, a Selenium or Playwright session steering a real browser, or a background job running with nobody watching. One CapSkipClient instance serves all three; only what you do with the answer differs.

For HttpClient work, gather the site key or download the image using the session cookies of that form, await the matching method, then add result.Code to the FormUrlEncodedContent of your POST in the field the target form reads, typically g-recaptcha-response. A Cloudflare challenge page also wants its data and pagedata values in the options, and the follow-up request should carry result.UserAgent.

Inside a browser session the SDK stays away from the driver. Your test reads the key from the element, awaits RecaptchaAsync or TurnstileAsync with driver.Url, writes the token back through IJavaScriptExecutor or EvaluateAsync, and submits. These tokens stay valid for only a few minutes, so request them right before the submit step, not at the top of a long test.

Unattended work is where a flat license earns its keep. A Hangfire job or hosted worker can retry a failed solve, run overnight on a schedule and fan out with Task.WhenAll without anyone topping up a balance. Catch CapSkipError once to log an unreachable app, a rejected option or a timeout, and hand the job's CancellationToken to each call so a shutting-down host never hangs on a pending solve.

Moving off CapSolver or 2Captcha but keeping its .NET client? On the machine running CapSkip, enable that service's emulator and use the hosts file option in the app. The existing C# code stays untouched, and the CAPTCHA types it already sends are answered locally.

Related guides: reCAPTCHA v2 in C# · Turnstile challenge page in C# · Hangfire CAPTCHA jobs

Which NuGet package should I install to solve CAPTCHAs in .NET?
Install the package named CapSkip, either with dotnet add package CapSkip or Install-Package CapSkip in the Visual Studio Package Manager Console. It is MIT licensed and wraps the local API of the CapSkip app in async methods, one per CAPTCHA type, from RecaptchaAsync to NormalAsync.
Will one build of the package work on .NET Framework 4.6.1 and on .NET 8?
Yes. The library targets .NET Standard 2.0, which both runtimes consume, along with .NET 6, 7 and 9 and .NET Core 2.0 or later. On the older targets, NuGet restores System.Text.Json for you, so there is nothing extra to reference by hand.
How do I put a solved reCAPTCHA token into a Selenium WebDriver page in C#?
Locate the widget with FindElement, read its sitekey, and await RecaptchaAsync with that key and driver.Url. Then set the hidden g-recaptcha-response field through IJavaScriptExecutor.ExecuteScript and submit. For invisible, Enterprise or v3 widgets, pass an options dictionary with invisible or enterprise set to 1, or version set to v3 plus the page's action.
Does the .NET SDK handle Cloudflare's full-page check as well as the Turnstile box?
Yes. For the box alone, await TurnstileAsync with the sitekey and URL, then post result.Code in the cf-turnstile-response field. A full-page check needs two more inputs: copy that page's data and pagedata strings into the options dictionary, and make your next request with the browser identity returned in result.UserAgent.
Is it safe to block on the async methods in WinForms or a console tool?
In a console app or a background thread, calling GetAwaiter().GetResult() on the returned Task works fine. On a WinForms UI thread or inside ASP.NET Core, prefer await, because blocking there freezes the window or ties up a request thread while the solve runs.
How do I cancel a slow solve or change its time limit in .NET?
Pass a CancellationToken to any method, and cancelling it stops both the submission and the polling. The CapSkipClient constructor also takes defaultTimeout, 120 seconds for image CAPTCHAs, and recaptchaTimeout, 300 seconds for reCAPTCHA and the other browser-based types. A solve that runs past its limit throws TimeoutException.
Can a CapSolver or 2Captcha client written in C# keep working unchanged?
Yes. In the CapSkip app, enable the emulator matching that service, then add it to the hosts file from the same screen. The client keeps calling the address it always used, the supported CAPTCHA types are solved on your machine, and the per-solve charges stop.
Is Tesseract good enough as a CAPTCHA reader in C#?
Rarely. Tesseract is tuned for clean printed text, and CAPTCHA images are distorted on purpose, so it misreads them often. NormalAsync sends the image to CapSkip, which reads thousands of CAPTCHA styles in about 0.1 seconds, and a new style that reads poorly can be trained for free.

Reference CapSkip in your next .NET build

Install the app, add the NuGet package and await your first token within minutes. From then on, every solve your C# code requests is covered by the same monthly price, whatever the volume.