Skip to main content
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

curl -X POST https://api.interchange.io/api/v2/buyer/advertisers/12345/measurement-records \
  -H "Authorization: Bearer $SCOPE3_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "records": [
      {
        "outcomeType": "incremental_revenue",
        "geo": "US-CA",
        "timeWindowStart": "2026-03-01",
        "timeWindowEnd": "2026-03-07",
        "value": 8450.75,
        "baselineValue": 7100.00,
        "confidenceInterval": 0.92,
        "source": "acme_incr_rev",
        "lagDays": 7
      }
    ]
  }'

Parameters

FieldTypeRequiredNotes
advertiserIdstringYesPath parameter — the owning advertiser
recordsarrayYes1–5000 records
records[].outcomeTypestringYesOutcome being measured (e.g. incremental_revenue)
records[].geostringYesGeo identifier (e.g. US-CA)
records[].timeWindowStartstringYesDate YYYY-MM-DD
records[].timeWindowEndstringYesDate YYYY-MM-DD
records[].valuenumberYesMeasured value
records[].sourcestringYesSource key (matches a measurement source)
records[].baselineValuenumberNoCounterfactual baseline
records[].confidenceIntervalnumberNoConfidence on the value
records[].lagDaysintegerNoReporting lag in days

Response

{
  "recordsUpserted": 1,
  "records": [
    {
      "id": "mr_001",
      "advertiserId": "12345",
      "outcomeType": "incremental_revenue",
      "geo": "US-CA",
      "timeWindowStart": "2026-03-01",
      "timeWindowEnd": "2026-03-07",
      "value": 8450.75,
      "baselineValue": 7100.00,
      "confidenceInterval": 0.92,
      "source": "acme_incr_rev",
      "receivedAt": "2026-04-19T08:00:00Z",
      "lagDays": 7
    }
  ]
}
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 — empty records, more than 5,000 records, a missing required field, or a malformed timeWindowStart/timeWindowEnd date.
  • 404 NOT_FOUNDadvertiserId does not exist or is not visible to the authenticated customer.
See Errors for the full error contract.

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