Guide Privacy & Data 5 min read

The privacy header thousands of sites copied now guards something else

Permissions-Policy: interest-cohort=() was added in 2021 to opt out of FLoC. FLoC was cancelled, and Chromium repointed the token at the Topics API without anyone editing a config file. Of fifteen sites checked, four send it as their entire policy — including a government service and a privacy company.

Priya Nair
Data, AI Governance & Policy Analyst
Published 11 Sep 2026, 5:01 PM (SGT)
Share:
Lines of syntax-highlighted code on a dark monitor, photographed close up Lines of syntax-highlighted code on a dark monitor, photographed close up Photo by tookapic on Pixabay
Advertisement

In 2021 a great many sites added one line to their web server config to opt out of Google's FLoC tracking experiment:

Permissions-Policy: interest-cohort=()

FLoC was abandoned. The header was not. It now names a control for a different system entirely, and nobody who deployed it was told.

What it was for

The instruction came from the FLoC explainer itself:

"For example, a site can opt out of all FLoC cohort calculation by sending the HTTP response header: Permissions-Policy: interest-cohort=()"

It spread fast, because it was one line, cost nothing, and let a site say it had done something. It was never implemented by any browser except Chrome — Firefox and Safari never shipped FLoC, so for their users the header did nothing from the start.

What it names now

FLoC was replaced by the Topics API, and rather than retire the old token Chromium repointed it. From the browser's own feature definitions:

// "browsing-topics" permissions policy that controls the use of Topics API.
kBrowsingTopics = 97,

// "interest-cohort" permissions policy that controls the use of Topics API.
kBrowsingTopicsBackwardCompatible = 98,

⚠️ The name and syntax are the same, and the server config is untouched, but the thing it governs is a different API from the one it was added for. The internal name says it plainly: backward compatible. That is a decision to keep old deployments working, which is a courtesy, and it also means the header quietly changed subject.

Which is fortunate, because the thing it guards is going away too

Chrome's own deprecation notice states that "the browsing-topics and interest-cohort permissions policy features will be removed", and the API's main entry point now rejects calls outright with a message saying it has been removed.

A site that deployed the line in 2021 has seen it guard FLoC, which was cancelled, then get repointed at Topics, which was not what anyone opted out of, and now Topics itself is being withdrawn, taking the token with it. At no point did the config file change.

How many sites are still sending it

We checked fifteen well-known sites. Six send a Permissions-Policy header at all. Of those six, four include interest-cohort — and for every one of the four it is the entire header:

SitePermissions-Policy
gov.ukinterest-cohort=()
php.netinterest-cohort=()
ubuntu.cominterest-cohort=()
duckduckgo.cominterest-cohort=()

These are not careless operations. They are a government service, two major open-source projects and a company whose entire proposition is privacy. This is the point. The header is the kind of thing a careful team adds once, correctly, and never revisits. Nothing ever prompts them to.

Advertisement

What this does not mean

It does not mean these sites are tracking anyone, or that the header is harmful. Sending it costs a few bytes and, while the alias exists, it does still disable the Topics API in Chrome. Nobody is worse off for having it.

It does not mean Chromium did something underhand either. Keeping an old token working is the considerate choice; the alternative was to break every deployment that had followed the official advice. Both the mapping and the removal plan are published in the open.

The point is narrower and worth sitting with. A security or privacy control can change what it governs without a single byte of your configuration changing, and your deployment pipeline will not notice. The line still parses. The linter is happy. The audit sees a privacy header. The subject changed underneath all three.

What to do about it

If you send it, decide deliberately rather than by inheritance. The honest options are to send browsing-topics=() — the current name, which will outlive the alias — or to send both while the alias lasts, or to accept that the API it guards is being withdrawn and drop the line at the next config change.

⚠️ What is not defensible is treating this header's presence as evidence of a current privacy choice. It documents a decision about a system that no longer exists.

More generally, if a header, a policy name or a feature token appears in your configuration and you cannot say what it currently governs, look it up rather than assuming it still means what it meant when it was added. We check our own headers the same way — reading the live response, not the template that is supposed to produce it.

Where this comes from, and what will date it

The original instruction is quoted from the FLoC explainer as still published. The feature mapping is quoted from Chromium's own permissions-policy feature definitions, fetched here and searched directly, with "permissions policy" appearing nine times as a positive control so the single interest-cohort hit is a real match rather than a failed download.

The header census is ours: fifteen sites queried live, six carrying a Permissions-Policy header, four of those carrying interest-cohort as their whole policy.

⚠️ Three limits. Fifteen sites is an illustration, not a survey — it supports "this is still widespread among careful operators" and not any percentage of the web. Header responses vary by user agent and region, so another observer may see a different set. And the removal timing and the thrown error are as Chrome has announced and shipped them; we have quoted the deprecation intent and the feature mapping, which are the durable parts, rather than pinning a release date we did not verify ourselves.

This dates when the alias is removed, at which point the header becomes inert rather than misdirected, and the config lines will still be there. That is the part of the story worth remembering. The line in the config file has outlived every system it was ever meant to control.

Advertisement
Priya Nair
Data, AI Governance & Policy Analyst

Priya Nair covers AI governance, data protection, privacy, and digital trust topics for RECATOOLS.

View author profile → · Editorial policy

About this byline Priya Nair is a RECATOOLS editorial persona for AI governance, privacy, and digital trust coverage. Articles are produced and reviewed under RECATOOLS editorial supervision.

Corrections policy

Advertisement