Bypass

How to bypass TrustDecision in 2026: Step-by-step guide

TrustDecision uses device fingerprinting and behavioral analysis across 150+ data points to detect automated traffic. This guide shows you practical methods to bypass their protection using TLS fingerprinting, stealth browsers, and behavioral simulation.

Whether you're building a scraper for research purposes or testing your own applications, understanding how TrustDecision works is the first step to getting past it.

What is TrustDecision Anti-Bot?

TrustDecision anti-bot is a fraud prevention system that identifies automated traffic through device fingerprinting, behavioral analysis, and real-time risk scoring. It creates unique identifiers for each device by collecting hardware configurations, operating system details, and software settings.

The system processes over 6 billion device profiles globally. It serves more than 10,000 clients across financial services, e-commerce, and digital platforms.

Unlike simpler anti-bot solutions that rely primarily on IP reputation or basic CAPTCHA challenges, TrustDecision operates at multiple detection layers simultaneously.

How TrustDecision Detects Bots

Understanding the detection mechanisms is essential before attempting any bypass. TrustDecision employs several overlapping techniques.

Device Fingerprinting

TrustDecision collects over 150 device parameters to create a unique identifier. These include:

  • Hardware configuration (CPU cores, GPU details, screen resolution)
  • Operating system and version
  • Browser type and installed plugins
  • Timezone and language settings
  • Canvas and WebGL rendering characteristics
  • Audio context fingerprints

The system persists device identification even after factory resets or app reinstalls. This makes simple evasion tactics ineffective.

Behavioral Analysis

Beyond static fingerprints, TrustDecision monitors how users interact with applications. It tracks typing patterns, mouse movements, scroll behavior, and touch gestures on mobile devices.

Automated scripts typically produce unnaturally consistent timing. Real users show variation in their actions. The system flags requests that lack this natural randomness.

Risk Scoring

Each incoming request receives a real-time risk score based on multiple factors. The system assigns dynamic risk labels that update continuously.

High-risk indicators include:

  • Emulator or virtual machine detection
  • Modified device parameters
  • Group control tools (device farms)
  • VPN or proxy usage patterns
  • Inconsistent location data

WebAssembly Protection

TrustDecision protects its client-side scripts using WebAssembly obfuscation. This makes reverse engineering significantly harder than with standard JavaScript fingerprinting libraries.

The code virtualization technology increases the cost and effort required to understand the detection logic.

Method 1: Bypass TLS Fingerprinting with curl_cffi

When your scraper connects over HTTPS, a TLS handshake reveals information about your client. Standard HTTP libraries like Python's requests produce fingerprints that differ noticeably from real browsers.

TrustDecision analyzes these TLS characteristics as part of its detection stack. The curl_cffi library solves this by impersonating real browser fingerprints.

Install curl_cffi

First, install the library using pip:

pip install curl_cffi

The package includes pre-compiled binaries for Windows, macOS, and Linux. No additional compilation is required.

Basic Usage

Replace your standard requests import with curl_cffi:

from curl_cffi import requests

# Impersonate Chrome browser including TLS fingerprint
response = requests.get(
    "https://target-site.com",
    impersonate="chrome"
)

print(response.status_code)
print(response.text)

The impersonate parameter tells curl_cffi which browser's TLS signature to mimic. This single change makes your requests appear identical to real Chrome traffic at the TLS layer.

Supported Browser Profiles

curl_cffi supports multiple browser versions. Use specific versions for more precise impersonation:

from curl_cffi import requests

# Specific Chrome version
response = requests.get(
    "https://target-site.com",
    impersonate="chrome124"
)

# Safari impersonation
response = requests.get(
    "https://target-site.com",
    impersonate="safari"
)

# Latest Chrome (auto-updates)
response = requests.get(
    "https://target-site.com",
    impersonate="chrome"
)

Available profiles include chrome99 through chrome131, safari, and safari_ios. The library updates profiles as browser fingerprints change.

