Skip to content
Docs

API reference

Event and webhook payloads

Every internal event is a JSON document validated against packages/contracts/events/<name>.v1.json (JSON Schema 2020-12) and published on NATS JetStream with the subject shown. Nats-Msg-Id carries the event id so redelivery is de-duplicated. The webhook envelope below wraps any of these for delivery to your own HTTP endpoints.

click

Subject: dt.click.created.v1. Schema: click.v1.json.

FieldTypeRequiredDescription
idstringyesULID
tenant_idstringyes
tsstring (date-time)yes
schema_versionintegeryes
click_idstringyes
entitiesobjectyes
entities.offer_idstring
entities.partner_idstring
entities.advertiser_idstring
entities.landing_page_idstring
entities.creative_idstring
entities.smartlink_idstring
entities.offer_group_idstring
entities.goal_idstring
entities.tracking_domain_idstring
entities.app_idstring
paramsobjectsub1..sub15, p1..p15 aliases resolved to sub*, source, sub_source, creative, campaign_ext, adgroup, label, adv1..adv10, utm_*, platform click ids, custom
ipstring
geoobject
geo.countrystring
geo.regionstring
geo.citystring
geo.postalstring
geo.dmastring
geo.ispstring
geo.carrierstring
geo.asnstring
geo.connection_typestring
deviceobject
device.device_typestring
device.brandstring
device.modelstring
device.osstring
device.os_versionstring
device.browserstring
device.browser_versionstring
device.languagestring
device.user_agentstring
flagsobject
flags.is_proxyboolean
flags.is_vpnboolean
flags.is_datacenterboolean
flags.is_torboolean
flags.is_botboolean
flags.is_uniqueboolean
flags.is_duplicateboolean
flags.is_invalidboolean
flags.is_testboolean
moneyobject
money.payoutstring
money.revenuestring
money.sale_amountstring
money.coststring
money.currencystring
money.fx_ratestring
money.cost_currencystringWP-80: currency of the cost the partner passed (cost_currency=); empty = currency
decisionobject
decision.redirect_modestring
decision.destination_urlstring
decision.invalid_reasonstring: traffic_filter, traffic_control, already_converted, offer_expired, geotargeting, caps, caps_degraded, fraud, blocked_partner, bot, duplicate, offer_inactive, partner_inactive, other
decision.fail_traffic_target_idstring
decision.cap_statestring
decision.matched_rule_idsarray of string
fraudobject
fraud.scoreinteger
fraud.reasonsarray of string
fraud.rule_idsarray of string
fraud.dry_runbooleanevery evaluation that scored the click came from a dry-run pack (log only): the score changes neither the click nor its conversions
link_stylestring: native, numeric, trackier, everflow, tune, affise, cake, app, unilink
refererstring
click_domainstring
session_idstring
fingerprint_hashstring
consentobject
latency_msinteger
edge_regionstring
raw_querystring
cost_statusstring: accepted, not_permitted, invalidWP-80: the click passed cost=: accepted (partner allowed to pass media cost), not_permitted (recorded, cost ignored) or invalid (not a non-negative amount)

Minimal example:

json
{
  "id": "01JABCDEF0123456789XYZ",
  "tenant_id": "01JABCDEF0123456789XYZ",
  "ts": "2026-01-15T10:30:00Z",
  "schema_version": 1,
  "click_id": "01JABCDEF0123456789XYZ",
  "entities": {
    "offer_id": "01JABCDEF0123456789XYZ",
    "partner_id": "01JABCDEF0123456789XYZ",
    "advertiser_id": "01JABCDEF0123456789XYZ",
    "landing_page_id": "01JABCDEF0123456789XYZ",
    "creative_id": "01JABCDEF0123456789XYZ",
    "smartlink_id": "01JABCDEF0123456789XYZ",
    "offer_group_id": "01JABCDEF0123456789XYZ",
    "goal_id": "01JABCDEF0123456789XYZ",
    "tracking_domain_id": "01JABCDEF0123456789XYZ",
    "app_id": "01JABCDEF0123456789XYZ"
  }
}

config_changed

Subject: dt.config.changed.v1. Schema: config_changed.v1.json.

NATS subject dt.config.changed.v1; edge reloads snapshot for tenant when version > held version

FieldTypeRequiredDescription
tenant_idstringyes
versionintegeryes
changed_atstring (date-time)yes
entity_typestring
entity_idstring

Minimal example:

json
{
  "tenant_id": "01JABCDEF0123456789XYZ",
  "version": 1,
  "changed_at": "2026-01-15T10:30:00Z"
}

