Skip to main content

Niquests is a simple, yet elegant, HTTP library. It is a drop-in replacement for Requests, which is under feature freeze.

Project description

Niquests Logo

Niquests is a simple, yet elegant, HTTP library. It is a drop-in replacement for Requests, which is under feature freeze. โœจ Were you used to betamax, requests-mock, responses, ...? See how they still work! We got you covered.

Niquests, is the โ€œSafest, Fastest[^10], Easiest, and Most advancedโ€ Python HTTP Client. Production Ready!

Live Benchmark

Target: https://httpbingo.org/get
Conditions: All default parameters, one shared session, everything simultaneously.
HTTP/2 when supported.
Niquests Benchmark
๐Ÿ‘† Look at the feature table comparison against requests, httpx and aiohttp!
Feature niquests requests httpx aiohttp
HTTP/1.1 โœ… โœ… โœ… โœ…
HTTP/2 โœ… โŒ โœ…[^7] โŒ
HTTP/3 over QUIC โœ… โŒ โŒ โŒ
Synchronous โœ… โœ… โœ… N/A[^1]
Asynchronous โœ… โŒ โœ… โœ…
Thread Safe โœ… โœ… โŒ[^5] N/A[^1]
Task Safe โœ… N/A[^2] โœ… โœ…
OS Trust Store โœ… โŒ โŒ โŒ
Multiplexing โœ… โŒ Limited[^3] โŒ
DNSSEC โœ…[^11] โŒ โŒ โŒ
Customizable DNS Resolution โœ… โŒ โŒ โœ…
DNS over HTTPS โœ… โŒ โŒ โŒ
DNS over QUIC โœ… โŒ โŒ โŒ
DNS over TLS โœ… โŒ โŒ โŒ
Multiple DNS Resolver โœ… โŒ โŒ โŒ
Network Fine Tuning & Inspect โœ… โŒ Limited[^6] Limited[^6]
Certificate Revocation Protection โœ… โŒ โŒ โŒ
Session Persistence โœ… โœ… โœ… โœ…
In-memory Certificate CA & mTLS โœ… โŒ Limited[^4] Limited[^4]
SOCKS 4/5 Proxies โœ… โœ… โœ… โŒ
HTTP/HTTPS Proxies โœ… โœ… โœ… โœ…
TLS-in-TLS Support โœ… โœ… โœ… โœ…
Direct HTTP/3 Negotiation โœ…[^9] N/A[^8] N/A[^8] N/A[^8]
Happy Eyeballs โœ… โŒ โŒ โœ…
Package / SLSA Signed โœ… โŒ โŒ โœ…
HTTP/2 with prior knowledge (h2c) โœ… โŒ โœ… โŒ
Post-Quantum Security Limited[^12] โŒ โŒ โŒ
HTTP Trailers โœ… โŒ โŒ โŒ
Early Responses โœ… โŒ โŒ โŒ
WebSocket over HTTP/1 โœ… โŒ[^14] โŒ[^14] โœ…
WebSocket over HTTP/2 and HTTP/3 โœ…[^13] โŒ โŒ โŒ
Automatic Ping for HTTP/2+ โœ… N/A โŒ N/A
Automatic Connection Upgrade / Downgrade โœ… N/A โŒ N/A
Server Side Event (SSE) โœ… โŒ โŒ โŒ
๐Ÿ“ˆ Look at the performance comparison against them!

Scenario: Fetch a thousand requests using 10 tasks or threads, each with a hundred requests using a single pool of connection.

High-Level APIs

Client Average Delay to Complete Notes
requests 987 ms or ~1013 req/s ThreadPoolExecutor. HTTP/1.1
httpx 720 ms or ~1389 req/s Asyncio. HTTP/2
niquests 340 ms or ~2941 req/s Asyncio. HTTP/2

Simplified APIs

Client Average Delay to Complete Notes
requests core 643 ms or ~1555 req/s ThreadPoolExecutor. HTTP/1.1
httpx core 490 ms or ~2000 req/s Asyncio. HTTP/2
aiohttp 210 ms or ~4762 req/s Asyncio. HTTP/1.1
niquests core 160 ms or ~6200 req/s Asyncio. HTTP/2

