Modern anti-fraud systems have learned to detect automation not only by IP addresses and cookies but also by the unique fingerprint of HTTP/2 requests. Cloudflare, Akamai, DataDome, and other protective systems analyze the order of headers, stream priorities, and connection parameters — and block requests from standard libraries like requests, axios, or curl. In this article, we will explore how HTTP/2 fingerprinting works and how to bypass it for parsing marketplaces, automating social media, and traffic arbitrage.
What is HTTP/2 fingerprint and how does it work
HTTP/2 fingerprint is a unique set of characteristics that is formed when establishing a connection between a client and a server using the HTTP/2 protocol. Unlike HTTP/1.1, where requests are sent sequentially, HTTP/2 uses multiplexing, stream prioritization, and header compression via the HPACK algorithm. All these parameters create a unique "signature" of the client.
The main components of HTTP/2 fingerprint include:
- SETTINGS frame — connection parameters (window size, maximum frame size, stream limits)
- WINDOW_UPDATE values — values for updating the data transmission window
- Priority frames — stream priorities and their dependencies
- Header order — order of HTTP headers in pseudo-headers (:method, :path, :authority)
- ALPN negotiation — protocol negotiation parameters at the TLS level
- Connection preface — initial connection string
Each browser (Chrome, Firefox, Safari) and each library (Python requests, Node.js axios, Go net/http) sends these parameters in different orders and with different values. For example, Chrome 120 sends SETTINGS with parameters HEADER_TABLE_SIZE=65536, ENABLE_PUSH=0, MAX_CONCURRENT_STREAMS=1000, while the Python library httpx may send completely different values.
Example SETTINGS frame from Chrome 120: SETTINGS_HEADER_TABLE_SIZE: 65536 SETTINGS_ENABLE_PUSH: 0 SETTINGS_MAX_CONCURRENT_STREAMS: 1000 SETTINGS_INITIAL_WINDOW_SIZE: 6291456 SETTINGS_MAX_HEADER_LIST_SIZE: 262144 Example SETTINGS frame from Python httpx: SETTINGS_HEADER_TABLE_SIZE: 4096 SETTINGS_ENABLE_PUSH: 1 SETTINGS_MAX_CONCURRENT_STREAMS: 100 SETTINGS_INITIAL_WINDOW_SIZE: 65535
Anti-fraud systems collect statistics on fingerprints from real users and compare them with incoming requests. If the fingerprint does not match any known browser — the request is blocked as suspicious.
Why websites block based on HTTP/2 fingerprint
Blocks based on HTTP/2 fingerprint have become widespread in 2022-2023, when anti-fraud systems realized that traditional protection methods (checking User-Agent, cookies, IP addresses) can be easily bypassed. Parsers learned to spoof headers, arbitrage specialists — to use proxies, and bots — to emulate user behavior. However, changing the HTTP/2 fingerprint is more difficult — it is formed at a low level of the network stack.
The main reasons for implementing HTTP/2 fingerprinting are:
- Combatting scraping — marketplaces (Wildberries, Ozon, Amazon) lose millions on competitive price intelligence
- Protecting advertising platforms — Facebook Ads, Google Ads block automation to prevent fraud
- Preventing scalping — ticket sales and limited goods websites fight against bots
- Protection against DDoS — HTTP/2 fingerprint helps distinguish legitimate traffic from botnets
- Compliance with API licenses — some services want to enforce the use of paid APIs instead of scraping
Cloudflare, one of the largest protection providers, implemented HTTP/2 fingerprint checking in its Bot Management in 2023. According to their data, this reduced the number of successful scraping attacks by 67%. Akamai and DataDome use similar technologies.
Important: Even if you use the correct User-Agent and high-quality residential proxies, the request may be blocked due to a mismatch in HTTP/2 fingerprint. For example, if you send a request with a User-Agent from Chrome 120 but with a fingerprint from Python requests — the system will instantly detect this.
How anti-fraud systems detect fingerprints
Modern anti-fraud systems use multi-level checks of HTTP/2 connections. The process of determining the fingerprint occurs even before the server sends the HTML page — at the TCP and TLS connection establishment level.
Stages of fingerprint detection:
- TLS handshake analysis — checking the order of cipher suites, supported TLS extensions (ALPN, SNI, supported_versions), TLS version, and elliptic curve parameters. This is called JA3 fingerprint.
- HTTP/2 connection preface — checking the initial string "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" and the first SETTINGS frame.
- SETTINGS frame validation — comparing parameters with a database of known browsers and libraries. If SETTINGS does not match the User-Agent — the request is blocked.
- Priority and dependency analysis — checking stream priorities. For example, Chrome creates a tree of stream dependencies in a certain way, while Firefox does it differently.
- Header order check — analyzing the order of pseudo-headers (:method, :authority, :scheme, :path) and regular headers (user-agent, accept, accept-encoding).
- WINDOW_UPDATE patterns — checking the values and frequency of sending WINDOW_UPDATE frames.
Cloudflare uses its own Akamai2 technology, which creates a "fingerprint of the fingerprint" — a hash of all parameters of the HTTP/2 connection. This hash is compared with a database of millions of known fingerprints. If there is no match and the fingerprint looks suspicious — additional checks are triggered through a JavaScript challenge or blocking.
Example of spoof detection:
You send a request with User-Agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0", but use the Python library httpx. The system sees that the User-Agent indicates Chrome 120, but the SETTINGS frame contains parameters from httpx. Mismatch = blocking. The detection rate of such spoofing by Cloudflare reaches 99.2%.
Methods to bypass HTTP/2 fingerprinting
There are several approaches to bypassing blocks based on HTTP/2 fingerprint, each with its own advantages and limitations. The choice of method depends on the task: data parsing, social media automation, traffic arbitrage, or testing.
| Method | Difficulty | Effectiveness | Application |
|---|---|---|---|
| curl-impersonate | Medium | 95% | API parsing, scraping |
| Playwright/Puppeteer with patches | High | 90% | Automation with JS |
| Anti-detect browsers | Low | 98% | Arbitrage, multi-accounting |
| Real browsers via Selenium | Medium | 85% | Simple automation |
| HTTP/2 libraries with custom settings | Very high | 70-80% | Specific tasks |
Key principles for successful bypass:
- Matching HTTP/2 fingerprint and User-Agent — if you emulate Chrome, the fingerprint must be from Chrome of the same version
- Using quality proxies — even the correct fingerprint won't save you if the IP is already blacklisted
- Rotating fingerprints — do not use the same fingerprint for thousands of requests
- Emulating user behavior — delays between requests, realistic navigation patterns
- Updating fingerprints — browsers update every 4-6 weeks, fingerprints need to be updated too
Using curl-impersonate for parsing
curl-impersonate is a modified version of curl that emulates the HTTP/2 fingerprint of popular browsers at a low level. The project was specifically developed to bypass anti-fraud systems and supports fingerprints from Chrome, Firefox, Safari, and Edge of various versions.
Advantages of curl-impersonate for parsing:
- Accurate emulation of HTTP/2 fingerprint — SETTINGS, Priority, WINDOW_UPDATE are identical to a real browser
- Support for TLS fingerprint (JA3) — emulation not only of HTTP/2 but also of TLS handshake
- Low resource consumption — unlike headless browsers, curl works quickly
- Easy integration — can be used as a replacement for regular curl in scripts
- Regular updates — fingerprints are updated for new browser versions
Installing curl-impersonate:
# Installation on Ubuntu/Debian wget https://github.com/lwthiker/curl-impersonate/releases/download/v0.6.1/curl-impersonate-v0.6.1.x86_64-linux-gnu.tar.gz tar -xzf curl-impersonate-v0.6.1.x86_64-linux-gnu.tar.gz sudo cp curl-impersonate-chrome /usr/local/bin/ # Checking the installation curl-impersonate-chrome --version
Example usage with proxies:
# Emulating Chrome 120 with proxy curl-impersonate-chrome120 \ --proxy http://username:password@proxy.example.com:8080 \ -H "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8" \ https://www.wildberries.ru/catalog/0/search.aspx?search=laptop # Emulating Firefox 120 curl-impersonate-ff120 \ --proxy socks5://username:password@proxy.example.com:1080 \ https://www.ozon.ru/api/composer-api.bx/page/json/v2?url=/category/laptops
For Python developers, there is a library curl_cffi, which provides a Python wrapper around curl-impersonate:
from curl_cffi import requests
# Installation: pip install curl_cffi
# Request emulating Chrome 120
response = requests.get(
'https://www.wildberries.ru/catalog/0/search.aspx?search=laptop',
impersonate='chrome120',
proxies={
'http': 'http://username:password@proxy.example.com:8080',
'https': 'http://username:password@proxy.example.com:8080'
},
headers={
'Accept-Language': 'ru-RU,ru;q=0.9'
}
)
print(response.status_code)
print(response.text[:500])
curl-impersonate is particularly effective for parsing marketplaces and websites with Cloudflare, as it emulates not only HTTP/2 but also TLS fingerprint. In tests on Wildberries and Ozon, the success rate of requests reaches 95% when using high-quality residential proxies.
Configuring Playwright and Puppeteer with the correct fingerprint
Playwright and Puppeteer are popular tools for browser automation, but by default, they are detected by anti-fraud systems due to the characteristic signs of headless mode and specific HTTP/2 fingerprint. Additional configuration is needed to bypass blocks.
Default issues with Playwright/Puppeteer:
- Headless mode is detected through navigator.webdriver, absence of plugins, and specific window sizes
- HTTP/2 fingerprint differs from regular Chrome due to the peculiarities of the DevTools Protocol
- Absence of some Web APIs (WebGL, Canvas fingerprint may differ)
- Synchronization of actions — bots perform actions too quickly and uniformly
Solution: using playwright-extra and puppeteer-extra with plugins
# Installation for Playwright npm install playwright-extra puppeteer-extra-plugin-stealth # Or for Python pip install playwright-stealth
Example of configuring Playwright to bypass fingerprinting (Node.js):
const { chromium } = require('playwright-extra');
const stealth = require('puppeteer-extra-plugin-stealth')();
(async () => {
const browser = await chromium.launch({
headless: false, // Or true with additional patches
proxy: {
server: 'http://proxy.example.com:8080',
username: 'user',
password: 'pass'
},
args: [
'--disable-blink-features=AutomationControlled',
'--disable-dev-shm-usage',
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-web-security',
'--disable-features=IsolateOrigins,site-per-process'
]
});
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
locale: 'ru-RU',
timezoneId: 'Europe/Moscow',
geolocation: { latitude: 55.7558, longitude: 37.6173 },
permissions: ['geolocation']
});
// Patches to bypass detection
await context.addInitScript(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
// Emulating plugins
Object.defineProperty(navigator, 'plugins', {
get: () => [1, 2, 3, 4, 5]
});
// Emulating languages
Object.defineProperty(navigator, 'languages', {
get: () => ['ru-RU', 'ru', 'en-US', 'en']
});
});
const page = await context.newPage();
// Navigating to the site with a delay
await page.goto('https://www.wildberries.ru/', {
waitUntil: 'networkidle'
});
// Emulating mouse movement
await page.mouse.move(100, 100);
await page.waitForTimeout(Math.random() * 2000 + 1000);
await browser.close();
})();
For Python developers, there is a library playwright-stealth:
from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync
with sync_playwright() as p:
browser = p.chromium.launch(
headless=False,
proxy={
"server": "http://proxy.example.com:8080",
"username": "user",
"password": "pass"
}
)
context = browser.new_context(
viewport={'width': 1920, 'height': 1080},
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
locale='ru-RU',
timezone_id='Europe/Moscow'
)
page = context.new_page()
stealth_sync(page) # Applying stealth patches
page.goto('https://www.wildberries.ru/')
page.wait_for_timeout(3000)
browser.close()
It is important to understand that even with these patches, Playwright/Puppeteer do not provide a 100% guarantee of bypassing advanced anti-fraud systems. Cloudflare Bot Management and DataDome can detect automation through behavior analysis (speed of actions, click patterns, mouse movements). For critical tasks, it is recommended to use anti-detect browsers.
Anti-detect browsers for bypassing fingerprinting
Anti-detect browsers are specialized solutions for multi-accounting and bypassing fingerprinting, used by arbitrage specialists, SMM experts, and e-commerce professionals. Unlike Playwright, they provide a ready-made UI and automatically spoof all fingerprint parameters, including HTTP/2.
Popular anti-detect browsers with HTTP/2 fingerprint support:
| Browser | HTTP/2 Spoofing | Price | Application |
|---|---|---|---|
| Dolphin Anty | Yes, automatically | From $89/month | Facebook/TikTok arbitrage |
| AdsPower | Yes, automatically | From $9/month | E-commerce, SMM |
| Multilogin | Yes, advanced | From €99/month | Professional arbitrage |
| GoLogin | Yes, basic | From $24/month | Beginner arbitrage |
| Octo Browser | Yes, automatically | From €29/month | Social media multi-accounting |
How anti-detect browsers spoof HTTP/2 fingerprint:
- Modification of Chromium at the source level — changing HTTP/2 parameters in the browser code before compilation
- Dynamic spoofing of SETTINGS — generating unique but realistic parameters for each profile
- Synchronization with Canvas/WebGL fingerprint — all fingerprint parameters are consistent with each other
- Databases of real fingerprints — using fingerprints from real devices and browsers
- Automatic updates — fingerprints are updated when new browser versions are released
Configuring Dolphin Anty to bypass HTTP/2 fingerprinting:
- Create a new browser profile → select the operating system (Windows/macOS/Linux)
- In the "Fingerprint" section, choose "Real fingerprint" or "Generate new"
- Specify User-Agent — the browser will automatically select the corresponding HTTP/2 fingerprint
- In the proxy settings, add mobile proxies for working with Facebook/Instagram or residential proxies for other tasks
- Enable the "WebRTC substitution" option to spoof the real IP
- In the "Canvas" section, choose the "Noise" mode for a unique Canvas fingerprint
- Save the profile and launch — the browser will have a unique HTTP/2 fingerprint
Anti-detect browsers show the best results in bypassing fingerprinting — success rates reach 98% with proper configuration. They are particularly effective for working with Facebook Ads, TikTok Ads, Instagram, where fingerprint blocks are the most stringent.
Tip for arbitrage specialists:
When farming Facebook Ads accounts, use the combination: Dolphin Anty + mobile proxies + unique fingerprint for each account. Do not use the same fingerprint for multiple accounts — Facebook links accounts by fingerprint and can ban the entire chain (chain-ban). Change the fingerprint with each new profile creation.
The role of proxies in bypassing HTTP/2 blocks
A correct HTTP/2 fingerprint is only half the success. Even with a perfect fingerprint, the request will be blocked if the IP address is blacklisted or belongs to a known data center. Proxies play a critical role in bypassing fingerprinting.
Why proxies are important for bypassing HTTP/2 blocks:
- Hiding the real IP — anti-fraud systems check not only the fingerprint but also the reputation of the IP
- Geographic matching — if the fingerprint is from Windows with a Russian locale, but the IP is from the USA — this is suspicious
- Rotating fingerprints — with different IPs, you can use different fingerprints without linking
- Bypassing rate limiting — distributing requests across multiple IPs reduces the likelihood of blocking
- Emulating mobile devices — mobile proxies provide real IPs from telecom operators
Which proxies to use for different tasks:
| Task | Proxy Type | Why |
|---|---|---|
| Farming Facebook Ads | Mobile proxies | Facebook trusts mobile IPs from operators, low ban risk |
| Parsing Wildberries/Ozon | Residential proxies | Real IPs of home users, hard to distinguish from legitimate |
| Mass API parsing | Data center proxies | High speed, low price, suitable for APIs without strict protection |
| Multi-accounting Instagram | Mobile or residential | Instagram strictly blocks data centers, needs "clean" IPs |
| TikTok Ads | Mobile proxies | TikTok is focused on mobile devices, mobile IPs look natural |
Important proxy parameters for working with HTTP/2 fingerprinting:
- Support for HTTP/2 — ensure that the proxy server supports the HTTP/2 protocol
- Sticky sessions — the ability to keep one IP for the duration of the session (for multi-accounting)
- IP rotation — automatic IP change for parsing (every N requests or by time)
- Geographic binding — the choice of country/city must match the fingerprint
- IP cleanliness — checking the IP against blacklists (can be done via IPQualityScore)
The combination of the correct HTTP/2 fingerprint and quality proxies creates a synergistic effect — each element enhances the other. For example, when parsing Wildberries using curl-impersonate with residential proxies, the success rate of requests reaches 97%, while without proxies or with data center proxies — only 60-70%.
Practical cases: parsing, arbitrage, e-commerce
Let's consider real scenarios of applying HTTP/2 fingerprinting bypass in various business areas.
Case 1: Price parsing on Wildberries for competitor monitoring
Task: An e-commerce company sells electronics on Wildberries and wants to automatically track prices of 500 competitors twice a day.
Problem: Wildberries uses Cloudflare Bot Management with HTTP/2 fingerprint checking. Standard libraries (Python requests, Scrapy) get blocked after 3-5 requests.
Solution:
- Using curl-impersonate (curl_cffi for Python) with Chrome 120 emulation
- Connecting residential proxies with rotation every 10 requests
- Adding random delays of 2-5 seconds between requests
- Rotating User-Agent between Chrome 119, 120, 121 with corresponding fingerprints
import time
import random
from curl_cffi import requests
# List of products to parse
product_ids = [12345678, 87654321, ...] # 500 SKUs
# Proxy settings (residential with rotation)
proxy = "http://username:password@residential.proxycove.com:8080"
# Chrome versions for rotation
chrome_versions = ['chrome119', 'chrome120', 'chrome121']
results = []
for product_id in product_ids:
# Choosing a random version of Chrome
impersonate = random.choice(chrome_versions)
url = f'https://www.wildberries.ru/catalog/{product_id}/detail.aspx'
try:
response = requests.get(
url,
impersonate=impersonate,
proxies={'http': proxy, 'https': proxy},
headers={
'Accept-Language': 'ru-RU,ru;q=0.9',
'Accept': 'text/html,application/xhtml+xml'
},
timeout=15
)
if response.status_code == 200:
# Parsing price from HTML
price = parse_price(response.text)
results.append({'id': product_id, 'price': price})
print(f'✓ {product_id}: {price} rub.')
else:
print(f'✗ {product_id}: HTTP {response.status_code}')
except Exception as e:
print(f'✗ {product_id}: {str(e)}')
# Random delay
time.sleep(random.uniform(2, 5))
# Saving results
save_to_database(results)
Result: The success rate of parsing increased from 45% (without bypassing fingerprint) to 96%. Time savings — instead of manual monitoring for 8 hours a day, automatic parsing takes 30 minutes.
Case 2: Farming Facebook Ads accounts for arbitrage
Task: The arbitrage team runs ads on 30 Facebook Ads accounts simultaneously to test creatives.
Problem: Facebook detects linked accounts by HTTP/2 fingerprint and bans the entire chain (chain-ban). Using one browser for all accounts results in a 90% ban risk.
Solution:
- Using Dolphin Anty with the creation of 30 unique profiles
- For each profile — a unique HTTP/2 fingerprint, Canvas, WebGL, User-Agent
- Connecting mobile proxies (one IP per account, sticky session for 24 hours)
- Separating accounts by operating systems (10 Windows, 10 macOS, 10 Android emulation)
- Warming up accounts: 3 days of normal activity (scrolling feed, likes) before launching ads
Configuration in Dolphin Anty:
- Profile 1: Windows 10, Chrome 120, mobile proxy Russia (Beeline), fingerprint from a real device
- Profile 2: macOS Sonoma, Safari 17, mobile proxy Russia (MTS), unique fingerprint
- Profile 3: Windows 11, Chrome 121, mobile proxy Ukraine (Kyivstar), fingerprint from a real device
- And so on for all 30 profiles...
Result: In 3 months of operation, 2 out of 30 accounts were banned (6.6% compared to 90% without anti-detect). ROI increased by 340% due to the ability to test more chains simultaneously.
Case 3: Automating posting on Instagram for an SMM agency
Task: The SMM agency manages 50 client accounts on Instagram and wants to automate post publishing on a schedule.
Problem: Instagram blocks accounts upon detecting automation. Using one IP and the same fingerprint for all accounts leads to mass bans.
Solution:
- Using AdsPower with 50 profiles (one for each account)
- Residential proxies linked to the client's city (if the client is from Moscow — proxy Moscow)
- Unique HTTP/2 fingerprint for each profile
- Automation through the built-in scheduler in AdsPower (no code)
- Emulating manual actions: random delays, scrolling feed before posting
Automation setup:
- Uploading content to AdsPower (photos, text, hashtags)
- Setting the schedule: post every day at 12:00 client time
- Adding randomness: ±30 minutes from the scheduled time
- Before posting: opening Instagram → scrolling the feed for 2-3 minutes