config_snapshot

Subject: HTTP snapshot document (not a subject). Schema: config_snapshot.v1.json.

Full per-tenant hot-path config pushed to edge-redirect/ingest; built by control-plane from Postgres rows (docs/04).

FieldTypeRequiredDescription
tenant_idstringyes
versionintegeryes
generated_atstring (date-time)yes
tenantobjectyes
tracking_domainsarray of objectyes
advertisersarray of objectyes
partnersarray of objectyes
partner_tiersarray of object
offersarray of objectyes
traffic_controlsarray of object
listsarray of object
postbacksarray of object
fraud_rulesarray of object
smartlinksarray of objectWP-13 smartlinks with member offers (snapshot.Smartlink)
scoped_controlsarray of objectWP-14 tenant-wide rule sets with scope_kind offer|geo (evaluated by the edge hook only)
capsarray of objectWP-14 caps not attached to an offer (partner, advertiser, goal, smartlink, tenant); snapshot.Cap
daypartsarray of objectWP-14 day-parting schedules (snapshot.Daypart)

Minimal example:

json
{
  "tenant_id": "01JABCDEF0123456789XYZ",
  "version": 1,
  "generated_at": "2026-01-15T10:30:00Z",
  "tenant": {},
  "tracking_domains": [
    {}
  ],
  "advertisers": [
    {}
  ],
  "partners": [
    {}
  ],
  "offers": [
    {}
  ]
}

conversion_created

Subject: dt.conversion.created.v1. Schema: conversion_created.v1.json.

FieldTypeRequiredDescription
idstringyesULID
tenant_idstringyes
tsstring (date-time)yes
schema_versionintegeryes
conversion_idstringyes
click_idstring
impression_idstring
txn_idstring
order_idstring
conversion_typestring: base, goal, event, upsell, rebill, refund, chargeback, adjustment
goal_keystring
entitiesobjectyes
entities.offer_idstring
entities.partner_idstring
entities.advertiser_idstring
entities.landing_page_idstring
entities.creative_idstring
entities.smartlink_idstring
entities.offer_group_idstring
entities.goal_idstring
entities.tracking_domain_idstring
entities.app_idstring
paramsobjectsub1..sub15, p1..p15 aliases resolved to sub*, source, sub_source, creative, campaign_ext, adgroup, label, adv1..adv10, utm_*, platform click ids, custom
click_tsstring (date-time)
ctit_secondsinteger
statusstring: pending, approved, rejected, cancelled, extended, flagged, scrubbedyes
status_reasonstring
status_sourcestring
is_hidden_from_partnerboolean
moneyobjectyes
money.payoutstring
money.revenuestring
money.sale_amountstring
money.coststring
money.currencystring
money.fx_ratestring
money.payout_tenant_ccystringWP-76: payout in the tenant's default currency at the rate in force on the conversion's UTC date (absent: no rate)
money.revenue_tenant_ccystringWP-76: revenue in the tenant's default currency (as payout_tenant_ccy)
payout_entry_idstring
methodstring: postback, pixel, iframe, js, sdk, s2s, coupon, manual, importyes
attributionobject
attribution.modelstring
attribution.touchstring: click, impression, coupon, probabilistic, skan, referrer, none
attribution.confidencenumber
attribution.is_organicboolean
attribution.matchstringWP-80: the matching method (click_id, cookie, fingerprint, email, coupon, device, probabilistic, impression, txn_reuse)
ipstring
click_ipstring
geoobject
geo.countrystring
geo.regionstring
geo.citystring
geo.postalstring
geo.dmastring
geo.ispstring
geo.carrierstring
geo.asnstring
geo.connection_typestring
deviceobject
device.device_typestring
device.brandstring
device.modelstring
device.osstring
device.os_versionstring
device.browserstring
device.browser_versionstring
device.languagestring
device.user_agentstring
user_idstring
email_hashstring
coupon_codestring
fraudobject
raw_requeststring
is_testboolean
holdobjectWP-80: timed hold set by a conversion rule (status extended until release_at, then the hold scheduler sets then)
hold.rule_set_idstring
hold.minutesinteger
hold.release_atstring (date-time)
hold.thenstring: approved, rejected
itemsarray of objectWP-80: SKU lines as priced; payout / revenue of the conversion are their sum when priced per SKU

Minimal example:

