Python binding for curl-impersonate fork via cffi. For commercial support, visit impersonate.pro.
Unlike other pure python http clients like httpx or requests, curl_cffi can impersonate browsers' TLS/JA3 and HTTP/2 fingerprints. If you are blocked by some website for no obvious reason, you can give curl_cffi a try.
Python 3.9 is the minimum supported version since v0.10.
Maintenance of this project is made possible by all the contributors and sponsors. If you'd like to sponsor this project and have your avatar or company logo appear below click here. 💖
Scrape Google and other search engines from SerpApi's fast, easy, and complete API. 0.66s average response time (≤ 0.5s for Ludicrous Speed Max accounts), 99.95% SLAs, pay for successful responses only.
Yescaptcha is a proxy service that bypasses Cloudflare and uses the API interface to obtain verified cookies (e.g. cf_clearance). Click here to register: https://yescaptcha.com/i/stfnIO
CapSolver is an AI-powered tool that easily bypasses Captchas, allowing uninterrupted access to public data. It supports a variety of Captchas and works seamlessly with curl_cffi, Puppeteer, Playwright, and more. Fast, reliable, and cost-effective. Plus, curl_cffi users can use the code "CURL" to get an extra 6% balance! and register here.
- Supports JA3/TLS and http2 fingerprints impersonation, including recent browsers and custom fingerprints.
- Much faster than requests/httpx, on par with aiohttp/pycurl, see benchmarks.
- Mimics the requests API, no need to learn another one.
- Pre-compiled, so you don't have to compile on your machine.
- Supports asyncio with proxy rotation on each request.
- Supports http 2.0 & 3.0, which requests does not.
- Supports websocket.
| http/2 | ❌ | ❌ | ✅ | ✅ | ✅ |
| http/3 | ❌ | ❌ | ❌ | ☑️1 | ✅2 |
| sync | ✅ | ❌ | ✅ | ✅ | ✅ |
| async | ❌ | ✅ | ✅ | ❌ | ✅ |
| websocket | ❌ | ✅ | ❌ | ❌ | ✅ |
| fingerprints | ❌ | ❌ | ❌ | ❌ | ✅ |
| speed | 🐇 | 🐇🐇 | 🐇 | 🐇🐇 | 🐇🐇 |
Notes:
- For pycurl, you need an http/3 enabled libcurl to make it work, while curl_cffi packages libcurl-impersonate inside Python wheels.
- Since v0.11.4.
This should work on Linux, macOS and Windows out of the box. If it does not work on you platform, you may need to compile and install curl-impersonate first and set some environment variables like LD_LIBRARY_PATH.
To install beta releases:
To install unstable version from GitHub:
On macOS, you may need to install the following dependencies:
curl_cffi comes with a low-level curl API and a high-level requests-like API.
v0.9:
v0.10:
v0.9:
v0.10:
curl_cffi supports the same browser versions as supported by my fork of curl-impersonate:
Open source version of curl_cffi includes versions whose fingerprints differ from previous versions. If you see a version, e.g. chrome135, were skipped, you can simply impersonate it with your own headers and the previous version.
If you don't want to look up the headers etc, by yourself, consider buying commercial support from impersonate.pro, we have comprehensive browser fingerprints database for almost all the browser versions on various platforms.
If you are trying to impersonate a target other than a browser, use ja3=... and akamai=... to specify your own customized fingerprints. See the docs on impersonation for details.
| Chrome | chrome99, chrome100, chrome101, chrome104, chrome107, chrome110, chrome116[1], chrome119[1], chrome120[1], chrome123[3], chrome124[3], chrome131[4], chrome133a[5][6], chrome136[6] | chrome132, chrome134, chrome135 |
| Chrome Android | chrome99_android, chrome131_android [4] | chrome132_android, chrome133_android, chrome134_android, chrome135_android |
| Chrome iOS | N/A | coming soon |
| Safari [7] | safari15_3 [2], safari15_5 [2], safari17_0 [1], safari18_0 [4], safari18_4 [6] | coming soon |
| Safari iOS [7] | safari17_2_ios[1], safari18_0_ios[4], safari18_4_ios [6] | coming soon |
| Firefox | firefox133[5], firefox135[7] | coming soon |
| Firefox Android | N/A | firefox135_android |
| Tor | tor145 [7] | coming soon |
| Edge | edge99, edge101 | edge133, edge135 |
| Opera | N/A | coming soon |
| Brave | N/A | coming soon |
Notes:
- Added in version 0.6.0.
- Fixed in version 0.6.0, previous http2 fingerprints were not correct.
- Added in version 0.7.0.
- Added in version 0.8.0.
- Added in version 0.9.0.
- The version postfix -a(e.g. chrome133a) means that this is an alternative version, i.e. the fingerprint has not been officially updated by browser, but has been observed because of A/B testing.
- Added in version 0.10.0.
- Added in version 0.11.0.
- Since 0.11.0, the format safari184_ios is preferred over safari18_4_ios, both are supported, but the latter is quite confusing and hard to parse.
More concurrency:
For low-level APIs, Scrapy integration and other advanced topics, see the docs for more details.
- Integrating with Scrapy: jxlil/scrapy-impersonate and tieyongjie/scrapy-fingerprint.
- Integrating with requests, httpx as adapter.
- Integrating with captcha resolvers: CapSolver, YesCaptcha. Please see the head area for promo code and link.
- Originally forked from multippt/python_curl_cffi, which is under the MIT license.
- Headers/Cookies files are copied from httpx, which is under the BSD license.
- Asyncio support is inspired by Tornado's curl http client.
- The synchronous WebSocket API is inspired by websocket_client.
- The asynchronous WebSocket API is inspired by aiohttp.
.png)




