FCaptcha v1.12: Catch AI Agents in Real Browsers
How FCaptcha v1.11 and v1.12 detect AI agents that drive real browsers, using CDP input forensics, think-time cadence, and declared-agent matching.
bot-detectionNew SDKs with JA3 and JA4 fingerprinting detect bots by analyzing TLS handshakes. Learn how WebDecoy blocks sophisticated botnets.
WebDecoy Team
WebDecoy Security Team
We’re excited to announce the release of WebDecoy’s official SDKs for Node.js, Go, and PHP (WordPress)! These SDKs bring enterprise-grade bot detection to your backend applications with a powerful new capability: TLS fingerprinting.
In this post, we’ll introduce the new SDKs, explain what TLS fingerprinting is, dive deep into JA3 and JA4 fingerprinting techniques, and show you how WebDecoy uses these technologies to protect your applications from sophisticated botnets.
Our new SDKs make it incredibly easy to integrate WebDecoy’s AI-powered bot detection into your server-side applications:
Perfect for Express, Next.js, and other Node.js frameworks. Simple middleware integration with full TypeScript support.
Lightweight and performant, designed for high-throughput Go applications with native support for standard net/http handlers.
Built specifically for WordPress, with seamless integration into your existing plugins and themes. Protect your WP admin, forms, and API endpoints.
All three SDKs now support comprehensive TLS fingerprinting, allowing WebDecoy to detect bots with unprecedented accuracy.
TLS (Transport Layer Security) fingerprinting is a technique for identifying clients based on the unique characteristics of their TLS handshake—the initial “hello” message sent when establishing an HTTPS connection.
Every TLS client (browser, bot, script) has a unique “signature” based on:
Real browsers like Chrome, Firefox, and Safari have very specific TLS configurations. Automated tools like curl, wget, python-requests, and headless browsers have distinctly different fingerprints.
Traditional bot detection methods rely on:
TLS fingerprinting is different. It’s based on low-level cryptographic handshake details that are extremely difficult to fake without completely reimplementing a browser’s TLS stack.
JA3 is a standardized method for creating TLS fingerprints, developed by Salesforce in 2017.
JA3 creates a fingerprint from the TLS ClientHello message by concatenating:
These values are joined with commas and hyphens, then MD5 hashed to create a unique fingerprint.
Example:
771,4866-4865-4867,0-11-10-35-23,29-23-24,0↓ MD5 Hash ↓
e7d705a3286e19ea42f587b344ee6865This fingerprint uniquely identifies the TLS client.
Let’s say a bot sends this request:
{
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0",
"tls_info": {
"version": 771,
"cipher_suites": [49195, 49199, 52393, 52392, 49196],
"extensions": [0, 23, 65281, 10, 11, 35, 16]
}
}The User-Agent claims to be Chrome on Windows, but when we generate the JA3 fingerprint:
JA3: e7d705a3286e19ea42f587b344ee6865This fingerprint matches curl 7.x, not Chrome!
Result: WebDecoy detects the mismatch and blocks the request.
While powerful, JA3 has some limitations:
uTLS to mimic browser fingerprintsThis is where JA4 comes in.
JA4 is a modern TLS fingerprinting method developed in 2023 to address JA3’s limitations.
JA4 provides a more comprehensive fingerprint by including:
JA4 actually consists of multiple fingerprints:
Together, these create a multi-dimensional fingerprint that’s extremely difficult to spoof.
Unlike JA3’s simple MD5 hash, JA4 uses a structured format that captures:
This makes it nearly impossible for bots to perfectly mimic a real browser without using an actual browser engine.
WebDecoy’s SDK integration brings TLS fingerprinting into your application’s detection flow:
Our SDKs capture comprehensive TLS parameters from incoming requests:
// Node.js SDK Example
const tlsInfo = {
version: socket.getProtocol(), // e.g., "TLSv1.3"
cipherSuites: socket.getCipherSuites(), // Array of supported ciphers
extensions: socket.getExtensions(), // TLS extensions
supportedGroups: socket.getSupportedGroups(),
signatureAlgorithms: socket.getSignatureAlgorithms(),
alpnProtocols: socket.getALPNProtocols(),
sniHostname: socket.getServerName()
};WebDecoy automatically generates both JA3 and JA4 fingerprints from the TLS data:
SDK Request → Extract TLS Parameters
↓
Generate JA3 Fingerprint
Generate JA4 Fingerprint
↓
Send to WebDecoy APIWebDecoy maintains a comprehensive database of known bot fingerprints:
WebDecoy compares the TLS fingerprint with the User-Agent header:
User-Agent: "Mozilla/5.0 (Chrome/120...)"
JA3 Fingerprint: e7d705a3286e19ea42f587b344ee6865 (curl)
→ MISMATCH DETECTED!Based on the fingerprint analysis, WebDecoy adds score boosts:
Let’s walk through a complete detection scenario:
A sophisticated scraper tries to access your API:
POST /api/products HTTP/2
Host: yoursite.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36The User-Agent claims to be Chrome on macOS.
Step 1: TLS Fingerprint Generation
TLS Version: 771 (TLS 1.2)
Cipher Suites: [49195, 49199, 52393, 52392, 49196]
Extensions: [0, 23, 65281, 10, 11, 35, 16]
→ JA3: e7d705a3286e19ea42f587b344ee6865Step 2: Database Lookup
JA3 e7d705a3286e19ea42f587b344ee6865 matches:
- curl 7.68.0
- curl 7.74.0
- curl 7.81.0Step 3: Mismatch Detection
User-Agent: Chrome 120 on macOS
TLS Fingerprint: curl 7.x
→ CRITICAL MISMATCHStep 4: Threat Score Calculation
Base Score: 0
+ Known Bot Fingerprint: +40
+ TLS/UA Mismatch: +45 (confidence 90 / 2)
+ TLS 1.2 (Chrome 120 uses TLS 1.3): +15
─────────────────────────────────
Final Threat Score: 100
→ VERDICT: HIGH THREAT - BLOCKWebDecoy blocks the request and logs the detection:
{
"threat_score": 100,
"verdict": "block",
"reasons": [
"Known bot fingerprint: curl 7.x",
"TLS fingerprint mismatch with User-Agent",
"Outdated TLS version for claimed browser"
],
"ja3": "e7d705a3286e19ea42f587b344ee6865",
"ja4": "t13d1516h2_8daaf6152771_b0da82dd1658"
}Bot developers are getting more sophisticated:
TLS fingerprinting is effective because:
Even sophisticated tools like Selenium and Puppeteer have distinctive fingerprints because they use different TLS implementations than real browsers.
Ready to add TLS fingerprinting to your application?
npm install @webdecoy/expressconst { webdecoy } = require('@webdecoy/express');
app.use(webdecoy({
apiKey: 'your-api-key',
enableTLSFingerprinting: true
}));For the core SDK without Express, install @webdecoy/node and call webdecoy.protect(metadata) directly.
go get github.com/webdecoy/go-sdkimport "github.com/webdecoy/go-sdk"
wd := webdecoy.New(webdecoy.Config{
APIKey: "your-api-key",
EnableTLSFingerprinting: true,
})
http.Handle("/", wd.Middleware(yourHandler))composer require webdecoy/wordpress-pluginuse WebDecoy\WordPress\WebDecoy;
$webdecoy = new WebDecoy([
'api_key' => 'your-api-key',
'enable_tls_fingerprinting' => true
]);
add_action('init', [$webdecoy, 'protect']);All SDKs support flexible TLS fingerprinting options:
{
enableTLSFingerprinting: true,
// Fallback mode for environments where full TLS data isn't available
tlsFallbackMode: 'simple',
// Custom fingerprint database
customBotFingerprints: [
{ ja3: 'abc123...', name: 'Custom Bot' }
],
// Adjust scoring weights
scoringWeights: {
knownBotFingerprint: 40,
tlsUaMismatch: 45,
outdatedTls: 15
}
}TLS fingerprinting represents a significant leap forward in bot detection technology. By analyzing the cryptographic handshake that happens before any HTTP data is exchanged, WebDecoy can identify bots with exceptional accuracy—even when they perfectly mimic browser behavior at the application layer.
Combined with WebDecoy’s honeypot technology and AI-powered behavioral analysis, TLS fingerprinting creates a multi-layered defense that’s extremely difficult for bots to bypass.
✅ TLS fingerprinting analyzes low-level handshake details
✅ JA3 provides basic fingerprinting (MD5 hash of TLS parameters)
✅ JA4 offers advanced, multi-dimensional fingerprinting
✅ WebDecoy SDKs make implementation effortless
✅ Known bot database catches common automation tools
✅ Mismatch detection identifies spoofed User-Agents
✅ Weighted scoring provides nuanced threat assessment
Ready to protect your application with advanced TLS fingerprinting?
Try WebDecoy for free and see how our SDKs can stop even the most sophisticated bots.
Have questions? Join our Discord community or read the full SDK documentation.
How FCaptcha v1.11 and v1.12 detect AI agents that drive real browsers, using CDP input forensics, think-time cadence, and declared-agent matching.
bot-detectionAn honest, technical look at why CAPTCHAs no longer stop bots, and the modern stack of behavioral biometrics, proof-of-work, and fingerprinting that does.
bot-detectionFCaptcha v1.3 adds 7 biometric keystroke metrics, Playwright detection, AI agent bypass fixes, and server-side PoW validation.
bot-detectionLike this post? Share it with your friends!
Get a personalized demo from our team.