The calls, side by side
Every V3 call is a
POST to https://api.apostra.com/api/v3/tools/<operation>
with your key as a bearer token. A key that belongs to one account needs no
other header. See Make a request.
Read advertisers
data.objects.results, one object per advertiser with
advertiserId, name, primaryCurrency and status. To read one advertiser,
call get with kind: "advertiser" and its id; the advertiser is in
data.object.
Read an advertiser’s campaigns
data.objects.results[].campaign.campaignId and
data.objects.results[].advertiser.advertiserId. Filters always go inside
filter; V3 HTTP does not read a filter from the top level of the body.
Page through results
v2 paged with numbers (limit and offset for advertisers, take and skip
for campaigns). V3 pages with a cursor:
- Send
limit(up to 200 forsearch, up to 100 rows forget_delivery). - If the response has a
nextCursor(data.objects.nextCursorforsearch,data.page.nextCursorforget_delivery), send the same request again withcursorset to it. - Stop when the response has no
nextCursor.
limit.
Read delivery
v2GET /api/v2/buyer/reporting/metrics becomes get_delivery with
report: "campaign_delivery". For one advertiser and one day:
- Dates. Send
range.startDateandrange.endDate(up to 90 days), orrange.lifetime: true. There is nodaysparameter. - Grouping.
dimensionschooses the grouping, fromdate,advertiser,campaign,media_buy,packageand others. Each row carries its dimension values inrows[].dimensions, for examplerows[].dimensions.campaign.id. - Metric values. Each metric is an object, not a bare number:
{"value": 1250, "status": "available"}. Whenstatusisunavailable,valueisnullandreasonsays why. A missing value is never reported as zero. - Totals.
data.totals.metricsholds the total for each metric. When the matched delivery mixes provisional (Snapshot) and final (Official) figures,totalsgives no number andtotalsByFinalitygives one total per class. See Reporting for what each label means. - Paging. Rows come in pages of up to 100 (
limit); followdata.page.nextCursoras above.
Metric names
V3 uses AdCP’s delivery metric names.The v2 summary view
v2 reporting returns a tree by default (view=summary): advertiser, then
campaign, media buy and package, with totals at each level. get_delivery
returns flat rows instead. To build the same tree, request
dimensions: ["campaign", "media_buy", "package"] and group the rows in your
client. For daily rows, add date.
These v2 reporting features have no V3 equivalent today: delivery pace and goal
progress in the summary view, the converted cross-advertiser total
(displayCurrency), outcome counts from your measurement uploads
(outcomeType), and CSV download (download=true). If you depend on one of
them, tell us before you move.
Errors
V3 returns a non-2xx status with an AdCP error inerror; data is null.
- A request body that does not match the operation’s schema returns
422with codeINVALID_REQUEST, anderror.details.validationnames the field. v2 returned400for invalid query parameters. - A key cannot reach another account. Sending an
X-SCOPE3-CUSTOMER-IDheader that does not match the key’s account returns403.