Skip to main content

Overview

The Scope3 Measurement Engine turns raw advertising signals into causal evidence about what is working. Instead of treating every conversion as proof, it asks the harder question — would that conversion have happened anyway? — and updates a running set of beliefs about each campaign’s incremental impact as new data arrives. The pipeline has four layers:
  1. Event sources — buyer-registered pixels, SDKs, MMPs, CRMs, or measurement partners that send conversions, impressions, or outcome data.
  2. Measurement data — privacy-safe outcome records (revenue, conversions, LTV) attached to a campaign, media buy, package, or creative.
  3. Belief state — a Bayesian summary of what the engine currently believes about each hypothesis (e.g. “audience segment A drives more incremental revenue than segment B”), expressed as posterior distributions with confidence intervals.
  4. Incrementality tests — explicit treatment / control / observation cohorts and test plans that produce stronger causal estimates than passive observation.
How belief updating works (high level) The engine starts each hypothesis with a prior — your initial guess about size and confidence. As measurement records arrive, the learning cycle updates that prior into a posterior using Bayesian inference: high-quality, fresh data shifts beliefs faster; sparse or noisy data shifts them less. Running an A/B test with proper test and control cohorts produces the strongest evidence and tightens the posterior fastest.
Privacy-first: the measurement engine never accepts raw PII (plain emails, phone numbers, addresses). Send pre-hashed identifiers (SHA-256) or pre-resolved identity tokens (RampID, UID2, ID5, etc.) — see the Conversion API guide for hashing rules.

Prerequisites

1

Scope3 API key

Generate a key at interchange.io/user-api-keys. See Authentication for setup.
2

Advertiser ID

All measurement endpoints are scoped to an advertiser. You’ll use this in every URL: /api/v2/buyer/advertisers/:advertiserId/....
3

A campaign or media buy (recommended)

Measurement data is most useful when attached to in-flight campaigns. See Campaigns for setup.
All examples below use:

Step 1: Register Event Sources

An event source is a logical channel through which measurement events flow — a website pixel, a mobile SDK, a CRM export, or an MMP feed. Every event you send must reference a registered event_source_id. Use the ADCP-spec sync endpoint to upsert event sources for an advertiser:
Live results (created, updated, unchanged) carry a setup object so install guidance travels with the response, not only inside the widget. Interchange ingests every source server-to-server via log_event, so snippet_type is always server_only and no client-side snippet is returned; instructions names the ingestion endpoint and links the setup guide. failed and deleted results omit setup.

Request fields

Each result’s action is one of created, updated, unchanged, failed, or deleted.

List configured sources

Events sent to an unregistered event_source_id are rejected. Always sync sources before turning on a pixel or CRM job.

Step 2: Configure Measurement

Measurement configuration controls which measurement features are active for an advertiser — Marketing Mix Modeling (MMM), incrementality testing, and brand lift — plus any provider-specific MMM settings.

Fields

PUT is upsert — pass only the fields you want to set; missing fields fall back to defaults / prior values. Read the current config with GET /advertisers/:advertiserId/measurement-config.

Step 3: Validate Configuration

Before relying on incrementality estimates, assess whether your planned spend, geos, and flight length can actually move the needle on a hypothesis. The testability assessment returns power-analysis-style guidance.
The response surfaces, per hypothesis, whether the design has enough cells, whether geos are well-matched, and which gaps would weaken inference.
Run testability before launching media. It’s far cheaper to widen your geo list or extend the flight than to discover post-flight that the test was underpowered.

Step 4: Send Measurement Data

There are two complementary ways to feed the engine:
  • Conversion events — fine-grained, per-user actions (purchases, leads, sign-ups). Use the Conversion API — same identity rules apply.
  • Measurement records — pre-aggregated outcomes for a time window and geo (e.g. “incremental revenue, US-CA, week of 2026-03-01 = $8,450”). Use the sync endpoint below.

Sync aggregated measurement data

Up to 1,000 measurements per call. Each result reports action: created | updated | unchanged | failed.

Upload raw measurement records (advanced)

For research-style flows that already produce per-geo outcomes, the learning engine accepts batched records directly:
Up to 5,000 records per call.

Upload context records

Context records describe market conditions that the learning engine should partial out — promos, weather, competitor activity, seasonality:
Never include raw user identifiers (emails, phone numbers, names) in measurement or context records. These endpoints accept aggregated outcomes only — per-user events go through the Conversion API.

Step 5: Inspect the Event Summary

Once events are flowing, the event-summary endpoint returns hourly counts per event type so you can confirm ingestion before depending on downstream attribution:
Response
You can also check measurement freshness — gaps in expected geo/time coverage:

Step 6: Set Up Test Cohorts and Test Plans

