v152 · privacy sandbox · web api · deprecated
Deprecate and remove: Private Aggregation API
Chrome is removing the Private Aggregation API — the Privacy Sandbox mechanism that let Shared Storage and Protected Audience worklets emit noisy, aggregate cross-site measurement reports. The API was designed for a future without third-party cookies; Chrome’s decision to keep the current third-party-cookie approach removed its reason to exist. The surface (privateAggregation.contributeToHistogram() and friends) is exposed only inside those two worklet contexts, which are themselves being removed, so no standalone API change reaches the open web.
The Private Aggregation API is on a published deprecation path (Intent to Deprecate and Remove): deprecated from Chrome 144, with removal planned from Chrome 150 and the intervention filed at milestone 152. Server-side summary-report computation stopped operating in late December 2025. New code must not call privateAggregation; existing callers should follow the migration paths. At fetch time the JavaScript surface still exists in Chromium source (gated by a Finch-controlled feature) — removal is being executed as a staged disablement, not a single code deletion (see timeline).
at a glance
| What it was | A generic mechanism for measuring aggregate, cross-site data in a privacy-preserving manner: worklet code contributed encrypted histogram buckets that a server-side aggregation service later summed with noise into “summary reports” (ChromeStatus 4683382919397376) |
|---|---|
| Where it was exposed | Only inside Shared Storage worklets and Protected Audience interest-group script runners — never on window in an ordinary document |
| Milestone listing | Chrome 152 — “Deprecated” (listing, verified 2026-07-29; the listing is authoritative for identity per gendn invariant #2) |
| Deprecation path | Deprecated in Chrome 144, removal planned from Chrome 150; server-side summary-report computation ended late December 2025 (ChromeStatus feature notes) |
| Usage at deprecation | ~3% of page loads — high for a removal, but driven by a small number of third-party ad-tech scripts present on many sites (feature notes) |
| Replacement | None. Cross-site measurement remains possible with third-party cookies; Google states removal helps “focus efforts on the proposed interoperable Attribution standard” (intent) |
| Specification | Private Aggregation API — Unofficial Proposal Draft, 13 May 2025; repository archived 2025-12-01 |
| WPT | None: no private-aggregation directory exists in the WPT repository (directory listing checked 2026-07-29) |
why it was removed
The Intent to Deprecate and Remove gives three reasons, verbatim in substance:
- Third-party cookies are staying. The API “was originally designed for a future without third-party cookies”; after Chrome announced the current approach to third-party cookies will be maintained, adoption was expected to decrease since cross-site measurement remains possible with cookies.
- No other engine ever adopted it. “Other browser engines have not signaled interest in launching the API” — Mozilla’s standards-position record was closed as “proposal appears stale” and WebKit’s as “proposal withdrawn”, neither recording an implementation.
- Focus. Removing this and certain other Privacy Sandbox APIs “will help focus efforts on the proposed interoperable Attribution standard” (see Privacy Sandbox feature status).
Because the API surface is only reachable from inside Shared Storage and Protected Audience worklets — both on their own removal paths (Shared Storage deprecation record, Protected Audience deprecation record) — the intent states “no additional work will be required for Private Aggregation”: its functionality is removed transitively when those host APIs go.
Source: blink-dev — Intent to Deprecate and Remove: Private Aggregation API; ChromeStatus API recordremoval timeline
| When | What happened / is planned |
|---|---|
| 2025-10-21 | Deprecation feature recorded on ChromeStatus (record metadata); Intent to Deprecate and Remove posted to blink-dev |
| Chrome 144 | Deprecation begins (feature notes); new enrollment sign-ups disallowed; enrolled sites contacted about timelines |
| Late December 2025 | Server-side summary-report computation stops operating. Users of that service were notified in advance and directed to debug reports until the API surface as a whole is removed. Because this affects post-facto server-side operations, it caused no user-facing breakage (feature notes) |
| Chrome 150 | Planned removal of the API surface (feature notes); the intent notes that if usage stayed too high, Protected Audience and Shared Storage could be temporarily retained with stub/no-op implementations — in which case the worklet contexts where privateAggregation exists would simply no longer be created |
| Chrome 152 (this listing) | The intervention is filed under “Deprecated” in the milestone=152 listing (verified 2026-07-29) |
| Code state at fetch time | The surface is not yet deleted from source. On the M152 branch the IDL and the kPrivateAggregationApi base feature remain, FEATURE_ENABLED_BY_DEFAULT with Finch parameters enabled_in_shared_storage / enabled_in_fledge (features.cc, M152 branch); at trunk the IDL still exists (private_aggregation.idl) while the base feature no longer appears in blink/common/features.cc (both fetched 2026-07-29). Removal is proceeding as a staged, Finch-controlled disablement rather than a single deletion |
the removed surface
The whole developer-facing surface was one interface exposed on two worklet global scopes, plus the reporting pipeline it fed. The normative IDL from the final published draft (§ the exposed interface), verbatim:
[Exposed=(InterestGroupScriptRunnerGlobalScope,SharedStorageWorklet),
SecureContext]
interface PrivateAggregation {
undefined contributeToHistogram(PAHistogramContribution contribution);
undefined contributeToHistogramOnEvent(DOMString event,
record<DOMString, any> contribution);
undefined enableDebugMode(optional PADebugModeOptions options = {});
};
dictionary PAHistogramContribution {
required bigint bucket;
required long value;
bigint filteringId = 0;
};
dictionary PADebugModeOptions {
required bigint debugKey;
};
| Surface item | Documented at |
|---|---|
PrivateAggregation interface (the worklet-global object) | privateaggregation-interface/ reference |
contributeToHistogram(contribution) | method contract |
contributeToHistogramOnEvent(event, contribution) | method contract |
enableDebugMode(options) | method contract |
PAHistogramContribution / PADebugModeOptions dictionaries | dictionary contracts |
Aggregatable report pipeline (.well-known endpoints, server-side aggregation) | aggregatable-reports/ reference |
what calling code sees now
Because privateAggregation was only ever exposed inside Shared Storage and Protected Audience worklets, ordinary page JavaScript cannot touch it directly — and the intent states the contexts that expose it “would still no longer be created” even in the stub-retention contingency. Inside a worklet, the removal sequence is:
- Disablement (current staged step): with the Finch-controlled feature off, the worklet global no longer exposes
privateAggregation— reading it yieldsundefined, and callingprivateAggregation.contributeToHistogram(...)throws aTypeError(Cannot read properties of undefined). Contributions silently stop flowing; no reports are generated. - Host-API removal (end state): when Shared Storage and Protected Audience are themselves removed, the worklets never run at all, so the question becomes moot — see the host deprecations (Shared Storage, Protected Audience).
Defensive guard for worklet code that must survive the transition (the pattern the spec’s own callers were advised to use):
// Inside a Shared Storage or Protected Audience worklet:
if (typeof privateAggregation !== "undefined") {
privateAggregation.contributeToHistogram({ bucket: 1n, value: 128 });
}
// After disablement/removal this is a silent no-op instead of a TypeError.
Source: Intent to Deprecate and Remove — “Possible breakage”; draft — exposed interface
migration paths
| Situation | Path |
|---|---|
| Cross-site reach / conversion measurement | Third-party cookies remain available in Chrome — the stated rationale for the removal is precisely that cross-site measurement “will remain possible in Chrome using third-party cookies” (intent — Motivation) |
| Aggregate reporting already collected | Server-side summary-report computation ended late December 2025; affected users were told to switch to debug reports until the API surface as a whole is removed (feature notes). Debug reports were unencrypted, immediate reports enabled via enableDebugMode() |
| Private measurement going forward | No in-browser replacement exists. The intent says removal “will help focus efforts on the proposed interoperable Attribution standard” — a future standards-track effort, not a drop-in API; track it via the Privacy Sandbox status page. Chrome’s separate Attribution Reporting API is itself being deprecated and removed under the same consolidation |
| Enrollment / operations | New enrollment sign-ups were disallowed once the intent was approved; enrolled sites were contacted with deprecation timelines (feature notes) |
reporting pipeline sunset
Contributions made in a worklet were encrypted into an aggregatable report and sent by the browser to a fixed endpoint on the reporting origin — .well-known/private-aggregation/report-<api>, with the aggregation service’s public keys fetched from .well-known/aggregation-service/v1/public-keys (draft — report scheduling). The full pipeline is documented on the aggregatable-reports/ child page, including which stage ended when:
- Worklet contribution — ends with the API disablement/removal described above.
- Report delivery to the origin’s
.well-knownendpoint — stops when no further contributions are made. - Server-side aggregation into summary reports — already ended (late December 2025), ahead of the client-side surface (feature notes).
examples
Historical usage (from the pre-removal developer flow): a Shared Storage worklet recording a conversion bucket after reading cross-site data:
// Inside a Shared Storage worklet operation (REMOVED API — do not use):
class MeasureConversion {
async run(data) {
// bucket: a 128-bit id; value: a contribution amount
privateAggregation.contributeToHistogram({ bucket: 543n, value: 1 });
}
}
register("measure-conversion", MeasureConversion);
browser compatibility
Interim table. There is no BCD entry for PrivateAggregation (BCD api/ directory has no PrivateAggregation.json, checked 2026-07-29) and a webstatus.dev query returns zero features. Rows below are compiled from the linked primary sources, not from BCD.
| Browser | Support | Evidence |
|---|---|---|
| Chrome | Shipped (Shared Storage / Protected Audience worklets), deprecated from 144, removal filed at 152 | milestone=152 listing (“Deprecated”); feature notes |
| Edge | Follows Chromium | Chromium-based; no separate position on record |
| Firefox | Never implemented | mozilla/standards-positions #805 — closed, “proposal appears stale” |
| Safari | Never implemented | WebKit/standards-positions #189 — closed, “proposal withdrawn” |
security and privacy
- What the API protected: contributions were encrypted so only the trusted aggregation service could read them; individual worklet inputs were never exposed to the reporting origin in the clear, and summary reports added noise to limit cross-site identity leakage (the API’s stated purpose per the draft).
- Removal direction is privacy-positive or neutral: no new data flow is created by removal; the measurement flows that remain (third-party cookies, first-party analytics) pre-date the API. Sites that depended on the privacy properties of aggregate measurement lose that option and must re-evaluate their measurement design (see migration paths).
- Residual data: previously collected encrypted reports held by an origin’s aggregation-service deployment can no longer be processed into new summary reports once server-side computation has ended (late December 2025) — retained ciphertext has no supported decryption path (feature notes).
- Debug reports caveat: the interim debug-report path bypasses the aggregation service’s privacy protections by design (unencrypted, per-event) — acceptable only as a short migration bridge, and it ends with the API surface itself.
specifications
| Document | Status |
|---|---|
| Private Aggregation API — Unofficial Proposal Draft, 13 May 2025 (editor: Alexander Turner, Google) | Final published draft; never on a W3C Recommendation track |
| patcg-individual-drafts/private-aggregation-api | Specification repository — archived, last push 2025-12-01 |
WICG/private-aggregation (former location) | Deleted — the earlier WICG repo and its wicg.github.io/private-aggregation rendering both return 404 (checked 2026-07-29); no public archive link is recorded in the remaining sources, and gendn does not imply one exists |
| Privacy Sandbox feature status | Google’s tracker for the wider Sandbox wind-down referenced by the intent |
see also
- Chrome Platform Status — Deprecate and remove: Private Aggregation API (API record)
- blink-dev — Intent to Deprecate and Remove: Private Aggregation API
- ChromeStatus — Deprecate and Remove: Shared Storage API (host API #1)
- ChromeStatus — Deprecate and Remove Protected Audience (host API #2)
- ChromeStatus — Deprecate and remove: Attribution Reporting API (sibling consolidation removal)
- gendn — PrivateAggregation interface reference (removed surface) · gendn — aggregatable reports pipeline
- Chrome Platform Showcase — demo for this feature