{"id":12974,"date":"2026-08-28T13:05:15","date_gmt":"2026-08-28T11:05:15","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/privacy-sandbox-capability-detector\/"},"modified":"2026-08-28T13:05:15","modified_gmt":"2026-08-28T11:05:15","slug":"privacy-sandbox-capability-detector","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/privacy-sandbox-capability-detector\/","title":{"rendered":"Privacy Sandbox and Fingerprint Surface Detector"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Eight Privacy Sandbox technologies carry the same sentence on the status page &#8211; intent to deprecate and remove. Three carry a different one and stay. Whether a given browser still answers any of them is not something a table can say, so this reads the browser it runs in. The second half asks the matching question about fingerprinting: which high-entropy interfaces hand this page a value at all.<\/p>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">The deprecation column reflects the Privacy Sandbox status page as of 14 August 2026 and is fixed text, not a live reading. Only the browser column is measured. Everything runs locally in the browser; nothing is transmitted or stored.<\/p>\n<p>    <button id=\"ps-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Read this browser<\/button><\/p>\n<div id=\"ps-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Eight Privacy Sandbox technologies carry the same sentence on the status page - intent to deprecate and remove. Three carry a different one and stay. Whether a given browser still answers any of them is not something a table can say, so this reads the browser it runs in. The second half asks the matching question about fingerprinting: which high-entropy interfaces hand this page a value at all.\",\"stand_erklaerung\":\"The deprecation column reflects the Privacy Sandbox status page as of 14 August 2026 and is fixed text, not a live reading. Only the browser column is measured. Everything runs locally in the browser; nothing is transmitted or stored.\",\"knopf\":\"Read this browser\",\"h_zusammenfassung\":\"Summary\",\"zeile_abgekuendigt\":\"Deprecated interfaces still answering\",\"zeile_bleibt\":\"Surviving interfaces present\",\"zeile_entropie\":\"High-entropy surfaces returning a value\",\"h_sandbox\":\"Privacy Sandbox interfaces\",\"spalte_schnittstelle\":\"Interface\",\"spalte_lage\":\"Status page\",\"spalte_browser\":\"This browser\",\"api_topics\":\"Topics API\",\"api_protected_audience\":\"Protected Audience\",\"api_attribution\":\"Attribution Reporting\",\"api_private_aggregation\":\"Private Aggregation\",\"api_shared_storage\":\"Shared Storage\",\"api_fenced_frames\":\"Fenced Frames\",\"api_related_sets\":\"Related Website Sets\",\"api_ip_protection\":\"IP Protection\",\"api_chips\":\"CHIPS, partitioned cookies\",\"api_storage_access\":\"Storage Access API\",\"api_fedcm\":\"FedCM\",\"lage_abgekuendigt\":\"to be removed\",\"lage_bleibt\":\"supported by default\",\"status_vorhanden\":\"answers\",\"status_fehlt\":\"absent\",\"status_nicht_messbar\":\"not measurable here\",\"h_entropie\":\"High-entropy surface\",\"spalte_merkmal\":\"Interface\",\"spalte_wert\":\"What this page is handed\",\"wert_keiner\":\"nothing\",\"ent_ua_data\":\"User-Agent Client Hints, brands\",\"ent_device_memory\":\"Device memory, GB\",\"ent_hardware_concurrency\":\"Logical processors\",\"ent_screen\":\"Screen resolution\",\"ent_color_depth\":\"Colour depth\",\"ent_zeitzone\":\"Time zone\",\"ent_sprachen\":\"Languages offered\",\"ent_touch\":\"Touch points\",\"ent_plugins\":\"Plugin entries\",\"ent_webgl\":\"WebGL renderer\",\"ent_referrer\":\"Referrer length\",\"h_hinweise\":\"Notes\",\"hinweis_stand\":\"The status column is a snapshot of 14 August 2026, not a live lookup. A browser column that disagrees with it is the more current of the two.\",\"hinweis_bekanntes_skript\":\"Safari 26 degrades high-entropy interfaces only for scripts on a list of known fingerprinting scripts, and that list is not published. This page is presumably not on it, so the values above are what an unremarkable script sees - a tracker on the list may well be handed less.\",\"hinweis_nicht_messbar\":\"Four entries cannot be answered honestly from a first-party page: Private Aggregation lives inside a Shared Storage worklet, Related Website Sets and CHIPS only take effect in an embedded third-party context, and IP Protection is a property of the network path rather than the document.\",\"hinweis_alle_weg\":\"None of the measurable deprecated interfaces answers in this browser. For a measurement setup that means nothing was lost here - there was nothing to lose.\",\"hinweis_alle_da\":\"Every measurable deprecated interface still answers. Present is not the same as durable: the status page states the intention to remove them, so anything built on these needs a path off them.\",\"hinweis_bleibt_fehlt\":\"At least one of the three surviving interfaces is missing here. Those three carry what replaces third-party cookies for embedded contexts, so their absence matters more than any entry above.\",\"hinweis_wenig_entropie\":\"Half the high-entropy surfaces or fewer return a value. That is the shape a browser with active fingerprinting protection produces.\",\"hinweis_viel_entropie\":\"Most high-entropy surfaces return a value. Each one is small on its own; together they identify a device without any cookie being involved.\"};<\/p>\n<p>    \/\/ --- Merkmalstabelle -----------------------------------------------------\n    \/\/\n    \/\/ Acht Schnittstellen tragen auf der Statusseite vom 14.08.2026 denselben\n    \/\/ Satz - Absicht zur Abkuendigung und Entfernung. Drei tragen einen\n    \/\/ anderen: standardmaessig unterstuetzt. Die Einteilung steht hier fest,\n    \/\/ erkannt wird nur, ob der Browser sie noch beantwortet.<\/p>\n<p>    var SANDBOX = [\n        { id: 'topics', lage: 'abgekuendigt' },\n        { id: 'protected_audience', lage: 'abgekuendigt' },\n        { id: 'attribution', lage: 'abgekuendigt' },\n        { id: 'private_aggregation', lage: 'abgekuendigt' },\n        { id: 'shared_storage', lage: 'abgekuendigt' },\n        { id: 'fenced_frames', lage: 'abgekuendigt' },\n        { id: 'related_sets', lage: 'abgekuendigt' },\n        { id: 'ip_protection', lage: 'abgekuendigt' },\n        { id: 'chips', lage: 'bleibt' },\n        { id: 'storage_access', lage: 'bleibt' },\n        { id: 'fedcm', lage: 'bleibt' }\n    ];<\/p>\n<p>    var ENTROPIE = ['ua_data', 'device_memory', 'hardware_concurrency', 'screen',\n        'color_depth', 'zeitzone', 'sprachen', 'touch', 'plugins', 'webgl', 'referrer'];<\/p>\n<p>    \/\/ --- Erhebung ------------------------------------------------------------\n    \/\/\n    \/\/ Liest den laufenden Browser aus. Jede Sonde ist einzeln abgesichert:\n    \/\/ eine geworfene Ausnahme darf den Rest der Erhebung nicht mitnehmen,\n    \/\/ denn genau die Schnittstellen, um die es geht, werfen in manchen\n    \/\/ Browsern statt zu antworten.<\/p>\n<p>    function sicher(fn, ersatz) {\n        try {\n            var w = fn();\n            return (w === undefined || w === null) ? ersatz : w;\n        } catch (e) {\n            return ersatz;\n        }\n    }<\/p>\n<p>    function vorhanden(fn) {\n        return sicher(fn, false) ? 'vorhanden' : 'fehlt';\n    }<\/p>\n<p>    function sammeln() {\n        var roh = {};<\/p>\n<p>        \/\/ Privacy Sandbox: Anwesenheit der Schnittstelle im laufenden Browser.\n        roh.topics = vorhanden(function () { return 'browsingTopics' in Document.prototype; });\n        roh.protected_audience = vorhanden(function () { return 'runAdAuction' in Navigator.prototype; });\n        roh.attribution = vorhanden(function () { return 'attributionSrc' in HTMLAnchorElement.prototype; });\n        roh.shared_storage = vorhanden(function () { return 'sharedStorage' in window; });\n        roh.fenced_frames = vorhanden(function () { return typeof window.HTMLFencedFrameElement !== 'undefined'; });\n        roh.storage_access = vorhanden(function () { return 'hasStorageAccess' in Document.prototype; });\n        roh.fedcm = vorhanden(function () { return typeof window.IdentityCredential !== 'undefined'; });<\/p>\n<p>        \/\/ Drei Eintraege lassen sich aus einer Seite heraus nicht ehrlich\n        \/\/ beantworten und werden deshalb auch nicht behauptet.\n        roh.private_aggregation = 'nicht_messbar'; \/\/ nur in einem Shared-Storage-Worklet erreichbar\n        roh.related_sets = 'nicht_messbar';        \/\/ wirkt nur im eingebetteten Drittkontext\n        roh.ip_protection = 'nicht_messbar';       \/\/ Eigenschaft des Netzwegs, nicht des Dokuments\n        roh.chips = 'nicht_messbar';               \/\/ Partitionierung zeigt sich erst im Drittkontext<\/p>\n<p>        \/\/ Hochentropie-Flaeche: was dieses Skript tatsaechlich zu sehen bekommt.\n        roh.ua_data = sicher(function () {\n            return 'userAgentData' in navigator ? (navigator.userAgentData.brands || []).length : null;\n        }, null);\n        roh.device_memory = sicher(function () { return navigator.deviceMemory; }, null);\n        roh.hardware_concurrency = sicher(function () { return navigator.hardwareConcurrency; }, null);\n        roh.screen = sicher(function () { return screen.width + ' x ' + screen.height; }, null);\n        roh.color_depth = sicher(function () { return screen.colorDepth; }, null);\n        roh.zeitzone = sicher(function () { return Intl.DateTimeFormat().resolvedOptions().timeZone; }, null);\n        roh.sprachen = sicher(function () { return (navigator.languages || []).length || null; }, null);\n        roh.touch = sicher(function () {\n            return typeof navigator.maxTouchPoints === 'number' ? navigator.maxTouchPoints : null;\n        }, null);\n        roh.plugins = sicher(function () {\n            return navigator.plugins ? navigator.plugins.length : null;\n        }, null);\n        roh.webgl = sicher(function () {\n            var c = document.createElement('canvas');\n            var gl = c.getContext('webgl') || c.getContext('experimental-webgl');\n            if (!gl) { return null; }\n            var info = gl.getExtension('WEBGL_debug_renderer_info');\n            if (!info) { return null; }\n            return gl.getParameter(info.UNMASKED_RENDERER_WEBGL) || null;\n        }, null);\n        roh.referrer = sicher(function () { return document.referrer ? document.referrer.length : null; }, null);<\/p>\n<p>        return roh;\n    }<\/p>\n<p>    \/\/ --- Bewertung -----------------------------------------------------------\n    \/\/\n    \/\/ Reine Funktion ueber den Rohdaten. Sie ruehrt keine Browser-Globals an,\n    \/\/ damit sich die Einordnung gegen erfundene Umgebungen pruefen laesst und\n    \/\/ nicht nur gegen den Browser, in dem die Pruefung zufaellig laeuft.<\/p>\n<p>    function bewerten(roh) {\n        var daten = roh || {};<\/p>\n<p>        var sandbox = SANDBOX.map(function (m) {\n            var status = daten[m.id];\n            if (status !== 'vorhanden' && status !== 'fehlt' && status !== 'nicht_messbar') {\n                status = 'nicht_messbar';\n            }\n            return { id: m.id, lage: m.lage, status: status };\n        });<\/p>\n<p>        function zaehle(lage, status) {\n            return sandbox.filter(function (m) { return m.lage === lage && m.status === status; }).length;\n        }<\/p>\n<p>        var abgekuendigtGesamt = SANDBOX.filter(function (m) { return m.lage === 'abgekuendigt'; }).length;\n        var bleibtGesamt = SANDBOX.filter(function (m) { return m.lage === 'bleibt'; }).length;\n        var abgekuendigtVorhanden = zaehle('abgekuendigt', 'vorhanden');\n        var bleibtVorhanden = zaehle('bleibt', 'vorhanden');\n        var abgekuendigtMessbar = sandbox.filter(function (m) {\n            return m.lage === 'abgekuendigt' && m.status !== 'nicht_messbar';\n        }).length;\n        var bleibtMessbar = sandbox.filter(function (m) {\n            return m.lage === 'bleibt' && m.status !== 'nicht_messbar';\n        }).length;\n        var nichtMessbar = sandbox.filter(function (m) { return m.status === 'nicht_messbar'; }).length;<\/p>\n<p>        var entropie = ENTROPIE.map(function (id) {\n            var wert = daten[id];\n            var geliefert = wert !== null && wert !== undefined && wert !== '';\n            return { id: id, wert: geliefert ? String(wert) : null, geliefert: geliefert };\n        });\n        var entropieGeliefert = entropie.filter(function (m) { return m.geliefert; }).length;<\/p>\n<p>        var hinweise = ['stand', 'bekanntes_skript'];\n        if (nichtMessbar > 0) { hinweise.push('nicht_messbar'); }\n        if (abgekuendigtMessbar > 0 && abgekuendigtVorhanden === 0) { hinweise.push('alle_weg'); }\n        if (abgekuendigtMessbar > 0 && abgekuendigtVorhanden === abgekuendigtMessbar) { hinweise.push('alle_da'); }\n        if (bleibtMessbar > 0 && bleibtVorhanden < bleibtMessbar) { hinweise.push('bleibt_fehlt'); }\n        if (entropieGeliefert <= Math.floor(ENTROPIE.length \/ 2)) { hinweise.push('wenig_entropie'); }\n        else { hinweise.push('viel_entropie'); }\n\n        return {\n            sandbox: sandbox,\n            abgekuendigtGesamt: abgekuendigtGesamt,\n            abgekuendigtVorhanden: abgekuendigtVorhanden,\n            abgekuendigtMessbar: abgekuendigtMessbar,\n            bleibtGesamt: bleibtGesamt,\n            bleibtVorhanden: bleibtVorhanden,\n            bleibtMessbar: bleibtMessbar,\n            nichtMessbar: nichtMessbar,\n            entropie: entropie,\n            entropieGeliefert: entropieGeliefert,\n            entropieGesamt: ENTROPIE.length,\n            hinweise: hinweise\n        };\n    }\n\n    \/\/ --- Pruefpunkt ----------------------------------------------------------\n    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.PS = {\n        sammeln: sammeln,\n        bewerten: bewerten,\n        sicher: sicher,\n        SANDBOX: SANDBOX,\n        ENTROPIE: ENTROPIE,\n        T: T\n    };\n\n    \/\/ --- Oberflaeche ---------------------------------------------------------\n\n    var btn = document.getElementById('ps-btn');\n    var out = document.getElementById('ps-ausgabe');\n    if (!btn || !out) { return; }\n\n    function el(tag, stil, text) {\n        var e = document.createElement(tag);\n        if (stil) { e.setAttribute('style', stil); }\n        if (text !== undefined) { e.textContent = text; }\n        return e;\n    }\n\n    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.92rem; margin: 18px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var GUT = ' color: #7ee787;';\n    var WARN = ' color: #ffa94d;';\n    var GRAU = ' color: #8a8a99;';\n\n    function statusFarbe(status) {\n        if (status === 'vorhanden') { return WARN; }   \/\/ noch da heisst: noch Flaeche\n        if (status === 'fehlt') { return GUT; }\n        return GRAU;\n    }\n\n    btn.addEventListener('click', function () {\n        var erg = bewerten(sammeln());\n        out.innerHTML = '';\n\n        \/\/ --- Zusammenfassung ---\n        out.appendChild(el('div', UEBERSCHRIFT, T.h_zusammenfassung));\n        var z = el('div', 'display: grid; grid-template-columns: auto auto; gap: 0 18px; align-items: baseline;');\n        function zzeile(name, wert, stil) {\n            z.appendChild(el('div', ZELLE, name));\n            z.appendChild(el('div', ZELLE_WERT + (stil || ''), wert));\n        }\n        zzeile(T.zeile_abgekuendigt, erg.abgekuendigtVorhanden + ' \/ ' + erg.abgekuendigtGesamt,\n            erg.abgekuendigtVorhanden > 0 ? WARN : GUT);\n        zzeile(T.zeile_bleibt, erg.bleibtVorhanden + ' \/ ' + erg.bleibtGesamt,\n            erg.bleibtVorhanden === erg.bleibtMessbar ? GUT : WARN);\n        zzeile(T.zeile_entropie, erg.entropieGeliefert + ' \/ ' + erg.entropieGesamt,\n            erg.entropieGeliefert > Math.floor(erg.entropieGesamt \/ 2) ? WARN : GUT);\n        out.appendChild(z);<\/p>\n<p>        \/\/ --- Privacy Sandbox ---\n        out.appendChild(el('div', UEBERSCHRIFT, T.h_sandbox));\n        var s = el('div', 'display: grid; grid-template-columns: auto auto auto; gap: 0 18px; align-items: baseline;');\n        s.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee);', T.spalte_schnittstelle));\n        s.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee);', T.spalte_lage));\n        s.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee);', T.spalte_browser));\n        erg.sandbox.forEach(function (m) {\n            s.appendChild(el('div', ZELLE, T['api_' + m.id] || m.id));\n            s.appendChild(el('div', ZELLE + (m.lage === 'abgekuendigt' ? WARN : GUT), T['lage_' + m.lage]));\n            s.appendChild(el('div', ZELLE_WERT + statusFarbe(m.status), T['status_' + m.status]));\n        });\n        out.appendChild(s);<\/p>\n<p>        \/\/ --- Hochentropie-Flaeche ---\n        out.appendChild(el('div', UEBERSCHRIFT, T.h_entropie));\n        var e = el('div', 'display: grid; grid-template-columns: auto auto; gap: 0 18px; align-items: baseline;');\n        e.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee);', T.spalte_merkmal));\n        e.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee);', T.spalte_wert));\n        erg.entropie.forEach(function (m) {\n            e.appendChild(el('div', ZELLE, T['ent_' + m.id] || m.id));\n            e.appendChild(el('div', ZELLE_WERT + (m.geliefert ? WARN : GUT), m.geliefert ? m.wert : T.wert_keiner));\n        });\n        out.appendChild(e);<\/p>\n<p>        \/\/ --- Hinweise ---\n        out.appendChild(el('div', UEBERSCHRIFT, T.h_hinweise));\n        var liste = el('ul', 'margin: 0 0 0 18px; padding: 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem; line-height: 1.65;');\n        erg.hinweise.forEach(function (h) {\n            var text = T['hinweis_' + h];\n            if (text) { liste.appendChild(el('li', '', text)); }\n        });\n        out.appendChild(liste);\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Reads the running browser: which Privacy Sandbox interfaces still answer, which of the three survivors are present, and how much of the high-entropy surface this page is handed. The answer differs by browser, which is the point.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[91276,91279,91516],"class_list":["post-12974","page","type-page","status-publish","hentry","tag-cookies","tag-prywatnosc-danych-pl","tag-tracking"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Privacy Sandbox and Fingerprint Surface Detector - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/privacy-sandbox-capability-detector\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Privacy Sandbox and Fingerprint Surface Detector - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Reads the running browser: which Privacy Sandbox interfaces still answer, which of the three survivors are present, and how much of the high-entropy surface this page is handed. The answer differs by browser, which is the point.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/privacy-sandbox-capability-detector\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/privacy-sandbox-capability-detector\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/privacy-sandbox-capability-detector\\\/\",\"name\":\"Privacy Sandbox and Fingerprint Surface Detector - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-28T11:05:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/privacy-sandbox-capability-detector\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/privacy-sandbox-capability-detector\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/privacy-sandbox-capability-detector\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Privacy Sandbox and Fingerprint Surface Detector\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Privacy Sandbox and Fingerprint Surface Detector - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/privacy-sandbox-capability-detector\/","og_locale":"en_US","og_type":"article","og_title":"Privacy Sandbox and Fingerprint Surface Detector - Lukas Wojcik - Blog","og_description":"Reads the running browser: which Privacy Sandbox interfaces still answer, which of the three survivors are present, and how much of the high-entropy surface this page is handed. The answer differs by browser, which is the point.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/privacy-sandbox-capability-detector\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/privacy-sandbox-capability-detector\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/privacy-sandbox-capability-detector\/","name":"Privacy Sandbox and Fingerprint Surface Detector - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-28T11:05:15+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/privacy-sandbox-capability-detector\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/privacy-sandbox-capability-detector\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/privacy-sandbox-capability-detector\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"Privacy Sandbox and Fingerprint Surface Detector"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/12974","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=12974"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/12974\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=12974"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=12974"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}