Did you give up on HTTP/2 due to performance concerns? Think again! Do you realize that you can get 3 times faster with the same CPU if you ever switched to Niquests from Requests? Multiplexing and response lazyness open up a wide range of possibilities! Want to learn more about the tests? scripts? reasoning?

Take a deeper look at https://github.com/Ousret/niquests-stats

Update: The previous scenario is fairly complex to set up, and we were asked to provide a more "real life" benchmark scenario.

Given the script hosted at https://gist.github.com/Ousret/9e99b07e66eec48ccea5811775ec116d that simply execute 1k requests. We deliberately use two hosts, disabled Niquests manual multiplexing (for fairness), one known to be very slow (httpbin.org), and the other adequately fast (httpbingo.org) to showcase how the client behave.

Fast endpoint

Client Average Delay to Complete Notes
httpx 1.771s HTTP/1.1
aiohttp 1.372s HTTP/2
niquests 0.704s HTTP/2

Slow endpoint

Client Average Delay to Complete Notes
httpx 8.19s HTTP/1.1
aiohttp 7.041s HTTP/2
niquests 4.201s HTTP/2

:tada: Niquests can easily bring you twice the throughput if you migrated today. Join us today!

>>> import niquests
>>> r = niquests.get('https://one.one.one.one')
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf-8'
>>> r.oheaders.content_type.charset
'utf-8'
>>> r.encoding
'utf-8'
>>> r.text
'{"authenticated": true, ...'
>>> r.json()
{'authenticated': True, ...}
>>> r
<Response HTTP/2 [200]>
>>> r.ocsp_verified
True
>>> r.conn_info.established_latency
datetime.timedelta(microseconds=38)

or using async/await!

import niquests
import asyncio

async def main() -> None:
    r = await niquests.aget('https://one.one.one.one', stream=True)
    print(r)  # Output: <Response HTTP/2 [200]>
    payload = await r.text  # we await text because we set `stream=True`!
    print(payload)  # Output: <html>...
    # or... without stream=True
    r = await niquests.aget('https://one.one.one.one')
    print(r)  # Output: <Response HTTP/3 [200]>
    payload = r.text  # we don't need to away anything, it's already loaded!
    print(payload)  # Output: <html>...

asyncio.run(main())

Niquests allows you to send HTTP requests extremely easily. Thereโ€™s no need to manually add query strings to your URLs, or to form-encode your PUT & POST data โ€” just use the json method!

PyPI Downloads Supported Versions OpenSSF Best Practices

This project does not require any compilation toolchain. The HTTP/3 support is not enforced and installed if your platform can support it natively (e.g. pre-built wheel available).

โœจ Installing Niquests and Supported Versions

Niquests is available on PyPI:

$ python -m pip install niquests

Niquests officially supports Python or PyPy 3.7+.

๐Ÿš€ Supported Features & Bestโ€“Practices

Niquests is ready for the demands of building scalable, robust and reliable HTTPโ€“speaking applications.

  • DNS over HTTPS, DNS over QUIC, DNS over TLS, and DNS over UDP
  • Automatic Content Decompression and Decoding
  • OS truststore by default, no more certifi!
  • OCSP Certificate Revocation Verification
  • Advanced connection timings inspection
  • In-memory certificates (CAs, and mTLS)
  • Browser-style TLS/SSL Verification
  • Certificate Revocation List (CRL)
  • Sessions with Cookie Persistence
  • Keep-Alive & Connection Pooling
  • International Domains and URLs
  • Automatic honoring of .netrc
  • Basic & Digest Authentication
  • Familiar dictโ€“like Cookies
  • Network settings fine-tuning
  • HTTP/2 with prior knowledge
  • Object-oriented headers
  • Multi-part File Uploads
  • Post-Quantum Security
  • Chunked HTTP Requests
  • Fully type-annotated!
  • SOCKS Proxy Support
  • Connection Timeouts
  • Streaming Downloads
  • HTTP/2 by default
  • HTTP/3 over QUIC
  • Early Responses
  • Happy Eyeballs
  • Multiplexed!
  • Thread-safe!
  • WebSocket!
  • Trailers!
  • DNSSEC!
  • Async!
  • SSE!

Need something more? Create an issue, we listen.

