Calibration noise as a unique ID
Research (notably the “fingerprinting via accelerometer calibration” work) showed that the fixed offset and gain errors baked into a phone’s MEMS sensors at manufacture are stable and measurable from JavaScript. Collecting a short window of readings and fitting the calibration curve yields an identifier that persists across app and browser resets, because it is a property of the silicon, not of any software state. Ambient light and magnetometer readings add environmental and hardware entropy on top.
Browsers responded by gating these APIs behind HTTPS, permissions, and reduced sampling rates, but the readings remain a fingerprinting vector on permissive configurations.
Why it matters for mobile scraping
When you emulate a mobile device — spoofing a phone User-Agent and touch support — anti-bots on mobile-heavy sites may ask for motion data. A desktop headless browser claiming to be an iPhone returns no DeviceMotionEvent stream, or returns constant zeros, which contradicts the claimed device and gets flagged by a lie detector. Convincing mobile emulation therefore needs plausible, slightly-noisy sensor playback — not silence — which is one reason real-device farms remain popular for the hardest mobile targets.
What it means for mobile and app scraping
Sensor fingerprinting is mostly a mobile concern, and it is brutal for emulators: a headless Android emulator or a desktop browser spoofing a phone reports either no DeviceMotion/DeviceOrientation data at all, or perfectly flat, noise-free values that no physical accelerometer ever produces. Real devices leak tiny, per-unit calibration offsets and a constant trickle of jitter even when sitting still, and detectors look for that texture.
For scraping mobile sites and apps at scale this is why real-device farms and residential mobile setups exist — synthesising a convincing sensor stream is far harder than spoofing a User-Agent. If you only need the mobile content rather than to pass a hardware-attestation check, requesting the mobile rendering through a web scraping API sidesteps the sensor surface entirely instead of trying to forge it.
