wreq is a free, open source data extraction & web scraping project written in Rust and released under Apache-2.0. It has 1,091 GitHub stars, 140 forks and 23 open issues, and was last pushed 16 hours ago. On this registry it ranks #116 of 149 tracked projects in Data Extraction & Web Scraping, with 5 head-to-head comparisons available. It gained 38 stars over the last 30 tracked days.

What is wreq?

wreq is an Apache-2.0 licensed Rust HTTP client that provides high-fidelity protocol matching through customizable TLS, JA3/JA4, and HTTP/2 signature capabilities, and it is aimed at developers building crawlers, scrapers, and censorship-resistant clients that need to look like real browsers on the wire.

What it is

wreq is an ergonomic and modular HTTP client written in Rust, distributed as the wreq crate on crates.io and documented at wreq.org. It describes itself as a client for high-fidelity protocol matching, and it exposes fine-grained control over TLS and HTTP/2 extensions and settings rather than a single opaque fingerprint string. HTTPS is handled through BoringSSL, and the client supports multiple runtimes, currently Tokio and Compio.

The concrete problem it solves is fingerprint-based rejection. In the Rust ecosystem, most HTTP clients rely on the http library, which performs well but does not preserve header case, and some WAFs reject HTTP/1 requests carrying lowercase headers, a behavior documented in a linked reqwest discussion. wreq fully supports HTTP/1 header case sensitivity, replacing that default behavior. For HTTP/2 over TLS, the maintainers argue that browser fingerprints such as JA3, JA4, and Akamai cannot be reliably emulated using simple fingerprint strings, because TLS encryption is complex and HTTP/2 is widely adopted. wreq therefore gives direct control over the underlying TLS and HTTP/2 parameters instead of parsing string-based fingerprints.

Key capabilities

  • Fine-grained TLS and HTTP/2 extension and setting controls for reproducing browser wire behavior, backed by the ja3, ja4, akamai, and fingerprint topics.
  • HTTP/1 over TLS with full header case preservation, which the README presents as a direct fix for WAF rejection of lowercase headers.
  • wreq-util maintains more than 100 browser device emulation profiles, selected through Emulation::Safari26 and similar values.
  • Body handling for plain bodies, JSON, urlencoded, and multipart payloads, plus support for HTTP Trailer.
  • Operational features including a Cookie Store, Redirect Policy, Original Header handling, rotating proxies, and Tower Middleware integration.
  • Protocol and identity features including WebSocket Upgrade, a Certificate Store for CAs and mTLS, and HTTP/2 over TLS parity.
  • Runtime flexibility through Tokio and Compio, and HTTPS delivered via BoringSSL.

Who uses it and how

  • Scraping and crawling teams whose requests are blocked by WAFs that inspect header casing or TLS handshake shape.
  • Engineers reproducing a specific browser's behavior on the wire, choosing among the 100-plus device emulation profiles in wreq-util instead of hand-tuning cipher lists.
  • Services that need to route traffic through rotating proxies while retaining cookies and applying Tower middleware in the same client.
  • Applications requiring mutual TLS or custom certificate authorities, which use the Certificate Store rather than shelling out to an external HTTP tool.
  • Teams already standardized on Tokio, or on Compio, who can select the runtime without changing client code.

Getting started

Add tokio = { version = "1", features = ["full"] }, wreq = "0.16", and wreq-util = "0.2" to Cargo.toml, then build a client with Client::builder().emulation(Emulation::Safari26).build()? and call .send().await? on a request. Compiling from source requires BoringSSL build dependencies — build-essential cmake perl pkg-config libclang-dev musl-tools git on Debian-derived systems — followed by cargo build --release, and a GitHub Actions workflow in .github/compilation-guide/build.yml covers Linux, Windows, and macOS.

How it compares

The README positions wreq against the broader Rust HTTP client ecosystem, where most clients build on the http library and inherit its header-case behavior, and it links a reqwest discussion as evidence of the resulting WAF problems. The distinction wreq draws is not breadth of API but depth of protocol control: instead of accepting or parsing string-based JA3, JA4, and Akamai fingerprints, it exposes the TLS and HTTP/2 extensions and settings that produce them. No commercial products are named as targets for replacement.

When to use it — and when not to

