A managed .NET 10 wrapper around libcurl-impersonate. Sends HTTP requests with TLS, HTTP/2, and HTTP/3 fingerprints identical to real Chrome, Firefox, Safari, Edge, and Tor — bypassing TLS-based bot detection without browser automation.
using Texnomic.Curl.Impersonate;
using var Client = new CurlHttpClient(ImpersonateTarget.Chrome146);
using var Response = await Client.GetAsync("https://tls.peet.ws/api/all");
Response.EnsureSuccessStatusCode();
var Body = await Response.Content.ReadAsStringAsync();
Console.WriteLine(Body);
HttpClient.A familiar managed surface backed by a curl that lies convincingly about who it is. Every request fingerprints as a real browser at the TLS, HTTP/2, and HTTP/3 layer.
Replays the exact ClientHello extensions, cipher order, ALPN, ALPS, and GREASE values of real browsers. JA3, JA4, and HTTP/2 SETTINGS all line up.
Bypasses Cloudflare, Akamai, DataDome, and PerimeterX without browser automation, cookies, or JavaScript challenges.
CurlHttpClient mirrors HttpClient: GetAsync, PostAsJsonAsync, SendAsync, BaseAddress, DefaultHeaders. Drop-in feel.
Every async overload accepts a CancellationToken. libcurl's xferinfo callback aborts the native transfer the moment the token fires.
Natives are shipped as per-RID NuGet sub-packages. Restore pulls only the binary your platform needs — no 30 MB tax on every project.
Nullable-enabled, LibraryImport source-generated P/Invoke, TreatWarningsAsErrors, deterministic builds, SourceLink + symbol packages.
Pick any target from ImpersonateTarget — or pass a custom string for fingerprints added in newer libcurl-impersonate releases.
99 → 146 on desktop, 99 & 131 on Android. Chrome146 is the current default.
133, 135, 144, 147. NSS-backed handshake matches Mozilla's stock builds.
15.3 → 26.0 on desktop; 17.2 → 26.0 on iOS. Apple's SecureTransport quirks faithfully replicated.
Edge 99 and 101. Chromium-based handshake with Microsoft-specific extension order.
Tor 14.5 fingerprint. Pair with a Tor SOCKS proxy for end-to-end anonymity.
Implicit string conversion lets you pass any libcurl-impersonate target that the upstream binary supports — no recompile.
No native build chain. No browser binary. Just a NuGet install and an HttpClient-shaped API.
The main package automatically pulls the native sub-package for your runtime.
$ dotnet add package Texnomic.Curl.Impersonate
Every supported browser lives on the ImpersonateTarget type as a static field.
using Texnomic.Curl.Impersonate;
using var Client = new CurlHttpClient(ImpersonateTarget.Chrome146);
// or pick any other supported browser
var Firefox = new CurlHttpClient(ImpersonateTarget.Firefox147);
var Safari = new CurlHttpClient(ImpersonateTarget.Safari260);
var Edge = new CurlHttpClient(ImpersonateTarget.Edge101);
Same shape as HttpClient. Default headers, base address, timeouts, cancellation tokens, JSON helpers — all there.
using var Client = new CurlHttpClient(ImpersonateTarget.Chrome146)
{
BaseAddress = new Uri("https://api.example.com"),
VerifySsl = true,
Timeout = TimeSpan.FromSeconds(30),
ConnectTimeout = TimeSpan.FromSeconds(10),
};
Client.DefaultHeaders["Authorization"] = "Bearer xxx";
using var Response = await Client.PostAsJsonAsync(
"/users",
new { Name = "Ada", Email = "ada@example.com" });
Response.EnsureSuccessStatusCode();
A TLS handshake leaks a fingerprint at every layer of the stack. libcurl-impersonate replays each layer to match a real browser byte-for-byte.
Shipped today: Windows x64 and Linux x64. macOS and Linux arm64 sub-packages are planned — contributions welcome.
Install the main package and NuGet will resolve the right native sub-package for your runtime automatically.
Install the package, pick a target, send a request. The TLS fingerprint inspectors will tell you everything matches.