json
{
  "id": "01JABCDEF0123456789XYZ",
  "tenant_id": "01JABCDEF0123456789XYZ",
  "ts": "2026-01-15T10:30:00Z",
  "schema_version": 1,
  "conversion_id": "01JABCDEF0123456789XYZ",
  "entities": {
    "offer_id": "01JABCDEF0123456789XYZ",
    "partner_id": "01JABCDEF0123456789XYZ",
    "advertiser_id": "01JABCDEF0123456789XYZ",
    "landing_page_id": "01JABCDEF0123456789XYZ",
    "creative_id": "01JABCDEF0123456789XYZ",
    "smartlink_id": "01JABCDEF0123456789XYZ",
    "offer_group_id": "01JABCDEF0123456789XYZ",
    "goal_id": "01JABCDEF0123456789XYZ",
    "tracking_domain_id": "01JABCDEF0123456789XYZ",
    "app_id": "01JABCDEF0123456789XYZ"
  },
  "status": "pending",
  "money": {
    "payout": "string",
    "revenue": "string",
    "sale_amount": "string",
    "cost": "string",
    "currency": "string",
    "fx_rate": "string",
    "payout_tenant_ccy": "string",
    "revenue_tenant_ccy": "string"
  },
  "method": "postback"
}

conversion_status_changed

Subject: dt.conversion.status_changed.v1. Schema: conversion_status_changed.v1.json.

FieldTypeRequiredDescription
idstringyesULID
tenant_idstringyes
tsstring (date-time)yes
schema_versionintegeryes
conversion_idstringyes
entitiesobject
entities.offer_idstring
entities.partner_idstring
entities.advertiser_idstring
entities.landing_page_idstring
entities.creative_idstring
entities.smartlink_idstring
entities.offer_group_idstring
entities.goal_idstring
entities.tracking_domain_idstring
entities.app_idstring
from_statusstringyes
to_statusstringyes
reasonstring
actor_typestring
actor_idstring
payout_deltastring
revenue_deltastring
currencystring
effective_atstring (date-time)yesoriginal conversion time: the reporting period this change restates (equals conversion_ts); ts is when the change happened
versionintegeryes
conversion_tsstring (date-time)original conversion time (reporting period of the restatement)
click_idstring
click_tsstring (date-time)
moneyobjectabsolute amounts after the change
money.payoutstring
money.revenuestring
money.sale_amountstring
money.currencystring
money.payout_tenant_ccystringWP-76: payout in the tenant's default currency at the rate in force on the conversion's UTC date (absent: no rate)
money.revenue_tenant_ccystringWP-76: revenue in the tenant's default currency (as payout_tenant_ccy)
dimsobjectdenormalised dimensions so writers need no lookup
status_sourcestring

Minimal example:

json
{
  "id": "01JABCDEF0123456789XYZ",
  "tenant_id": "01JABCDEF0123456789XYZ",
  "ts": "2026-01-15T10:30:00Z",
  "schema_version": 1,
  "conversion_id": "01JABCDEF0123456789XYZ",
  "from_status": "string",
  "to_status": "string",
  "effective_at": "2026-01-15T10:30:00Z",
  "version": 1
}

impression

Subject: dt.impression.created.v1. Schema: impression.v1.json.

FieldTypeRequiredDescription
idstringyesULID
tenant_idstringyes
tsstring (date-time)yes
schema_versionintegeryes
impression_idstringyes
entitiesobjectyes
entities.offer_idstring
entities.partner_idstring
entities.advertiser_idstring
entities.landing_page_idstring
entities.creative_idstring
entities.smartlink_idstring
entities.offer_group_idstring
entities.goal_idstring
entities.tracking_domain_idstring
entities.app_idstring
paramsobjectsub1..sub15, p1..p15 aliases resolved to sub*, source, sub_source, creative, campaign_ext, adgroup, label, adv1..adv10, utm_*, platform click ids, custom
ipstring
geoobject
geo.countrystring
geo.regionstring
geo.citystring
geo.postalstring
geo.dmastring
geo.ispstring
geo.carrierstring
geo.asnstring
geo.connection_typestring
deviceobject
device.device_typestring
device.brandstring
device.modelstring
device.osstring
device.os_versionstring
device.browserstring
device.browser_versionstring
device.languagestring
device.user_agentstring
flagsobject
flags.is_proxyboolean
flags.is_vpnboolean
flags.is_datacenterboolean
flags.is_torboolean
flags.is_botboolean
flags.is_uniqueboolean
flags.is_duplicateboolean
flags.is_invalidboolean
flags.is_testboolean
is_viewableboolean
refererstring
raw_querystring

Minimal example:

