> ## Documentation Index
> Fetch the complete documentation index at: https://docs.interchange.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Sync measurement data

> Upsert time-series performance data as an ADCP alternative to the Conversion API

`POST /api/v2/buyer/advertisers/{advertiserId}/measurement-data/sync`

Advertisers or MMPs call this to provide performance data instead of the Conversion API. Accepts time-series measurement points keyed by campaign, media buy, package, and/or creative. Up to 1,000 measurements per call; deduplicates on `external_row_id`.

## Request

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.interchange.io/api/v2/buyer/advertisers/12345/measurement-data/sync \
    -H "Authorization: Bearer $SCOPE3_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "measurements": [
        {
          "start_time": "2026-03-01T00:00:00-05:00",
          "end_time": "2026-03-07T23:59:59-05:00",
          "metric_id": "incremental_revenue",
          "metric_value": 8450.75,
          "unit": "currency",
          "currency": "USD",
          "campaign_id": "camp_456",
          "media_buy_id": "mb_789",
          "source": "advertiser",
          "source_platform": "acme-analytics",
          "source_metric_name": "Incremental Revenue",
          "external_row_id": "acme_row_001"
        }
      ]
    }'
  ```

  ```json Count metric theme={null}
  {
    "measurements": [
      {
        "start_time": "2026-03-01T00:00:00-05:00",
        "end_time": "2026-03-07T23:59:59-05:00",
        "metric_id": "purchase_count",
        "metric_value": 142,
        "unit": "count",
        "campaign_id": "camp_456",
        "external_row_id": "acme_row_002"
      }
    ]
  }
  ```
</CodeGroup>

## Parameters

| Field                               | Type   | Required    | Notes                                                                                                                                                               |
| ----------------------------------- | ------ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `measurements`                      | array  | Yes         | 1–1000 measurement points                                                                                                                                           |
| `measurements[].start_time`         | string | Yes         | ISO 8601 with timezone offset                                                                                                                                       |
| `measurements[].end_time`           | string | Yes         | ISO 8601 with timezone offset                                                                                                                                       |
| `measurements[].metric_id`          | enum   | Yes         | `revenue`, `incremental_revenue`, `conversions`, `incremental_conversions`, `page_view_count`, `add_to_cart_count`, `purchase_count`, `ltv_1d`, `ltv_7d`, `ltv_30d` |
| `measurements[].metric_value`       | number | Yes         | Measured value                                                                                                                                                      |
| `measurements[].unit`               | enum   | Yes         | `currency`, `count`, `ratio`, `percentage`                                                                                                                          |
| `measurements[].currency`           | string | Conditional | ISO 4217 (`^[A-Z]{3}$`). Required when `unit` is `currency`                                                                                                         |
| `measurements[].campaign_id`        | string | No          | Attach to a campaign (max 255)                                                                                                                                      |
| `measurements[].media_buy_id`       | string | No          | Attach to a media buy (max 255)                                                                                                                                     |
| `measurements[].package_id`         | string | No          | Attach to a package (max 255)                                                                                                                                       |
| `measurements[].creative_id`        | string | No          | Attach to a creative (max 255)                                                                                                                                      |
| `measurements[].source`             | enum   | No          | `advertiser`, `mmp`, `measurement_partner`                                                                                                                          |
| `measurements[].source_platform`    | string | No          | Originating platform (max 255)                                                                                                                                      |
| `measurements[].source_metric_name` | string | No          | Raw partner metric name (max 255)                                                                                                                                   |
| `measurements[].external_row_id`    | string | No          | Idempotency key for re-syncs (max 255)                                                                                                                              |

## Response

```json theme={null}
{
  "measurements": [
    { "index": 0, "action": "created" },
    { "index": 1, "action": "updated" }
  ]
}
```

Each result reports its `index` in the request array and an `action` of `created`, `updated`, `unchanged`, or `failed`. Failed rows include an `error` string.

## Errors

* `400 VALIDATION_ERROR` — missing required field, `start_time` not before `end_time`, missing `currency` when `unit` is `currency`, or more than 1,000 measurements.

See [Errors](/v2/reference/errors) for the full error contract.

## Related

<CardGroup cols={2}>
  <Card title="Measurement tasks" href="/v2/buyer/measurement/tasks" icon="list-check">
    All measurement operations
  </Card>

  <Card title="Measurement overview" href="/v2/guides/measurement-incrementality" icon="chart-line">
    Pipeline, belief state, and concepts
  </Card>

  <Card title="Upload measurement records" href="/v2/buyer/measurement/tasks/upload-measurement-records" icon="upload">
    Batch per-geo outcome records
  </Card>

  <Card title="Get measurement freshness" href="/v2/buyer/measurement/tasks/get-measurement-freshness" icon="clock">
    Confirm data is arriving
  </Card>
</CardGroup>
