Skip to main content

Does apnews.com fingerprint you?

Fingerprinting indicators observed.

The latest measured scans include canvas drawing and readback by the same script. Some activity was recorded on a challenge page. This is a fingerprinting indicator, not proof of tracking intent or transmission.

Open evidence JSON ↗

All 5 source records are included in the JSON. Scan timestamps and versions are shown as recorded. The tabs show the latest usable homepage measurement for each setup. Later failed attempts remain in the history. Scan scope and methodology ↗

Inside the scan

← All websites

Draw + readback

4 of 5 signal families observed

Canvas: ObservedWebGL: ObservedAudio: ObservedFonts: Not observedDevice: Observed
Measurement
Measured
Page context
Challenge page
Scan time
2026-10-22T13:41:43.528194Z
Browser / scanner
156.0.8078.4 / 0.4

Captured titleJust a moment...

CanvasDraws text and reads canvas output.6 API entries

Observed requires a text-drawing API and a canvas readback API. Guide ↗

canvas.getContext1 calls

Frame: https://apnews.com/

  • Inline caller recorded
canvas.getContext3 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • Inline caller recorded
  • https://challenges.cloudflare.com/[redacted-challenge]
canvas.toDataURL1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
canvas2d.fillText2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
canvas2d.getImageData2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
canvas2d.strokeText1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
WebGLQueries the graphics environment.10 API entries

Observed requires at least three distinct WebGL probing APIs. Guide ↗

webgl2renderingcontext.getExtension5 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webgl2renderingcontext.getParameter38 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webgl2renderingcontext.getShaderPrecisionFormat1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webgl2renderingcontext.getSupportedExtensions2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webgl2renderingcontext.readPixels1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webglrenderingcontext.getExtension5 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webglrenderingcontext.getParameter36 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webglrenderingcontext.getShaderPrecisionFormat14 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webglrenderingcontext.getSupportedExtensions2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webglrenderingcontext.readPixels3 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
AudioRenders or reads audio samples.4 API entries

Observed requires offline rendering, buffer reads, or analyser reads. Guide ↗

audio.createDynamicsCompressor2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
audio.createOscillator2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
audiobuffer.getChannelData4 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
offlineaudio.startRendering3 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
FontsMeasures text repeatedly.1 API entries

Observed requires at least ten text-measurement calls. Guide ↗

fonts.check1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
DeviceReads browser and display properties.13 API entries

Observed requires at least three distinct browser, screen, or window properties. Guide ↗

navigator.deviceMemory1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.doNotTrack1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.getBattery1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.hardwareConcurrency1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.language3 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.languages2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.maxTouchPoints1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.mimeTypes1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.platform1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.plugins3 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.userAgent1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.webdriver1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
window.devicePixelRatio1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
Scripts with both text drawing and canvas readback 1

These source URLs appear in both call groups. Aggregated logs do not preserve the full execution sequence or establish the purpose of the collection.

  • https://challenges.cloudflare.com/[redacted-challenge]
Providers, script signatures, and DNS 0 provider labels

Provider labels and static signatures are scanner observations. A library-name match does not establish that its code executed.

Static script signatures

  • https://challenges.cloudflare.com/[redacted-challenge]reCAPTCHA · 0 API patterns
Network and worker observations 24 requests
Captured scripts
5
Instrumented frames
2
Google Ads observed
No
Transmission evidence
Not validated

Legacy transmission hints are excluded. A request after an API call does not establish that the extracted value was sent.

Third-party hosts

  • challenges.cloudflare.com
  • hagen.challenges.cloudflare.com
Other recorded API calls 4
  • document.cookie.read1 calls
  • document.cookie.read2 calls
  • webrtc.RTCPeerConnection1 calls
  • webrtc.RTCPeerConnection1 calls
Source record and integrity
Original source
results/headful/apnews-com-20261022T134143.json
Original file SHA-256
e8143d0f2b7a41918f892356f6ead35b88f6cbcf6ca89141ad10ba4bc4d3ff0b

Run ID: headful-e8143d0f2b7a. The JSON contains sanitized observations, not the original private scan payload.

Other scan attempts (2)

Navigation failed

Navigation failed

Canvas: UnmeasuredWebGL: UnmeasuredAudio: UnmeasuredFonts: UnmeasuredDevice: Unmeasured
Measurement
Navigation failed
Page context
Page not measured
Scan time
2026-10-21T22:26:21.058467Z
Browser / scanner
156.0.8078.4 / 0.3
Navigation failed — no usable scan result

Navigation or page loading failed in this browser setup. The record does not establish why it failed.

Source record and integrity
Original source
results/headful/apnews-com-20261021T222621.json
Original file SHA-256
aaa146e6771c91c77ddd4da7875ce2ca3f97c28f80dc34ed15d30950673924ad

Run ID: headful-aaa146e6771c. The JSON contains sanitized observations, not the original private scan payload.

Scanner error

Scanner error

Canvas: UnmeasuredWebGL: UnmeasuredAudio: UnmeasuredFonts: UnmeasuredDevice: Unmeasured
Measurement
Scanner error
Page context
Page not measured
Scan time
2026-10-22T13:41:42.916753Z
Browser / scanner
156.0.8078.4 / 0.4
Scanner error — no usable scan result

