Skip to content

WebRTC Fingerprinting

WebRTC fingerprinting creates a peer connection and observes ICE candidate types. This reveals network topology without exposing raw IP addresses.

How it works

Neoprint creates an RTCPeerConnection with no ICE servers, generates an offer, and collects ICE candidates. Only candidate types are recorded (not IP addresses).

Collected signals

SignalDescription
candidateCountNumber of ICE candidates generated
ipTypesUnique types: mdns, private, public
hasMdnsWhether mDNS candidates are present
hasPrivateWhether private IP candidates are present

Privacy

Raw IP addresses are never stored or exposed. Only the type classification (mdns/private/public) is recorded.

Entropy and stability

PropertyValue
Entropy~4 bits
Stability0.50
Typical duration50-100ms

WebRTC is the slowest collector due to ICE candidate gathering. Neoprint resolves after the first candidate arrives (+ 50ms batch window) instead of waiting for the full gathering process.

Excluded in privacy mode.

Usage

ts
const fp = await neoprint.get({ collectors: ['webrtc'] })
const rtc = fp.components.webrtc.value

console.log(rtc.candidateCount)  // 2
console.log(rtc.ipTypes)         // ["mdns"]
console.log(rtc.hasMdns)         // true

Released under the MIT License.