Adding Proxy Support

Combine TLS fingerprinting with proxy rotation for better results:

from curl_cffi import requests

proxies = {
    "http": "http://user:pass@proxy-server:8080",
    "https": "http://user:pass@proxy-server:8080"
}

response = requests.get(
    "https://target-site.com",
    impersonate="chrome",
    proxies=proxies
)

Residential proxies work better than datacenter IPs against TrustDecision. The system cross-references IP reputation with device fingerprints.

Session Management

Maintain cookies and session state across multiple requests:

from curl_cffi import requests

session = requests.Session()

# First request establishes session
session.get(
    "https://target-site.com/login",
    impersonate="chrome"
)

# Subsequent requests reuse cookies
response = session.get(
    "https://target-site.com/protected-page",
    impersonate="chrome"
)

Consistent sessions help maintain a believable browsing pattern. Avoid creating new fingerprints for every request.

Limitations of curl_cffi

While curl_cffi handles TLS fingerprinting effectively, it cannot execute JavaScript. Sites that require JavaScript execution or browser interactions need a different approach.

Use curl_cffi for:

  • API endpoints
  • Pages without JavaScript challenges
  • Initial reconnaissance

Move to stealth browsers when JavaScript execution is required.

Method 2: Stealth Browser Automation with Camoufox

Camoufox is a Firefox-based anti-detect browser that masks fingerprints at the C++ implementation level. This approach defeats detection methods that inspect JavaScript properties.

Standard automation tools like Selenium expose the navigator.webdriver flag. Camoufox eliminates these telltale signs before JavaScript can even check them.

Install Camoufox

Install the library and download browser binaries:

pip install camoufox
python -m camoufox fetch

The fetch command downloads the modified Firefox binary. This step is required before first use.

Basic Scraping Example

Here's how to scrape a protected page:

from camoufox.sync_api import Camoufox

with Camoufox(headless=True) as browser:
    page = browser.new_page()
    page.goto("https://target-site.com")
    
    # Wait for content to load
    page.wait_for_load_state("networkidle")
    
    # Extract content
    content = page.content()
    print(content)

Camoufox automatically generates realistic fingerprints on each launch. The browser appears identical to a genuine Firefox installation.

Configure Fingerprint Properties

Override specific values when you need precise control:

from camoufox.sync_api import Camoufox

config = {
    'window.outerHeight': 1056,
    'window.outerWidth': 1920,
    'window.innerHeight': 1008,
    'window.innerWidth': 1920,
    'navigator.language': 'en-US',
    'navigator.languages': ['en-US'],
    'navigator.platform': 'Win32',
    'navigator.hardwareConcurrency': 8,
}

with Camoufox(
    config=config,
    i_know_what_im_doing=True
) as browser:
    page = browser.new_page()
    page.goto("https://target-site.com")

The i_know_what_im_doing flag acknowledges that custom configurations can create detectable inconsistencies. Only use custom values when necessary.

GeoIP Proxy Integration

Camoufox automatically matches location data to your proxy's geographic location:

from camoufox.sync_api import Camoufox

with Camoufox(
    headless=True,
    geoip=True,
    proxy={
        "server": "http://proxy-server:8080",
        "username": "user",
        "password": "pass"
    }
) as browser:
    page = browser.new_page()
    page.goto("https://target-site.com")

The geoip feature queries your proxy's IP and sets timezone, locale, and WebRTC IP accordingly. This prevents location inconsistencies that TrustDecision would flag.

Async Implementation for Scale

For large-scale scraping, use the async API:

from camoufox.async_api import AsyncCamoufox
import asyncio

async def scrape_page(browser, url):
    page = await browser.new_page()
    await page.goto(url)
    content = await page.content()
    await page.close()
    return content

