CapSkip 1.0.2
dotnet add package CapSkip --version 1.0.2
NuGet\Install-Package CapSkip -Version 1.0.2
<PackageReference Include="CapSkip" Version="1.0.2" />
<PackageVersion Include="CapSkip" Version="1.0.2" />
<PackageReference Include="CapSkip" />
paket add CapSkip --version 1.0.2
#r "nuget: CapSkip, 1.0.2"
#:package CapSkip@1.0.2
#addin nuget:?package=CapSkip&version=1.0.2
#tool nuget:?package=CapSkip&version=1.0.2
CapSkip .NET SDK
Official .NET / C# client for the CapSkip local captcha solver.
CapSkip runs on your machine and exposes a standard captcha-solver HTTP API (the familiar in.php / res.php endpoints). This SDK wraps that API with clean, familiar method names, so you can solve captchas locally — no cloud service and no per-solve API fees beyond your CapSkip license.
Targets .NET Standard 2.0, so it runs on .NET 6/7/8/9+, .NET Core 2.0+, and .NET Framework 4.6.1+.
Quick start (5 minutes)
1. Install CapSkip
Download and run the CapSkip desktop app from capskip.com. Leave it running in the background.
In CapSkip settings, note:
- API port (default:
8080) - API key (optional — if validation is disabled, any string works)
2. Install the SDK
dotnet add package CapSkip
3. Solve your first captcha
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); // g-recaptcha-response token
Prerequisite: CapSkip must be running before you call the SDK. If you see a connection error, see Troubleshooting.
Every solve method is asynchronous — await it (or call .GetAwaiter().GetResult() from synchronous code).
Supported captcha types
| Type | SDK method |
|---|---|
| Image CAPTCHA (distorted text) | solver.NormalAsync(file) |
| reCAPTCHA v2 (checkbox) | solver.RecaptchaAsync(sitekey, url) |
| reCAPTCHA v2 Invisible | solver.RecaptchaAsync(sitekey, url, new() { ["invisible"] = 1 }) |
| reCAPTCHA v2 Enterprise | solver.RecaptchaAsync(sitekey, url, new() { ["enterprise"] = 1 }) |
| reCAPTCHA v3 | solver.RecaptchaAsync(sitekey, url, new() { ["version"] = "v3" }) |
| reCAPTCHA v3 Enterprise | solver.RecaptchaAsync(sitekey, url, new() { ["version"] = "v3", ["enterprise"] = 1 }) |
| Cloudflare Turnstile (widget) | solver.TurnstileAsync(sitekey, url) |
| Cloudflare Turnstile (challenge page) | solver.TurnstileAsync(sitekey, url, new() { ["data"] = ..., ["pagedata"] = ... }) |
Documentation
| Guide | Description |
|---|---|
| Tutorial | Complete walkthrough of every captcha type |
| Getting Started | Full setup: CapSkip app, SDK install, first program |
| API Reference | All classes, methods, parameters, and return values |
| Examples | Ready-to-run samples for every captcha type |
| Troubleshooting | Connection errors, timeouts, proxy issues |
| Contributing | Development setup, tests, pull requests |
| Changelog | Release history |
Configuration
using CapSkip;
var solver = new CapSkipClient(
apiKey: "capskip", // your CapSkip API key (or any string if validation is off)
host: "127.0.0.1", // CapSkip host
port: 8080, // CapSkip port from app settings
defaultTimeout: 120, // seconds — image captcha polling timeout
recaptchaTimeout: 300, // seconds — reCAPTCHA / Turnstile polling timeout
pollingInterval: 5); // max seconds between res.php polls (starts at 0.25s, backs off to this)
Use environment variables in production:
# Linux / macOS
export CAPSKIP_API_KEY="your-key"
export CAPSKIP_HOST="127.0.0.1"
export CAPSKIP_PORT="8080"
# Windows PowerShell
$env:CAPSKIP_API_KEY = "your-key"
$env:CAPSKIP_HOST = "127.0.0.1"
$env:CAPSKIP_PORT = "8080"
using CapSkip;
var solver = new CapSkipClient(
apiKey: Environment.GetEnvironmentVariable("CAPSKIP_API_KEY") ?? "capskip",
host: Environment.GetEnvironmentVariable("CAPSKIP_HOST") ?? "127.0.0.1",
port: int.TryParse(Environment.GetEnvironmentVariable("CAPSKIP_PORT"), out var p) ? p : 8080);
Usage examples
Image captcha
await solver.NormalAsync("captcha.png");
await solver.NormalAsync("https://example.com/captcha.jpg");
await solver.NormalAsync("data:image/png;base64,iVBORw0KGgo...");
// result.Code holds the recognized text
reCAPTCHA v2 / v3
// reCAPTCHA v2
var v2 = await solver.RecaptchaAsync("...", "https://example.com");
// reCAPTCHA v3
var v3 = await solver.RecaptchaAsync("...", "https://example.com", new()
{
["version"] = "v3",
["action"] = "submit",
["score"] = 0.7,
});
Cloudflare Turnstile
var result = await solver.TurnstileAsync("0x4AAAAAAA...", "https://example.com");
With a proxy (reCAPTCHA & Turnstile only)
// Proxy is not supported for image captcha
await solver.RecaptchaAsync("...", "https://example.com", new()
{
["proxy"] = new Proxy("HTTPS", "user:pass@1.2.3.4:3128"),
});
await solver.TurnstileAsync("...", "https://example.com", new()
{
["proxy"] = new Proxy("HTTP", "1.2.3.4:3128"),
});
Parallel solving
using CapSkip;
var solver = new CapSkipClient();
var results = await Task.WhenAll(
solver.RecaptchaAsync("...", "https://a.com"),
solver.TurnstileAsync("...", "https://b.com"));
Console.WriteLine($"{results[0].Code} {results[1].Code}");
AsyncCapSkipis provided as an alias ofCapSkipClient— .NET I/O is asynchronous by nature, so every method already returns aTask. It exists for parity with the other CapSkip SDKs.
More examples: examples/
Return value
Every solve method resolves to a SolveResult:
public sealed class SolveResult
{
public string CaptchaId { get; } // internal ID from CapSkip
public string Code { get; } // solution — text for image, token for reCAPTCHA/Turnstile
public string? UserAgent { get; } // Turnstile only — use when submitting challenge-page tokens
}
Error handling
All SDK exceptions derive from CapSkipError, so you can catch that one type — or handle each kind:
using CapSkip;
try
{
var result = await solver.RecaptchaAsync("...", "...");
}
catch (ValidationException) { /* invalid parameters */ }
catch (NetworkException) { /* CapSkip not running, or captcha not ready (manual polling) */ }
catch (ApiException) { /* API returned an error code */ }
catch (CapSkip.TimeoutException) { /* polling timeout exceeded */ }
catch (CapSkipError) { /* any other CapSkip failure */ }
Note:
CapSkip.TimeoutExceptionandCapSkip.ValidationExceptionshare their short names with types inSystem. If you have bothusing System;andusing CapSkip;, qualify them asCapSkip.TimeoutException/CapSkip.ValidationException, or just catch the baseCapSkipError.
Development
git clone https://github.com/capskip/capskip-dotnet.git
cd capskip-dotnet
dotnet test
The test suite mocks the HTTP layer and spins up a local mock server — no CapSkip app or network access required. See CONTRIBUTING.md for the full development workflow.
Links
License
MIT — see LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- System.Text.Json (>= 8.0.5)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.2 | 47 | 7/15/2026 |
See CHANGELOG.md for release history.