json
{
  "id": "01JABCDEF0123456789XYZ",
  "tenant_id": "01JABCDEF0123456789XYZ",
  "ts": "2026-01-15T10:30:00Z",
  "schema_version": 1,
  "impression_id": "01JABCDEF0123456789XYZ",
  "entities": {
    "offer_id": "01JABCDEF0123456789XYZ",
    "partner_id": "01JABCDEF0123456789XYZ",
    "advertiser_id": "01JABCDEF0123456789XYZ",
    "landing_page_id": "01JABCDEF0123456789XYZ",
    "creative_id": "01JABCDEF0123456789XYZ",
    "smartlink_id": "01JABCDEF0123456789XYZ",
    "offer_group_id": "01JABCDEF0123456789XYZ",
    "goal_id": "01JABCDEF0123456789XYZ",
    "tracking_domain_id": "01JABCDEF0123456789XYZ",
    "app_id": "01JABCDEF0123456789XYZ"
  }
}

mobile_event

Subject: dt.mobile.event.v1, dt.mobile.ad_revenue.v1. Schema: mobile_event.v1.json.

dt.mobile.event.v1 and dt.mobile.ad_revenue.v1 (event_name ad_revenue; network/ad_unit/placement/ad_type in params)

FieldTypeRequiredDescription
idstringyes
schema_versionintegeryes
tenant_idstringyes
tsstring (date-time)yes
event_idstringyes
event_namestringyes
app_idstringyes
device_idstring
install_idstring
install_tsstring (date-time)
days_since_installinteger
session_idstring
partner_idstring
offer_idstring
click_idstring
is_attributedboolean
is_reengagementboolean
is_firstboolean
revenuestringyes6-dp decimal
currencystringyes
paramsobject
partner_paramsobject
device_idsobject
customer_user_idstring
platformstring
os_versionstring
app_versionstring
sdk_versionstring
environmentstring
countrystring
ipstring
validation_statusstring
consentobject
third_party_sharingboolean

Minimal example:

json
{
  "id": "01JABCDEF0123456789XYZ",
  "schema_version": 1,
  "tenant_id": "01JABCDEF0123456789XYZ",
  "ts": "2026-01-15T10:30:00Z",
  "event_id": "01JABCDEF0123456789XYZ",
  "event_name": "string",
  "app_id": "01JABCDEF0123456789XYZ",
  "revenue": "string",
  "currency": "string"
}

mobile_install

Subject: dt.mobile.install.v1. Schema: mobile_install.v1.json.

FieldTypeRequiredDescription
idstringyes
schema_versionintegeryes
tenant_idstringyes
tsstring (date-time)yes
install_idstringyes
app_idstringyes
device_idstringyes
kindstring: install, reinstall, reattribution, reengagementyes
match_typestring: referrer, device_id, click_id, deep_link, san, preload, probabilistic, organicyes
confidencenumber
partner_idstring
offer_idstring
advertiser_idstring
click_idstring
click_tsstring (date-time)
san_networkstring
attribution_windowstring
is_organicboolean
is_reinstallboolean
is_reattributionboolean
is_reengagementboolean
first_install_tsstring (date-time)
platformstring
os_versionstring
app_versionstring
sdk_versionstring
environmentstring: production, sandbox
countrystring
ipstring
att_statusstring
customer_user_idstring
device_idsobject
paramsobject
consentobject
third_party_sharingboolean
rejectedarray of string

Minimal example:

json
{
  "id": "01JABCDEF0123456789XYZ",
  "schema_version": 1,
  "tenant_id": "01JABCDEF0123456789XYZ",
  "ts": "2026-01-15T10:30:00Z",
  "install_id": "01JABCDEF0123456789XYZ",
  "app_id": "01JABCDEF0123456789XYZ",
  "device_id": "01JABCDEF0123456789XYZ",
  "kind": "install",
  "match_type": "referrer"
}

mobile_session

Subject: dt.mobile.session.v1. Schema: mobile_session.v1.json.

FieldTypeRequiredDescription
idstringyes
schema_versionintegeryes
tenant_idstringyes
tsstring (date-time)yes
session_idstringyes
app_idstringyes
device_idstringyes
install_idstring
install_tsstring (date-time)
days_since_installinteger
partner_idstring
offer_idstring
is_organicboolean
is_reengagementboolean
platformstring
os_versionstring
app_versionstring
sdk_versionstring
environmentstring
countrystring
ipstring

Minimal example:

json
{
  "id": "01JABCDEF0123456789XYZ",
  "schema_version": 1,
  "tenant_id": "01JABCDEF0123456789XYZ",
  "ts": "2026-01-15T10:30:00Z",
  "session_id": "01JABCDEF0123456789XYZ",
  "app_id": "01JABCDEF0123456789XYZ",
  "device_id": "01JABCDEF0123456789XYZ"
}

mobile_skan_postback

Subject: dt.mobile.skan_postback.v1. Schema: mobile_skan_postback.v1.json.

WP-27: a received SKAdNetwork / AdAttributionKit postback after verification and conversion-value decode. events / revenue_estimate are empty for unverified postbacks.

FieldTypeRequiredDescription
idstringyes
schema_versionintegeryes
tenant_idstringyes
tsstring (date-time)yes
app_idstringyes
kindstring: skan, aakyes
versionstring
ad_network_idstringyes
transaction_idstringyes
postback_sequence_indexintegeryes
source_identifierstring
source_app_idstring
source_domainstring
fidelity_typeinteger
did_winboolean
redownloadboolean
conversion_typestring
fine_cvinteger
coarse_cvstring: ``, low, medium, high
country_codestring
verifiedbooleanyes
partner_idstring
offer_idstring
campaignstring
schema_idstring
eventsarray of stringyes
revenue_estimatestringyes
currencystringyes

Minimal example:

json
{
  "id": "01JABCDEF0123456789XYZ",
  "schema_version": 1,
  "tenant_id": "01JABCDEF0123456789XYZ",
  "ts": "2026-01-15T10:30:00Z",
  "app_id": "01JABCDEF0123456789XYZ",
  "kind": "skan",
  "ad_network_id": "01JABCDEF0123456789XYZ",
  "transaction_id": "01JABCDEF0123456789XYZ",
  "postback_sequence_index": 1,
  "verified": false,
  "events": [
    "string"
  ],
  "revenue_estimate": "string",
  "currency": "string"
}

mobile_uninstall

Subject: dt.mobile.uninstall.v1. Schema: mobile_uninstall.v1.json.

FieldTypeRequiredDescription
idstringyes
schema_versionintegeryes
tenant_idstringyes
tsstring (date-time)yes
app_idstringyes
device_idstringyes
install_idstring
install_tsstring (date-time)
partner_idstring
offer_idstring
is_organicboolean
platformstring
sourcestring

Minimal example:

json
{
  "id": "01JABCDEF0123456789XYZ",
  "schema_version": 1,
  "tenant_id": "01JABCDEF0123456789XYZ",
  "ts": "2026-01-15T10:30:00Z",
  "app_id": "01JABCDEF0123456789XYZ",
  "device_id": "01JABCDEF0123456789XYZ"
}

postback_result

Subject: dt.postback.result.v1. Schema: postback_result.v1.json.

FieldTypeRequiredDescription
idstringyesULID
tenant_idstringyes
tsstring (date-time)yes
schema_versionintegeryes
postback_idstringyes
conversion_idstringyes
partner_idstring
url_resolvedstring
methodstring
request_headersobject
request_bodystring
response_codeinteger
response_bodystring
latency_msinteger
attemptintegeryes
errorstring
finalboolean
next_retry_atstring (date-time)

Minimal example:

json
{
  "id": "01JABCDEF0123456789XYZ",
  "tenant_id": "01JABCDEF0123456789XYZ",
  "ts": "2026-01-15T10:30:00Z",
  "schema_version": 1,
  "postback_id": "01JABCDEF0123456789XYZ",
  "conversion_id": "01JABCDEF0123456789XYZ",
  "attempt": 1
}

webhook_envelope

Subject: External webhook delivery (HTTP POST). Schema: webhook_envelope.v1.json.

Delivered by HTTP POST to your webhook URL. Headers sent: X-Metrixed-Signature (t=<unix>,v1=<hex HMAC-SHA256 of t + "." + body>), X-Metrixed-Event, X-Metrixed-Delivery (attempt number) and, on manual replays, X-Metrixed-Replay. See webhooks.

FieldTypeRequiredDescription
idstringyes
tenant_idstringyes
eventstringyese.g. offer.updated, partner.created, partner_application.approved, conversion.created, conversion.status_changed, click.created, postback.failed, cap.reached, fraud.flagged, invoice.created, payout.executed
created_atstring (date-time)yes
api_versionstring
dataobjectyes
previousobject

Minimal example:

json
{
  "id": "01JABCDEF0123456789XYZ",
  "tenant_id": "01JABCDEF0123456789XYZ",
  "event": "string",
  "created_at": "2026-01-15T10:30:00Z",
  "data": {}
}