NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #2874 most downloaded on PyPI
A library for making HTTP requests through browser impersonation
Last release 27 days ago
07 Sep 2026
Release timing varies
gaps range from 2 weeks to 3 months
Most releases are documented
notes for 26 of 30 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
30 releases · first in 2025
One column per month.
py-0.14.1 - 2026-09-07
h3 discovery first records a host as not h3-capable, then needs to upgrade that cached value when the response advertises HTTP/3. ## Verification - Before: cargo test -p impit http3::tests::alt_svc_discovery_updates_cached_h3_support -- --exact failed because the cached false value was retained. - After: cargo test -p impit passes, including the cache-upgrade regression test. - cargo fmt --check - cargo clippy -p impit --all-targets -- -D warningsAdd chrome151 browser fingerprint
Add chrome151 browser fingerprint (#510)
chrome151 fingerprint. Closes #508. Relative to chrome142 the only wire-level TLS difference is that Chrome now leads its signature_algorithms list with the three ML-DSA codepoints 0x0904/0x0905/0x0906, which is the entire reason chrome142 produces a different JA4 from current Chrome. Ciphers, extensions, key exchange groups, ALPN, ALPS, ECH and the HTTP/2 settings are unchanged.Support streaming request bodies (#514)
ImpitBody, letting the core crate stream request bodies into reqwest instead of always buffering them; bindings support comes in follow-ups.Stream iterator request bodies (#515)
content= take a sync or async iterable of byte chunks and streams it into the request instead of buffering it; stacked on #514.Fix panic on a malformed server cookie
Fix panic on a malformed server cookie (#491)
Decode header values per-ecosystem (Python/JS), expose httpx-style Response.headers (#492)
Add raise_for_status to type stub (#501)
Align Browser literal with the fingerprints actually supported at runtime (#509)
Replace substring match by matching according to RFC 6265, §5.1.3 . Add test. # Issues: Closes: #473 ---------
All notable changes to this project will be documented in this file.
All notable changes to this project will be documented in this file.
Decode non-ASCII response header values as ISO-8859-1 (#434)
Use browser-matching multipart boundary format (#435)
----WebKitFormBoundary + 16 alphanumeric chars - Firefox: ----geckoformboundary + two random uint64 hex values - OkHttp: UUID v4 (xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx) - No fingerprint: ----formdata-impit-* (default, unchanged) The boundary is generated lazily — the NAPI call only happens when the body is actually a FormData instance. The method is not exposed in public types.Migrate http3 DNS lookup from hickory-client to hickory-resolver (#454)
impit/src/http3.rs only used hickory to fire a single HTTPS-record DNS query against a hard-coded 8.8.8.8:53 for h3 discovery. Migrated that to hickory-resolver 0.26.1, which: - pulls in the patched hickory-proto 0.26.1, - uses the system DNS config instead of hard-coding Google's resolver, - drops the manual background-task plumbing and Drop impl since the resolver manages its own connections. API shifts handled along the way: Record::data() → Record.data (now a public field), SVCB::svc_params() → SVCB.svc_params (public field).Share browser-string resolution across sync and async clients (#481)
browser string → fingerprint match, and the two had drifted. The async client mapped chrome124 to the chrome_125 fingerprint (mislabeled, even though a real chrome_124 fingerprint exists in the core database), while the sync client didn't recognize chrome124 at all and fell back to panic!("Unsupported browser"), aborting across the FFI boundary instead of raising a catchable Python exception. The bare chrome alias is intentionally left at chrome_125 in both clients to preserve current behavior and the pinned JA4 test.Raise on mid-stream body errors instead of silent EOF (#482)
StopIteration/StopAsyncIteration, which signal normal end-of-iteration — so for/async for ended silently and callers processed partial bodies as complete (a silent data-integrity bug, #475). Both sync and async iterators now propagate the classified ImpitError as a real exception and set the consumed/closed flags consistently with the clean-EOF branch. Streamed truncation surfaces in reqwest as a Decode-kinded error rather than Body, so the existing unexpected-EOF classification missed it and fell through to the catch-all HTTPError. The guard is widened to cover is_decode(), so truncated streams now raise RemoteProtocolError, matching httpx. Verified against a vanilla server that truncates the body mid-response; added sync + async regression tests.Add new OkHTTP fingerprints (#416)
Return the vanillaFallback option as an alternative for failing requests (#441)
vanillaFallback option has been noop in a few of the latest versions of impit. The changes from this PR return this feature to support, e.g., servers with old TLS stacks that uncover some of the emulation discrepancies and cause the requests to fail.Add iOS 18 system TLS fingerprint (#465)
Browser::Ios18 (string: "ios18").Add HTTP/2 SETTINGS fingerprinting
Add HTTP/2 SETTINGS fingerprinting (#386)
Support timeout=None to disable timeout (#402)
scraper dependency with a more lightweight HTML parser from lol_html. Adds regression tests to ensure the behaviour stays the same.Proxy authenticates with empty password
Proxy authenticates with empty password (#327)
Authenticate with HTTPS proxy and HTTP target (#333)
reqwest.Do not panic on missing attributes for encoding-related meta elements (#346)
meta elements with missing content or charset attributes. Related to #344Use the rustls Verifier / CryptoProvider cache with custom fingerprints (#371)
Allow removing impersonated headers by passing empty string (#382)
Sec-Fetch-User) from requests by passing an empty string as the header value. When an empty string is provided, the header is filtered out before the request is sent. This enables users, e.g., to manually control which Sec-Fetch-* headers should be included in their requests, addressing use cases where the default impersonated headers don't match the actual request context.Enable TRACE method in the bindings (#328)
trace method in all of them. Required for type parity (HttpMethod) in downstream repositories - Crawlee et al.Use rustls-platform-verifier for system CA support (#357)
webpki-roots dependency with rustls-platform-verifier to enable impit to rely on the operating system's trust store. ---------Custom fingerprint support (#366)
rustls patch) to impit. Prepares the codebase for new, non-hardcoded browser fingerprints. Related to #99Add more Chrome and Firefox fingerprints (#367)
…(accepting the binary body) is considered deprecated in the httpx library we use as the design master.
All notable changes to this project will be documented in this file.
RemoteProtocolError (#314)
ImpitRequest struct for storing all request-related data (#307)
impit.make_request method by splitting it into build_request and send. Prerequisite for the solution to #227 proposed in https://github.com/apify/impit/issues/227#issuecomment-3184109259json() method for Response object (#277)
Response.json() method that parses Response.text using the native json module.ConnectError (#258)
cause to the ConnectError display string. This allows for better error introspection in dependent packages. Unblocks https://github.com/apify/crawlee-python/pull/1389/Error, impit will return false for every call to host_supports_h3 (unless, e.g. alt-svc header has been registered for this domain).local_address option to Impit constructor (#225)
local_address option to the Impit HTTP client constructor across all language bindings (Rust, Python, and Node.js), allowing users to bind the client to a specific network interface. This feature is useful for testing purposes or when working with multiple network interfaces.TRACE (#238)Client while reading response (#234)
Response for impit.ClientResponse (#233)
Response. This can be useful when creating tests and mocks. - Allow to set custom attributes in Response ---------impit.Client during multithreaded operations (#230)TimeoutException (#222)
Impit-instance-wide timeout if the request-specific timeout is missing.Exception class types are inheriting from Exception (#207)
Fix cookies with attributes 'SameSite' and domain (#213)
Impit Sync (#212)rest and version with which the Cookie object is created. (#202)
Cookie object is created, such as rest and version.(Async)Client.stream() method for Python (#201)
stream support for Client and AsyncClient. Implements for Response support for the read and iter_bytes methods, and their counterparts aread and aiter_bytes according to the httpx API closes https://github.com/apify/impit/issues/142Add support for custom cookie store implementations (#179)
ImpitBuilder struct (using the new with_cookie_store builder method). Without passing the store implementation, impit client in both bindings is by default stateless (doesn't store cookies). Enables implementing custom support for language-specific cookie stores (in JS and Python).Show the underlying reqwest error on unrecognized error type (#183)
reqwest errors through to binding users.Support socks proxy (#197)
socks proxies to impit-node. This theoretically enables socks proxies for CLI and the Python binding as well, but this behaviour is untested due to a lack of working socks proxy server implementations in Python.Support for custom cookie stores for Python (#182)
cookie_jar constructor parameter for Client and AsyncClient classes, accepting http.cookiejar's CookieJar (or a custom implementation thereof, implementing at least setCookie(cookie: http.cookiejar.Cookie) and iter(): Cookie[]. impit will write to and read from this custom cookie store. Related to #123Client-scoped headers option (#200)
headers setting to Impit constructor to set headers to be included in every request made by the built [Impit] instance. This can be used to add e.g. custom user-agent or authorization headers that should be included in every request. These headers override the "impersonation" headers set by the with_browser method. In turn, these are overridden by request-specific headers setting.Client and AsyncClient (#176)
AsyncClient and Client constructors as context managers inside the with statements. Closes #174Reenable HTTP/3 features in JS bindings (#57)
http3 feature in Node.JS bindings. This PR solves the underlying problems by building the reqwest's Client from within the napi-rs-managed tokio runtime. Adds tests for http3 usage from Node bindings. Removes problematic Firefox header (Connection is not allowed in HTTP2 and HTTP3 requests or responses and together with forceHttp3 was causing panics inside the Rust code).response.encoding contains the actual encoding (#119)
content-type header for the charset parameter.Case-insensitive request header deduplication (#127)
Add ReadableStream in Response.body (#28)
Response.body now returns an instance of JS ReadableStream. This API design matches the (browser) Fetch API spec. In order to correctly manage the Response consumption, the current codebase has been slightly refactored. Note that the implementation relies on a prerelease version of the napi-rs tooling.Add Python bindings for impit (#49)
impit. The interface is inspired by the httpx library (in the same way the JS bindings' interface is inspired by fetch, i.e. the end goal is to provide an almost drop-in replacement with extra features).Use thiserror for better error handling DX (#90)
std::error::Error implementation with thiserror. This should improve the developer experience and error messages across the monorepo.Allow passing binary body to the data parameter (#103)
data parameter. data now accepts both a dict[str,str] and a binary representation of the request body. This PR intentionally doesn't update the recently added typings in the impit.pyi file, as this behaviour (accepting the binary body) is considered deprecated in the httpx library we use as the design master.Make ImpitPyResponse public for Python with the name Response (#110)
ImpitPyResponse public for Python with the name Response. This will improve type handling and code navigation in the IDE ---------Add url and content property for Response, smart .text decoding, options for redirects (#122)
url, encoding and content properties for Response. Decodes the response using the automatic encoding-determining algorithm. Adds redirect-related options. ---------response.headers is a Headers object (#137)
response.headers from a Record<string, string> into a Headers object, matching the original fetch API.Better errors (#150)
impit and both the language bindings. Improves error messages. For Python bindings, this PR adds the same exception types as in httpx.Switch to Vec<(String, String)> for request headers (#156)
RequestInit.headers type in the impit-node bindings. Closes #151<!-- generated by git-cliff -->
Treat unexpected EOF error as RemoteProtocolError
RemoteProtocolError (#314)
Raise Python exception on response body read error
Align anonymous client API with httpx
ImpitRequest struct for storing all request-related data (#307)
impit.make_request method by splitting it into build_request and send. Prerequisite for the solution to #227 proposed in https://github.com/apify/impit/issues/227#issuecomment-3184109259Add support for Python 3.14, drop support for Python 3.9 and PyPy
Do not panic on constructor param errors
json() method for Response object (#277)
Response.json() method that parses Response.text using the native json module.Releasing linux-aarch64-gnu prebuilds to PyPI.
linux-aarch64-gnu prebuilds to PyPI.Include error message in ConnectError
ConnectError (#258)
cause to the ConnectError display string. This allows for better error introspection in dependent packages. Unblocks https://github.com/apify/crawlee-python/pull/1389/Fallback to HTTP/2 on HTTP3 DNS error
Error, impit will return false for every call to host_supports_h3 (unless, e.g. alt-svc header has been registered for this domain).local_address option to Impit constructor (#225)
local_address option to the Impit HTTP client constructor across all language bindings (Rust, Python, and Node.js), allowing users to bind the client to a specific network interface. This feature is useful for testing purposes or when working with multiple network interfaces.All notable changes to this project will be documented in this file.
All notable changes to this project will be documented in this file.
Allow passing request body in all HTTP methods except TRACE
TRACE (#238)Resolve blocking behavior in synchronous Client while reading response
Client while reading response (#234)
Response for impit.ClientResponse (#233)
Response. This can be useful when creating tests and mocks. - Allow to set custom attributes in Response ---------Resolve blocking behavior in impit.Client during multithreaded operations
impit.Client during multithreaded operations (#230)Log correct timeout duration on TimeoutException
TimeoutException (#222)
Impit-instance-wide timeout if the request-specific timeout is missing.Exception class types are inheriting from Exception
Exception class types are inheriting from Exception (#207)
Fix cookies with attributes 'SameSite' and domain (#213)
Fix the data types for rest and version with which the Cookie object is created.
rest and version with which the Cookie object is created. (#202)
Cookie object is created, such as rest and version.(Async)Client.stream() method for Python (#201)
stream support for Client and AsyncClient. Implements for Response support for the read and iter_bytes methods, and their counterparts aread and aiter_bytes according to the httpx API closes https://github.com/apify/impit/issues/142Show the underlying reqwest error on unrecognized error type
Show the underlying reqwest error on unrecognized error type (#183)
reqwest errors through to binding users.Support socks proxy (#197)
socks proxies to impit-node. This theoretically enables socks proxies for CLI and the Python binding as well, but this behaviour is untested due to a lack of working socks proxy server implementations in Python.Support for custom cookie stores for Python (#182)
cookie_jar constructor parameter for Client and AsyncClient classes, accepting http.cookiejar's CookieJar (or a custom implementation thereof, implementing at least setCookie(cookie: http.cookiejar.Cookie) and iter(): Cookie[]. impit will write to and read from this custom cookie store. Related to #123Client-scoped headers option (#200)
headers setting to Impit constructor to set headers to be included in every request made by the built [Impit] instance. This can be used to add e.g. custom user-agent or authorization headers that should be included in every request. These headers override the "impersonation" headers set by the with_browser method. In turn, these are overridden by request-specific headers setting.Add support for custom cookie store implementations (#179)
ImpitBuilder struct (using the new with_cookie_store builder method). Without passing the store implementation, impit client in both bindings is by default stateless (doesn't store cookies). Enables implementing custom support for language-specific cookie stores (in JS and Python).Show the underlying reqwest error on unrecognized error type (#183)
reqwest errors through to binding users.Support socks proxy (#197)
socks proxies to impit-node. This theoretically enables socks proxies for CLI and the Python binding as well, but this behaviour is untested due to a lack of working socks proxy server implementations in Python.Support for custom cookie stores for Python (#182)
cookie_jar constructor parameter for Client and AsyncClient classes, accepting http.cookiejar's CookieJar (or a custom implementation thereof, implementing at least setCookie(cookie: http.cookiejar.Cookie) and iter(): Cookie[]. impit will write to and read from this custom cookie store. Related to #123Client-scoped headers option (#200)
headers setting to Impit constructor to set headers to be included in every request made by the built [Impit] instance. This can be used to add e.g. custom user-agent or authorization headers that should be included in every request. These headers override the "impersonation" headers set by the with_browser method. In turn, these are overridden by request-specific headers setting.Add context manager interface for Client and AsyncClient
Client and AsyncClient (#176)
AsyncClient and Client constructors as context managers inside the with statements. Closes #174…(accepting the binary body) is considered deprecated in the httpx library we use as the design master.
Reenable HTTP/3 features in JS bindings (#57)
http3 feature in Node.JS bindings. This PR solves the underlying problems by building the reqwest's Client from within the napi-rs-managed tokio runtime. Adds tests for http3 usage from Node bindings. Removes problematic Firefox header (Connection is not allowed in HTTP2 and HTTP3 requests or responses and together with forceHttp3 was causing panics inside the Rust code).response.encoding contains the actual encoding (#119)
content-type header for the charset parameter.Case-insensitive request header deduplication (#127)
Add ReadableStream in Response.body (#28)
Response.body now returns an instance of JS ReadableStream. This API design matches the (browser) Fetch API spec. In order to correctly manage the Response consumption, the current codebase has been slightly refactored. Note that the implementation relies on a prerelease version of the napi-rs tooling.Add Python bindings for impit (#49)
impit. The interface is inspired by the httpx library (in the same way the JS bindings' interface is inspired by fetch, i.e. the end goal is to provide an almost drop-in replacement with extra features).Use thiserror for better error handling DX (#90)
std::error::Error implementation with thiserror. This should improve the developer experience and error messages across the monorepo.Allow passing binary body to the data parameter (#103)
data parameter. data now accepts both a dict[str,str] and a binary representation of the request body. This PR intentionally doesn't update the recently added typings in the impit.pyi file, as this behaviour (accepting the binary body) is considered deprecated in the httpx library we use as the design master.Make ImpitPyResponse public for Python with the name Response (#110)
ImpitPyResponse public for Python with the name Response. This will improve type handling and code navigation in the IDE ---------Add url and content property for Response, smart .text decoding, options for redirects (#122)
url, encoding and content properties for Response. Decodes the response using the automatic encoding-determining algorithm. Adds redirect-related options. ---------response.headers is a Headers object (#137)
response.headers from a Record<string, string> into a Headers object, matching the original fetch API.Better errors (#150)
impit and both the language bindings. Improves error messages. For Python bindings, this PR adds the same exception types as in httpx.Switch to Vec<(String, String)> for request headers (#156)
RequestInit.headers type in the impit-node bindings. Closes #151Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →