Overview
Scope3’s Conversion API follows the AdCPlog_event specification for server-to-server conversion measurement. This enables you to:
- Send purchase, sign-up, and other conversion events
- Attribute conversions back to ad impressions and clicks
- Optimize campaigns based on actual outcomes
Prerequisites
Before sending conversion events, you’ll need two things:1. Configure an Event Source
Register an event source for your advertiser using the REST sync endpoint. This gives you anevent_source_id to include in all event requests:
account.account_id is required and must equal the path {advertiserId}. Response shape:
action field on each result will be one of created, updated, unchanged, failed, or deleted. Pass "delete_missing": true to archive any previously-configured sources not included in the payload.
2. Get Your API Key
- Visit interchange.io/user-api-keys
- Sign up or log into your Scope3 account
- Generate a new API key (starts with
scope3_)
Endpoints
Different host on purpose. The Conversion API ingests events at
ping.interchange.io, not the main api.interchange.io host. CAPI runs on
separate high-throughput ingestion infrastructure tuned for event firehose
workloads, so the host difference is intentional — not a typo.Request Format
Minimal Example (Purchase with Click ID)
Full Example (with Identity Tokens and Line Items)
Batch Example (Multiple Events)
Send up to 10,000 events in a single request:Request Fields
Top-Level
Event Object
UserMatch Object
Provide the strongest identifiers available. Sending multiple types increases match rates.
CustomData Object
Supported Event Types
Commerce Events
Commerce Events
Lead & Registration Events
Lead & Registration Events
| Event Type | Description | |------------|-------------| |
lead | User
expressed interest (form submission, signup, etc.) | | qualify_lead | Lead
qualified by sales or scoring criteria | | close_convert_lead | Lead
converted to a customer or closed deal | | disqualify_lead | Lead
disqualified or marked as not viable | | complete_registration | User
completed account registration | | subscribe | User subscribed to a service
or newsletter | | start_trial | User started a free trial | |
submit_application | User submitted an application (loan, job, etc.) |Engagement Events
Engagement Events
| Event Type | Description | |------------|-------------| |
page_view | User
viewed a page | | view_content | User viewed specific content (product,
article, etc.) where the view is mostly context for a lower-funnel goal | |
content_view | User meaningfully consumed a content unit (a watch, listen,
stream, episode play, or read) where the consumption itself is the optimized
event | | watch_milestone | User reached a content progress threshold (25%,
50%, 75%, 100%, or a seconds-viewed milestone) | | follow |
User made a free, durable opt-in to an account, channel, feed, list, podcast,
or similar owned property | | select_content | User selected or clicked on
content | | select_item | User selected a specific product or item from a
list | | search | User performed a search | | share | User shared content
via social or messaging |App & Other Events
App & Other Events
Attribution Methods
Scope3 supports two attribution methods depending on your use case:Click Attribution (Online)
When a user clicks an ad served through Scope3, we append a uniquesc3clid parameter to the landing page URL:
- Capture the
sc3clidfrom the URL when the user lands - Store it (cookie, session, or database)
- Include it as
user_match.click_idwithclick_id_type: "sc3clid"when sending conversion events
Offline Attribution (Cross-Device / Offline)
For conversions that happen on a different device or offline, use pre-resolved identity tokens or hashed identifiers. These allow Scope3 to match the conversion back to ad exposure even without a click ID. Use cases:- User sees ad on mobile, purchases on desktop
- User sees ad online, purchases in physical store
- CRM/offline sales data upload
Supported Identity Types
Hashing requirements for
hashed_email and hashed_phone:
- Must be SHA-256 hex strings (64 characters, lowercase)
- Emails: normalize to lowercase with whitespace trimmed before hashing
- Phone numbers: normalize to E.164 format (e.g.
+12065551234) before hashing
Test Events
Usetest_event_code to validate your integration without affecting production attribution or reporting:
Response Format
Success (200 OK)
Partial Failures
Events within a batch are processed independently. Failed events are reported inpartial_failures without rejecting the entire batch:
Error Responses
Operation-level errors (auth failure, invalid event source) return anerrors array instead of the success fields:
Code Examples
- cURL
- Python
- JavaScript
Best Practices
Configure Event Sources First
Configure Event Sources First
Always run
sync_event_sources before sending events. Events sent to
unconfigured sources are rejected with EVENT_SOURCE_NOT_FOUND.Always Capture Click ID
Always Capture Click ID
Store the
sc3clid parameter immediately when users land from ads. Use
cookies, session storage, or your database to persist it until conversion.Send Events Server-Side
Send Events Server-Side
Never expose your API key in client-side code. Always send conversion events
from your backend server.
Use Stable, Deterministic Event IDs
Use Stable, Deterministic Event IDs
Use order numbers, transaction IDs, or composite keys (e.g.
"purchase_user123_20260115") as event_id rather than random UUIDs. Events
are deduplicated by event_id + event_type + event_source_id, so stable
IDs ensure safe retries without duplicate counting.Send Multiple Identity Types
Send Multiple Identity Types
Provide as many user identifiers as available in
user_match (click ID,
hashed email, UIDs). More identifiers increases match rates across devices and
channels.Include Value and Currency
Include Value and Currency
For purchase events, always include
custom_data.value and
custom_data.currency to enable ROAS reporting and optimization.Use Accurate Event Times
Use Accurate Event Times
Set
event_time to when the event actually occurred, not when you’re sending
the request. Events outside the attribution window may not be matched.Batch When Possible
Batch When Possible
Send up to 10,000 events per request to reduce API calls. Events within a
batch are processed independently — a failure in one won’t affect others.
Test with test_event_code
Test with test_event_code
Set
test_event_code during integration to validate events without
affecting production data.Event Deduplication
Events are deduplicated by the combination ofevent_id + event_type + event_source_id. Sending the same event multiple times is safe — duplicates are silently ignored.
Next Steps
Measurement & Incrementality
Use conversion data to power incrementality tests and lift measurement
Reporting
Analyze conversion performance across campaigns
Authentication
Learn more about API key management
Campaign object guide
Set up campaigns that optimize toward your conversion events