async def main():
    urls = [
        "https://target-site.com/page1",
        "https://target-site.com/page2",
        "https://target-site.com/page3"
    ]
    
    async with AsyncCamoufox(headless=True) as browser:
        tasks = [scrape_page(browser, url) for url in urls]
        results = await asyncio.gather(*tasks)
        
        for url, content in zip(urls, results):
            print(f"Scraped {len(content)} chars from {url}")

asyncio.run(main())

Async mode handles concurrent page loads efficiently. Keep the browser instance alive to maintain consistent fingerprints across requests.

Why Camoufox Works Against TrustDecision

Camoufox achieves 0% detection rates on fingerprinting test sites like CreepJS and BrowserScan. The modifications happen at the C++ level, before any JavaScript can inspect browser properties.

TrustDecision's JavaScript-based fingerprinting cannot detect Camoufox because:

  1. The navigator.webdriver flag is genuinely absent
  2. Canvas fingerprints match real Firefox installations
  3. WebGL parameters are consistent with the spoofed OS
  4. Audio context fingerprints are properly masked

Method 3: Nodriver for CDP-Minimal Automation

Nodriver takes a fundamentally different approach from patched browsers. Instead of hiding automation signals, it avoids creating them in the first place.

Traditional tools like Selenium use the Chrome DevTools Protocol (CDP) extensively. Anti-bot systems learned to detect CDP patterns. Nodriver minimizes CDP usage while still providing automation capabilities.

Install Nodriver

pip install nodriver

Nodriver manages browser installation automatically. No separate driver downloads required.

Basic Example

import nodriver as uc

async def main():
    browser = await uc.start()
    page = await browser.get("https://target-site.com")
    
    # Wait for page to fully load
    await page.sleep(2)
    
    # Get page content
    content = await page.get_content()
    print(content)
    
    await browser.stop()

if __name__ == "__main__":
    uc.loop().run_until_complete(main())

The library launches Chrome with minimal automation traces. Most CDP interactions that trigger detection are avoided entirely.

Handling Form Submissions

Nodriver supports realistic user interactions:

import nodriver as uc

async def login_example():
    browser = await uc.start()
    page = await browser.get("https://target-site.com/login")
    
    # Find and fill username field
    username = await page.select("input[name='username']")
    await username.send_keys("your_username")
    
    # Find and fill password field
    password = await page.select("input[name='password']")
    await password.send_keys("your_password")
    
    # Click login button
    login_btn = await page.select("button[type='submit']")
    await login_btn.click()
    
    # Wait for navigation
    await page.sleep(3)
    
    print(await page.get_content())
    await browser.stop()

uc.loop().run_until_complete(login_example())

The interactions mimic real user behavior. No CDP-based input injection that would trigger detection.

Proxy Configuration

import nodriver as uc

async def main():
    browser = await uc.start(
        browser_args=[
            '--proxy-server=http://proxy-server:8080'
        ]
    )
    page = await browser.get("https://target-site.com")
    await browser.stop()

uc.loop().run_until_complete(main())

Combine Nodriver with residential proxies for best results against TrustDecision's IP reputation checks.

Method 4: Behavioral Simulation

TrustDecision monitors user behavior patterns. Even with perfect fingerprinting, robotic behavior can trigger detection. Simulate human-like interactions to avoid behavioral flags.

Random Delays

Never send requests at consistent intervals:

import random
import time
from curl_cffi import requests

def human_delay():
    """Generate random delay between 1-5 seconds"""
    delay = random.uniform(1.0, 5.0)
    time.sleep(delay)

session = requests.Session()

urls = ["https://site.com/page1", "https://site.com/page2"]

for url in urls:
    human_delay()
    response = session.get(url, impersonate="chrome")
    print(f"Fetched: {url}")

Real users don't navigate instantly between pages. The random delays make your traffic pattern more believable.

Mouse Movement Simulation

For browser automation, simulate realistic cursor paths:

from camoufox.sync_api import Camoufox
import random

