ureq
Simple, safe HTTP client
3.4.0
184M downloads/mo
#535 most downloaded on crates.io
algesten/ureq
What this package is like to depend on
Last release 15 days ago
08 Aug 2026
Release timing varies
gaps range from 8 days to 5 months
Some releases are documented
notes for 57 of 105 stable releases
Nothing withdrawn
no release was ever pulled
8 years old
113 releases · first in 2018
8 releases in the last 12 months
see the full history below
Release timeline
113 releases · Jun 2018 to Aug 2026Releases
latest 60 of 113-
3.4.008 Aug 2026Release notes
Open source →- Seal RequestExt (technically breaking) #1189
- Send canonical Basic authentication scheme to CONNECT proxies #1185
- Establish target TLS through HTTPS CONNECT proxies #1183
- Update rustls-platform-verifier to 0.7.0 #1174
- Fix pooled connections never aging out according to max_idle_age #1172
- Strip brackets from IPv6-literal hosts before TLS SNI/ServerName #1171
- RequestExt::middleware_config for conf inside middleware #1169
- Seal RequestExt (technically breaking) #1189
-
3.3.021 Mar 2026 -
3.2.121 Mar 2026 -
3.2.005 Feb 2026Release notes
Open source →- Strip Content-Encoding/Content-Length headers after decompression #1156
- Timeout per resolved ip for try_connect #1152
- Fix body header bug on redirect #1140
- ureq-proto 0.5.3 to fix unsolicited 100-continue #1139
- Make socks5:// locally resolve before calling proxy #1138
- Add socks5h:// which DOESN'T locally resolve before calling proxy #1138
- Strip Content-Encoding/Content-Length headers after decompression #1156
-
3.1.408 Nov 2025 -
3.1.308 Nov 2025Release notes
Open source →- Fix short read with multi-byte charset #1131
- Replace rustls-pemfile usage with rustls-pki-types #1122
- Support for env NO_PROXY and proxy config #1118
- Experimental multi-part form support #1102
- Fix short read with multi-byte charset #1131
-
3.1.208 Sep 2025 -
3.1.106 Sep 2025Release notes
Open source →- Fix regression in MSRV (hold back native-tls) #1113
- Fix edge case regression when setting request header Content-Length: 0 #1109
- Fix regression in MSRV (hold back native-tls) #1113
-
3.1.017 Aug 2025Release notes
Open source →DECISION: webpki-roots and webpki-root-certs goes from pre-release (0.26) to stable release (1.0.0). This is potentially a big change for ureq users. We release this as semver minor.
- Bump all deps to latest #1104
- Fixes to CONNECT to follow spec #1103
- Send Content-Length for File #1100
- native-tls transport capture and surface underlying errors #1093
- Bump webpki-roots/webpki-root-certs to 1.0.0 #1089
- Bump rustls-platform-verifier to 0.6.0 #1089
- Allow the license CDLA-Permissive-2.0 #1089
-
3.0.1216 Jun 2025Release notes
Open source →- Chunked transfer handle abrupt close after 0\r\n #1074
- Fix incorrect DNS resolving when using proxies #1081
- Use + instead of %20 for url encoded form bodies #1071
- Fix problem with double-quotes in cookie values #1068
- Reduce Body size #1065
- Fix featue flag
public_suffixfor CookieStore #1063 - Improve doc for 10MB limit #1061
- Chunked transfer handle abrupt close after 0\r\n #1074
-
3.0.1115 Apr 2025Release notes
Open source →- Fix CONNECT proxy bug #1057
- Fix bug setting cookies in redirects #1055
- Annotated example for making a Transport #1054
- Feature for adding unencoded query parameters #1039
- Fix bug in not encoding ' in query parameters #1039
- Fix bug making timeout settings not working #1051
- Big refactor of ureq-proto #1042
- Extension trait for http::Request allowing agent config #1011
- Fix CONNECT proxy bug #1057
-
3.0.1017 Mar 2025 -
3.0.913 Mar 2025Release notes
Open source →- Bump deps #1031
- Allow body for all methods when using http-crate API #1035
- Improved errors and doc for bespoke transports #1032
- Bump deps #1031
-
3.0.828 Feb 2025 -
3.0.726 Feb 2025Release notes
Open source →- Allow non-standard HTTP methods #1018
- Fix not appending port to host header #1017
- Allow non-standard HTTP methods #1018
-
3.0.619 Feb 2025Release notes
Open source →- Avoid percent encoding some query parameter chars #1004
- Fix incorrect LargeResponseHeader #1003
- Stop passing internal state in Config #996
- Support request level TlsConfig #996
- Avoid percent encoding some query parameter chars #1004
-
3.0.508 Feb 2025Release notes
Open source →- Fix incorrect reading of valid utf8 #992
- Fix panic when parsing malformed proxy URI #990
- ureq::Error wrapped as io::Error should pass through body chain #984
- send_json should set content-length header #983
- Fix incorrect reading of valid utf8 #992
-
3.0.403 Feb 2025Release notes
Open source →- Manually unroll some macros to regular code #978
- Fix bug in
rustls-no-providerwhen disabling ring #973
- Fix bug in
- Manually unroll some macros to regular code #978
-
3.0.330 Jan 2025Release notes
Open source →- Use the same data in CONNECT and Host header for proxied requests #967
- Set default scheme in proxy uri #966
- Redact URI and Location header on debug level #964
- Downgrade all logging to debug and below #964
- Use the same data in CONNECT and Host header for proxied requests #967
-
3.0.228 Jan 2025Release notes
Open source →- Remove dependency on once_cell #959
- Fix bug parsing partial redirects #958
- Expose typestate variables #956
- Remove dependency on once_cell #959
-
3.0.127 Jan 2025Release notes
Open source →- Fix excessive stack sizes #950
- Do not enable json (by default breaking, but it was a mistake) #948
- Fix excessive stack sizes #950
-
3.0.026 Jan 2025Release notes
Open source →- Replace RequestBuilder Deref with explicit wrappers #944
- Remove dependency on
urlcrate #943 - Feature
Config::save_redirect_history#939
- Remove dependency on
- Replace RequestBuilder Deref with explicit wrappers #944
-
3.0.0-rc507 Jan 2025 pre-releaseRelease notes
Open source →TlsConfig::unversioned_rustls_crypto_provider()#931- Feature
rustls-no-providerto compile without ring #931 - Fix CONNECT proxy Host header #936
- Re-enable CONNECT proxy support #932
- Body::content_length #927
- Handle Authorization: Basic from URI #923
- Remove many uses of Box::new() from Connector chain #919
- Feature
-
3.0.0-rc402 Jan 2025 pre-releaseRelease notes
Open source →- Default to
TooManyRedirectserror #916- Add
ConfigBuilder::max_redirects_will_error()#916 - Add new
SendBody::into_reader()#914 - Fix completely broken PEM parsing #912
- Improve ergonomics for
AutoHeaderValue#896
- Add
- Default to
-
3.0.0-rc327 Nov 2024 pre-releaseRelease notes
Open source →- Re-export ureq_proto::ArrayVec #891
- Expose typestate variables, but #[doc(hidden)] #889
- Clarify versioning and MSRV policy #887
- Get last used uri via
ResponseExt::get_uri()#884 - Expose more things for 3rd party Transport impls #886
- Make accessor fn for
ConfigandTlsConfig#886 - Move
TransportandResolvertraits tounversioned#881 - Upgrade deps #885
- MSRV 1.71.1 to follow rustls #885
- Fix bug in chunked overhead calculation #880
- Make it possible to disable all automatic headers #876
- Rename
hoot->ureq_proto#872 - Fix
disable_verificationfor TLS #871 vendoredfeature flag to get vendored native-tls #866- Fix incorrect handling of expect-100 #867
- Re-export ureq_proto::ArrayVec #891
-
3.0.0-rc218 Oct 2024 pre-releaseRelease notes
Open source →- Remove pub-field config structs in favor of builders #848
- BodyBuilder to create a response Body for test/middleware #847
- RequestBuilder::send_empty() convenience fn #846
- Rename BodyWithConfig::into_reader -> reader #845
- Escape hatch to send body for any method #857
- Reintrodice RequestBuilder::query #843
- Reintroduce RequestBuilder::query_pairs #856
- Reintroduce ResponseBuilder::send_form helper #859
- (internal) Use HeaderName for non-sensitive headers #855
- Fix broken build with rustls #832
- Reduce dependency count, platform-verifier feature #833 #818
- Remove pub-field config structs in favor of builders #848
-
3.0.0-rc128 Sep 2024 pre-release -
2.12.104 Dec 2024 -
2.12.003 Dec 2024Release notes
Open source →- Bump MSRV 1.67 -> 1.71 because rustls will soon adopt it #905
- Unpin rustls dep (>=0.23.19) #905
- Bump MSRV 1.67 -> 1.71 because rustls will soon adopt it #905
-
2.11.028 Nov 2024Release notes
Open source →- Fixes for changes to cargo-deny #882
- Pin rustls dep on 0.23.19 to keep MSRV 1.67 #878
- Bump MSRV 1.63 -> 1.67 due to time crate #878
- Re-export rustls #813
- Fixes for changes to cargo-deny #882
-
2.10.108 Aug 2024Release notes
Open source →- default
ureqRustls tls config updated to avoid panic for applications that activate the default Rustlsaws-lc-rsfeature without setting a process-wide crypto provider.ureqwill now use*ring*in this circumstance instead of panicking.
- default
-
2.10.006 Jul 2024Release notes
Open source →- Bump MSRV 1.61 -> 1.63 due to rustls #764
- Update deps only patch versions (in Cargo.lock) #763
- Refork frewsxcv/rust-chunked-transfer to fix MIT/Apache2.0 license #761
- Enable http-crate feature for docs #755
- Update Rustls from 0.22 to 0.23 - this may be a breaking change if your
application depends on Rustls 0.22 (e.g. to provide a custom
rustls::ClientConfigtoureq). See the Rustls 0.23.0 changelog for a list of breaking API changes #753 - Rustls dep to default to ring backend. If your project uses the
default
ureqTLS config, or constructs its ownrustls::ClientConfigwithrustls::ClientConfig::builder()you must ensure the Rustlsaws-lc-rsfeature is not activated, or set the process default cryptography provider before constructing any configs. See the Rustls CryptoProvider docs for more information #753 - Remove direct dep rustls-webpki #752
- Fix doc Rustls does now support IP address certificates #759 #753
- Bump MSRV 1.61 -> 1.63 due to rustls #764
-
2.9.725 Apr 2024Release notes
Open source →- Update deps
base640.22,rustlsto 0.22.4 #747 #748- Parse URL after middleware to enable changing it #745
- Tidy up code and fix compilation #742, 743
- Update deps
-
2.9.616 Feb 2024Release notes
Open source →Fixed
hootbinis optional dep. Tests must be run with featuretestdeps#729- Exclude script files from cargo package #728
-
2.9.509 Feb 2024 -
2.9.431 Jan 2024 -
2.9.330 Jan 2024 -
2.9.230 Jan 2024Release notes
Open source →Added
- Replace dependency on httpbin.org for tests/doc-tests. #703
Fixed
- Remove Header struct that never should have been exported. #696
- Update deps (rustls 0.22) #690
-
2.9.124 Nov 2023Release notes
Open source →Fixed
- Unbreak feature
http-interop. This feature is version locked to http crate 0.2 - New feature
http-crate. This feature is for http crate 1.0 - New feature
proxy-from-envto detect proxy settings for global Agent (ureq::get)
- Unbreak feature
-
2.9.020 Nov 2023Release notes
Open source →Fixed
- Broken rustls dep (introduced new function in patch version) #677
- Doc and test fixes #670 #673 #674
Added
- Upgraded http dep to 1.0
- http_interop to not require utf-8 headers #672
- http_interop implement conversion for
http::request::Parts#669
-
2.8.030 Sep 2023Release notes
Open source →Fixed
- Fix regression in IPv6 handling #635
- Read proxy response to \r\n\r\n #620
Added
- Auto-detect proxy from env vars (turned off by default) #649
- Conversion ureq::Response -> http::Response<Vec<u8>> #638
- cargo-deny CI action to disallow copy-left and duplicate deps #661
-
2.7.119 Jun 2023 -
2.7.015 Jun 2023Release notes
Open source →Fixed
- Pass User-Agent when connecting to proxy #597
- Proxy: Use CONNECT for HTTPS requests, but not HTTP requests #587
- Cookie headers are now cleared on redirect #608
- HTTP/1.0 responses with Content-Length no longer block until server closes the socket. #625
Added
- Conversions to and from http::Response and http::request::Builder #591
- Updated to rustls 0.21 and rustls-webpki, which add support for IP address certificates #601
- Response::local_addr #605
-
2.6.216 Jan 2023 -
2.6.103 Jan 2023 -
2.6.002 Jan 2023Release notes
Open source →Added
- Response::remote_addr() #489
- Request::query_pairs() - make query params from an Iterator of pairs #519
Fixed
- Gzip responses with chunked encoding now work with connection pooling #560
- Don't panic when rustls-native-certs errors #564
- Responses with zero-length body now work with connection pooling #565
-
2.5.010 Jul 2022Release notes
Open source →- Add tcp no_delay option #465
- Rework public TLS traits
- Warn if requests aren't sent #490
- Fixes for returning stream to pool #509
- Avoid extra syscalls when content is buffered #508
- Remove dep on sync_wrapper #514 #528
- Error instead of panic on large deadlines #517
- Make ReadWrite trait simpler (used in bespoke TLS impls) #530
- Buffer short response bodies #531
- Update cookie/cookie_store dep
-
2.4.023 Dec 2021Release notes
Open source →- Enable
gzipfeature by default #455 gzipandbrotlifeature flags to enable decompression #453 #421- Middleware function on agent #448
- Agent option to preserve
Authorizationheader on redirects #445 - Deprecate re-exported serde types #446
- Widen type of
send_jsontoimpl Serializable#446 native-tlsfeature provides an alternative TLS backend #449 #391
- Enable
-
2.3.114 Nov 2021Release notes
Open source →- Don't panic when given an invalid DNS name #436
- Update to rustls-native-certs v0.6 #432
-
2.3.021 Oct 2021Release notes
Open source →- Upgrade to rustls 0.20 #427
- Make test mocks of Response more accurate by removing newline #423
- Redact sensitive headers when logging prelude #414
-
2.2.023 Aug 2021Release notes
Open source →- Update to latest dependencies
- Add SOCKS4 support #410
- Downgrade logging on info level to debug #409
- Bugfix: Clear content-length header on redirect #394 #395
-
2.1.127 Apr 2021Release notes
Open source →- Bugfix: don't reuse conns with bytes pending from server #372. This reduces Transport errors when using an Agent for connection pooling.
-
2.1.026 Mar 2021Release notes
Open source →- Bugfix: allow status lines without a reason phrase #316
- Example: "cureq" to easier make ad-hoc command line tests #330
- Override timeout per Request #335
- Bugfix: handle non-utf8 status and headers #347 and better errors #329
- Request inspection (method, url, etc) #310 #350
- Bugfix: stop percent encoding cookies #353
- Enforce cookie RFC naming/value rules #353
- Bugfix: reduce error struct size #356
-
2.0.221 Feb 2021Release notes
Open source →- Bugfix: Apply deadline across redirects. #313
- OrAnyStatus::or_any_status ergonomic helper
- Allow header lines to end with only LF #321
-
2.0.110 Jan 2021Release notes
Open source →- Fix handling of 308 redirects (port from 1.5.4 branch)
- Return UnexpectedEof instead of InvalidData on short responses. #293
- Implement std::error::Error for error::Transport. #299
-
2.0.003 Jan 2021Release notes
Open source →- Methods that formerly returned Response now return Result<Response, Error>.
You'll need to change all instances of
.call()to.call()?or handle errors using amatchstatement. - Non-2xx responses are considered Error by default. See Error documentation for details on how to get Response bodies for non-2xx.
- Rewrite Error type. It's now an enum of two types of error: Status and Transport. Status errors (i.e. non-2xx) can be readily turned into a Response using match statements.
- Errors now include the source error (e.g. errors from DNS or I/O) when appropriate, as well as the URL that caused an error.
- The "synthetic error" concept is removed.
- Move more configuration to Agent. Timeouts, TLS config, and proxy config now require building an Agent.
- Create AgentBuilder to separate the process of building an agent from using the resulting agent. Headers can be set on an AgentBuilder, not the resulting Agent.
- Agent is cheaply cloneable with an internal Arc. This makes it easy to share a single agent throughout your program.
- There is now a default timeout_connect of 30 seconds. Read and write timeouts continue to be unset by default.
- Add ureq::request_url and Agent::request_url, to send requests with already-parsed URLs.
- Remove native_tls support.
- Remove convenience methods
options(url),trace(url), andpatch(url). To send requests with those verbs userequest(method, url). - Remove Request::build. This was a workaround because some of Request's
methods took
&mut selfinstead ofmut self, and is no longer needed. You can simply delete any calls toRequest::build. - Remove Agent::set_cookie.
- Remove Header from the public API. The type wasn't used by any public methods.
- Remove basic auth support. The API was incomplete. We may add back something better in the future.
- Remove into_json_deserialize. Now into_json handles both serde_json::Value
and other types that implement serde::Deserialize. If you were using
serde_json before, you will probably have to explicitly annotate a type,
like:
let v: serde_json::Value = response.into_json();. - Rewrite README and top-level documentation.
- Methods that formerly returned Response now return Result<Response, Error>.
You'll need to change all instances of
-
2.0.0-rc419 Dec 2020 pre-releaseRelease notes
Open source →- Remove error_on_non_2xx. #272
- Do more validation on status line. #266
- (internal) Add history to response objects #275
-
2.0.0-rc312 Dec 2020 pre-releaseRelease notes
Open source →- Refactor Error to use an enum for easier extraction of status code errors.
- (Internal) Use BufRead::read_line when reading headers.
-
2.0.0-rc223 Nov 2020 pre-releaseRelease notes
Open source →- These changes are mostly already listed under 2.0.0.
- Remove the "synthetic error" concept. Methods that formerly returned Response now return Result<Response, Error>.
- Rewrite Error type. Instead of an enum, it's now a struct with an ErrorKind. This allows us to store the source error when appropriate, as well as the URL that caused an error.
- Move more configuration to Agent. Timeouts, TLS config, and proxy config now require building an Agent.
- Create AgentBuilder to separate the process of building an agent from using the resulting agent. Headers can be set on an AgentBuilder, not the resulting Agent.
- Agent is cheaply cloneable with an internal Arc. This makes it easy to share a single agent throughout your program.
- There is now a default timeout_connect of 30 seconds. Read and write timeouts continue to be unset by default.
- Add ureq::request_url and Agent::request_url, to send requests with already-parsed URLs.
- Remove native_tls support.
- Remove convenience methods
options(url),trace(url), andpatch(url). To send requests with those verbs userequest(method, url). - Remove Request::build. This was a workaround because some of Request's
methods took
&mut selfinstead ofmut self, and is no longer needed. You can simply delete any calls toRequest::build. - Remove Agent::set_cookie.
- Remove Header from the public API. The type wasn't used by any public methods.
- Remove basic auth support. The API was incomplete. We may add back something better in the future.
- Remove into_json_deserialize. Now into_json handles both serde_json::Value
and other types that implement serde::Deserialize. If you were using
serde_json before, you will probably have to explicitly annotate a type,
like:
let v: serde_json::Value = response.into_json();. - Rewrite README and top-level documentation.
-
1.5.527 Apr 2021Nothing published for this version