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:- Event sources — buyer-registered pixels, SDKs, MMPs, CRMs, or measurement partners that send conversions, impressions, or outcome data.
- Measurement data — privacy-safe outcome records (revenue, conversions, LTV) attached to a campaign, media buy, package, or creative.
- 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.
- 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.
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.
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 registeredevent_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
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.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:Upload context records
Context records describe market conditions that the learning engine should partial out — promos, weather, competitor activity, seasonality: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:- Hypotheses — what 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 cohorts — who is in each arm (treatment, control, observation). A cohort is a flexible audience definition (geo, segment, zip code, custom).
- Test plans — how 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 astatus 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.
List hypotheses
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:Activate a test plan and link media buys
Once a plan is created (statusdesigned), patch it to active and link the allocation entries (media buys) that fall under each role:
status transitions: designed → active → complete. 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: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:
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 reachescomplete, the engine produces an incrementality result attached to the test plan and hypothesis. Read it via the test plan endpoint:
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):Best Practices
Register event sources before turning on a pixel
Register event sources before turning on a pixel
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.Send aggregated measurement records when you have them
Send aggregated measurement records when you have them
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.Send raw events when you need fine-grained attribution
Send raw events when you need fine-grained attribution
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.
Set good priors
Set good priors
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.Match cohorts on the dimensions that move the metric
Match cohorts on the dimensions that move the metric
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.Use external_row_id for idempotency
Use external_row_id for idempotency
measurement-data/sync deduplicates on external_row_id. Re-running a
daily export is safe — only changed rows update.Hash before sending
Hash before sending
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.Run testability before launch, freshness during flight
Run testability before launch, freshness during flight
POST /testability answers “is this design likely to learn anything?”
before media starts. GET /measurement-freshness answers “is data
actually arriving?” once it has.Keep human feedback in the loop
Keep human feedback in the loop
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 tohttps://api.interchange.io/api/v2/buyer.
Event sources
Measurement config
Measurement data
Events and freshness
Learning engine
Measurement sources
Hypotheses
Test cohorts
Test plans
Related
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.