def human_mouse_move(page, target_x, target_y):
    """Move cursor with human-like randomness"""
    current_x, current_y = 0, 0
    steps = random.randint(10, 25)
    
    for i in range(steps):
        progress = (i + 1) / steps
        # Add slight randomness to path
        jitter_x = random.uniform(-5, 5)
        jitter_y = random.uniform(-5, 5)
        
        next_x = current_x + (target_x - current_x) * progress + jitter_x
        next_y = current_y + (target_y - current_y) * progress + jitter_y
        
        page.mouse.move(next_x, next_y)
        page.wait_for_timeout(random.randint(10, 30))

with Camoufox(humanize=True) as browser:
    page = browser.new_page()
    page.goto("https://target-site.com")
    
    # Move to a button before clicking
    button = page.locator("button.submit")
    box = button.bounding_box()
    human_mouse_move(page, box['x'] + box['width']/2, box['y'] + box['height']/2)
    
    button.click()

Camoufox includes built-in humanization with the humanize=True parameter. This adds natural variations to interactions automatically.

Scroll Behavior

Humans scroll pages in distinct patterns:

from camoufox.sync_api import Camoufox
import random
import time

def human_scroll(page, total_scroll):
    """Scroll page with realistic behavior"""
    scrolled = 0
    
    while scrolled < total_scroll:
        # Variable scroll distance
        scroll_amount = random.randint(100, 400)
        
        page.evaluate(f"window.scrollBy(0, {scroll_amount})")
        scrolled += scroll_amount
        
        # Occasional pause to "read"
        if random.random() < 0.3:
            time.sleep(random.uniform(0.5, 2.0))
        else:
            time.sleep(random.uniform(0.1, 0.3))

with Camoufox(headless=True) as browser:
    page = browser.new_page()
    page.goto("https://target-site.com/long-page")
    
    # Scroll down the page naturally
    human_scroll(page, 2000)

Avoid scrolling at constant speeds or to exact pixel positions. Real users are imprecise.

Method 5: Proxy Rotation Strategy

TrustDecision correlates device fingerprints with IP addresses. Using the same IP with different fingerprints raises flags. A proper proxy strategy is essential.

Residential vs Datacenter Proxies

Datacenter proxies are cheap but easily detected. TrustDecision maintains IP reputation databases that flag known datacenter ranges.

Residential proxies route traffic through real user devices. They're harder to detect but more expensive.

For TrustDecision bypass:

  • Use residential proxies for sensitive operations
  • Rotate IPs between sessions, not requests
  • Match proxy location to your spoofed fingerprint location

Session-Based Rotation

Don't rotate IPs within a single user session:

from curl_cffi import requests
import random

class ProxyRotator:
    def __init__(self, proxy_list):
        self.proxies = proxy_list
        self.current_proxy = None
    
    def get_session_proxy(self):
        """Get proxy for entire session"""
        if not self.current_proxy:
            self.current_proxy = random.choice(self.proxies)
        return {
            "http": self.current_proxy,
            "https": self.current_proxy
        }
    
    def rotate(self):
        """Switch to new proxy for next session"""
        self.current_proxy = random.choice(self.proxies)

proxy_list = [
    "http://user:pass@proxy1:8080",
    "http://user:pass@proxy2:8080",
    "http://user:pass@proxy3:8080"
]

rotator = ProxyRotator(proxy_list)

# Use same proxy for entire browsing session
session = requests.Session()
proxies = rotator.get_session_proxy()

# Multiple requests with same proxy
for page in range(1, 5):
    response = session.get(
        f"https://site.com/page/{page}",
        impersonate="chrome",
        proxies=proxies
    )
    
# Rotate for next session
rotator.rotate()

Consistent IP within sessions mimics real user behavior. Changing IPs mid-session triggers anti-fraud alerts.

Putting It All Together

Here's a complete example combining multiple bypass techniques:

