← Deprecate and remove: Private Aggregation API

v152 · privacy sandbox · reporting · sunset

Aggregatable reports pipeline

The reporting half of the removed Private Aggregation API: how worklet contributions became encrypted aggregatable reports, where the browser delivered them, and the server-side aggregation that turned them into summary reports — including the precise order in which each stage shut down.

Server-side aggregation already ended

Summary-report computation on the server side stopped operating in late December 2025, ahead of the client-side API surface (ChromeStatus feature notes). Former users were directed to debug reports as a bridge. Retained encrypted report payloads have no supported processing path.

the pipeline, end to end

  1. Contribute. Worklet code called privateAggregation.contributeToHistogram(); contributions were validated (bucket < 2128, non-negative value) and queued for the invocation.
  2. Assemble. When the worklet invocation ended, the browser packaged the contributions into an aggregatable report — a struct carrying the reporting origin, original report time and (randomized) report time, the contribution list, the API context (“shared-storage” or Protected Audience), a report ID, an aggregation coordinator, an optional context ID, and the filtering-ID byte bound (draft — §4.8 Aggregatable report).
  3. Encrypt. The contribution payload was encrypted to the aggregation service’s public key, fetched from .well-known/aggregation-service/v1/public-keys on the coordinator’s origin; the browser could not read it back and neither could the reporting origin.
  4. Deliver. The browser POSTed the report — JSON with a shared_info envelope and an aggregation_service_payloads array — to a fixed path on the reporting origin: .well-known/private-aggregation/report-<api> (for example report-shared-storage). Reports could not be sent to arbitrary endpoints — only that well-known path (draft — report scheduling & serialization).
  5. Aggregate. The origin later batched encrypted payloads to the aggregation service (a trusted-execution-environment deployment), which decrypted, summed with noise, and produced summary reports.
Source: Private Aggregation API draft (structures §4.8, algorithms §9)

endpoint contract

Report destinationhttps://<reporting origin>/.well-known/private-aggregation/report-<api> — fixed, per-API suffix; no arbitrary endpoints (draft)
Public keys.well-known/aggregation-service/v1/public-keys on the aggregation coordinator’s origin
MethodBrowser-initiated POST, on a delay, with retries per the browser’s reporting machinery; not interceptable by page script
BodyJSON object: shared_info (origin, times, report ID, API context) + aggregation_service_payloads (encrypted contribution ciphertext)
NowOrigins can stop serving the endpoint once disablement is complete for their traffic; the browser stops generating reports when the API is off
Source: Private Aggregation API draft — report scheduling / serializing reports

sunset sequence

StageState
Server-side summary-report computationEnded late December 2025, ahead of everything else; affected users notified in advance and pointed at debug reports; “no user-facing breakage” by design (feature notes)
Client-side contribution (worklet calls)Deprecated from Chrome 144; removal planned from Chrome 150 and filed at milestone 152; executed as staged Finch disablement (see the overview timeline)
Report delivery (.well-known POSTs)Stops automatically once no contributions are made; no endpoint changes are required of sites, but retained payloads are unprocessable
Debug reportsThe sanctioned bridge for former server-side users; ends together with the API surface (feature notes)
Source: ChromeStatus API record (feature notes); Intent to Deprecate and Remove

examples

The delivery step, as an origin’s .well-known endpoint would have seen it (field set per the draft’s aggregatable-report struct and serialization; ciphertext elided):

POST /.well-known/private-aggregation/report-shared-storage HTTP/1.1
Host: ad-tech.example
Content-Type: application/json

{
  "shared_info": "{\"reporting_origin\":\"https://ad-tech.example\",
    \"api\":\"shared-storage\", \"report_id\":\"<uuid>\", ...}",
  "aggregation_service_payloads": [
    { "payload": "<encrypted contributions — opaque to the origin>" }
  ]
}

An aggregation-service batch later turned many such payloads into one summary report: per-bucket sums plus noise — the only output where individual user contributions were (probabilistically) protected. That service is what shut down in late December 2025.

Source: report struct and wire keys per the Private Aggregation API draft (§4.8, §9); shutdown per the ChromeStatus feature notes

browser compatibility

The pipeline was Chromium-only end to end; no other engine generated or accepted these reports. Interim table (no BCD entry; webstatus.dev zero matches, 2026-07-29):

BrowserSupportEvidence
ChromeGenerated reports until staged disablement (deprecated 144, removal filed 152)milestone=152 listing; feature notes
EdgeFollows ChromiumChromium-based; no separate position on record
FirefoxNever implementedmozilla/standards-positions #805
SafariNever implementedWebKit/standards-positions #189
Source: chromestatus.com/feature/4683382919397376; vendor position records as linked per row

security and privacy

Source: Private Aggregation API draft; ChromeStatus API record