How WhatsApp Detects Mailing via Baileys and whatsapp-web.js
AndySendy academy
← All posts

🔗 It's not the WebSocket that gives you away. It's everything around it

"The library reproduces the protocol directly - WhatsApp won't tell it from a real client" - a convenient assumption that falls apart on serious review. Baileys and whatsapp-web.js work without browser or phone, but that doesn't mean invisible. What's confirmed in detection vs developer community reconstruction.


Why confusion around this topic persists

The original thesis names two factors: behavior and protocol version. Behavioral layer is solidly confirmed - documented industry practice. Protocol versioning as a detect mechanism is nowhere officially confirmed - plausible technical hypothesis, not Meta documentation fact. Web parallel - extensions and isTrusted: browser gives signal, WhatsApp use is hypothesis.


Before / After: correcting the original thesis

Before:

Caught on two factors: behavior (send speed without pauses, missing "typing" status) and protocol version (version mismatch detected).

After:

Confirmed, well-documented risk - behavioral signals: send speed, perfectly even intervals, mass identical messaging. Protocol version as a separately checked Meta detect factor officially unconfirmed - community hypothesis based on reverse-engineered libraries objectively lagging Meta updates and statistically breaking or getting banned more often.

Before:

Missing "typing" status before message - one of two main detect factors.

After:

Missing presence events (composing, paused) - plausible behavioral marker actively discussed by practitioners. No direct confirmation Meta specifically checks this event before every message - only broader category confirmed: unnaturally perfect timings generally - see behavioral antispam.


Baileys vs whatsapp-web.js - different architecture, different risks

Parameter Baileys whatsapp-web.js
How it works Reverse-engineered WebSocket client, no browser [✓] Controls real WhatsApp Web via Puppeteer/Chromium [✓]
Main risk layer Network protocol + behavior Browser fingerprints + behavior
Automation markers Protobuf packet structure, TLS fingerprint navigator.webdriver = true, Canvas/WebGL anomalies, isTrusted = false
Presence events (typing/paused) Via sendPresenceUpdate(), manual implementation [✓] Via real UI emulation

Important nuance: neither approach is safer by default. Headless browser isn't "more legitimate" because it opens Chromium - headless without graphics generates dozens of automation technical signs.


What's officially and broadly confirmed


Mini-case: 4 numbers in 20 minutes on whatsapp-web.js

Marketer deployed whatsapp-web.js script in Docker on Ubuntu server for warm-base mailing. Despite base quality, 4 numbers banned in 20 minutes. Logs showed Chromium in container had navigator.webdriver = true and no cursor movement events.

Proves: server browser automation without graphics creates notable technical anomalies - team's observed fact. Doesn't prove: webdriver flag alone caused ban vs combination with mailing speed or other signals. Forum observation, not dissected Meta algorithm.

Second case: B2B on Baileys added sendPresenceUpdate('composing') before each message with 50 ms/char pause. Reduced auto-ban frequency, reached 150 messages/day on warmed number. Correlation with presence logic, not proof it's sole factor - pause itself may have mattered regardless of presence status.


Community debate: stealth plugins vs network fingerprint

JS developers disagree. Some claim puppeteer-extra-plugin-stealth fixes whatsapp-web.js detection, masking webdriver and spoofing Canvas/Codecs. Others argue Meta antispam may evaluate network timings and TCP/IP fingerprint, not individual browser variables - datacenter servers still visible regardless of stealth.

No confirmation either way - reconstruction without verifiable Meta data, as in gray infrastructure schemes.


Numbers from automation practice

No official Meta stats on Node.js library ban rates. From behavioral limit practice:

Last three blocks - forum observations, not confirmed Meta thresholds.


Additional risk: malicious forks

Separate from detect topic. npm ecosystem has malicious packages masquerading as Baileys: one fork silently stole chats, contacts, session tokens. Not antiban - direct account compromise - practical reason to verify library origin and linked devices in WhatsApp itself.


Common misconceptions

"Official protocol means Meta treats library as legitimate client" Wrong. Protocol used unofficially via reverse-engineering - explicitly prohibited by ToS regardless of reproduction accuracy.

"whatsapp-web.js safer because it physically opens browser" Wrong. Headless Chromium without graphics generates its own automation fingerprint set - not less visible than direct WebSocket.

"QR scanned successfully = account safe" Wrong. Authorization only checks encryption key validity - behavioral and network analysis continues after session opens.

"Stealth plugin fully solves detection" Unconfirmed. Plugin closes some browser variables, not necessarily server network timings or TCP/IP fingerprint.


Practical takeaways


🎯 Next step

If Baileys or whatsapp-web.js mailing already failing, check behavioral profile first - speed and interval regularity - most documented risk factor. Keep library version current not because mismatch "gets detected," but because stale protocol objectively increases session malfunction chance.

Conclusion

Practical rule:

No browser doesn't mean no traces - traces just move to a different layer.