from camoufox.sync_api import Camoufox
import random
import time

def scrape_with_bypass(url, proxy_config):
    """
    Complete TrustDecision bypass scraper
    """
    with Camoufox(
        headless=True,
        humanize=True,
        geoip=True,
        proxy=proxy_config
    ) as browser:
        page = browser.new_page()
        
        # Navigate to target
        page.goto(url)
        
        # Wait for any JavaScript challenges to complete
        page.wait_for_load_state("networkidle")
        
        # Simulate reading behavior
        time.sleep(random.uniform(2, 4))
        
        # Scroll down naturally
        for _ in range(3):
            page.evaluate(f"window.scrollBy(0, {random.randint(200, 400)})")
            time.sleep(random.uniform(0.3, 0.8))
        
        # Extract data
        content = page.content()
        
        return content

# Configure proxy
proxy = {
    "server": "http://residential-proxy:8080",
    "username": "user",
    "password": "pass"
}

# Run scraper
result = scrape_with_bypass(
    "https://trustdecision-protected-site.com",
    proxy
)

print(f"Scraped {len(result)} characters")

This implementation addresses multiple detection layers:

  • TLS fingerprinting (Camoufox uses real Firefox)
  • Device fingerprinting (C++-level spoofing)
  • Behavioral analysis (humanize mode + manual simulation)
  • IP reputation (residential proxy with GeoIP matching)

Common Pitfalls to Avoid

Several mistakes commonly trigger TrustDecision detection even when using bypass tools.

Fingerprint Inconsistencies

Don't spoof a Windows fingerprint while using a macOS proxy location. TrustDecision cross-references all available signals.

Keep your configuration consistent:

  • OS fingerprint matches proxy location
  • Timezone aligns with IP geolocation
  • Language settings match expected region

Excessive Request Rates

Even with perfect fingerprints, sending 100 requests per minute looks automated. Real users browse slowly.

Target 2-5 requests per minute for heavily protected sites. Monitor success rates and adjust accordingly.

Reusing Fingerprints Across IPs

Each IP should have a consistent, unique fingerprint. Don't use the same device ID with multiple IP addresses.

Generate new fingerprints when rotating proxies between sessions.

Ignoring JavaScript Execution

curl_cffi bypasses TLS fingerprinting but cannot handle JavaScript challenges. If a site requires browser execution, switch to Camoufox or Nodriver.

Watch for symptoms like:

  • Blank pages despite 200 status codes
  • "Please enable JavaScript" messages
  • Immediate redirects to challenge pages

Testing Your Setup

Before targeting production sites, verify your bypass configuration works correctly.

Fingerprint Test Sites

Check your fingerprint against these testing tools:

from camoufox.sync_api import Camoufox

test_urls = [
    "https://browserleaks.com/javascript",
    "https://browserscan.net/",
    "https://creepjs.com/"
]

with Camoufox(headless=False) as browser:
    for url in test_urls:
        page = browser.new_page()
        page.goto(url)
        input(f"Check {url} - Press Enter to continue")
        page.close()

Run in headful mode to manually inspect results. Look for:

  • Zero headless detection flags
  • Consistent fingerprint properties
  • No automation signals detected

TLS Fingerprint Verification

Confirm curl_cffi produces correct browser fingerprints:

from curl_cffi import requests

# Check JA3 fingerprint
response = requests.get(
    "https://tls.browserleaks.com/json",
    impersonate="chrome"
)

data = response.json()
print(f"JA3 Hash: {data.get('ja3_hash')}")
print(f"User Agent: {data.get('user_agent')}")

Compare the JA3 hash against known Chrome values. Mismatches indicate configuration issues.

Method 6: SeleniumBase UC Mode Alternative

SeleniumBase with Undetected ChromeDriver (UC) Mode provides another option for bypassing TrustDecision. This approach works well if you already have Selenium-based code.

Install SeleniumBase