The scanner crashed while collecting this page. No usable API results were saved for this setup. A fresh scan is needed; this is not a site-blocking verdict.

Source record and integrity
Original source
results/headful/apnews-com-20261022T134142.json
Original file SHA-256
3be9804dce76d9ba6f20a7fdd5ed1115db64c04b5dfbcd755e37ab21c6f1569a

Run ID: headful-3be9804dce76. The JSON contains sanitized observations, not the original private scan payload.

Draw + readback

4 of 5 signal families observed

Canvas: ObservedWebGL: ObservedAudio: ObservedFonts: Not observedDevice: Observed
Measurement
Measured
Page context
Challenge page
Scan time
2026-10-22T17:33:25.326163Z
Browser / scanner
156.0.8078.4 / 0.4

Captured titleJust a moment...

CanvasDraws text and reads canvas output.6 API entries

Observed requires a text-drawing API and a canvas readback API. Guide ↗

canvas.getContext1 calls

Frame: https://apnews.com/

  • Inline caller recorded
canvas.getContext3 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • Inline caller recorded
  • https://challenges.cloudflare.com/[redacted-challenge]
canvas.toDataURL1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
canvas2d.fillText2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
canvas2d.getImageData2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
canvas2d.strokeText1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
WebGLQueries the graphics environment.10 API entries

Observed requires at least three distinct WebGL probing APIs. Guide ↗

webgl2renderingcontext.getExtension5 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webgl2renderingcontext.getParameter38 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webgl2renderingcontext.getShaderPrecisionFormat1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webgl2renderingcontext.getSupportedExtensions2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webgl2renderingcontext.readPixels1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webglrenderingcontext.getExtension5 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webglrenderingcontext.getParameter36 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webglrenderingcontext.getShaderPrecisionFormat14 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webglrenderingcontext.getSupportedExtensions2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
webglrenderingcontext.readPixels3 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
AudioRenders or reads audio samples.4 API entries

Observed requires offline rendering, buffer reads, or analyser reads. Guide ↗

audio.createDynamicsCompressor2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
audio.createOscillator2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
audiobuffer.getChannelData4 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
offlineaudio.startRendering3 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
FontsMeasures text repeatedly.1 API entries

Observed requires at least ten text-measurement calls. Guide ↗

fonts.check1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
DeviceReads browser and display properties.13 API entries

Observed requires at least three distinct browser, screen, or window properties. Guide ↗

navigator.deviceMemory1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.doNotTrack1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.getBattery1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.hardwareConcurrency1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.language3 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.languages2 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.maxTouchPoints1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.mimeTypes1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.platform1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.plugins3 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.userAgent1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
navigator.webdriver1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
window.devicePixelRatio1 calls

Frame: https://challenges.cloudflare.com/[redacted-challenge]

  • https://challenges.cloudflare.com/[redacted-challenge]
Scripts with both text drawing and canvas readback 1

These source URLs appear in both call groups. Aggregated logs do not preserve the full execution sequence or establish the purpose of the collection.

  • https://challenges.cloudflare.com/[redacted-challenge]
Providers, script signatures, and DNS 0 provider labels

Provider labels and static signatures are scanner observations. A library-name match does not establish that its code executed.

Static script signatures

  • https://challenges.cloudflare.com/[redacted-challenge]reCAPTCHA · 0 API patterns
Network and worker observations 18 requests
Captured scripts
4
Instrumented frames
2
Google Ads observed
No
Transmission evidence
Not validated

Legacy transmission hints are excluded. A request after an API call does not establish that the extracted value was sent.

Third-party hosts

  • challenges.cloudflare.com
  • hagen.challenges.cloudflare.com
Other recorded API calls 4
  • document.cookie.read1 calls
  • document.cookie.read2 calls
  • webrtc.RTCPeerConnection1 calls
  • webrtc.RTCPeerConnection1 calls
Source record and integrity
Original source
results/headless/apnews-com-20261022T173325.json
Original file SHA-256
49ba102ba6f28eaa053665231c82d6b6540a707c634fcf91ef55feac7cd90659

Run ID: research-49ba102ba6f2. The JSON contains sanitized observations, not the original private scan payload.

Other scan attempts (1)

Navigation failed

Navigation failed

Canvas: UnmeasuredWebGL: UnmeasuredAudio: UnmeasuredFonts: UnmeasuredDevice: Unmeasured
Measurement
Navigation failed
Page context
Page not measured
Scan time
2026-10-21T20:49:18.704998Z
Browser / scanner
156.0.8078.4 / 0.3
Navigation failed — no usable scan result

Navigation or page loading failed in this browser setup. The record does not establish why it failed.

Source record and integrity
Original source
results/headless/apnews-com-20261021T204918.json
Original file SHA-256
f951e921d8b8207df42d2e143b995048f4ec174004bb783334265a2be1c0ac1c

Run ID: research-f951e921d8b8. The JSON contains sanitized observations, not the original private scan payload.

Queries, request bodies, cookies, extracted values, raw errors, and session payloads are excluded before publication. The source digest identifies the original private record.

Read the sanitized JSON →