POST /api/v2/buyer/advertisers/{advertiserId}/measurement-records
Uploads outcome measurement records (sales, brand lift, etc.) directly to the learning engine. Each record carries a value for one outcome type, geo, and time window. Up to 5,000 records per call. Records upsert on (customer, seat, outcomeType, source, geo, time window).
Request
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
advertiserId | string | Yes | Path parameter — the owning advertiser |
records | array | Yes | 1–5000 records |
records[].outcomeType | string | Yes | Outcome being measured (e.g. incremental_revenue) |
records[].geo | string | Yes | Geo identifier (e.g. US-CA) |
records[].timeWindowStart | string | Yes | Date YYYY-MM-DD |
records[].timeWindowEnd | string | Yes | Date YYYY-MM-DD |
records[].value | number | Yes | Measured value |
records[].source | string | Yes | Source key (matches a measurement source) |
records[].baselineValue | number | No | Counterfactual baseline |
records[].confidenceInterval | number | No | Confidence on the value |
records[].lagDays | integer | No | Reporting lag in days |
Response
recordsUpserted is the number of records inserted or updated (records upsert on (customer, seat, outcomeType, source, geo, time window), so re-uploading the same key updates in place). records[] echoes the persisted rows.
Errors
400 VALIDATION_ERROR— emptyrecords, more than 5,000 records, a missing required field, or a malformedtimeWindowStart/timeWindowEnddate.404 NOT_FOUND—advertiserIddoes not exist or is not visible to the authenticated customer.
Related
Measurement tasks
All measurement operations
Measurement overview
Pipeline, belief state, and concepts
List measurement records
Query uploaded records
Upload context records
Add market conditions to partial out