pip install seleniumbase

Basic Usage with UC Mode

from seleniumbase import SB

with SB(uc=True) as sb:
    sb.open("https://target-site.com")
    
    # Wait for any challenges to complete
    sb.sleep(3)
    
    # Extract content
    content = sb.get_page_source()
    print(content)

The uc=True parameter enables undetected mode. The browser launches with modifications that hide automation signals from detection scripts.

Handling Turnstile Challenges

SeleniumBase includes built-in CAPTCHA handling:

from seleniumbase import SB

with SB(uc=True) as sb:
    sb.uc_open_with_reconnect("https://protected-site.com", 4)
    
    # If Turnstile appears
    if sb.is_element_visible("iframe[src*='turnstile']"):
        sb.uc_gui_click_captcha()
    
    # Continue after verification
    sb.click("button.proceed")

The uc_gui_click_captcha() method handles interactive Turnstile challenges automatically. This saves significant development time compared to manual solver integration.

Combining with Proxies

from seleniumbase import SB

proxy_string = "user:pass@proxy-server:8080"

with SB(uc=True, proxy=proxy_string) as sb:
    sb.open("https://target-site.com")
    content = sb.get_page_source()

SeleniumBase passes proxy configuration to the browser cleanly. The traffic routes through your proxy while maintaining stealth mode.

Troubleshooting Detection Issues

Even with proper bypass techniques, you may encounter blocks. Here's how to diagnose and fix common problems.

Check TLS Fingerprint First

If curl_cffi requests fail, verify your TLS fingerprint matches expectations:

from curl_cffi import requests

response = requests.get(
    "https://tls.browserleaks.com/json",
    impersonate="chrome124"
)

print(response.json())

Look for any anomalies in the JA3 hash or HTTP/2 settings. Mismatches indicate the impersonation isn't working correctly.

Verify Browser Fingerprint

For Camoufox or Nodriver issues, run fingerprint tests in headful mode:

from camoufox.sync_api import Camoufox

with Camoufox(headless=False) as browser:
    page = browser.new_page()
    page.goto("https://browserscan.net/")
    
    # Manually inspect the results
    input("Press Enter after checking results...")

Common issues include:

  • WebGL parameters inconsistent with spoofed OS
  • Audio context fingerprint anomalies
  • Canvas rendering differences

Monitor Request Headers

TrustDecision inspects HTTP headers for inconsistencies:

from curl_cffi import requests

response = requests.get(
    "https://httpbin.org/headers",
    impersonate="chrome"
)

print(response.json()['headers'])

Verify the User-Agent, Accept, and Accept-Language headers match a real browser. Missing or malformed headers trigger detection.

Check for IP Reputation Issues

Sometimes the proxy IP itself is flagged. Test with a fresh IP:

from curl_cffi import requests

# Test IP reputation
response = requests.get(
    "https://ipinfo.io/json",
    impersonate="chrome",
    proxies={"https": "http://proxy:port"}
)

data = response.json()
print(f"IP: {data.get('ip')}")
print(f"Type: {data.get('hosting', 'Unknown')}")
print(f"Location: {data.get('city')}, {data.get('country')}")

Datacenter IPs often show "hosting: true" which triggers TrustDecision's IP reputation filter. Switch to residential proxies if this occurs.

Debug JavaScript Challenges

If pages load but show challenge screens, JavaScript execution is required:

from camoufox.sync_api import Camoufox

with Camoufox(headless=False) as browser:
    page = browser.new_page()
    
    # Enable console logging
    page.on("console", lambda msg: print(f"Console: {msg.text}"))
    
    page.goto("https://target-site.com")
    
    # Watch for any errors or challenge triggers
    page.wait_for_timeout(10000)

JavaScript errors in the console often indicate detection. Common triggers include undefined properties that the fingerprinting script expects.

Performance Optimization Tips

Bypassing TrustDecision effectively requires balancing stealth with speed.

