GET /api/v2/buyer/reporting/metrics
Returns delivery metrics rolled up across the advertiser → campaign → media buy → package tree. Choose a hierarchical summary or flat timeseries view, scope with advertiserId, campaignId, or mediaBuyId, and set the window with days or an explicit startDate/endDate. This endpoint is day-grain only — for hourly counts use Get event summary.
Request
Parameters
Response
The example below uses illustrative, non-zero
conversionValue, cpa, and
roas values to show the response shape. See the note below the response for
how these fields behave when a seller has not reported conversion data.management state:
tracked (a campaign you did not set up through the platform, mirrored
read-only from a connected provider account) or managed (authored or adopted
through the platform). This surface currently reports managed campaigns only —
tracked mirror delivery is excluded — so totals never silently mix the two
states.
conversionValue is advertiser-attributed revenue from conversions; unlike
spend, it is never grossed up with platform fees. cpa (spend / conversions)
is null when there are no conversions. roas (conversionValue / spend) is
null when spend is zero, or when there is no conversion signal at all — zero
conversions and zero attributed value; it reports a true 0 only when
conversions are real but their attributed value is zero.
These fields depend on the seller reporting conversion data. Where a seller
reports none, conversionValue is 0 and cpa and roas are null.
When download=true, the response is instead { downloadUrl, expiresAt, fileName, rowCount } with a signed URL that expires in 7 days. Treat that URL as a bearer credential.
Errors
400 VALIDATION_ERROR— malformedstartDate/endDate,daysoutside0–90, or acampaignIdthat does not belong to the givenadvertiserId.422 SPEND_DENOMINATION_UNRESOLVED— one or more media buys in scope have spend that cannot be denominated, so no figure would be correct. The error names them in its message and indetails.mediaBuyIds, alongsidedetails.unresolvedCount. Classifiedterminal— do not retry. The cause is delivery data that is wrong at rest (a source reporting a currency it is not paid in, a buy missing its cross-currency booking evidence, or currencies mixed within the period), so every retry reproduces it. Report the named ids to support; to keep reporting in the meantime, scope the request to exclude them (a single campaign, or a period they did not deliver in). Unaffected buys report normally, andview=timeseriescan still return rows for buys whose days each carry their own currency.503 FX_RATE_UNAVAILABLE— the exchange-rate feed could not price a currency pair. Classifiedtransient; retry shortly.
Related
Reporting tasks
All reporting operations
Reporting overview guide
Hierarchy, metrics, CSV export, delivery flow
Get event summary
Hourly event counts by type