NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1710 most downloaded on PyPI
A modern, high-performance HTTP client for Python and Rust.
Last release 9 days ago
25 Sep 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 17 of 17 stable releases
Nothing withdrawn
no release was ever pulled
8 months old
17 releases · first in 2026
One column per month.
This release notably adds support for trio. If your application runs under trio, it will be automatically detected and pyqwest will use its integratio
This release notably adds support for trio. If your application runs under trio, it will be automatically detected and pyqwest will use its integration to run with it. If not using trio, there is no change. We also have a few fixes for corner cases related to streaming request content, notably when it raises an exception mid-request.
Full Changelog: v0.10.0...v0.11.0
This release allows customizing whether the retry middleware will buffer payloads or only retry connection errors, and brings more fidelity to the HTT
This release allows customizing whether the retry middleware will buffer payloads or only retry connection errors, and brings more fidelity to the HTTPX adapter.
Full Changelog: v0.9.0...v0.10.0
This release brings more fidelity to the HTTPX adapter, with the notable new feature to customize redirect handling to power it.
This release brings more fidelity to the HTTPX adapter, with the notable new feature to customize redirect handling to power it.
Full Changelog: v0.8.0...v0.9.0
This release brings several new features to pyqwest. We always appreciate when users bring up specific use cases that we can better satisfy - special
This release brings several new features to pyqwest. We always appreciate when users bring up specific use cases that we can better satisfy - special thanks to @mishushakov for driving much of the improvement in this release, thank you!
@typing.final to match their runtime behaviorFull Changelog: v0.7.0...v0.8.0
…in the HTTPX adapter. This comes with a minor breaking change to the behavior of the retry middleware.
This release adds some more features to reflect user feedback, while fixing some docs issues and timeout handling in the HTTPX adapter. This comes with a minor breaking change to the behavior of the retry middleware.
Before
class MyRetryMiddleware(RetryMiddleware):
def should_retry_response(self, request: Request, response: Response | Exception
) -> bool:
return response.status >= 500After
class MyRetryMiddleware(RetryMiddleware):
def should_retry_response(self, request: Request, response: Response | Exception
) -> bool:
if request.method in ("GET", "HEAD", "PUT", "DELETE"):
return False
return response.status >= 500Full Changelog: v0.6.2...v0.7.0
This is a small maintenance release to switch back to upstream release versions for fixes we had backported to custom branches. There should be no rea
This is a small maintenance release to switch back to upstream release versions for fixes we had backported to custom branches. There should be no real impact on applications.
Full Changelog: v0.6.1...v0.6.2
This is a small bugfix release for issues during interpreter shutdown when using pyqwest in a background thread. Thanks @ravwojdyla for bring it to li
This is a small bugfix release for issues during interpreter shutdown when using pyqwest in a background thread. Thanks @ravwojdyla for bring it to light!
Full Changelog: v0.6.0...v0.6.1
A fairly significant change has been made to the middleware Request types - content now returns bytes | AsyncIterator[bytes] (or Iterator ) depending
A fairly significant change has been made to the middleware Request types - content now returns bytes | AsyncIterator[bytes] (or Iterator) depending on the user passed content. The previous form was taken to keep the API as simple as possible, but it was recognized that the overhead for converting a non-streaming request to an iterator is too significant in middleware.
This change will only affect middleware and custom Transport implementations - user code using HTTPClient is unaffected.
Full Changelog: v0.5.1...v0.6.0
This small release includes some improvements to testing transports.
This small release includes some improvements to testing transports.
app_exception to None instead of leaving it unboundwsgi.errors to allow testing handlers that use itFull Changelog: v0.5.0...v0.5.1
WSGI testing transport can have client address set similar to ASGI
host header in testing transports to follow behavior of real transportFull Changelog: v0.4.0...v0.4.1
This release adds some features for improved usage in production
This release adds some features for improved usage in production
Add middleware/retry package with middleware that can be applied to a transport to automatically retry requests
Add OpenTelemetry tracing and metrics for requests and the rust runtime. These are enabled by default - without an OpenTelemetry SDK installed, these will behave as no-op. To completely disable, you can set enable_otel = False when initializing a transport
Full Changelog: https://github.com/curioswitch/pyqwest/compare/v0.3.3...v0.4.0
Fixes illegal closing of running generators, which can cause hangs on Python 3.12
Full Changelog: https://github.com/curioswitch/pyqwest/compare/v0.3.2...v0.3.3
Use reqwest's default for pool_max_idle_per_host for more stable performance.
Full Changelog: https://github.com/curioswitch/pyqwest/compare/v0.3.1...v0.3.2
This release follows up with some important improvements found when integrating with connect-python.
This release follows up with some important improvements found when integrating with connect-python.
Full Changelog: https://github.com/curioswitch/pyqwest/compare/v0.3.0...v0.3.1
This release contains some API cleanups - check for breaking changes.
This release contains some API cleanups - check for breaking changes.
timeout has been removed from the methods on the async Client. It is recommended to instead use asyncio.wait_for or similar to apply a timeout consistently across the entire task, which will allow it to apply if you use middleware that does I/OWSGITransport now uses a shared module-level threadpool by default instead of creating one per instance. We imagine instances to be created commonly in tests and it is too tedious to deal with threadpools in them.HTTPHeaderName enum has been added both to provide type-safety when operating on headers but also a small performance improvement thanks to the memoization. str is accept in all places with it and this will never change.Full Changelog: https://github.com/curioswitch/pyqwest/compare/v0.2.0...v0.3.0
This is a large follow-up release. Notable features are the testing transports to replace HTTP invocations with direct invocations of ASGI and WSGI ap
This is a large follow-up release. Notable features are the testing transports to replace HTTP invocations with direct invocations of ASGI and WSGI applications. In addition, numerous tweaks and fixes have been made to better handle error cases such as making sure to cancel request iterators when closing a response.
Full Changelog: https://github.com/curioswitch/pyqwest/compare/v0.1.0...v0.2.0
Welcome to pyqwest, an HTTP client for Python, built in Rust on top of the excellent reqwest library. It brings modern HTTP features to Python, includ
Welcome to pyqwest, an HTTP client for Python, built in Rust on top of the excellent reqwest library. It brings modern HTTP features to Python, including HTTP/2 bi-directional streaming, trailers, and HTTP/3, all in a highly-performant, stable package.
We expect the API and general features to be fairly complete and will continue with more useful features and performance improvements. If you give it a try, let us know how it goes.
Your coding agent can read these notes before it upgrades. Set up the MCP server →