curl --request GET \
--url https://api.apostra.com/api/v2/storefront/media-buys/{mediaBuyId}/timeline \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.apostra.com/api/v2/storefront/media-buys/{mediaBuyId}/timeline"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.apostra.com/api/v2/storefront/media-buys/{mediaBuyId}/timeline', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"mediaBuyId": "<string>",
"buyer": {
"customerId": 0,
"name": "<string>"
},
"approval": {
"status": "<string>",
"submittedAt": "<string>",
"reviewedBy": "<string>",
"reviewedAt": "<string>",
"reviewerNotes": "<string>",
"forwardedAt": "<string>",
"submittedPayload": {}
},
"stages": [
{
"stage": "received",
"at": "<string>",
"detail": "<string>",
"evidence": [
{
"at": "<string>",
"kind": "exchange_event",
"eventType": "<string>",
"outcome": "<string>",
"errorCode": "<string>",
"recovery": "transient",
"attemptNumber": 0,
"hiddenCount": 0,
"detail": "<string>"
}
]
}
],
"legs": [
{
"sourceId": "<string>",
"sourceName": "<string>",
"sourceKind": "<string>",
"currentStatus": "<string>",
"forwardedAt": "<string>",
"responseReceivedAt": "<string>",
"theirReference": {
"mediaBuyId": "<string>",
"taskId": "<string>"
},
"platformReference": {
"idempotencyKey": "<string>",
"requestedAt": "<string>"
},
"stages": [
{
"stage": "received",
"at": "<string>",
"detail": "<string>",
"evidence": [
{
"at": "<string>",
"kind": "exchange_event",
"eventType": "<string>",
"outcome": "<string>",
"errorCode": "<string>",
"recovery": "transient",
"attemptNumber": 0,
"hiddenCount": 0,
"detail": "<string>"
}
]
}
],
"forwardedPayload": {},
"responsePayload": {},
"payloadHighlights": {
"flightStart": "<string>",
"flightEnd": "<string>",
"budget": 123,
"currency": "<string>",
"packageCount": 0,
"productIds": [
"<string>"
],
"targetingKeys": [
"<string>"
],
"signalTargetingSelections": [
{
"scope": "<string>",
"signalId": "<string>",
"groupOperator": "any",
"minValue": 123,
"maxValue": 123
}
]
},
"replayed": true,
"note": "<string>"
}
],
"goal": {
"goal": {
"kind": "metric",
"subject": "<string>",
"eventTypes": [
"<string>"
],
"target": {
"kind": "cost_per",
"value": 123
}
},
"askedTarget": {
"kind": "cost_per",
"value": 123
},
"answeredTarget": {
"kind": "cost_per",
"value": 123
},
"commitment": "guaranteed",
"commitmentSource": "proposal",
"actual": {
"kind": "cost_per",
"value": 123,
"unit": "impressions",
"units": 1,
"denominatorUnits": 1,
"perUnits": 1,
"currency": "<string>"
},
"verdict": "on_track",
"judgedAgainst": "asked",
"verdictWithheld": "no_goal",
"basis": {
"kind": "seller_attested"
},
"freshness": {
"dataThrough": "<string>",
"reportingPeriodEnd": "<string>",
"nextExpectedAt": "<string>",
"notificationType": "<string>",
"sequenceNumber": 123,
"awaitingLaterReport": true,
"missingMetrics": [
"<string>"
]
},
"optimizedBy": {
"actor": "ad_server",
"detail": "<string>"
}
},
"eventsTruncated": true
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}Get one buy's exchange timeline
The seller-scoped projection of the buy’s exchange record: stages (received → screened → decided → forwarded / forward-failed → submitted → source moderation → accepted / rejected → delivering) with evidence, per-source legs, and the references to quote per state — the source’s own ids as their reference, and the sf: idempotency key paired with the request timestamp as the platform reference. The forwarded payload is returned minus platform-internal fields (webhook/push-notification config and signing material); admin-only material never appears. {"pruned": true} payloads mean retention removed the bytes.
curl --request GET \
--url https://api.apostra.com/api/v2/storefront/media-buys/{mediaBuyId}/timeline \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.apostra.com/api/v2/storefront/media-buys/{mediaBuyId}/timeline"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.apostra.com/api/v2/storefront/media-buys/{mediaBuyId}/timeline', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"mediaBuyId": "<string>",
"buyer": {
"customerId": 0,
"name": "<string>"
},
"approval": {
"status": "<string>",
"submittedAt": "<string>",
"reviewedBy": "<string>",
"reviewedAt": "<string>",
"reviewerNotes": "<string>",
"forwardedAt": "<string>",
"submittedPayload": {}
},
"stages": [
{
"stage": "received",
"at": "<string>",
"detail": "<string>",
"evidence": [
{
"at": "<string>",
"kind": "exchange_event",
"eventType": "<string>",
"outcome": "<string>",
"errorCode": "<string>",
"recovery": "transient",
"attemptNumber": 0,
"hiddenCount": 0,
"detail": "<string>"
}
]
}
],
"legs": [
{
"sourceId": "<string>",
"sourceName": "<string>",
"sourceKind": "<string>",
"currentStatus": "<string>",
"forwardedAt": "<string>",
"responseReceivedAt": "<string>",
"theirReference": {
"mediaBuyId": "<string>",
"taskId": "<string>"
},
"platformReference": {
"idempotencyKey": "<string>",
"requestedAt": "<string>"
},
"stages": [
{
"stage": "received",
"at": "<string>",
"detail": "<string>",
"evidence": [
{
"at": "<string>",
"kind": "exchange_event",
"eventType": "<string>",
"outcome": "<string>",
"errorCode": "<string>",
"recovery": "transient",
"attemptNumber": 0,
"hiddenCount": 0,
"detail": "<string>"
}
]
}
],
"forwardedPayload": {},
"responsePayload": {},
"payloadHighlights": {
"flightStart": "<string>",
"flightEnd": "<string>",
"budget": 123,
"currency": "<string>",
"packageCount": 0,
"productIds": [
"<string>"
],
"targetingKeys": [
"<string>"
],
"signalTargetingSelections": [
{
"scope": "<string>",
"signalId": "<string>",
"groupOperator": "any",
"minValue": 123,
"maxValue": 123
}
]
},
"replayed": true,
"note": "<string>"
}
],
"goal": {
"goal": {
"kind": "metric",
"subject": "<string>",
"eventTypes": [
"<string>"
],
"target": {
"kind": "cost_per",
"value": 123
}
},
"askedTarget": {
"kind": "cost_per",
"value": 123
},
"answeredTarget": {
"kind": "cost_per",
"value": 123
},
"commitment": "guaranteed",
"commitmentSource": "proposal",
"actual": {
"kind": "cost_per",
"value": 123,
"unit": "impressions",
"units": 1,
"denominatorUnits": 1,
"perUnits": 1,
"currency": "<string>"
},
"verdict": "on_track",
"judgedAgainst": "asked",
"verdictWithheld": "no_goal",
"basis": {
"kind": "seller_attested"
},
"freshness": {
"dataThrough": "<string>",
"reportingPeriodEnd": "<string>",
"nextExpectedAt": "<string>",
"notificationType": "<string>",
"sequenceNumber": 123,
"awaitingLaterReport": true,
"missingMetrics": [
"<string>"
]
},
"optimizedBy": {
"actor": "ad_server",
"detail": "<string>"
}
},
"eventsTruncated": true
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}{
"data": null,
"error": {
"code": "<string>",
"message": "<string>",
"field": "<string>",
"details": {}
}
}Authorizations
API key or access token
Path Parameters
Media buy id at the storefront grain (sf_mb_…).
1Query Parameters
Buyer customer id that owns this buyer-scoped media-buy id. Omit only for compatibility with callers whose ids are globally unambiguous.
0 < x <= 9007199254740991Response
Get one buy's exchange timeline
The seller-scoped projection of a buy's exchange timeline: only this storefront's legs; forwarded/response payloads minus platform-internal fields; no admin-only material (resolution cache internals, worker poll internals, cross-tenant audit rows).
Show child attributes
Show child attributes
The approval-queue row, when the buy rode the review flow.
Show child attributes
Show child attributes
Buy-level stages (pre-fan-out): received, screened, decided, and any pre-dispatch failure.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The buyer's goal for this buy and how delivery compares — the same block the media-buy list carries, and the same verdict the buyer sees. Null when this seller holds no goal for the buy, and also on the rare read failure: the block is assembled from a commitment read and a delivery read, and either one failing leaves it absent rather than showing a half-assembled goal. Those failures are captured to Sentry, so an outage has an operational signal even though this field cannot distinguish it from genuine absence.
Show child attributes
Show child attributes
True when more ledger events exist than were hydrated into this timeline.