A self-hoster takes on the BoringSSL toolchain: the README warns that compiling alongside openssl-sys can cause symbol conflicts that lead to link failures, avoidable on Linux and Android by enabling the prefix-symbols feature. Developers who only need straightforward JSON requests over HTTPS may find a lighter client sufficient, since the emulation machinery and BoringSSL dependency exist for fingerprint-sensitive traffic. Those wanting private guidance, expert review, or direct maintainer access are directed to commercial support by email, which indicates that support otherwise runs through community channels such as the linked Discord.

project readme (upstream, from github) — read inline

wreq

CI Crates.io License Crates.io MSRV crates.io Discord chat

🚀 Help me work seamlessly with open source sharing by sponsoring me on GitHub

An ergonomic and modular Rust HTTP Client for high-fidelity protocol matching, featuring customizable TLS, JA3/JA4, and HTTP/2 signature capabilities.

Features

  • Plain bodies, JSON, urlencoded, multipart
  • HTTP Trailer
  • Cookie Store
  • Redirect Policy
  • Original Header
  • Rotating Proxies
  • Tower Middleware
  • WebSocket Upgrade
  • HTTPS via BoringSSL
  • HTTP/2 over TLS Parity
  • Certificate Store (CAs & mTLS)
  • Multiple Runtime (Tokio, Compio)

Example

The following example uses the Tokio runtime with optional features enabled by adding this to your Cargo.toml:

[dependencies]
tokio = { version = "1", features = ["full"] }
wreq = "0.16"
wreq-util = "0.2"

And then the code:

use wreq::Client;
use wreq_util::Emulation;

#[tokio::main]
async fn main() -> wreq::Result<()> {
    // Build a client
    let client = Client::builder()
        .emulation(Emulation::Safari26)
        .build()?;

    // Use the API you're already familiar with
    let resp = client.get("https://pingly.us.kg/api/all").send().await?;
    println!("{}", resp.text().await?);
    Ok(())
}

Behavior

  • HTTP/1 over TLS

In the Rust ecosystem, most HTTP clients rely on the http library, which performs well but does not preserve header case. This causes some WAFs to reject HTTP/1 requests with lowercase headers (see discussion). wreq addresses this by fully supporting HTTP/1 header case sensitivity.

  • HTTP/2 over TLS

Due to the complexity of TLS encryption and the widespread adoption of HTTP/2, browser fingerprints such as JA3, JA4, and Akamai cannot be reliably emulated using simple fingerprint strings. Instead of parsing and emulating these string-based fingerprints, wreq provides fine-grained control over TLS and HTTP/2 extensions and settings for precise browser behavior emulation.

  • Device Emulation

TLS and HTTP/2 fingerprints are often identical across various browser models because these underlying protocols evolve slower than browser release cycles. 100+ browser device emulation profiles are maintained in wreq-util.

Building

Compiling alongside openssl-sys can cause symbol conflicts with boringssl that lead to link failures, and on Linux and Android this can be avoided by enabling the prefix-symbols feature.

Install BoringSSL build dependencies and build with:

sudo apt-get install build-essential cmake perl pkg-config libclang-dev musl-tools git -y
cargo build --release

This GitHub Actions workflow can be used to compile the project on Linux, Windows, and macOS.

Services

Help sustain the ongoing development of this open-source project by reaching out for commercial support. Receive private guidance, expert reviews, or direct access to the maintainer, with personalized technical assistance tailored to your needs.

License

Licensed under either of Apache License, Version 2.0 (LICENSE or http://www.apache.org/licenses/LICENSE-2.0).

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be licensed as above, without any additional terms or conditions.

Sponsors

Solve reCAPTCHA in less than 2 seconds

Captcha.fun delivers fast, reliable CAPTCHA solving built for automation at scale.

With simple API integration, consistent performance, and competitive pricing, it's an easy way to keep your workflows moving without delays—use code WREQ for 10% bonus credits.

Dashboard | Docs | Discord


TLS fingerprinting alone isn't enough for modern bot protection. Hyper Solutions provides the missing piece - API endpoints that generate valid antibot tokens for:

Akamai • DataDome • Kasada • Incapsula

No browser automation. Just simple API calls that return the exact cookies and headers these systems require.

Dashboard | Docs | Discord

Accolades

A hard fork of reqwest.

Frequently asked questions

Is wreq free to use?

wreq is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does wreq do?

An ergonomic, privacy-aware Rust HTTP Client

What is wreq written in?

wreq is primarily written in Rust. Its source is publicly available at https://github.com/0x676e67/wreq, and it has 1,091 GitHub stars.