Overview
A Package is the delivery unit beneath a Media Buy: one package per product, multiplied by the number of pacing periods. Packages are created when a media buy executes — like media buys, they are not directly creatable. Each package carries its own budget, pacing strategy, bid price, and optimization goals, and reports its own delivery metrics.Packages are spawned at execution. A product selected on a
DRAFT campaign becomes one package per pacing period once the campaign executes and the media buy submits to ADCP.Where a package sits in the hierarchy
Per-package fields
Package identity and the id numbering scheme
Every package carries apackageId that is stable for the life of the package, and it is what you pass in packageIds or packages[] when you cancel or update one package (see Cancel a single package below). Storefront-minted ids follow this shape:
N is a one-based position across the whole dispatch, not a period number, and it is not stable across media buys. On a buy with 2 products over 3 pacing periods, _1 through _6 cover both products: the first three belong to one product, the next three to the other.
Going from a description to a packageId
A buyer or their agent typically has a description, not an id: “the display package ending 2026-08-11.” Get media buy packages resolves that directly, no seller-side export needed. Match onproductName plus endTime (or pacingPeriod.label), then take packageId:
productName alone does not pick one. The endTime does: the second entry ends 2026-08-11T23:59:59Z, so its packageId (sf_pkg_sf_mb_1783618937177_43ycbp7b_2) is the one to send. Match on the field, not on the trailing number.
Packages without a recorded flight window
startTime, endTime, and pacingPeriod are absent on packages created before the platform started retaining this identity, and on any media buy that was never split across periods. Expect this to be the common case on buys that are already live: no package created before the change carries a period, and most carry no window either. The platform now keeps the flight window it requested even when the seller’s response omits it, but it cannot reconstruct one for a package already stored without it, so the gap is permanent for those packages.
The periods themselves are still readable on the campaign, including each period’s label and dates. What is missing is only the link from a package to its period.
For those packages, productName plus budget sometimes narrows it to one. Often it will not: a schedule that gives several periods the same budget gives their packages identical budgets, so same-product siblings come back indistinguishable, and nothing this API returns separates them. Those packages cannot be addressed individually, and the seller is the only remaining route. Check for the presence of startTime/endTime before matching on them, and treat two identical entries as unresolved rather than picking one: pausing the wrong period is worse than asking.
Pacing strategies
Delivery metrics
Delivery metrics roll up per package:impressionsspend— gross (fee-inclusive), stated at the fee terms locked on the parent media buy, so it compares directly against the package’s budget. Packages under a legacy media buy created before fee terms were locked report spend net, as the seller reported itclicks
Meta property coverage
Meta Audience Network can deliver outside properties owned by Meta, and Meta does not provide a complete publisher-property roster during product discovery. Standard AdCP 3.1 Meta products therefore use an explicit, closed set of the advertised Facebook and Instagram placements rather than allowing Meta to expand delivery into undisclosed properties. Buyers enrolled in Interchange’s authenticated candidate AdCP 3.2 path can retain Advantage+ Placements. Those products declareproperty_coverage.disclosure: partial,
set property_targeting_allowed: false, and name the known Facebook and
Instagram properties without claiming they are exhaustive. The same trusted
contract is required again when the package is created; a candidate product ID
cannot be submitted through an ordinary 3.1 call. Explicit Facebook or
Instagram placement selections remain complete and support placement-level
delivery reporting.
How pacing periods create packages
Each product becomes one package per pacing period. The campaign’spacingPeriods defines time-windowed spend intensity within the flight, in one of two modes:
weight— relative weights (e.g.3.0= 3x normal); budget is distributed proportionally across periods.budget— an explicit dollar amount per period.
Example: three periods → three packages per product
Cancel a single package
To cancel one package without touching the rest of its media buy, passpackageIds on a mediaBuys[] entry in PUT /api/v2/buyer/campaigns/:id. Resolve the packageId first with Get media buy packages:
packages[] array with action: "update":
Related concepts
Get media buy packages
Resolve a description (“the display package ending 2026-08-11”) to a packageId
Media Buy
The parent ADCP transaction that spawns packages
Pacing periods
Time-windowed spend intensity that multiplies products into packages
Campaign
The parent media plan