GET /api/v2/buyer/media-buys/:mediaBuyId/packages
Lists a media buy’s packages with the attributes that identify each one: productId, productName, the package’s own startTime/endTime, and its pacingPeriod (index plus the campaign’s label, e.g. "Week 6"). Use this to turn a description of a package (“the display package ending 2026-08-11”) into the packageId to send to Update campaign. Prefer it over GET /campaigns/:id whenever the goal is to pick a package: this response carries no targeting, creative, or format detail, so it stays small enough for an agent to read in full.
Update campaign is addressed by campaign, not by media buy, so you need the parent campaignId as well as the packageId to act on what you find here. This response does not carry it: keep it from whichever read gave you the media buy ID, or recover it from List campaigns by matching mediaBuys[].mediaBuyId.
Request
Parameters
Response
That is the shape of a paced buy executed after this read shipped. Packages created before it carry no
pacingPeriod at all, and most carry no startTime/endTime either, so on media buys that are already live today the response below is the one to expect. Neither gap can be backfilled.mediaBuyId: the media buy these packages belong to.isPaced: whether this buy was split across pacing periods. Whentrue, expect one package per product per period, and usepacingPeriodto tell them apart where it is present. On buys executed before this read shipped,isPacedistruewhile every package lackspacingPeriod, and the period cannot be recovered.packageCount: how many packages this media buy has.packages[]: grouped by product, then ordered bypacingPeriod.indexwhere it is present. Packages with no recorded period sort bypackageIdas text, which is not dispatch order (..._10sorts before..._2). Never read a period out of a package’s position in this array. See the numbering scheme:packageId: the identifier to quote when updating or pausing this package. Opaque, do not parse it.productId: the seller product this package buys.nullwhen the product is not locally resolvable.productName: the product’s name as published by the seller, when known locally.status:active,paused, orcanceled. Independent of the media buy’s own status: a live buy can carry a paused package.pacingPeriod:{ index, label }.indexis a one-based ordinal counting from the campaign’s first period;labelis how the campaign named it (“Week 6”). Absent when the buy is not paced, and absent on every package created before period identity was recorded.startTime/endTime: ISO 8601. Present on paced packages executed after this read shipped. Absent on an unpaced buy, where the package runs the media buy’s own window and has no separate one, and absent on packages created before the platform retained the window it requested. Match onpacingPeriod.labelwhere you have it, since that is the buyer’s own wording (“Week 6”);endTimeis the fallback when you already know a literal date. Where neither is present,productNameplusbudgetsometimes narrows it to one, but a schedule that gave those periods equal budgets gives their packages identical budgets, and those cannot be told apart through this API.budget: this package’s budget, gross of buyer fees, inbudgetCurrency.budgetCurrency: ISO-4217 currency ofbudget.pacing: how the package spends its budget (even,asap, orfront_loaded).delivery:{ impressions, spend, clicks }. Absent when the package has not delivered yet or the source has not reported.
200 with packageCount: 0 and an empty packages[]. Packages exist only after execute, so a DRAFT buy, a PENDING_APPROVAL buy that has not executed, and a rejected buy all read as empty rather than as an error. See Execute campaign.
Errors
See Errors for the full error shape and recovery semantics.
Related
Packages
Package identity, the id numbering scheme, and pacing period behavior
Get campaign products
The campaign-scoped lean package-ID read for every product on a buy
Update campaign
Pass packageId to update or cancel a single package
Media buy status
Poll live ADCP status after execute