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.
navigator.getInterestGroupAdAuctionData() where the browser exposes it.
on-device auction (legacy)
total
device wallclock
network
B&A services (Chrome 130+)
total
device wallclock
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,
});