Incrementality tests work by comparing well-defined groups. The v2 model has three layers:
  • Hypotheseswhat you’re testing: a falsifiable claim about a treatment vs. a comparison (“premium CTV drives more incremental revenue per impression than general CTV”). Hypotheses are persistent — each test plan accumulates evidence against the same hypothesis over time.
  • Test cohortswho is in each arm (treatment, control, observation). A cohort is a flexible audience definition (geo, segment, zip code, custom).
  • Test planshow the comparison runs against a hypothesis: which conditions, which dimensions to match on, how cells are sized.

Create a hypothesis

Every test plan is anchored to a hypothesis. Create one before linking test plans, cohorts, or allocation entries to it.
Response
The returned id is the hypothesisId you’ll plug into the test-plan creation step below — and into testability, learning-records, and belief-state queries.

Hypothesis status lifecycle

Every hypothesis carries a status that the engine advances as evidence accrues. New hypotheses always start at no_buys; the rest are reached automatically as media buys link, fire, and produce measurable outcomes.
You can filter hypotheses by status when listing — GET /advertisers/:advertiserId/hypotheses?status=well_measured is a useful default for “what’s worth a stakeholder review this week.”

List hypotheses

Optional filters: category, status, flightId. Pagination via take (max 100) and skip.

Create test cohorts

Available cohort operations:

Create a test plan against a hypothesis

A hypothesis is the question being tested (e.g. “Does running on premium CTV inventory drive incremental purchases versus general CTV?”). Test plans are nested under the hypothesis they test:
Once a plan is created (status designed), patch it to active and link the allocation entries (media buys) that fall under each role:
status transitions: designedactivecomplete. Updating to complete (or letting the engine auto-complete on flight end) closes the test for inference.

Step 7: Trigger Learning and Read Belief State

The learning cycle ingests new measurement records, fits the Bayesian update, and refreshes the belief state. It typically runs on a schedule, but you can trigger it on demand after a large data load:
Read the current belief state for an advertiser:
The response summarizes each tracked hypothesis: posterior magnitude, confidence interval, status (no_buys, in_market, partially_measured, well_measured, proven, disproven), and which sources contributed evidence. To inspect the records that fed the most recent updates:
You can also query raw measurement records by outcome / geo / date range:
Belief state is read-only. To change beliefs, send better data — more records, fewer gaps, properly designed test plans — and let the next learning cycle re-fit.

Step 8: Review and Acknowledge Test Results

When a test plan reaches complete, the engine produces an incrementality result attached to the test plan and hypothesis. Read it via the test plan endpoint:
The response includes the resolved test cell counts, control cell counts, coverage gaps (geos / dimensions where matching was weak), and the posterior delta on the hypothesis. List all plans for a hypothesis with:

Mark results as reviewed

Acknowledge a result so it stops surfacing in unread-results queues and so the audit trail records who signed off. Use the test plan update endpoint to transition status (e.g. recording observed test/control cell counts and final coverage gaps):
If the result motivates a new line of inquiry, capture it as human feedback or as a new hypothesis on the advertiser — that becomes the prior for the next round of testing.

Best Practices

Events sent to an unknown event_source_id are rejected. Always run sync_event_sources first; for new advertisers, do this in your onboarding automation.
If your MMP / CRM / data warehouse can produce weekly per-geo outcomes, use POST /measurement-data/sync (or /measurement-records). Aggregated records arrive faster, are cheaper to ingest, and are immune to user-level identity-resolution drift.
For per-user attribution and click-id matching, use the Conversion API. It’s the only path that can attribute back to a specific impression or click.
Hypothesis priorConfidence and priorMagnitude are not “the answer” — they reflect what you’d believe before the test. Calibrated priors make early-flight estimates much more useful than uncalibrated ones.
matchDimensions should include any factor that meaningfully drives the outcome (geo, daypart, segment). Forgetting a strong driver introduces confounding even with a clean A/B split.
measurement-data/sync deduplicates on external_row_id. Re-running a daily export is safe — only changed rows update.
hashed_email and hashed_phone must be SHA-256 hex (lowercase, 64 chars). Normalize email to lowercase / trimmed and phone to E.164 before hashing. The engine will not match malformed hashes.
POST /testability answers “is this design likely to learn anything?” before media starts. GET /measurement-freshness answers “is data actually arriving?” once it has.
Posterior deltas are a guide, not a verdict. When stakeholders disagree with a result, capture the disagreement as feedback so the next cycle can spawn refined hypotheses rather than re-litigating the old one.

Endpoint Reference

All paths are relative to https://api.interchange.io/api/v2/buyer.

Event sources

Measurement config

Measurement data

Events and freshness

Learning engine

Measurement sources

Hypotheses

Test cohorts

Test plans

Conversion API

Send per-user purchase, lead, and engagement events with click and identity matching.

Campaigns

Set up the campaigns and media buys that measurement data attaches to.

Authentication

Generate and manage API keys for measurement requests.

Reporting

Pull aggregated performance once measurement data is flowing.