Table of Contents
Provenance: privacy:tcf_consent_strings
Working notes behind Decoding TCF Consent Strings — every query with its population and denominator, the scripts and their unedited output, the folds and their residue, the quotes checked against the source papers, the external sources and how each was verified, what was rejected, and what could not be established. Corpus-level caveats that apply to every page on this site are on corpus and are not restated here.
1. What this page is backing
| Item | Value |
|---|---|
| Content page | tcf_consent_strings |
| Full-text population probe | scripts/tcf_fulltext_probe.mjs → scripts/tcf_fulltext_probe-output.txt |
| Report script | scripts/tcf_report.mjs → scripts/tcf_report-output.txt |
| Candidate-set audit | scripts/tcf_core_audit.mjs → scripts/tcf_core_audit-output.txt (verdicts) and scripts/tcf_core_audit-evidence.txt (the contexts each verdict rests on) |
| Additional-Consent probe | scripts/tcf_ac_probe.mjs → scripts/tcf_ac_probe-output.txt |
| Quote check | scripts/tcf_quotecheck.mjs → scripts/tcf_quotecheck-output.txt |
| External re-fetch | scripts/tcf_external_checks.sh → scripts/tcf_external_checks-output.txt |
| Live eight-site probe | scripts/tcf_live_probe.mjs → scripts/tcf_live_probe-output.txt |
| Deprecated-command probe | scripts/tcf_gettcdata_probe.mjs → scripts/tcf_gettcdata_probe-output.txt |
| Decoder published on the page | tcf/tcstring.mjs — cross-checked against @iabtechlabtcf/core 1.5.21 |
| Capture snippet published on the page | tcf_capture.js — run against spiegel.de and lemonde.fr on 2026-08-26 before publishing; reproduces the captured string and the silent-API case |
| Data | data/extract/run1/extractions.jsonl — 5,859 papers, 7 venues, 2010–2026; data/fulltext/*/*/*/paper.cols.txt — 5,869 files |
| Written | 2026-08-26, against the corpus as extended on 2026-08-11 (commit 8a6b843) |
| Bibliography entries added | 1 (§8) |
| Discussion block | No ~~DISCUSSION~~ on provenance pages. Comments belong on the content page. This is the convention set by consent and it is followed here. |
Create, extend or overlap? — Create, with one deliberate boundary. consent already carries a section Reading What the Site Stored: the TCF, about 70 lines, which introduces the framework, gives a __tcfapi probe, and covers the legal history (Belgian DPA, CJEU C-604/22, the Market Court ruling of 14 May 2025). That page's subject is the banner decision and it needs enough TCF to make that decision legible. This page's subject is the artefact: the bit layout, the seven channels, decoder and GVL reproducibility, Google Additional Consent, and the inference boundary between “the string says X” and “the site did X”.
The alternative — broadening privacy:consent instead — was rejected for two reasons. It is already 64,927 bytes and the TCF section would have to roughly triple to hold the segment table, the version-boundary table, the channel table and the AC specification. And the reader is different: privacy:consent is read by someone deciding what their crawler clicks, this one by someone who has already decided and now has to decode 40,000 strings without producing a number they cannot defend. Neither page repeats the other; each links to the other for what it does not carry. Someone could reasonably have decided the opposite.
Two corrections owed to privacy:consent, both found while writing this page and both applied there in the same sitting, and both recorded in the review log in §12.1:
- Its TCF section describes the shared
consensu.orgcookie in the present tense — “The TCF permits a CMP to store the string in a cookie on a shared domain”. Global scope and that cookie were deprecated on 22 June 2021 and strings using them have been invalid since 1 September 2021. - Its published
tcf_probe.jssample calls__tcfapi('getTCData', 2, …). That command was deprecated in the CMP API spec in TCF v2.2 (May 2023) in favour ofaddEventListener. It still works on most CMPs, so the sample is not broken, but it should say so.
2. Populations and denominators
There is no schema field for “worked with a TC string”, and there never will be — detection.phenomenon and classification.resourceName are free text and name what the paper headlines. So the population on this page is a full-text population, and it is labelled as such everywhere it is used.
| Tag | Definition | N | Share |
|---|---|---|---|
| corpus | papers with an extraction record | 5,859 | — |
| full text | papers with a paper.cols.txt | 5,8691) | — |
| TCF-MENTION | full text matches the TCF_CORE union below at least once | 77 | 1.3% of 5,859 |
| TCF-CORE | matches it ≥5 times | 19 | 0.3% of 5,859 |
The union, verbatim from tcf_report.mjs:
const TCF_CORE = /Transparency\s+(?:and|&)\s+Consent\s+Framework|__\s?tcfapi|euconsent|TC[\s-]?String|IAB\s+Europe/gi;
Text is read with hyphenation joined (s/-\n//) and whitespace collapsed before matching, because a PDF line break inside “con-\nsent string” otherwise hides the match.
The bare acronym TCF is deliberately excluded from the union. Included, it adds 24 papers, and in a security corpus the acronym has other expansions. Its per-pattern count is reported separately by tcf_fulltext_probe.mjs so the exclusion is visible rather than silent.
The ≥5 threshold was published as an answer in the first draft, and it was wrong. The draft asserted that “at and above 5 every one of the 19 either measures the TCF or measures something with the TCF”, chosen by eyeballing the ranked occurrence list. Nobody had validated it. The citations-and-quotes review pass challenged it directly, having read the papers, so all 19 were audited.
2.1 The audit: what the 19 candidates actually do
Every one of the 19 was read against its own full text, using scripts/tcf_core_audit.mjs –evidence (every core-TCF match with 90 characters of context, deduplicated, plus the extraction's own summary) and, where that was ambiguous, the paper's methodology section. Three tiers, distinguished by whether a figure in the paper depends on a TC string:
| Verdict | N | Definition |
|---|---|---|
WORKS-WITH-STRING | 4 | captures, decodes or compares TC strings, or reads the IABTCF_* keys in an app |
DETECTS-ONLY | 5 | uses TCF presence as a signal (probes __cmp/__tcfapi, counts CMPs, records which consent cookies appear) but never reads a string's contents |
BACKGROUND-ONLY | 10 | introduction, related work or reference list only |
Threshold precision: 4/19 = 21.1% for “works with a TC string”, 9/19 = 47.4% for “does anything with the TCF at all”. The page publishes both numbers and scopes every downstream figure to the audited tiers.
| Verdict | Paper | Reason |
|---|---|---|
| works | [1Matte, Célestin; Bielova, Nataliia; Santos, Cristiana Teixeira (2020): "Do Cookie Banners Respect my Choice? Measuring Legal Compliance of Banners from IAB Europe's Transparency and Consent Framework", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] | intercepts consent strings by four channels, decodes with the IAB script; every violation figure comes from the decoded purposes array |
| works | [2Smith, Michael; Torres-Agüero, Antonio; Grossman, Riley; Sen, Pritam; Chen, Yi; Borcea, Cristian (2024): "A Study of GDPR Compliance under the Transparency and Consent Framework", in: Proceedings of the ACM Web Conference. (DOI)] | the whole pipeline is find / decode / validate / aggregate; reports 62 strings that decode but are not TC strings |
| works | [3Kancherla, Gayatri Priyadarsini; Bielova, Nataliia; Santos, Cristiana; Bichhawat, Abhishek (2025): "Johnny Can't Revoke Consent Either: Measuring Compliance of Consent Revocation on the Web", in: Proceedings on Privacy Enhancing Technologies. (DOI)] | compares TCStrings from __tcfapi, cookies, localStorage, GET, POST and response bodies against each other |
| works | [4Morel, Victor; Santos, Cristiana; Carlsson, Pontus; Ahlinder, Joel; Duvignau, Romaric (2026): "The TCF doesn't really A(A)ID - Automatic Privacy Analysis and Legal Compliance of TCF-based Android Applications", Proceedings on Privacy Enhancing Technologies 2026(3). (DOI)] | greps IABTCF_PurposeConsents / IABTCF_PurposeLegitimateInterests out of Android SharedPreferences |
| detects | [5Hils, Maximilian; Woods, Daniel W.; Böhme, Rainer (2021): "Privacy Preference Signals: Past, Present and Future", in: Proceedings on Privacy Enhancing Technologies. (DOI)] | probes __cmp()/__tcfapi() to detect TCF and its version at 100k scale, diffs published GVL versions; no string decoded |
| detects | [6Koch, Simon; Altpeter, Benjamin; Johns, Martin (2023): "The OK Is Not Enough: A Large Scale Study of Consent Dialogs in Smartphone Applications", in: Proceedings of the USENIX Security Symposium. (Link)] | searches app property strings for the IABTCF_ prefix; presence is the measurement, not the values |
| detects | [7Toth, Michael; Bielova, Nataliia; Roca, Vincent (2022): "On dark patterns and manipulation of website publishers by CMPs", Proceedings on Privacy Enhancing Technologies 2022(3). (DOI)] | inspects CMP admin consoles and the default vendor set (whole GVL, 751 companies) plus Google's ATP list |
| detects | [8Liu, Zengrui; Iqbal, Umar; Saxena, Nitesh (2024): "Opted Out, Yet Tracked: Are Regulations Enough to Protect Your Privacy?", in: Proceedings on Privacy Enhancing Technologies. (DOI)] | records which consent cookies each CMP writes, naming euconsent-v2 and addtl_consent; presence, not contents |
| detects | [9Bouhoula, Ahmed; Kubicek, Karel; Zac, Amit; Cotrini, Carlos; Basin, David (2024): "Automated Large-Scale Analysis of Cookie Notice Compliance", in: Proceedings of the USENIX Security Symposium. (Link)] | reclassified — see below |
| background | [10Rasaii, Ali; Dao, Ha; Feldmann, Anja; Javid, Mohammadmahdi; Gasser, Oliver; Gosain, Devashish (2025): "Intractable Cookie Crumbs: Unveiling the Nexus of Stateful Banner Interaction and Tracking Cookies", in: Proceedings on Privacy Enhancing Technologies, pp. 429-445. (DOI)] | cookie transmission after banner actions; TCF and the GVL are background and related work |
| background | [11Aziz, Muhammad Abu Bakar; Wilson, Christo (2024): "Johnny Still Can't Opt-out: Assessing the IAB CCPA Compliance Framework", in: Proceedings on Privacy Enhancing Technologies. (DOI)] | measures the IAB CCPA framework and the US Privacy String — a different IAB framework; TCF appears as contrast |
| background | [12Utz, Christine; Degeling, Martin; Fahl, Sascha; Schaub, Florian; Holz, Thorsten (2019): "(Un)informed Consent: Studying GDPR Consent Notices in the Field", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)] | consent-notice GUI field study; TCF is regulatory background |
| background | [13Bollinger, Dino; Kubicek, Karel; Cotrini, Carlos; Basin, David (2022): "Automating Cookie Consent and GDPR Violation Detection", in: 31st USENIX Security Symposium (USENIX Security 22), pp. 2893-2910. USENIX Association, Boston, MA. (Link)] | cookie-level classification (CookieBlock); TCF appears citing other authors' work |
| background | [14Utz, Christine; Amft, Sabrina; Degeling, Martin; Holz, Thorsten; Fahl, Sascha; Schaub, Florian (2023): "Privacy Rarely Considered: Exploring Considerations in the Adoption of Third-Party Services by Websites", Proceedings on Privacy Enhancing Technologies 2023(1):5-28. (DOI)] | practitioner survey plus third-party-domain crawl |
| background | [15Zimmeck, Sebastian; Wang, Oliver; Alicki, Kuba; Wang, Jocelyn; Eng, Sophie (2023): "Usability and Enforceability of Global Privacy Control", Proceedings on Privacy Enhancing Technologies 2023(2). (DOI)] | GPC study; TCF as a contrasting signal |
| background | [16Demir, Nurullah; Urban, Tobias; Pohlmann, Norbert; Wressnegger, Christian (2024): "A Large-Scale Study of Cookie Banner Interaction Tools and their Impact on Users' Privacy", in: Proceedings on Privacy Enhancing Technologies, pp. 5-20. (DOI)] | banner-interaction extensions compared by their effect on cookies; one match is a different IAB artefact, the 17-category cookie scheme |
| background | [17Kumar, Vinayshekhar Bannihatti; Iyengar, Roger; Nisal, Namita; Feng, Yuanyuan; Habib, Hana; Story, Peter; Cherivirala, Sushain; Hagan, Margaret; Cranor, Lorrie Faith; Wilson, Shomir; Schaub, Florian; Sadeh, Norman M. (2020): "Finding a Choice in a Haystack: Automatic Extraction of Opt-Out Statements from Privacy Policy Text", in: Proceedings of the ACM Web Conference. (DOI)] | NLP extraction of opt-out statements from privacy policies |
| background | [18Tahaei, Mohammad; Ramokapane, Kopo M.; Li, Tianshi; Hong, Jason I.; Rashid, Awais (2022): "Charting App Developers' Journey Through Privacy Regulation Features in Ad Networks", in: Proceedings on Privacy Enhancing Technologies. (DOI)] | systematic review of ad-network consent documentation; TCF and the ATP page are documentation artefacts in a review table |
| background | [19Tang, Brian; Bui, Duc; Shin, Kang G. (2025): "Navigating Cookie Consent Violations Across the Globe", in: Proceedings of the USENIX Security Symposium. (Link)] | stated-consent-vs-behaviour tool; TCF is one row (1.15%) of a BuiltWith CMP market-share table |
One reclassification, and it was caused by the same PDF defect as the quote failures in §5. [9Bouhoula, Ahmed; Kubicek, Karel; Zac, Amit; Cotrini, Carlos; Basin, David (2024): "Automated Large-Scale Analysis of Cookie Notice Compliance", in: Proceedings of the USENIX Security Symposium. (Link)] was first put in BACKGROUND-ONLY on the reviewer's reading that “the TCF API is named as future work”. In paper.cols.txt the relevant passage reads:
... Future studies could use a more fine- the selection of websites used in these studies using a combi- grained definition for this dark pattern and investigate the nation of the Consent-O-Matic [28] CMP detection module intentions more thoroughly. and IAB Europe's Transparency & Consent Framework's API [15].
Two columns interleaved. Un-spliced, the second column reads: “we reconstruct the selection of websites used in these studies using a combination of the Consent-O-Matic CMP detection module and IAB Europe's Transparency & Consent Framework's API.” That is present-tense use, so the verdict is DETECTS-ONLY. Read a second rendering before excluding a paper, exactly as before publishing a quote.
What the audit does not establish. It is one reader, on one pass, with no second coder and no agreement statistic — the same limitation as the consentAction audit on consent. The evidence each verdict rests on is committed in scripts/tcf_core_audit-evidence.txt so a disagreement can be adjudicated against the same text. The BACKGROUND-ONLY tier is the one most likely to contain an error, because it is the tier where a single methodology sentence buried in a column splice flips the verdict — which is precisely what happened once already.
The 77-paper TCF-MENTION set was not audited. 77 papers is beyond a hand pass in this run, and the page therefore uses it only where the question is “who mentions it”, never “who measures it”.
2.2 Per-wording counts, and the ones that mislead
From tcf_fulltext_probe.mjs, denominator 5,869 papers with full text:
A DokuWiki table cell cannot contain a pipe — \| is not an escape — so every pattern below is named here and printed in full in the code block that follows.
| Pattern (name) | Papers | Usable? |
|---|---|---|
| gdpr_consent macro | 98 | No — matches the ordinary phrase “GDPR consent”. Not used on the page |
| CMP / Consent Management Platform | 80 | Not used; CMP has other expansions |
| IAB Europe | 74 | in the union |
| Transparency and Consent Framework | 69 | in the union |
| TCF (bare acronym) | 24 | excluded — see above |
| TC String / consent string | 14 | in the union |
| US Privacy / GPP string | 11 | context only |
| Additional Consent (narrow) | 8 | 7 of 8 false positives — see §4 |
| Global Vendor List / GVL | 7 | context only |
| euconsent cookie | 5 | in the union |
| __cmp (v1 API) | 3 | context only |
| __tcfapi | 2 | in the union |
| Ad Technology Providers / ATP (narrow) | 1 | superseded by the wide probe in §4 |
// scripts/tcf_fulltext_probe.mjs, verbatim const PATTERNS = { 'framework, spelled out': /Transparency\s+(?:and|&)\s+Consent\s+Framework/i, 'TCF (bare acronym)': /\bTCF\b/, 'consent string / TC string': /\b(?:TC[\s-]?String|consent\s+string)/i, '__tcfapi': /__\s?tcfapi/i, '__cmp (v1 API)': /__\s?cmp\s?\(/i, 'euconsent cookie': /euconsent/i, 'Global Vendor List / GVL': /Global\s+Vendor\s+List|\bGVL\b/i, 'Additional Consent (Google)': /Additional\s+Consent|addtl[_\s-]?consent|\bAC\s+string\b/i, 'Ad Technology Providers / ATP': /Ad\s+Technology\s+Provider|\bATP\s+list\b/i, 'gdpr_consent macro': /gdpr[_\s-]?consent/i, 'IAB Europe': /IAB\s+Europe/i, 'CMP (consent management)': /Consent\s+Management\s+(?:Platform|Provider)|\bCMPs?\b/, 'US Privacy / GPP string': /usprivacy|US\s+Privacy\s+String|Global\s+Privacy\s+Platform|\bGPP\s+string\b/i, };
Two of these are the page's own worked example of why probe width decides a claim. gdpr_consent looks like a URL-parameter probe and is actually an English-phrase probe. __tcfapi appears in two papers' text, which would be an absurd basis for any claim about API-based detection — the API is used far more often than it is named.
3. Every query behind a figure on the page
All of these are printed by scripts/tcf_report.mjs. Counts are of papers, never tuples.
| Figure on the page | Population | Denominator | Value |
|---|---|---|---|
| TCF-MENTION share | full text | 5,859 | 77 (1.3%) |
| TCF-CORE share | full text | 5,859 | 19 (0.3%) |
| PETS share | PETS papers in corpus | 510 | 30 mention / 11 core |
| USENIX Sec | 1,410 | 14 / 4 | |
| TheWebConf | 843 | 11 / 2 | |
| CCS | 990 | 8 / 1 | |
| IEEE S&P | 767 | 7 / 1 | |
| IMC | 638 | 4 / 0 | |
| NDSS | 701 | 3 / 0 | |
| “more than half of TCF-CORE is at PETS” | TCF-CORE | 19 | 11 (57.9%) |
| states a banner action | TCF-CORE with a crawlConfig | 16 | 14 |
| states statefulness | same | 16 | 8 |
| states a vantage location | TCF-CORE | 19 | 16 |
| versions its population list | TCF-CORE | 19 | 16 |
papers carrying ≥1 detection prevalence | TCF-CORE | 19 | 19 |
Per-year counts (used in the year table on the page) are the TCF-MENTION BY YEAR block of the report output. 2026 is provisional and 2025 is thin at the edges — CCS 2026 and IMC 2026 have not been held; IEEE S&P 2026 and TheWebConf 2026 are under-selected because selection screens on abstracts not yet in OpenAlex. The page labels this in the table itself and says not to read 2024→2026 as a decline.
The single 2012 TCF-MENTION is a match on the string “IAB Europe” in an unrelated context; it is footnoted on the page rather than silently dropped, and it is the reason the year table starts its series at 2019 in prose.
3.1 The fold, and its residue in full
Resource names are free text and agree run-to-run on about 20% of exact strings, so they are folded before counting and reported as a ranking, never as a percentage. The fold is an explicit alias list in tcf_report.mjs (constant DECODER_ALIASES), applied to tools[].name and classification[].resourceName filtered to usedOrMentioned ∈ {used, produced}, over the 77 TCF-MENTION papers:
| Folded family | Papers |
|---|---|
| EasyList / EasyPrivacy | 17 |
| Disconnect list | 8 |
| Consent-O-Matic | 6 |
IAB TC-string decoder / @iabtcf | 4 |
| Cookiepedia | 4 |
| Cookinspect | 1 |
| Cookie Glasses | 1 |
| IAB CMP list | 1 |
| Global Vendor List | 1 |
Unmapped residue — every consent-or-TCF-shaped name the fold did not claim, 12 distinct names over 11 papers (ConsentChk contributes two of the twelve from a single paper):
IAB Europe Transparency and Consent Framework custom TCF compliance rules __cmp() presence custom TCF API indicators custom consent-dialog design checks custom CMP-presence probe ConsentChk ConsentChk rule-based violation classifier custom cookie-consent taxonomy GDPR-Consent IAB Europe's CMP Compliance Programme OneTrust CMP
The residue is almost entirely bespoke, single-paper artefacts — “custom TCF compliance rules”, “custom CMP-presence probe”, “custom TCF API indicators”. That shape is a finding, and the page now states it: no shared TCF decoding pipeline exists in this corpus. Only ConsentChk is a named reusable tool (two of the twelve strings, both from [19Tang, Brian; Bui, Duc; Shin, Kang G. (2025): "Navigating Cookie Consent Violations Across the Globe", in: Proceedings of the USENIX Security Symposium. (Link)]), and only OneTrust CMP would have merged into an existing family had the alias list included CMP vendor names; it was left out because a CMP vendor is not a decoding resource.
4. The Additional Consent probe, and why it was run twice
The page's claim “3 papers mention Google's Additional Consent mechanism, 0 decode a string” went through three widths. This is recorded in full because the first two answers were confidently wrong.
| Attempt | Regex | Papers matched | True positives after reading |
|---|---|---|---|
| 1 (narrow) | A below | 8 | 1 |
| 2 (ATP only) | B below | 1 | 1 |
| 3 (wide, published) | C below | 26 | 3 |
A: /Additional Consent|addtl[_ -]?consent|\bAC string\b/i B: /Ad Technology Provider|\bATP list\b/i C: /addtl[_\s-]?consent|\bAC ?string\b|Additional\s+Consent|Ad\s+Tech(?:nology)?\s+Provider|\bATPs?\b|consented_providers|ADDTL_CONSENT|IABTCF_AddtlConsent/i
Attempt 1 missed [7Toth, Michael; Bielova, Nataliia; Roca, Vincent (2022): "On dark patterns and manipulation of website publishers by CMPs", Proceedings on Privacy Enhancing Technologies 2022(3). (DOI)], which writes “Ad Tech Providers” and not “Ad Technology Providers”, and missed [18Tahaei, Mohammad; Ramokapane, Kopo M.; Li, Tianshi; Hong, Jason I.; Rashid, Awais (2022): "Charting App Developers' Journey Through Privacy Regulation Features in Ad Networks", in: Proceedings on Privacy Enhancing Technologies. (DOI)], which writes “Ad technology providers” as a console page name. Attempt 2 missed the addtl_consent cookie. Attempt 3 catches all three and 23 false positives, every one of which is printed by the script.
The 23 false positives are worth listing because they are why \bATP\b can never be used unadjudicated: Advanced Threat Protection (Microsoft Defender, FortiNet, Symantec, Office 365 — 8 papers), “ATP: In-network Aggregation for Multi-tenant Learning” in reference lists (2), “Absolute True Positives” as a ranking metric (1), N(ATP) as a bug-injection count (1), OBD-II AT commands (1), “attribute providers (ATPs)” in a brokered-identity paper (1), a D-Link binary called atp (1), an atp = 0.0005 statistic (1), and 7 papers using the ordinary English phrase additional consent about an IRB form or a second permission dialog.
The three true positives, hand-adjudicated on 2026-08-26 by reading each match in context:
| Paper | What it actually says |
|---|---|
| [7Toth, Michael; Bielova, Nataliia; Roca, Vincent (2022): "On dark patterns and manipulation of website publishers by CMPs", Proceedings on Privacy Enhancing Technologies 2022(3). (DOI)] PETS 2022 | Publishers “can add the Google Ad Tech Providers (ATP) list”, “containing a total of 641 companies at the same date” (28 May 2021), “potentially complemented with the Google Ad Tech Providers (ATP) list that is almost the same size” |
| [8Liu, Zengrui; Iqbal, Umar; Saxena, Nitesh (2024): "Opted Out, Yet Tracked: Are Regulations Enough to Protect Your Privacy?", in: Proceedings on Privacy Enhancing Technologies. (DOI)] PETS 2024 | Names the addtl_consent cookie among three Quantcast sets on consent |
| [18Tahaei, Mohammad; Ramokapane, Kopo M.; Li, Tianshi; Hong, Jason I.; Rashid, Awais (2022): "Charting App Developers' Journey Through Privacy Regulation Features in Ad Networks", in: Proceedings on Privacy Enhancing Technologies. (DOI)] PETS 2022 | Lists “Ad technology providers” as an AdMob/AdSense GDPR configuration page in a systematic review table |
None of the three decodes an AC string, resolves an ATP ID, or tests any rule from the specification. That is the basis for the open-question box on the page. The claim is bounded to these seven venues and says so.
5. Quotes checked against the source
scripts/tcf_quotecheck.mjs checks each quote against three renderings of the same PDF — paper.cols.txt (column order repaired; the one quoted from), paper.norm.txt and paper.txt — because they fail on different sentences. A quote found in any of them is located. Final result: 36 quotes checked, 0 not located, over 10 papers: 9 from [1Matte, Célestin; Bielova, Nataliia; Santos, Cristiana Teixeira (2020): "Do Cookie Banners Respect my Choice? Measuring Legal Compliance of Banners from IAB Europe's Transparency and Consent Framework", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)], 5 each from [2Smith, Michael; Torres-Agüero, Antonio; Grossman, Riley; Sen, Pritam; Chen, Yi; Borcea, Cristian (2024): "A Study of GDPR Compliance under the Transparency and Consent Framework", in: Proceedings of the ACM Web Conference. (DOI)], [3Kancherla, Gayatri Priyadarsini; Bielova, Nataliia; Santos, Cristiana; Bichhawat, Abhishek (2025): "Johnny Can't Revoke Consent Either: Measuring Compliance of Consent Revocation on the Web", in: Proceedings on Privacy Enhancing Technologies. (DOI)] and [4Morel, Victor; Santos, Cristiana; Carlsson, Pontus; Ahlinder, Joel; Duvignau, Romaric (2026): "The TCF doesn't really A(A)ID - Automatic Privacy Analysis and Legal Compliance of TCF-based Android Applications", Proceedings on Privacy Enhancing Technologies 2026(3). (DOI)], 3 each from [5Hils, Maximilian; Woods, Daniel W.; Böhme, Rainer (2021): "Privacy Preference Signals: Past, Present and Future", in: Proceedings on Privacy Enhancing Technologies. (DOI)] and [7Toth, Michael; Bielova, Nataliia; Roca, Vincent (2022): "On dark patterns and manipulation of website publishers by CMPs", Proceedings on Privacy Enhancing Technologies 2022(3). (DOI)], 2 each from [6Koch, Simon; Altpeter, Benjamin; Johns, Martin (2023): "The OK Is Not Enough: A Large Scale Study of Consent Dialogs in Smartphone Applications", in: Proceedings of the USENIX Security Symposium. (Link)] and [9Bouhoula, Ahmed; Kubicek, Karel; Zac, Amit; Cotrini, Carlos; Basin, David (2024): "Automated Large-Scale Analysis of Cookie Notice Compliance", in: Proceedings of the USENIX Security Symposium. (Link)], 1 each from [8Liu, Zengrui; Iqbal, Umar; Saxena, Nitesh (2024): "Opted Out, Yet Tracked: Are Regulations Enough to Protect Your Privacy?", in: Proceedings on Privacy Enhancing Technologies. (DOI)] and [18Tahaei, Mohammad; Ramokapane, Kopo M.; Li, Tianshi; Hong, Jason I.; Rashid, Awais (2022): "Charting App Developers' Journey Through Privacy Regulation Features in Ad Networks", in: Proceedings on Privacy Enhancing Technologies. (DOI)].
The list grew from 30 to 36 during review, and that is the point of recording it. The generic review pass observed that a quote checker reporting “0 not located” says nothing about the quotes you never put in it. Six were added: 1 for [18Tahaei, Mohammad; Ramokapane, Kopo M.; Li, Tianshi; Hong, Jason I.; Rashid, Awais (2022): "Charting App Developers' Journey Through Privacy Regulation Features in Ad Networks", in: Proceedings on Privacy Enhancing Technologies. (DOI)] and 2 for [9Bouhoula, Ahmed; Kubicek, Karel; Zac, Amit; Cotrini, Carlos; Basin, David (2024): "Automated Large-Scale Analysis of Cookie Notice Compliance", in: Proceedings of the USENIX Security Symposium. (Link)], whose quotes appeared in these notes but not in the script; 2 from [4Morel, Victor; Santos, Cristiana; Carlsson, Pontus; Ahlinder, Joel; Duvignau, Romaric (2026): "The TCF doesn't really A(A)ID - Automatic Privacy Analysis and Legal Compliance of TCF-based Android Applications", Proceedings on Privacy Enhancing Technologies 2026(3). (DOI)]'s traffic table after a denominator was corrected; and 1 from [1Matte, Célestin; Bielova, Nataliia; Santos, Cristiana Teixeira (2020): "Do Cookie Banners Respect my Choice? Measuring Legal Compliance of Banners from IAB Europe's Transparency and Consent Framework", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] when a comparison figure was added to the page.
Seven quotes failed the first pass and were replaced, not dropped. All seven were column-splice artefacts, i.e. the sentence exists in the paper but the rendering interleaves a neighbouring column into the middle of it. In each case the published quote was shortened to a contiguous span that verifies:
| Paper | First attempt (failed) | Published instead |
|---|---|---|
| [1Matte, Célestin; Bielova, Nataliia; Santos, Cristiana Teixeira (2020): "Do Cookie Banners Respect my Choice? Measuring Legal Compliance of Banners from IAB Europe's Transparency and Consent Framework", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] | “141 websites (9.9%) set a consent string with 1 to 5 purposes before any user action.” | “141 websites register positive consent even if the user has not made their choice” (abstract) |
| [1Matte, Célestin; Bielova, Nataliia; Santos, Cristiana Teixeira (2020): "Do Cookie Banners Respect my Choice? Measuring Legal Compliance of Banners from IAB Europe's Transparency and Consent Framework", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] | “27 websites (5.3%) set a consent string with 5 purposes even though the user refused consent.” | “27 websites store a positive consent even if the user has explicitly opted out” (abstract) |
| [3Kancherla, Gayatri Priyadarsini; Bielova, Nataliia; Santos, Cristiana; Bichhawat, Abhishek (2025): "Johnny Can't Revoke Consent Either: Measuring Compliance of Consent Revocation on the Web", in: Proceedings on Privacy Enhancing Technologies. (DOI)] | “Of the 136 websites that implement __tcfapi and support revocation, 101 (74.2%) websites contain…” | “we found that on 101 websites, third parties that have received consent upon user's acceptance, are not informed of revocation” (abstract) |
| [3Kancherla, Gayatri Priyadarsini; Bielova, Nataliia; Santos, Cristiana; Bichhawat, Abhishek (2025): "Johnny Can't Revoke Consent Either: Measuring Compliance of Consent Revocation on the Web", in: Proceedings on Privacy Enhancing Technologies. (DOI)] | “…52 TCStrings in JSON objects and 170 TCStrings in HTML files” | “3,423 TCStrings in the postData, 52 TCStrings in JSON objects and” — the “170 … HTML files” clause is spliced; the figures are still used, the quote stops where the rendering does |
| [4Morel, Victor; Santos, Cristiana; Carlsson, Pontus; Ahlinder, Joel; Duvignau, Romaric (2026): "The TCF doesn't really A(A)ID - Automatic Privacy Analysis and Legal Compliance of TCF-based Android Applications", Proceedings on Privacy Enhancing Technologies 2026(3). (DOI)] | “…users' choices are stored only when consent is granted” | “we observed that in 15 (2.6%) of these apps, users' choices are” |
| [6Koch, Simon; Altpeter, Benjamin; Johns, Martin (2023): "The OK Is Not Enough: A Large Scale Study of Consent Dialogs in Smartphone Applications", in: Proceedings of the USENIX Security Symposium. (Link)] | “we only detected TCF-related settings in 146 (4.0%) apps” | “TCF-related settings in 146 (4.0%) apps” |
| [7Toth, Michael; Bielova, Nataliia; Roca, Vincent (2022): "On dark patterns and manipulation of website publishers by CMPs", Proceedings on Privacy Enhancing Technologies 2022(3). (DOI)] | “By default, the whole IAB Europe Global Vendors List is included, representing 751 companies as of 28 May 2021.” | “the entire Global Vendors List provided by the IAB Europe, which contained 751 companies end of May 2021” (conclusion) |
The first four of those were the extraction's own evidence.quote values. They are evidence about the source, not fabrications — but they are not quotable verbatim, and copying an evidence.quote onto a page without this check is how an unverifiable quote gets published.
5.1 One denominator in the extraction is wrong
For [6Koch, Simon; Altpeter, Benjamin; Johns, Martin (2023): "The OK Is Not Enough: A Large Scale Study of Consent Dialogs in Smartphone Applications", in: Proceedings of the USENIX Security Symposium. (Link)] the extraction records population.n = 3006. The paper's own text says “We were able to analyze 3654 apps”, and 146/3,654 = 4.0%, which matches the paper's own percentage; 146/3,006 would be 4.9%. The page publishes 3,654. This is the standard failure mode warned about in the dataset overview: detection.metric names the unit, not always the population. Every denominator in the What they measured table was re-read in paper.cols.txt for this reason.
5.2 Figures taken from tables rather than sentences
Three figures on the page come from a table in the source, where there is no sentence to quote and the quote-checker cannot help:
| Figure | Source | How verified |
|---|---|---|
| [2Smith, Michael; Torres-Agüero, Antonio; Grossman, Riley; Sen, Pritam; Chen, Yi; Borcea, Cristian (2024): "A Study of GDPR Compliance under the Transparency and Consent Framework", in: Proceedings of the ACM Web Conference. (DOI)] Table 3: empty-TC domains 605, avg 0.58 tracking cookies, 30.8% with any | the paper's Table 3 | read in paper.cols.txt; the surrounding prose repeats 0.58 and 30.8% and both were located |
| [1Matte, Célestin; Bielova, Nataliia; Santos, Cristiana Teixeira (2020): "Do Cookie Banners Respect my Choice? Measuring Legal Compliance of Banners from IAB Europe's Transparency and Consent Framework", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] GET 764 (53.6%) / POST 399 of 1,426 | the paper's §IV-C prose | quoted and located |
| [3Kancherla, Gayatri Priyadarsini; Bielova, Nataliia; Santos, Cristiana; Bichhawat, Abhishek (2025): "Johnny Can't Revoke Consent Either: Measuring Compliance of Consent Revocation on the Web", in: Proceedings on Privacy Enhancing Technologies. (DOI)] 122/136 first-party cookies (89.6%) | the paper's §7 prose | quoted and located |
6. The published decoder, and how it was validated
The page publishes tcf/tcstring.mjs, a from-scratch Core-String decoder. Publishing a hand-rolled decoder needs justification and validation; both are here.
Why not just tell people to use @iabtcf/core? The page does tell them that, first. The hand-rolled version exists because the reader needs to see which fields exist and what each one does or does not mean, and because a decoder that touches only the Core String cannot silently disagree with a newer specification about a field it never reads.
Validation, and a correction made during review. The first cross-check was run against @iabtcf/core 1.5.6 and all six strings agreed. The external-currency reviewer then established that @iabtcf is the project's abandoned npm scope and the maintained package is @iabtechlabtcf/core 1.5.21 (2026-02-10) — same GitHub repository, no deprecation marker on the old scope. The cross-check was re-run against 1.5.21, and all six strings agree there too, on all eighteen compared fields: version, created, lastUpdated, cmpId, cmpVersion, consentScreen, consentLanguage, vendorListVersion, policyVersion, isServiceSpecific, useNonStandardTexts, purposeOneTreatment, publisherCC, specialFeatureOptIns[], purposesConsent[], purposesLITransparency[], vendorConsent[], vendorLegitimateInterest[]. corriere.it exercises the 1,634-bit bitfield path and spiegel.de the range-encoding path.
The two library versions themselves disagree, and that is now a claim on the page. On all six strings the only differing field is useNonStandardTexts: 1.5.21 returns a boolean; 1.5.6 returns undefined for that property and exposes the value under the older specification field name useNonStandardStacks. Verified by decoding the same string with both packages side by side and diffing the projected field sets. This is why the page tells readers to name the package as well as the version: the older build does not error on a renamed field, it returns undefined, which is falsy.
What it does not do, stated because the page publishes it: it does not read publisher restrictions, does not decode the DisclosedVendors or PublisherTC segment bodies (it reports their presence and type only), and does not validate. Anyone needing those should use the library.
7. External and industry sources
Every external figure on the page is re-fetchable by scripts/tcf_external_checks.sh. Values below are that script's output on 2026-08-26; the GVL is republished weekly and the ATP list without notice, so they will drift.
| Source | Primary? | What was taken | Verified how |
|---|---|---|---|
vendor-list.consensu.org/v3/vendor-list.json | yes, IAB Europe | GVL spec v3, list version 173, tcfPolicyVersion 5, updated 2026-08-20, 1,203 vendors, highest ID 1,634, 11 purposes / 3 special purposes / 3 features / 2 special features / 45 stacks | fetched and parsed; archive URL …/v3/archives/vendor-list-v100.json returns 200 |
cmplist.consensu.org/v2/cmp-list.json | yes, IAB Europe | 264 entries, 189 active, 75 with a deletedDate, highest ID 515, isCommercial flag | fetched and parsed. Note cmplist.consensu.org/cmp-list.json (no /v2/) returns 403 |
IAB Tech Lab TC-string + GVL format spec (GitHub master) | yes | segment structure and the SegmentType enum (0, 1, 3 — no 2), Core String bit table, version history through 2.4 (May 2026), global-scope deprecation dates, GVL cadence and caching rules, the ${GDPR_CONSENT_XXXXX} macro, and the PublisherCC definition (“the country in which the publisher's business entity is established or the legislative country of reference”) | raw Markdown fetched and read; version history reproduced in the script output |
IAB Tech Lab CMP API v2 spec (GitHub master) | yes | getTCData deprecated in v2.2; required commands are ping, addEventListener, removeEventListener; cmpuishown semantics; gdprApplies is the publisher's determination; __tcfapiLocator | raw Markdown fetched and read |
| Google, “Google's Additional Consent technical specification” | yes, Google | ACv2 grammar and examples, ACv2 standard since December 2023, only a TCF CMP may create one, discarded without a TC string, Google may strip duplicates, IABTCF_AddtlConsent, addtlConsent on TCData/InAppTCData, addtl_consent URL parameter, OpenRTB consented_providers | support.google.com/admanager/answer/9681920 fetched 2026-08-26 |
storage.googleapis.com/tcfac/additional-consent-providers.csv | yes, Google | 715 ATP providers, IDs 20–64031 | fetched and parsed |
| npm registry | yes | @iabtechlabtcf/core latest 1.5.21, 2026-02-10, 16 releases; @iabtcf/core latest 1.5.6, 2023-04-04, 91 releases, not marked deprecated; @iabgpp/cmpapi 3.2.0, 2026-08-03 | registry JSON fetched for each; dist-tags.latest and the per-version deprecated flag read directly |
GitHub API, InteractiveAdvertisingBureau/iabtcf-es | yes | one repository publishes both scopes; last commit 2026-03-10 | commits endpoint fetched; the repository.url field of both npm packages points at it |
| IAB Tech Lab Global Privacy Platform core spec | yes | TCF EU is GPP section ID 2; TCF Canada is 5 | raw Markdown fetched |
The npm finding was wrong twice before it was right, and the page nearly shipped the second version.
- First read: “the reference decoder has been unmaintained since 2023”. Wrong and unfair — the GitHub repository is active, with a v1.5.21 tag in February 2026. Caught in self-review.
- Second read, which was drafted onto the page: “no release after 1.5.6 has been published to npm, so the maintained code never ships”. Also wrong, and wrong in a way that is invisible unless you guess the right package name: the project renamed its npm scope to
@iabtechlabtcfand publishes there. Caught by the external-currency review pass, which queried the scope directly rather than trusting the query the author had run. - Published version: both scopes exist, both resolve, neither is marked deprecated, and they decode differently. That is a strictly more useful warning than either draft, and it is the reason the review pass earned its slot.
This is recorded at length because the error class — verifying a claim against the artefact you already had in mind, rather than searching for the artefact that would refute it — is the one this whole review layer exists to catch.
Sources considered and rejected.
| Rejected | Why |
|---|---|
| CMP vendor blog posts and “TCF v2.2 explained” marketing pages (Cookiebot, Usercentrics, Didomi, CookieYes and similar) | Every factual claim on this page about the format is in the IAB specification, which is public, dated and versioned. A vendor page adds no information and dates badly. None is cited. |
| Third-party “TC string decoder” web tools | Unverifiable, and pasting real strings into one is a data-handling decision a reader should not be nudged into. |
| Any adoption percentage sourced from a CMP vendor's own customer base | Denominator is the vendor's customers, not the web. Not comparable to any figure on the page. |
iab-tcf on PyPI (0.2.2, last uploaded 2022-10-31) | Considered as the Python option and left out. Re-checked during the currency review: it is still the newest thing on PyPI and no better-maintained Python TCF decoder was found. Recommending a 2022 package on a page whose headline warning is about stale decoders would undercut the warning, so its existence is noted here rather than on the page. |
| The Belgian DPA / CJEU C-604/22 litigation history | Not rejected as unreliable — it is already covered, dated and footnoted on consent. Duplicating it here would create two copies to keep current. The page links there instead. |
8. Bibliography
One entry added to bibliography, appended before the closing </bibtex> tag:
@inproceedings{tahaei2022_charting, author = {Tahaei, Mohammad and Ramokapane, Kopo M. and Li, Tianshi and Hong, Jason I. and Rashid, Awais}, title = {Charting App Developers' Journey Through Privacy Regulation Features in Ad Networks}, booktitle = {Proceedings on Privacy Enhancing Technologies}, year = {2022}, series = {PoPETs 2022}, doi = {10.56553/popets-2022-0061}, }
Generated by scripts/bibgen.mjs –key tahaei2022_charting. PoPETs records in the index carry no authors — this is true of 100% of PETS and USENIX records — so the DOI was derived from the landing URL by the script and the author list was fetched from petsymposium.org/popets/2022/popets-2022-0061.php with curl and a browser User-Agent. Checked for a duplicate key and a duplicate DOI before appending; neither was present. The other 18 keys the page cites already existed.
A pre-existing problem found while checking, and deliberately not fixed here. A scan for duplicate titles (not just duplicate keys) across the 481 entries finds four papers present twice under different keys:
lerner2016internet / lerner2016_internet bouhoula2024automated / bouhoula2024_automated fouad2022my / fouad2022_cookie bottger2025_regional / boettger2025_regional
A duplicate-key check passes on all four, which is why they survived. They are not this page's doing and merging them would break whichever existing pages cite the losing key, so they are recorded here for whoever owns the bibliography rather than changed. This page cites bouhoula2024_automated (the underscore form, which the majority of entries use).
9. The live eight-site probe
Run on 2026-08-26 from a residential Swiss IP (AS9044, Aarau, CH — checked via ipinfo.io), Playwright Chromium 151.0.7922.34 headless, locale en-GB, one domcontentloaded navigation per site, twelve-second wait, no banner interaction, one page load each. Eight sites, chosen as European news publishers likely to run a TCF CMP. This is not a sample of anything and the page says so twice.
Unedited output is below. Four of eight returned a TC string. The probe was accidentally re-run ~40 minutes later while the page was being edited; the second run's output is byte-identical to the first, which is expected — Created/LastUpdated are day-level and the printed strings are truncated — but it does mean nothing on this page rests on a single load that happened to go a particular way.
- tcf_live_probe-output.txt
### https://www.spiegel.de/ [ok] __tcfapi: function __tcfapiLocator iframe: true events seen: cmpuishown consent-shaped cookie names : (none) consent-shaped localStorage : _sp_user_consent_31256 consent URL params on requests: (none) gdprApplies=true cmpId=6 cmpVersion=1 tcfPolicyVersion=5 addtlConsent: "2~~dv." tcString(350 chars): CQpjb0AQpjb0AAGABCENCtFgAAAAAALAAAQ4AAAMsgBgDu... segments : 0:core 1:1 2:3 created/updated : 2026-08-26 / 2026-08-26 GVL version : 173 policy 5 publisherCC CH purposes CONSENT: [] purposes LI : [7,9,10] vendors consent : 0 (bitfield, maxVendorId 0) vendors LI : 3 (range) purposeOneTreatment: false useNonStandardTexts: false ### https://www.lemonde.fr/ [ok] __tcfapi: function __tcfapiLocator iframe: true events seen: (none) consent-shaped cookie names : (none) consent-shaped localStorage : (none) consent URL params on requests: (none) ### https://www.corriere.it/ [ok] __tcfapi: function __tcfapiLocator iframe: true events seen: cmpuishown -> cmpuishown -> cmpuishown -> cmpuishown -> cmpuishown -> cmpuishown -> cmpuishown -> cmpuishown consent-shaped cookie names : (none) consent-shaped localStorage : permutive-consent consent URL params on requests: (none) gdprApplies=true cmpId=218 cmpVersion=0 tcfPolicyVersion=5 addtlConsent: "2~" tcString(334 chars): CQpjb0AQpjb0ADaAAAENCtFgAAAAAAAAAAAAMxNR_G__bW... segments : 0:core 1:1 2:3 created/updated : 2026-08-26 / 2026-08-26 GVL version : 173 policy 5 publisherCC AA purposes CONSENT: [] purposes LI : [] vendors consent : 932 (bitfield, maxVendorId 1634) vendors LI : 0 (bitfield) purposeOneTreatment: false useNonStandardTexts: false ### https://www.elmundo.es/ [ok] __tcfapi: function __tcfapiLocator iframe: true events seen: (none) consent-shaped cookie names : user_consent_policy, user_consent_gam, ue_consentState consent-shaped localStorage : ue-permutive-consent-status consent URL params on requests: (none) ### https://www.bild.de/ [ok] __tcfapi: function __tcfapiLocator iframe: true events seen: cmpuishown consent-shaped cookie names : (none) consent-shaped localStorage : _sp_user_consent_6804 consent URL params on requests: (none) gdprApplies=true cmpId=345 cmpVersion=1 tcfPolicyVersion=5 addtlConsent: "2~~dv." tcString(334 chars): CQpjb0AQpjb0AFZABCENCtFgAAAAAAAAAAQ4AAAAAAAA.I... segments : 0:core 1:1 2:3 created/updated : 2026-08-26 / 2026-08-26 GVL version : 173 policy 5 publisherCC CH purposes CONSENT: [] purposes LI : [] vendors consent : 0 (bitfield, maxVendorId 0) vendors LI : 0 (bitfield) purposeOneTreatment: false useNonStandardTexts: false ### https://www.focus.de/ [ok] __tcfapi: function __tcfapiLocator iframe: true events seen: cmpuishown consent-shaped cookie names : (none) consent-shaped localStorage : _sp_user_consent_278 consent URL params on requests: (none) gdprApplies=true cmpId=35 cmpVersion=1 tcfPolicyVersion=5 addtlConsent: "2~~dv." tcString(306 chars): CQpjb0AQpjb0AAjABCENCtFgAAAAAAAAAAQ4AAAAAAAA.I... segments : 0:core 1:1 2:3 created/updated : 2026-08-26 / 2026-08-26 GVL version : 173 policy 5 publisherCC CH purposes CONSENT: [] purposes LI : [] vendors consent : 0 (bitfield, maxVendorId 0) vendors LI : 0 (bitfield) purposeOneTreatment: false useNonStandardTexts: false ### https://www.marca.com/ [ok] __tcfapi: function __tcfapiLocator iframe: true events seen: (none) consent-shaped cookie names : user_consent_policy, user_consent_gam, ue_consentState consent-shaped localStorage : ue-permutive-consent-status consent URL params on requests: (none) ### https://www.telegraph.co.uk/ [ok] __tcfapi: undefined __tcfapiLocator iframe: false events seen: (none) consent-shaped cookie names : (none) consent-shaped localStorage : (none) consent URL params on requests: (none)
What was resolved against a primary source, not asserted:
- CMP IDs 6, 218, 345 and 35 were joined to the live Global CMP List: Sourcepoint Technologies (commercial), RCS MediaGroup (commercial), Axel Springer Deutschland (
isCommercial: false), BurdaForward (isCommercial: false). The claim “the CMP ID belongs to the publisher on two of the four” rests on that flag plus the company names. - All 932
corriere.itvendor-consent IDs were resolved against GVL 173 — all 932 are present, so this is not a decoder artefact or a garbage bitfield. spiegel.de's three LI vendors resolve to StackAdapt, Adobe Advertising Cloud and Nielsen International.addtlConsentvalues:2~~dv.on three sites (a well-formed empty ACv2 string) and2~oncorriere.it, which is not a well-formed ACv2 string — the grammar is2~<consented>~dv.<disclosed>and this has only two parts. That observation is on the page as an illustration of the grammar, not as a compliance finding about one site.
What this probe deliberately does not claim. No prevalence. No compliance verdict about any named site. The corriere.it observation is presented as which array you read decides what you see, not as this site violates the GDPR — one page load from one country on one day cannot support the second. The PublisherCC-tracks-the-crawler observation is called an anecdote on the page and put in the open-questions box.
Ethics. Eight public homepage loads, read-only, no interaction, no authentication, no repeat visits, well under any plausible rate concern. See Ethics.
10. What could not be established
- Current web-side TCF prevalence. The newest figure in the corpus is [5Hils, Maximilian; Woods, Daniel W.; Böhme, Rainer (2021): "Privacy Preference Signals: Past, Present and Future", in: Proceedings on Privacy Enhancing Technologies. (DOI)], February 2021. Nothing on the page claims a 2026 web prevalence, and the gap is in the open-questions box. Closing it needs a toplist crawl, not a query.
- Whether AC strings are common. Three of four live sites returned an empty-but-well-formed one, which is suggestive of wide CMP support and of nothing else. Not published as a figure.
- How
PublisherCCis actually set. Three of four strings reported the crawler's country. The specification permits both readings — establishment or legislative country of reference — so the observation does not by itself show a defect, and the page was rewritten to say so after the first draft asserted it did. A second vantage point would settle the empirical question in an hour; it was not run, because that is a measurement and this page is a systematisation. Flagged as an open question. - Whether the 1 March 2026 disclosed-vendors requirement changed behaviour. The deadline falls inside the provisional 2026 slice; no paper in the corpus is on the far side of it.
- How many of the 77 TCF-MENTION papers actually touch a string. The 19 candidates over the ≥5 threshold were audited (§2.1) and 4 work with a string. The other 58 were not read. Given that the threshold's precision is 21%, its recall is the open question: a paper could decode strings in a two-sentence methods paragraph and clear only three or four mentions. A hand pass over all 77 would settle it and would probably move the count of 4 upward, not downward. The page's “four papers” claim is therefore a claim about the audited candidate set and is worded as one.
- Anything about CHI, SOUPS, EuroS&P, ACSAC, RAID or AsiaCCS. Not in this corpus. Consent and CMP research is published at all of them, and the page says its claims are claims about seven venues.
11. Judgement calls
- New page rather than broadening consent. Reasoning and the rejected alternative in §1.
- Full-text populations rather than an extraction field. There is no extraction field for this subject. The alternative was to build an S2-style vocabulary sweep over free-text fields, as consent does. Rejected because the TCF vocabulary is small, distinctive and reliably spelled out in the paper's own prose, so a full-text regex has better recall than a sweep over extracted names — and because the extraction names what a paper headlines, and most TCF work headlines “GDPR compliance”, not “TC string”.
- Keeping the ≥5 threshold as a candidate set rather than dropping it. After the audit found 21% precision, the alternative was to delete the threshold entirely and publish only the audited nine. It was kept, with both precision figures printed, because the threshold is what makes the audit reproducible: a reader who disagrees with a verdict can re-derive the same 19 candidates and argue about the classification rather than about the search. Publishing the audited nine with no account of what they were selected from would have hidden the selection step. A reasonable person could have dropped it.
- Publishing a hand-rolled decoder. §6. Justified by the cross-check and bounded by an explicit list of what it does not do.
- Running a live probe at all. A systematisation page that only cites papers cannot show the reader what a real pre-consent string looks like, and the most useful facts on the page — that
__tcfapican be defined and silent, that vendor and purpose arrays disagree, thatPublisherCCmay be the crawler's country — are not in any paper in the corpus. The cost is a non-reproducible artefact; it is mitigated by publishing the script, the raw output and the exact vantage, and by making no prevalence claim. - Dating [1Matte, Célestin; Bielova, Nataliia; Santos, Cristiana Teixeira (2020): "Do Cookie Banners Respect my Choice? Measuring Legal Compliance of Banners from IAB Europe's Transparency and Consent Framework", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)]'s shared-cookie result as historical. The page reports the 4.3% figure and then says the mechanism was retired in 2021, on the authority of the specification's own changelog (“Deprecation of Global Scope, OOB and 'euconsent-v2' cookie associated with the consensu.org domain”, September 2021; “Since Sept 1st 2021, TC strings established with global-scope are considered invalid”). A reasonable person could have left the caveat off and let the 2019 date do the work; that is what consent currently does, and it reads as current practice, which is why it is being corrected.
- Not fixing the four duplicate bibliography entries. §8.
- Calling
getTCDatadeprecated but still usable. The spec says deprecated. Rather than assert “it still works” from the spec alone,scripts/tcf_gettcdata_probe.mjswas written and run on the four sites that answered anything: all four returned a TC string, andcorriere.itreturned one with the callback'ssuccessflag set tofalse. Both facts are on the page. An earlier draft of the correction to consent said “every CMP encountered still answersgetTCData” before that probe existed — an assertion about a command that had not been called. It was replaced with the measured wording. Raw output:
https://www.spiegel.de/ {"ok":true,"err":null,"ts":350,"ev":"cmpuishown"}
https://www.corriere.it/ {"ok":false,"err":null,"ts":334,"ev":"cmpuishown"}
https://www.bild.de/ {"ok":true,"err":null,"ts":334,"ev":"cmpuishown"}
https://www.focus.de/ {"ok":true,"err":null,"ts":306,"ev":"cmpuishown"}
12. The run itself
| Date | 2026-08-26 |
| Corpus at the time | 5,859 extracted papers, 5,869 full texts, 7 venues, 2010–2026, extended 2026-08-11 (commit 8a6b843) |
| Live external state | GVL 173 (2026-08-20), CMP list 264/189 active, ATP list 715 providers, TCF spec at v2.4 (May 2026) |
| Vantage for the live probe | residential CH, AS9044 |
| Model / agents | Written by Claude (Opus 5) in one session. Four review passes, three on Sonnet and one on Fable, each handed the page text, the report scripts, their unedited output and these notes, and each told the author's context may not be exhaustive. |
| Accidental exposure | None. No credentials, no personal data. The live probe visited public homepages only and stored no cookies beyond the ephemeral browser context. |
12.1 Review findings, and what was done with each
Four passes, each handed the page text, the scripts, their unedited output and these notes, and each told the author's context may not be exhaustive. Rejections are recorded as carefully as fixes, because they are the only record of whether a reviewer earned its slot.
Pass A — external currency (Sonnet). Told to fetch rather than recall.
| Finding | Verdict |
|---|---|
The npm claim was wrong. @iabtcf is the project's abandoned scope; the maintained package is @iabtechlabtcf/core 1.5.21 (2026-02-10). | Accepted, and it improved the page. The warning changed from “the reference decoder is stale” to the sharper and stranger truth: two scopes, both resolving, neither deprecated, decoding differently. The cross-check was re-run against 1.5.21 and the decoder's header comment rewritten. §7 records the full sequence of three wrong-then-right readings. |
The sibling packages (@iabtechlabtcf/cmpapi, /stub, /testing, /cli) have the same rename. | Noted, not acted on. The page names only core. scripts/tcf_external_checks.sh now queries both scopes so a future refresh sees it. |
Everything else — GVL 173, CMP list 264/189/75/515, ATP 715, the whole spec version-history table, getTCData deprecation, GPP section IDs 2 and 5, Google's AC spec verbatim, PyPI iab-tcf still at 0.2.2 — re-fetched and exact. | No change. |
Pass B — citations and quotes (Sonnet).
| Finding | Verdict |
|---|---|
| The 19-paper table is majority contaminated. The ≥5-mention threshold catches background prose and reference lists; the reviewer read all 19 and named 10 that never touch a TC string, so “the papers that actually work with the string” is false and every figure built on 19 is corrupted. | Accepted, and it is the largest change in the run. All 19 were re-audited by the author with a committed script and committed evidence (§2.1). The result is close to but not identical with the reviewer's: 4 works / 5 detects / 10 background, where the reviewer said 9 genuine and 10 not. The section is rewritten around the audit, the precision figures (21% and 47%) are published, and every downstream figure is re-scoped. |
| [9Bouhoula, Ahmed; Kubicek, Karel; Zac, Amit; Cotrini, Carlos; Basin, David (2024): "Automated Large-Scale Analysis of Cookie Notice Compliance", in: Proceedings of the USENIX Security Symposium. (Link)] is background-only: “the TCF API is mentioned only as a suggestion for future work”. | Rejected on the evidence, and the rejection is on the page. That reading comes from a two-column splice in paper.cols.txt. paper.norm.txt shows the authors reconstruct prior work's website selection using the TCF API. Reclassified DETECTS-ONLY. This is why the reviewer's count is 9 and the audit's is 4+5. |
| [4Morel, Victor; Santos, Cristiana; Carlsson, Pontus; Ahlinder, Joel; Duvignau, Romaric (2026): "The TCF doesn't really A(A)ID - Automatic Privacy Analysis and Legal Compliance of TCF-based Android Applications", Proceedings on Privacy Enhancing Technologies 2026(3). (DOI)]'s population diverges from the report script (4,482 on the page, 5,067 in the output) without a note. | Accepted. The page's number was right — 5,067 is apps scraped, 4,482 apps downloaded, and 4,482 is the denominator of the 12.85% — but it is now footnoted, like the [6Koch, Simon; Altpeter, Benjamin; Johns, Martin (2023): "The OK Is Not Enough: A Large Scale Study of Consent Dialogs in Smartphone Applications", in: Proceedings of the USENIX Security Symposium. (Link)] correction beside it. |
| The quote-checker's “0 not located” overstates its coverage: quotes attributed to [18Tahaei, Mohammad; Ramokapane, Kopo M.; Li, Tianshi; Hong, Jason I.; Rashid, Awais (2022): "Charting App Developers' Journey Through Privacy Regulation Features in Ad Networks", in: Proceedings on Privacy Enhancing Technologies. (DOI)] and [9Bouhoula, Ahmed; Kubicek, Karel; Zac, Amit; Cotrini, Carlos; Basin, David (2024): "Automated Large-Scale Analysis of Cookie Notice Compliance", in: Proceedings of the USENIX Security Symposium. (Link)] in these notes are not in the script. | Accepted. Both added, plus two more from the audit and two from the [4Morel, Victor; Santos, Cristiana; Carlsson, Pontus; Ahlinder, Joel; Duvignau, Romaric (2026): "The TCF doesn't really A(A)ID - Automatic Privacy Analysis and Legal Compliance of TCF-based Android Applications", Proceedings on Privacy Enhancing Technologies 2026(3). (DOI)] traffic table. 30 → 35 quotes, still 0 not located. |
Citekeys, duplicate-title scan, the tahaei2022_charting entry, the [6Koch, Simon; Altpeter, Benjamin; Johns, Martin (2023): "The OK Is Not Enough: A Large Scale Study of Consent Dialogs in Smartphone Applications", in: Proceedings of the USENIX Security Symposium. (Link)] denominator correction, and every industry/primary-source claim: all verified correct. | No change. |
Pass C — figures against the script (Sonnet).
| Finding | Verdict |
|---|---|
| Wrong denominator on the advertising-ID figure: 284 apps is out of 513 (active stage), not 550 (passive stage). | Accepted. Verified against the paper's Table 6 — “Passive-stage (N = 550) Active-stage (N = 513)” and “During Interaction – 284 (55.3%)”. The row now reads 55.3% of 513 and quotes the paper's own percentage. |
The code block embedded on the page is not byte-identical to tcf/tcstring.mjs — the header comments differ. | Accepted. The page block is now generated from the file. Also caught, while fixing it, that the section rewrite in response to Pass B had deleted the entire What they measured table; it was restored and re-verified row by row. That is the most useful thing this pass did, and it was not what it was looking for. |
| “all six agree on all seventeen fields” — the list has eighteen. | Accepted. |
| The hand audit exists in the repo but is not surfaced on either page, and the two scripts disagree about [9Bouhoula, Ahmed; Kubicek, Karel; Zac, Amit; Cotrini, Carlos; Basin, David (2024): "Automated Large-Scale Analysis of Cookie Notice Compliance", in: Proceedings of the USENIX Security Symposium. (Link)]. | Already fixed when reported. The reviewer read a mid-edit snapshot: the audit was being written and published while the pass ran. Both scripts now agree (DETECTS-ONLY) and the audit is on both pages. Recorded rather than dismissed, because “the reviewer saw an inconsistent intermediate state” is exactly the excuse that hides a real inconsistency. |
REVIEW_FINDINGS_PLACEHOLDER still in the provenance page. | Accepted — you are reading its replacement. |
| [3Kancherla, Gayatri Priyadarsini; Bielova, Nataliia; Santos, Cristiana; Bichhawat, Abhishek (2025): "Johnny Can't Revoke Consent Either: Measuring Compliance of Consent Revocation on the Web", in: Proceedings on Privacy Enhancing Technologies. (DOI)]'s own percentages are ~0.1pp off its own denominator (122/136 = 89.7%, not 89.6%). | Accepted as a footnote, not a correction. The page quotes what the paper prints and now says so. |
| Every other figure, table and percentage, the decoder's bit offsets against a freshly fetched spec, and all four scripts' reproducibility: verified correct. | No change. |
Pass D — generic (Fable). No checklist; told to look for whatever the focused three were not. It returned 15 findings against a page that had already absorbed the other three, and it is the pass that produced the largest number of accepted changes.
| Finding | Verdict |
|---|---|
| The quote count is stale in three places — 30 on the page, 33 in §5, 35 in the committed script output. The classic “the fix survives in the provenance log”. | Accepted. All three now read 36, with the per-paper breakdown in §5 and an explicit note that the list grew during review, because a quote checker only checks what you put in it. |
| “That is the real size of this literature” is a census claim the provenance explicitly refuses to make — §10 says the 58 sub-threshold papers were never read and recall is open, and says the page “is worded as one”. It was not. | Accepted. The page now says “four of the audited candidates… read that as a floor, not a census” and carries the recall caveat inline. |
| The lede said “so much of the compliance literature is really TCF literature” — which the page then refutes. | Accepted. Rewritten to scope the claim to the recording-audit slice and to point at the corpus section that shows how small it is. |
euconsent (v1) and euconsent-v2 (v2.0 global scope) are conflated in both this page and the neighbour: if the shared cookie were v1-only there would have been nothing to deprecate in 2021, since v1 strings were already invalid in 2020. | Accepted, and it is the sharpest finding of the pass. Both files now name both cookies and attach the 2021 deprecation to global scope and euconsent-v2 specifically. |
| The neighbour contradicts the new page (“Do not decode the TC string yourself” two paragraphs above a link to a page publishing a decoder), and the cross-link promises “the current pattern” that the new page never showed in code. | Accepted, both halves. The neighbour now says “do not decode it ad hoc” and points at the audited decoder. The new page gained a tested addEventListener capture snippet (tcf_capture.js), which was run on two live sites before publishing — it reproduces the spiegel.de capture and the lemonde.fr silent-API case. |
| Heading “the Half of the Signal Nobody Measures” overreaches twice — 715 ATP against 1,203 GVL is not a half, list size is not signal share, and an unbounded “nobody” contradicts the body's careful seven-venue scoping. | Accepted. Heading is now “the Parallel Signal Nobody Measures”; the body gives both list sizes for 2021 and 2026, says the ratio is of lists and not of signal, and the scoping to seven venues is in the box below it. |
Version-history table: the committed changelog evidence was truncated at head -8; the 2.3 and 2.4 rows both report the LI-workaround removal as if it happened twice; “1 March 2026” for the Disclosed-Vendors mandate is an inference the spec does not date; two v2.1 rows are silently filtered out. | All four accepted. head raised to 22 so the committed output covers every row on the page; the 2.3 and 2.4 rows now describe distinct changes; the 1 March 2026 boundary is footnoted as an inference with the sentence it rests on; the table says it is filtered to measurement-visible changes. |
“Every rejected match is printed” is false — three of the 23 print blank because the context regexes in tcf_ac_probe.mjs were narrower than the match regex (fixed 60-character windows, one missing the i flag). | Accepted, script fixed rather than claim softened. Context extraction now anchors on the actual match and takes whatever context exists. All 23 false positives print a context; the three that were blank are the D-Link atp binary, the second in-network-aggregation citation, and the atp = 0.0005 statistic. |
| “More than half of it is at PETS, on either counting” is false on one of the three columns shown (TCF-MENTION is 30/77 = 39%). | Accepted. All three countings are now named explicitly. |
| Prose population list still used the uncorrected morel figure (5,067) that the table one paragraph above footnotes as 4,482, and called apps “sites”; and “tens of thousands, not millions” described a list containing two 100,000s. | Accepted. Now “200, 2,230, 4,482, 28,257, 97,090, 100,000 and 100,000 sites or apps — between two hundred and a hundred thousand”. |
Three misattributions: [7Toth, Michael; Bielova, Nataliia; Roca, Vincent (2022): "On dark patterns and manipulation of website publishers by CMPs", Proceedings on Privacy Enhancing Technologies 2022(3). (DOI)] examined seven CMP consoles, not “sites”; [4Morel, Victor; Santos, Cristiana; Carlsson, Pontus; Ahlinder, Joel; Duvignau, Romaric (2026): "The TCF doesn't really A(A)ID - Automatic Privacy Analysis and Legal Compliance of TCF-based Android Applications", Proceedings on Privacy Enhancing Technologies 2026(3). (DOI)] is not “the first systematic mobile TCF study” because [6Koch, Simon; Altpeter, Benjamin; Johns, Martin (2023): "The OK Is Not Enough: A Large Scale Study of Consent Dialogs in Smartphone Applications", in: Proceedings of the USENIX Security Symposium. (Link)] counted IABTCF_ keys three years earlier; and “the last row and the first” pointed at the wrong rows. | Accepted. [4Morel, Victor; Santos, Cristiana; Carlsson, Pontus; Ahlinder, Joel; Duvignau, Romaric (2026): "The TCF doesn't really A(A)ID - Automatic Privacy Analysis and Legal Compliance of TCF-based Android Applications", Proceedings on Privacy Enhancing Technologies 2026(3). (DOI)] is now “the first study to decode what a mobile CMP stores”, with the credit to [6Koch, Simon; Altpeter, Benjamin; Johns, Martin (2023): "The OK Is Not Enough: A Large Scale Study of Consent Dialogs in Smartphone Applications", in: Proceedings of the USENIX Security Symposium. (Link)] in the same sentence. |
| “broader banner-compliance studies report majorities” is uncited on a page whose ethic is that comparisons name their source. | Accepted. Replaced with [1Matte, Célestin; Bielova, Nataliia; Santos, Cristiana Teixeira (2020): "Do Cookie Banners Respect my Choice? Measuring Legal Compliance of Banners from IAB Europe's Transparency and Consent Framework", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)]'s own sentence, quoted and quote-checked: “at least one suspected violation in 304 out of 560 websites (54%)”. The reviewer suggested [9Bouhoula, Ahmed; Kubicek, Karel; Zac, Amit; Cotrini, Carlos; Basin, David (2024): "Automated Large-Scale Analysis of Cookie Notice Compliance", in: Proceedings of the USENIX Security Symposium. (Link)]; [1Matte, Célestin; Bielova, Nataliia; Santos, Cristiana Teixeira (2020): "Do Cookie Banners Respect my Choice? Measuring Legal Compliance of Banners from IAB Europe's Transparency and Consent Framework", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)] was used instead because it is the same framework and the same era as the figure it is contrasted with. |
| §3.1 contradicts itself — “12 distinct over 12 papers, one paper each” versus “ConsentChk (twice, from one paper)” — and claims the page reports a finding it does not. | Accepted. The script now prints the distinct-paper count (12 names over 11 papers), the ConsentChk pair is attributed to [19Tang, Brian; Bui, Duc; Shin, Kang G. (2025): "Navigating Cookie Consent Violations Across the Globe", in: Proceedings of the USENIX Security Symposium. (Link)], and the finding the sentence referred to — no shared TCF decoding pipeline exists in this corpus — has been added to the page, since it is supportable and was the point of printing the residue. |
| Number-rule items: the lede gave “17 of 136” without naming the 136; the population table header used the banned “Share of 5,859” construction and sat near an “all 5,869 full texts” claim with no explanation; the live-probe ID resolutions were the only figures with no committed script behind them. | All three accepted. The lede names the denominator in the same clause; the table header carries a footnote explaining the 5,859/5,869 split; and tcf_report.mjs gained a LIVE-PROBE RESOLUTIONS section that joins each captured string to the published CMP list and GVL, so the Sourcepoint/RCS/Axel Springer/Burda attributions and the 932-of-932 check are in committed output. |
| Verified clean: the three neighbour edits, the embedded code block's byte-identity, the decoder's bit offsets, the npm facts, the March-2026 boundary, every corpus figure traced, citekeys, WRAP casing, balanced nowiki escapes, no pipes in cells. | No change. |
On the reviewer that found the most. Pass D was given no checklist and cost the most wall-clock by a wide margin. It found the two things that would actually have embarrassed the page — a claim the page's own data refutes, and a spec conflation that survived three focused passes and a fetch-everything currency review. The focused passes are still worth their slots (Pass C caught a wrong denominator and a deleted table; Pass B caught the contaminated population), but the evidence here is that the unstructured pass is not the optional one.
Related
- Decoding TCF Consent Strings — the page these notes back.
- corpus — corpus-level provenance: how the 5,859 papers were selected, extracted and validated, and the caveats that apply to every figure on this site.
- consent — the neighbouring page's notes, including the
consentActionaudit these populations deliberately do not duplicate.
References
- [1]
- Matte, Célestin; Bielova, Nataliia; Santos, Cristiana Teixeira (2020): "Do Cookie Banners Respect my Choice? Measuring Legal Compliance of Banners from IAB Europe's Transparency and Consent Framework", in: Proceedings of the IEEE Symposium on Security and Privacy. (DOI)
- [2]
- Smith, Michael; Torres-Agüero, Antonio; Grossman, Riley; Sen, Pritam; Chen, Yi; Borcea, Cristian (2024): "A Study of GDPR Compliance under the Transparency and Consent Framework", in: Proceedings of the ACM Web Conference. (DOI)
- [3]
- Kancherla, Gayatri Priyadarsini; Bielova, Nataliia; Santos, Cristiana; Bichhawat, Abhishek (2025): "Johnny Can't Revoke Consent Either: Measuring Compliance of Consent Revocation on the Web", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [4]
- Morel, Victor; Santos, Cristiana; Carlsson, Pontus; Ahlinder, Joel; Duvignau, Romaric (2026): "The TCF doesn't really A(A)ID - Automatic Privacy Analysis and Legal Compliance of TCF-based Android Applications", Proceedings on Privacy Enhancing Technologies 2026(3). (DOI)
- [5]
- Hils, Maximilian; Woods, Daniel W.; Böhme, Rainer (2021): "Privacy Preference Signals: Past, Present and Future", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [6]
- Koch, Simon; Altpeter, Benjamin; Johns, Martin (2023): "The OK Is Not Enough: A Large Scale Study of Consent Dialogs in Smartphone Applications", in: Proceedings of the USENIX Security Symposium. (Link)
- [7]
- Toth, Michael; Bielova, Nataliia; Roca, Vincent (2022): "On dark patterns and manipulation of website publishers by CMPs", Proceedings on Privacy Enhancing Technologies 2022(3). (DOI)
- [8]
- Liu, Zengrui; Iqbal, Umar; Saxena, Nitesh (2024): "Opted Out, Yet Tracked: Are Regulations Enough to Protect Your Privacy?", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [9]
- Bouhoula, Ahmed; Kubicek, Karel; Zac, Amit; Cotrini, Carlos; Basin, David (2024): "Automated Large-Scale Analysis of Cookie Notice Compliance", in: Proceedings of the USENIX Security Symposium. (Link)
- [10]
- Rasaii, Ali; Dao, Ha; Feldmann, Anja; Javid, Mohammadmahdi; Gasser, Oliver; Gosain, Devashish (2025): "Intractable Cookie Crumbs: Unveiling the Nexus of Stateful Banner Interaction and Tracking Cookies", in: Proceedings on Privacy Enhancing Technologies, pp. 429-445. (DOI)
- [11]
- Aziz, Muhammad Abu Bakar; Wilson, Christo (2024): "Johnny Still Can't Opt-out: Assessing the IAB CCPA Compliance Framework", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [12]
- Utz, Christine; Degeling, Martin; Fahl, Sascha; Schaub, Florian; Holz, Thorsten (2019): "(Un)informed Consent: Studying GDPR Consent Notices in the Field", in: Proceedings of the ACM SIGSAC Conference on Computer and Communications Security. (DOI)
- [13]
- Bollinger, Dino; Kubicek, Karel; Cotrini, Carlos; Basin, David (2022): "Automating Cookie Consent and GDPR Violation Detection", in: 31st USENIX Security Symposium (USENIX Security 22), pp. 2893-2910. USENIX Association, Boston, MA. (Link)
- [14]
- Utz, Christine; Amft, Sabrina; Degeling, Martin; Holz, Thorsten; Fahl, Sascha; Schaub, Florian (2023): "Privacy Rarely Considered: Exploring Considerations in the Adoption of Third-Party Services by Websites", Proceedings on Privacy Enhancing Technologies 2023(1):5-28. (DOI)
- [15]
- Zimmeck, Sebastian; Wang, Oliver; Alicki, Kuba; Wang, Jocelyn; Eng, Sophie (2023): "Usability and Enforceability of Global Privacy Control", Proceedings on Privacy Enhancing Technologies 2023(2). (DOI)
- [16]
- Demir, Nurullah; Urban, Tobias; Pohlmann, Norbert; Wressnegger, Christian (2024): "A Large-Scale Study of Cookie Banner Interaction Tools and their Impact on Users' Privacy", in: Proceedings on Privacy Enhancing Technologies, pp. 5-20. (DOI)
- [17]
- Kumar, Vinayshekhar Bannihatti; Iyengar, Roger; Nisal, Namita; Feng, Yuanyuan; Habib, Hana; Story, Peter; Cherivirala, Sushain; Hagan, Margaret; Cranor, Lorrie Faith; Wilson, Shomir; Schaub, Florian; Sadeh, Norman M. (2020): "Finding a Choice in a Haystack: Automatic Extraction of Opt-Out Statements from Privacy Policy Text", in: Proceedings of the ACM Web Conference. (DOI)
- [18]
- Tahaei, Mohammad; Ramokapane, Kopo M.; Li, Tianshi; Hong, Jason I.; Rashid, Awais (2022): "Charting App Developers' Journey Through Privacy Regulation Features in Ad Networks", in: Proceedings on Privacy Enhancing Technologies. (DOI)
- [19]
- Tang, Brian; Bui, Duc; Shin, Kang G. (2025): "Navigating Cookie Consent Violations Across the Globe", in: Proceedings of the USENIX Security Symposium. (Link)