๐Ÿ“ Why did we pursue this?

For many years now, Requests has been frozen. Being left in a vegetative state and not evolving, this blocked millions of developers from using more advanced features.

We don't have to reinvent the wheel all over again, HTTP client Requests is well established and really pleasant in its usage. We believe that Requests has the most inclusive and developer friendly interfaces. We intend to keep it that way. As long as we can, long live Niquests!

How about a nice refresher with a mere CTRL+H import requests to import niquests as requests ?

๐Ÿ’ผ For Enterprise

Professional support for Niquests is available as part of the Tidelift Subscription. Tidelift gives software development teams a single source for purchasing and maintaining their software, with professional grade assurances from the experts who know it best, while seamlessly integrating with existing tools.

You may also be interested in unlocking specific advantages (like access to a private issue tracker) by looking at our GitHub sponsor tiers.


Niquests is a highly improved HTTP client that is based (forked) on Requests. The previous project original author is Kenneth Reitz and actually left the maintenance of Requests years ago.

[^1]: aiohttp was conceived solely for an asynchronous context. [^2]: requests has no support for asynchronous request. [^3]: while the HTTP/2 connection object can handle concurrent requests, you cannot leverage its true potential. [^4]: loading client certificate without file can't be done. [^5]: httpx officially claim to be thread safe but recent tests demonstrate otherwise as of December 2025. https://github.com/jawah/niquests/issues/83#issuecomment-1956065258 https://github.com/encode/httpx/issues/3072 https://github.com/encode/httpx/issues/3002 and only recently acknowledged the issue in https://github.com/encode/httpx/issues/3324 (one year after getting valid reports). [^6]: they do not expose anything to control network aspects such as IPv4/IPv6 toggles, and timings (e.g. DNS response time, established delay, TLS handshake delay, etc...) and such. [^7]: while advertised as possible, they refuse to make it the default due to performance and stability issues. as of December 2025 an extra is required to enable it manually. [^8]: they don't support HTTP/3 at all. [^9]: you must use a custom DNS resolver so that it can preemptively connect using HTTP/3 over QUIC when remote is compatible. [^10]: performance measured when leveraging a multiplexed connection with or without uses of any form of concurrency as of December 2025. The research compared httpx, requests, aiohttp against niquests. See https://github.com/Ousret/niquests-stats [^11]: enabled when using a custom DNS resolver. [^12]: available only when using HTTP/3 over QUIC and that the remote server support also the same post-quantum key-exchange algorithm. Also, the qh3 installed version must be >= 1.1. [^13]: most servers out there are not ready for this feature, but Niquests is already compliant and future-proof! Caddy server and HAProxy support this! [^14]: they don't offer any built-in to speak with a WebSocket server.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

niquests-3.17.0.tar.gz (996.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

niquests-3.17.0-py3-none-any.whl (183.4 kB view details)

Uploaded Python 3

File details

Details for the file niquests-3.17.0.tar.gz.

File metadata

  • Download URL: niquests-3.17.0.tar.gz
  • Upload date:
  • Size: 996.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for niquests-3.17.0.tar.gz
Algorithm Hash digest
SHA256 1f4f337a973215c76f6f6471504fedab9dc6187203284146081e1bd3d2a311fc
MD5 3fea4c28106ad1cae66debbe5629bb01
BLAKE2b-256 535791fce2b91712cfce0fd6816d063f48770358d04b213eb947392ea371cbb6

See more details on using hashes here.

Provenance

The following attestation bundles were made for niquests-3.17.0.tar.gz:

Publisher: publish.yml on jawah/niquests

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file niquests-3.17.0-py3-none-any.whl.

File metadata

  • Download URL: niquests-3.17.0-py3-none-any.whl
  • Upload date:
  • Size: 183.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for niquests-3.17.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3930d94fce367385950dd545f913e7cfc6457feda76aecafeb324aae45da9fe1
MD5 c1843e4927efa7953109317330f69c26
BLAKE2b-256 8563e13cff780ef2edbfcb81e3a714417822f4b967dac0bb0388ad3146f30a95

See more details on using hashes here.

Provenance

The following attestation bundles were made for niquests-3.17.0-py3-none-any.whl:

Publisher: publish.yml on jawah/niquests

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page