Connection Pooling

Reuse connections instead of creating new ones for each request:

from curl_cffi import requests

session = requests.Session()

# Connection is reused across requests
for i in range(10):
    response = session.get(
        f"https://site.com/page/{i}",
        impersonate="chrome"
    )

Connection reuse mimics real browser behavior and reduces overhead.

Browser Instance Reuse

For Camoufox, keep browser instances alive across multiple pages:

from camoufox.sync_api import Camoufox

# WRONG - Creates new fingerprint each time
for url in urls:
    with Camoufox() as browser:  # New instance per URL
        page = browser.new_page()
        page.goto(url)

# CORRECT - Consistent fingerprint for session
with Camoufox() as browser:
    for url in urls:
        page = browser.new_page()
        page.goto(url)
        page.close()

Creating new browser instances generates new fingerprints. Keep the instance alive to maintain consistency.

Parallel Processing Limits

Don't run too many concurrent browsers. Each instance consumes significant memory:

from camoufox.async_api import AsyncCamoufox
import asyncio

async def scrape_batch(urls, max_concurrent=3):
    semaphore = asyncio.Semaphore(max_concurrent)
    
    async def scrape_one(browser, url):
        async with semaphore:
            page = await browser.new_page()
            await page.goto(url)
            content = await page.content()
            await page.close()
            return content
    
    async with AsyncCamoufox(headless=True) as browser:
        tasks = [scrape_one(browser, url) for url in urls]
        return await asyncio.gather(*tasks)

Limit concurrent pages to prevent resource exhaustion. Three to five concurrent pages works well for most systems.

Frequently Asked Questions

What is TrustDecision anti-bot protection?

TrustDecision anti-bot is a fraud prevention system that detects automated traffic through device fingerprinting, behavioral analysis, and real-time risk scoring across 150+ data points. It serves over 10,000 clients and maintains profiles for 6 billion+ devices globally.

Can TrustDecision detect headless browsers?

Yes, TrustDecision can detect standard headless browsers through JavaScript property inspection and fingerprint analysis. However, stealth browsers like Camoufox achieve 0% detection by modifying properties at the C++ level before JavaScript executes.

Which bypass method is most effective?

No single method works universally. For static content, curl_cffi with TLS fingerprinting often suffices. For JavaScript-heavy sites, Camoufox provides the best stealth. Combine multiple techniques with residential proxies for heavily protected targets.

Do I need residential proxies?

Residential proxies significantly improve success rates against TrustDecision. The system cross-references device fingerprints with IP reputation. Datacenter IPs are often flagged regardless of fingerprint quality.

How often should I rotate fingerprints?

Rotate fingerprints between sessions, not requests. Maintain the same fingerprint throughout a browsing session to mimic real user behavior. Generate new fingerprints when switching proxy IPs.

The legality depends on your use case and jurisdiction. Authorized security testing and accessing your own accounts is generally permitted. Scraping websites against their terms of service may violate computer fraud laws in some jurisdictions.

Conclusion

Bypassing TrustDecision requires a layered approach. No single technique works in isolation. Combine TLS fingerprinting with stealth browsers and realistic behavioral simulation for best results.

Start with curl_cffi for API endpoints and simple pages. Move to Camoufox when JavaScript execution is required. Add behavioral simulation and proxy rotation for heavily protected targets.

Monitor your success rates continuously. TrustDecision updates their detection methods regularly. What works today may need adjustment tomorrow.

The key principles to remember:

  1. Match your TLS fingerprint to a real browser using curl_cffi
  2. Use stealth browsers like Camoufox for JavaScript-heavy sites
  3. Simulate human behavior with realistic delays and interactions
  4. Keep fingerprints consistent within sessions
  5. Use residential proxies with matching geographic data

For large-scale operations, consider using residential proxies from providers that offer high-quality IPs suitable for anti-bot bypass.