primp
Python HTTP client that impersonates real browser TLS and HTTP/2 fingerprints.
Repository Health
Technical Analysis
primp (Python Requests IMPersonate) is a high-performance HTTP client for Python built on a Rust core. Unlike ordinary HTTP libraries, it mimics the TLS and HTTP/2 fingerprints (JA3/JA4, Akamai) of real web browsers such as Chrome, Safari, Edge, Firefox, and Opera, so its requests look like genuine browser traffic.
This makes primp especially useful for web scraping and automation against sites that fingerprint clients to block bots. It offers a requests-style API while delegating the networking and impersonation to compiled Rust for speed.
What You Get
- A requests-style Client with get, post, put, patch, delete, and head methods
- Browser impersonation profiles for Chrome, Safari, Edge, Firefox, and Opera
- OS fingerprint selection (Android, iOS, Linux, macOS, Windows, random)
- A fast Rust networking core exposed through prebuilt Python wheels
Common Use Cases
- Scraping sites that block clients by TLS/HTTP2 fingerprint
- Automating requests that must appear to come from a specific browser
- Replacing requests/httpx where anti-bot fingerprinting is a problem
Under The Hood
Architecture - primp is a monorepo: the core HTTP/impersonation engine lives in crates/primp (Rust) and the Python bindings in crates/primp-python. The Python package is a thin binding layer over the Rust client, which builds on the reqwest/rquest stack to control the TLS (BoringSSL) handshake and HTTP/2 frame settings that constitute a browser fingerprint. Impersonation profiles select a preconfigured set of these low-level parameters.
Tech Stack - Roughly 96% Rust with a small Python surface. The Rust side handles async networking and TLS via BoringSSL to reproduce JA3/JA4 and Akamai fingerprints; the Python side is packaged as a native extension distributed as prebuilt wheels, so end users typically need no Rust toolchain.
Code Quality - The project is actively maintained (56 releases, frequent commits) with a clear versioning cadence and per-crate structure. As a single-maintainer project the bus factor is low, but the release discipline and browser-profile update history indicate careful, ongoing upkeep tracking new browser versions.
API Design - The public API deliberately mirrors Python’s requests: a Client object plus HTTP verb methods returning response objects with .text, .json, and similar accessors. Enabling impersonation is a single constructor argument (impersonate=“chrome_146”), keeping the ergonomics familiar while hiding the substantial low-level fingerprinting machinery.