Features Targets Quick Start How It Works Packages GitHub
Open-Source · .NET 10

Curl.Impersonate

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.

NuGet
Downloads
GitHub Stars
License
Program.cs
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);
Scroll to explore

Built for Stealth.
Shaped like 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.

Real Browser Fingerprints

Replays the exact ClientHello extensions, cipher order, ALPN, ALPS, and GREASE values of real browsers. JA3, JA4, and HTTP/2 SETTINGS all line up.

Defeats TLS Bot Detection

Bypasses Cloudflare, Akamai, DataDome, and PerimeterX without browser automation, cookies, or JavaScript challenges.

Familiar API Surface

CurlHttpClient mirrors HttpClient: GetAsync, PostAsJsonAsync, SendAsync, BaseAddress, DefaultHeaders. Drop-in feel.

CancellationToken Aware

Every async overload accepts a CancellationToken. libcurl's xferinfo callback aborts the native transfer the moment the token fires.

Split Runtime Packages

Natives are shipped as per-RID NuGet sub-packages. Restore pulls only the binary your platform needs — no 30 MB tax on every project.

Modern .NET 10 + C# Latest

Nullable-enabled, LibraryImport source-generated P/Invoke, TreatWarningsAsErrors, deterministic builds, SourceLink + symbol packages.

Every Major Browser.
Every Recent Version.

Pick any target from ImpersonateTarget — or pass a custom string for fingerprints added in newer libcurl-impersonate releases.

Chrome

99 → 146 on desktop, 99 & 131 on Android. Chrome146 is the current default.

Firefox

133, 135, 144, 147. NSS-backed handshake matches Mozilla's stock builds.

Safari

15.3 → 26.0 on desktop; 17.2 → 26.0 on iOS. Apple's SecureTransport quirks faithfully replicated.

Microsoft Edge

Edge 99 and 101. Chromium-based handshake with Microsoft-specific extension order.

Tor Browser

Tor 14.5 fingerprint. Pair with a Tor SOCKS proxy for end-to-end anonymity.

Custom Targets

Implicit string conversion lets you pass any libcurl-impersonate target that the upstream binary supports — no recompile.

Three lines from install to impersonation.

No native build chain. No browser binary. Just a NuGet install and an HttpClient-shaped API.

01

Install the package

The main package automatically pulls the native sub-package for your runtime.

dotnet PackageReference
$ dotnet add package Texnomic.Curl.Impersonate
02

Pick an impersonation target

Every supported browser lives on the ImpersonateTarget type as a static field.

C#
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);
03

Send a request

Same shape as HttpClient. Default headers, base address, timeouts, cancellation tokens, JSON helpers — all there.

C#
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();

Three Layers of Indistinguishability

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.

Layer 1 · Transport
TLS 1.2 / 1.3 ClientHello Cipher suite order Extension order GREASE values ALPN / ALPS JA3 · JA4
Layer 2 · HTTP/2 & HTTP/3
SETTINGS frame WINDOW_UPDATE pattern Header pseudo-order HPACK dynamic table QUIC transport params
Layer 3 · Application
User-Agent header Accept-* defaults Sec-CH-UA hints Header casing & order
Verify · Fingerprint Inspectors
tls.peet.ws tlsfingerprint.io browserleaks.com/tls

Native Where You Run It.

Shipped today: Windows x64 and Linux x64. macOS and Linux arm64 sub-packages are planned — contributions welcome.

Windows x64 · shipped
Linux x64 (glibc) · shipped
macOS arm64 & x64 · planned

Runtime Identifiers

win-x64
linux-x64
osx-arm64
osx-x64
linux-arm64

Modular on NuGet

Install the main package and NuGet will resolve the right native sub-package for your runtime automatically.

Ready to look like a real browser?

Install the package, pick a target, send a request. The TLS fingerprint inspectors will tell you everything matches.