demo · v130

device vs server auction latency

Bidding & Auction Services moves the Protected Audience auction off the device and onto Trusted Execution Environment servers. The motivation is performance: many buyers running JavaScript bidders against trusted key/value lookups inside a phone's battery budget gets expensive fast. This calculator applies the explainer's cost model so you can dial up the buyer count and watch the curves diverge.

Privacy Sandbox cost model Real Bidding & Auction Services requires SSP/DSP servers running inside an attested TEE (AWS Nitro, GCP Confidential Space). This page keeps the cost model from the explainer visible; the sibling API probes call navigator.getInterestGroupAdAuctionData() where the browser exposes it.
8
120 ms
6 / 10

on-device auction (legacy)

total
– ms
device wallclock
– ms
network
– ms

B&A services (Chrome 130+)

total
– ms
device wallclock
– ms
network
– ms
trusted KV fetch generateBid() scoreAd() render network

cost model

The numbers above apply the published cost model in the explainer. For an on-device auction Chrome runs generateBid() for every interest group on the device, fetches trusted bidding signals from each buyer's TKV server, then runs scoreAd() for every bid. With B&A, the browser bundles all the buyers' ciphertext into a single request to the seller's auction server; the server runs all the bid functions in parallel inside a TEE and returns one winning ad ciphertext. The device's only cost is a single network round-trip plus rendering.

The crossover point in real telemetry is around 5–7 buyers on a mid-range phone — below that, the on-device path wins because the network round-trip dominates; above that, the server path scales linearly slower because the buyers run in parallel.

the code

// On-device auction (legacy path)
const winner = await navigator.runAdAuction({
  seller: "https://ssp.example",
  decisionLogicURL: "https://ssp.example/scoreAd.js",
  interestGroupBuyers: ["https://buyer1.example", "https://buyer2.example", /* ... */],
  // each buyer's generateBid runs on the device
});

// B&A auction (Chrome 130+)
const auctionBlob = await navigator.getInterestGroupAdAuctionData({
  seller: "https://ssp.example",
});
// auctionBlob is a single encrypted payload — send it to the seller.
const resp = await fetch("https://ssp.example/auction", {
  method: "POST", body: auctionBlob.request,
});
const winner = await navigator.runAdAuction({
  seller: "https://ssp.example",
  serverResponse: await resp.arrayBuffer(),
  requestId: auctionBlob.requestId,
});

see also