REST API reference
Every public endpoint with parameters, request bodies, responses and auth — generated from the same source as the OpenAPI document.
Updated 2026-09-02
Machine-readable version: https://app.whichclick.is/openapi.json (OpenAPI 3.1). Import it into Postman, Insomnia, Stainless or an agent's tool loader. The MCP server exposes the same operations as tools — see MCP server.
Base URL for everything except redirects: https://app.whichclick.is. Redirects and the pixel run on your tracking domain. Authentication is described in Authentication & limits.
Redirects#
GET /c/{slug}#
Certified click redirect · Auth: None · Host: your tracking domain
Google Ads transparent click tracker endpoint. Reads the next hop from the visible url parameter, appends exactly one first-party click id and answers with a single 302. No HTML, JavaScript or cookies; safe for parallel tracking.
| Parameter | In | Required | Description |
|---|---|---|---|
slug | path | yes | Tracking link slug |
url | query | yes | Escaped landing-page URL ({escapedlpurl}); aliases u, redirect, dest, r. May be single-, double- or triple-encoded. |
force_transparent | query | yes | true — the server must follow url and may not substitute a backend destination. 400 when set without url. |
gclid | query | no | ValueTrack {gclid} — captured on the click |
gbraid | query | no | ValueTrack {gbraid} — captured on the click |
wbraid | query | no | ValueTrack {wbraid} — captured on the click |
campaignid | query | no | ValueTrack {campaignid} — captured on the click |
adgroupid | query | no | ValueTrack {adgroupid} — captured on the click |
creative | query | no | ValueTrack {creative} — captured on the click |
keyword | query | no | ValueTrack {keyword} — captured on the click |
matchtype | query | no | ValueTrack {matchtype} — captured on the click |
network | query | no | ValueTrack {network} — captured on the click |
device | query | no | ValueTrack {device} — captured on the click |
placement | query | no | ValueTrack {placement} — captured on the click |
targetid | query | no | ValueTrack {targetid} — captured on the click |
loc_physical_ms | query | no | ValueTrack {loc_physical_ms} — captured on the click |
loc_interest_ms | query | no | ValueTrack {loc_interest_ms} — captured on the click |
adposition | query | no | ValueTrack {adposition} — captured on the click |
Responses:
302Redirect to the landing page with?wc_click_id=<id>appended. Headers:Location: https://landing.example/?gclid=…&wc_click_id=k3Zp9Qw1mR7tXc2b,Cache-Control: no-store400force_transparent=truewithout aurl, or an unsafe (non-http) destination.errorrequired: string | integer — Error code or Zod validation summaryretry_after: integer — Seconds to wait (429 only)
404Unknown slug, paused link, or hostname not bound to this link.
GET /l/{slug}#
Smart link · Auth: None · Host: your tracking domain
Evaluates the link's routing rules (geo, OS, IP type, in-app browser, params, time …) and redirects to a store, deep link, web fallback or A/B variant. Android store redirects carry referrer=wc_click_id=… for the Install Referrer API. A visible url= parameter always overrides the rules (Google transparency).
| Parameter | In | Required | Description |
|---|---|---|---|
slug | path | yes | Smart link slug |
url | query | no | Transparent override — behaves like /c/{slug} |
* | query | no | Any query parameter is available to rules as param.<name> and passed through per link settings |
Responses:
200HTML interstitial (custom-scheme fallback for in-app browsers), QR page on desktop, or Open Graph preview for social crawlers.302Redirect (store, deep link, web fallback, split variant).403Rule actionblock(also 404/410 per rule).410Link expired or click cap reached.
GET /i/{campaign}#
Impression pixel · Auth: None · Host: your tracking domain
1×1 GIF for display, video (VAST <Impression>) and CTV tags. Records an impression (IP hash + household hash, no cookies) for view-through and household attribution.
| Parameter | In | Required | Description |
|---|---|---|---|
campaign | path | yes | Campaign id or ad-platform external id |
app | query | no | App id |
cr | query | no | Creative id |
pl | query | no | Placement |
p | query | no | Partner / network (e.g. roku, dv360) |
Responses:
200image/gif,Cache-Control: no-store
Conversions#
GET /postback#
Inbound postback (GET) · Auth: API key (Bearer)
Server-to-server conversion postback. Authenticate with Authorization: Bearer or api_key query parameter. click_id or gclid is required. POST with the same query parameters is accepted too.
| Parameter | In | Required | Description |
|---|---|---|---|
api_key | query | no | API key when the Authorization header cannot be set |
click_id | query | no | wc_click_id value |
gclid | query | no | Alternative to click_id |
event | query | no | Event name (default conversion) |
value | query | no | Conversion value |
currency | query | no | ISO 4217 |
order_id | query | no | Idempotency key with event |
Responses:
200Stored (matched or unattributed).
{
"ok": true,
"id": "clx8n2…",
"matched": true
}400Validation error or neither click_id nor gclid.errorrequired: string | integer — Error code or Zod validation summaryretry_after: integer — Seconds to wait (429 only)
401Missing / revoked API key.errorrequired: string | integer — Error code or Zod validation summaryretry_after: integer — Seconds to wait (429 only)
POST /api/v1/conversions#
Create conversion · Auth: API key (Bearer)
JSON variant of the postback. Idempotent on order_id + event (the value/currency are updated on repeats). Matching: click_id first, else latest click with the same gclid; unmatched conversions are stored with matched: false. Outbound postbacks fan out asynchronously.
Request body:
click_id: string — WhichClick click id (wc_click_idappended to the landing page)gclid: string — Google click id — used when click_id is unknown; matched to the most recent clickevent: string — Event namevalue: number — Conversion valuecurrency: string — ISO 4217 currencyorder_id: string — Idempotency key together withevent
{
"click_id": "k3Zp9Qw1mR7tXc2b",
"event": "purchase",
"value": 49.9,
"currency": "USD",
"order_id": "ORD-1001"
}Responses:
201Created / updated.
{
"ok": true,
"id": "clx8n2…",
"matched": true
}400Validation error.errorrequired: string | integer — Error code or Zod validation summaryretry_after: integer — Seconds to wait (429 only)
401Unauthorized.errorrequired: string | integer — Error code or Zod validation summaryretry_after: integer — Seconds to wait (429 only)
GET /api/v1/conversions#
List conversions · Auth: API key (Bearer)
Most recent conversions for the organization.
| Parameter | In | Required | Description |
|---|---|---|---|
limit | query | no | 1–1000 (default 100) |
Responses:
200OK
GET /api/v1/clicks#
Export clicks · Auth: API key (Bearer)
Click facts (ValueTrack fields, next hop, transparency flags) for offline conversion import or auditing. Newest first.
| Parameter | In | Required | Description |
|---|---|---|---|
limit | query | no | 1–1000 (default 100) |
since | query | no | ISO timestamp lower bound |
gclid | query | no | Filter by gclid |
Responses:
200OK
{
"data": [
{
"id": "k3Zp9Qw1mR7tXc2b",
"createdAt": "2026-09-02T09:15:00.000Z",
"gclid": "Cj0KCQjw…",
"campaignExtId": "2098765432",
"adGroupExtId": "1234567",
"creativeId": "7654321",
"keyword": "running shoes",
"matchType": "e",
"network": "g",
"device": "m",
"nextHopUrl": "https://shop.example/?gclid=…",
"transparentParamPresent": true,
"forceTransparent": true,
"isBot": false,
"latencyMs": 4
}
]
}POST /api/v1/costs#
Import daily spend · Auth: API key (Bearer)
Bulk upsert of daily media cost per campaign (enables CPI / ROAS). Rows referencing unknown campaigns are skipped; the response counts upserts.
Request body:
rowsrequired: array<CostRow>
{
"rows": [
{
"campaign_external_id": "2098765432",
"day": "2026-09-01",
"spend": 1240.5,
"currency": "USD",
"impressions": 91000
}
]
}Responses:
200OK
{
"ok": true,
"upserted": 1
}Growth#
POST /api/v1/impressions#
Log impressions (S2S) · Auth: API key (Bearer)
Server-to-server impression log for view-through and household (CTV) attribution. IPs are hashed with the day; /24 (IPv4) and /48 (IPv6) household hashes are derived.
Request body:
impressionsrequired: array<Impression>
{
"impressions": [
{
"campaign_external_id": "2098765432",
"partner": "dv360",
"creative_id": "cr-1",
"ip": "203.0.113.7",
"os": "android",
"country": "TR",
"ts": "2026-09-02T09:15:00Z"
}
]
}Responses:
200OK
POST /api/v1/tv-airings#
Import TV airings · Auth: API key (Bearer)
Linear TV post-log import. Attribution runs immediately: baseline traffic before each spot vs. the spike inside window_min minutes after it.
Request body:
airingsrequired: array<TvAiring>
{
"airings": [
{
"network": "ATV",
"program": "Evening news",
"region": "TR",
"aired_at": "2026-09-01T19:32:00+03:00",
"spot_length_sec": 30,
"cost": 8500,
"campaign_external_id": "tv-sep",
"window_min": 8
}
]
}Responses:
200OKaccepted: integerattributed_airings: integer
GET /.well-known/attribution-reporting/register-source#
Privacy Sandbox: register source · Auth: None · Host: your tracking domain
Responds with an Attribution-Reporting-Register-Source header for Android Privacy Sandbox (MeasurementManager.registerSource) and Chrome attributionsrc tags.
| Parameter | In | Required | Description |
|---|---|---|---|
link | query | no | Smart-link or tracking-link slug |
campaign | query | no | Campaign id |
Responses:
200Empty body; registration header set.
GET /.well-known/attribution-reporting/register-trigger#
Privacy Sandbox: register trigger · Auth: None · Host: your tracking domain
Responds with an Attribution-Reporting-Register-Trigger header for a conversion event.
| Parameter | In | Required | Description |
|---|---|---|---|
event | query | no | Event name |
value | query | no | Value |
Responses:
200Empty body; trigger header set.
POST /.well-known/attribution-reporting/report-event-attribution#
Privacy Sandbox: reports · Auth: None · Host: your tracking domain
Receives event-level reports. report-aggregate-attribution receives aggregatable reports and debug/* receives debug reports on the same prefix.
Request body:
object
Responses:
200Stored.
SDK#
POST /api/sdk/v1/install#
Report install · Auth: SDK key (X-SDK-Key)
Called once per install on first open (SDKs retry with backoff). Runs the attribution waterfall and returns the deferred deep link. Re-attribution after reattributionDays and reinstall detection are handled here.
Request body:
device_idrequired: string — SHA-256 of IDFV / GAID / app-set id (raw ids are hashed server-side)platformrequired: string (ios | android | tvos | android_tv | roku | fire_tv | samsung_tv | lg_tv | windows | macos | playstation | xbox | nintendo | web)os_version: stringapp_version: stringsdk_version: stringclick_id: string | null — wc_click_id from the launch deep linkinstall_referrer: string | null — Raw Android Install Referrer stringgclid: string | nullinstalled_at: string — ISO timestamplocale: stringtimezone: stringadvertising_id: string | null — Only with ATT / consent; forwarded to Google's app conversion API, never storedlimit_ad_tracking: booleanapple_attribution_token: string | null — AdServices attribution token (iOS 14.3+)ttclid: string | null — TikTok click idsc_click_id: string | null — Snap click id
{
"device_id": "2f7c…sha256",
"platform": "ios",
"os_version": "17.5",
"app_version": "1.2.0",
"sdk_version": "1.0.0",
"click_id": "k3Zp9Qw1mR7tXc2b",
"installed_at": "2026-09-02T09:20:00Z",
"locale": "en_US",
"timezone": "Europe/Istanbul"
}Responses:
200Existing install (idempotent repeat).install_id: stringattribution: objectis_reattribution: boolean
201New install attributed.
{
"install_id": "ins_01…",
"attribution": {
"method": "CLICK_ID",
"campaign": "Brand — Search",
"click_id": "k3Zp9Qw1mR7tXc2b",
"deep_link_path": "/product/123"
},
"is_reattribution": false
}400Validation error or platform mismatch for the SDK key.401Invalid SDK key.
POST /api/sdk/v1/events#
Send in-app events · Auth: SDK key (X-SDK-Key)
Batched in-app events (max 100 per call). session_start powers retention; purchase with value + currency powers LTV / ROAS. Events before an install call are stored without an install link.
Request body:
device_idrequired: stringinstall_id: string | nulleventsrequired: array<-namerequired: string — e.g. purchase, session_startvalue: number | nullcurrency: string | nullparams: object | nulloccurred_at: string — ISO timestamp>
{
"device_id": "2f7c…sha256",
"install_id": "ins_01…",
"events": [
{
"name": "purchase",
"value": 49.9,
"currency": "USD",
"params": {
"sku": "abc"
},
"occurred_at": "2026-09-02T09:25:00Z"
}
]
}Responses:
200OK
POST /api/sdk/v1/open#
Re-engagement open · Auth: SDK key (X-SDK-Key)
App opened by an existing user via deep link / universal link / push. Attributes the re-open to a retargeting click (click_id or click id parsed from url).
Request body:
device_idrequired: stringclick_id: string | nullurl: string | null — The deep link that opened the appoccurred_at: string
{
"device_id": "2f7c…sha256",
"url": "https://link.yourbrand.com/product/123?wc_click_id=abc"
}Responses:
200OKreengagement_id: stringattributed: booleancampaign_id: string | nulldeep_link_path: string | null
404Install not found — call /install first.
POST /api/sdk/v1/push-token#
Register push token · Auth: SDK key (X-SDK-Key)
Stores the APNs / FCM token on the install so the uninstall checker can send silent pushes.
Request body:
device_idrequired: stringpush_tokenrequired: string — APNs device token or FCM registration tokenplatformrequired: string (ios | android | tvos | android_tv | fire_tv)
Responses:
200OK404Install not found.
POST /api/sdk/v1/subscription#
Link subscription · Auth: SDK key (X-SDK-Key)
Links a StoreKit / Play purchase to the install so store-side renewals, cancellations and refunds (received via the store webhooks) are attributed. Records a trial_start or subscribe event. De-duplicated on (store, original_transaction_id).
Request body:
device_idrequired: stringinstall_id: string | nullstorerequired: string (apple | google)original_transaction_id: string | null — StoreKit 2 Transaction.originalIDpurchase_token: string | null — Play Billing purchaseTokenproduct_idrequired: stringis_trial: booleanprice_micros: integer — Price × 1,000,000currency: string | nullexpires_at: string | nulloccurred_at: string | null
{
"device_id": "2f7c…sha256",
"install_id": "ins_01…",
"store": "apple",
"original_transaction_id": "2000000123456789",
"product_id": "pro_monthly",
"is_trial": false,
"price_micros": 9990000,
"currency": "USD",
"expires_at": "2026-10-02T09:25:00Z"
}Responses:
200OKsubscription_id: stringinstall_id: string | nulllinked: booleancreated: boolean
POST /api/sdk/v1/ad-revenue#
Send ad revenue · Auth: SDK key (X-SDK-Key)
Impression-level ad revenue (AdMob paid events, MAX / ironSource ARM). Stored as ad_revenue events so it flows into LTV / ROAS.
Request body:
device_idrequired: stringinstall_id: string | nulleventsrequired: array<-networkrequired: string — admob | max | ironsource | …ad_unit: string | nullformat: string | null — banner | interstitial | rewarded | nativeplacement: string | nullrevenuerequired: number — Currency units (AdMob micros ÷ 1,000,000)currency: stringprecision: string | nullsource: string | nullts: string | null>
{
"device_id": "2f7c…sha256",
"events": [
{
"network": "admob",
"ad_unit": "ca-app-pub-1/2",
"format": "interstitial",
"placement": "level_end",
"revenue": 0.0125,
"currency": "USD",
"precision": "ESTIMATED",
"ts": "2026-09-02T09:30:00Z"
}
]
}Responses:
200OKaccepted: integerinstall_id: string | null
Webhooks#
POST /api/skan/postback#
SKAdNetwork postback · Auth: None
Apple SKAdNetwork 2.2 – 4 postback ingestion. Point NSAdvertisingAttributionReportEndpoint at your WhichClick domain or forward copies from your ad network. Signature verified when Apple's public key is configured.
| Parameter | In | Required | Description |
|---|---|---|---|
org | query | yes | Organization id |
Request body:
versionrequired: string — 2.2 – 4.0ad-network-idrequired: stringtransaction-idrequired: stringapp-id: string | integercampaign-id: string | integersource-identifier: string | integerconversion-value: integercoarse-conversion-value: stringfidelity-type: integerdid-win: booleansource-app-id: string | integerpostback-sequence-index: integerattribution-signature: string
Responses:
200OKok: booleanid: string
400Missing org or invalid body.
POST /api/subscriptions/apple#
App Store Server Notifications v2 · Auth: None
Receives JWS signedPayload notifications; the certificate chain is verified against Apple's root. Renewals, cancellations, refunds, grace periods and billing retries update the subscription and emit events.
Request body:
signedPayloadrequired: string — JWS
Responses:
200Processed.400Invalid JWS.
POST /api/subscriptions/google#
Google Play RTDN · Auth: None
Pub/Sub push endpoint for Real-time Developer Notifications. The base64 message.data contains the subscriptionNotification; purchase state is fetched via the Play Developer API when credentials are configured.
Request body:
message: objectsubscription: string
Responses:
200Processed.
POST /api/protect/beacon#
Engagement beacon · Auth: None
Sent by wc.js from the landing page (sendBeacon; JSON or text/plain). Adds dwell time, scroll depth, webdriver flag, screen / timezone / language consistency and fingerprint reuse to the click's risk score.
Request body:
click_idrequired: stringfingerprint: string — Client fingerprint hashscreen: string — e.g. 390x844timezone: stringlanguages: stringwebdriver: booleantouch: booleandwell_ms: integerscroll: integer — Max scroll depth %
Responses:
200OK404Unknown click id.
POST /api/ingest/clicks#
Edge batch ingest · Auth: HMAC signature
Batch ingest from the Cloudflare edge worker. Body signed with HMAC-SHA256 (X-WC-Signature) using EDGE_INGEST_SECRET. Up to 1000 pre-built click rows per call.
Request body:
eventsrequired: array<object>
Responses:
200OK401Bad signature.
Dashboard#
GET /api/protect/export#
Invalid-click evidence export · Auth: Dashboard session
CSV of invalid clicks (IP, reasons, score, gclid, campaign) for a Google Ads invalid-activity investigation / refund claim.
| Parameter | In | Required | Description |
|---|---|---|---|
days | query | no | Default 30 |
Responses:
200text/csv
POST /api/protect/sync#
Sync IP exclusions to Google Ads · Auth: Dashboard session
Pushes the blocklist as negative IP criteria to every active campaign (500 per campaign cap).
Responses:
200Sync summary.
GET /api/dashboard/realtime#
Real-time stats · Auth: Dashboard session
Last-15-minute click / install / conversion counters and stream.
Responses:
200OK
GET /api/dashboard/export#
Report export (CSV) · Auth: Dashboard session
Pivot / clicks / conversions CSV as shown in Reports.
| Parameter | In | Required | Description |
|---|---|---|---|
type | query | no | clicks | conversions | pivot |
Responses:
200text/csv
POST /api/dashboard/route-test#
Routing simulator · Auth: Dashboard session
Evaluates a smart link for a simulated visitor and returns the decision (same engine as the MCP test_smart_link_route tool).
Request body:
slugrequired: stringcountry: stringregion: stringcity: stringos: string — ios | android | desktopua: stringip: stringlanguage: stringtimezone: stringhour: integerparams: string — Query stringinApp: string — 'true' to simulate an in-app browser
Responses:
200{ context, decision, pool }
GET /api/dashboard/ippool/lookup#
IP lookup · Auth: Dashboard session
Pool classification, geo, rate-limit key, exclusion form and live intel for an IP.
| Parameter | In | Required | Description |
|---|---|---|---|
ip | query | yes |
Responses:
200OK
GET /api/edge/links/hot#
Hot links for edge warm-up · Auth: API key (Bearer)
Top links by clicks in the last 24 h; the edge cron uses it to warm KV.
Responses:
200Array of link configs.
AI#
POST /api/mcp#
MCP server (Streamable HTTP) · Auth: API key (Bearer)
Model Context Protocol endpoint (JSON-RPC 2.0 over HTTP, stateless). Without an API key only the documentation tools are exposed; with Authorization: Bearer wc_live_… the analytics and management tools are available. See the MCP server page.
Request body:
jsonrpcrequired: stringid: string | integermethodrequired: string — initialize | tools/list | tools/call | resources/list | resources/read | prompts/list | prompts/get | pingparams: object
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_docs",
"arguments": {
"query": "tracking template"
}
}
}Responses:
200JSON-RPC response.202Notification accepted (no body).401Key required for this tool.
Meta#
GET /api/health#
Health · Auth: None
Liveness + database round-trip.
Responses:
200OK
{
"status": "ok",
"db": "ok",
"latencyMs": 1,
"version": "0.1.0"
}Schemas#
Error#
errorrequired: string | integer — Error code or Zod validation summaryretry_after: integer — Seconds to wait (429 only)
ConversionInput#
click_id: string — WhichClick click id (wc_click_idappended to the landing page)gclid: string — Google click id — used when click_id is unknown; matched to the most recent clickevent: string — Event namevalue: number — Conversion valuecurrency: string — ISO 4217 currencyorder_id: string — Idempotency key together withevent
ConversionResult#
okrequired: boolean — Always trueidrequired: string — Conversion idmatchedrequired: boolean — True when a click was found
Click#
id: string — Click idcreatedAt: string — ISO timestampgclid: string | nullgbraid: string | nullwbraid: string | nullcampaignExtId: string | null — {campaignid}adGroupExtId: string | null — {adgroupid}creativeId: string | null — {creative}keyword: string | null — {keyword}matchType: string | null — e | p | b | anetwork: string | null — g | s | d | ytv | ytsdevice: string | null — m | t | cnextHopUrl: string — Destination the visitor was sent totransparentParamPresent: boolean — A visible url= parameter was presentforceTransparent: boolean — force_transparent=true was presentisBot: boolean — Verified search-engine botlatencyMs: integer | null — Redirect latency
Conversion#
id: stringcreatedAt: stringclickId: string | nullcampaignId: string | nulleventName: stringvalue: number | nullcurrency: string | nullorderId: string | nullgclid: string | nullsource: string — postback | api | import
CostRow#
campaign_id: string — WhichClick campaign idcampaign_external_id: string — Ad-platform campaign id (alternative to campaign_id)dayrequired: string — YYYY-MM-DDspendrequired: numbercurrency: stringimpressions: integer
Impression#
campaign_id: stringcampaign_external_id: stringapp_id: stringpartner: stringcreative_id: stringplacement: stringiprequired: string — Viewer IP (hashed server-side)user_agent: stringos: stringdevice_type: stringcountry: string — ISO-3166 alpha-2ts: string — ISO timestamp
TvAiring#
networkrequired: stringprogram: stringregion: stringaired_atrequired: string — ISO timestampspot_length_sec: integercost: numbercampaign_external_id: stringcampaign_id: stringwindow_min: integer — Attribution window after the spot (2–60)
InstallRequest#
device_idrequired: string — SHA-256 of IDFV / GAID / app-set id (raw ids are hashed server-side)platformrequired: string (ios | android | tvos | android_tv | roku | fire_tv | samsung_tv | lg_tv | windows | macos | playstation | xbox | nintendo | web)os_version: stringapp_version: stringsdk_version: stringclick_id: string | null — wc_click_id from the launch deep linkinstall_referrer: string | null — Raw Android Install Referrer stringgclid: string | nullinstalled_at: string — ISO timestamplocale: stringtimezone: stringadvertising_id: string | null — Only with ATT / consent; forwarded to Google's app conversion API, never storedlimit_ad_tracking: booleanapple_attribution_token: string | null — AdServices attribution token (iOS 14.3+)ttclid: string | null — TikTok click idsc_click_id: string | null — Snap click id
InstallResponse#
install_id: stringattribution: objectis_reattribution: boolean
EventsRequest#
device_idrequired: stringinstall_id: string | nulleventsrequired: array<-namerequired: string — e.g. purchase, session_startvalue: number | nullcurrency: string | nullparams: object | nulloccurred_at: string — ISO timestamp>
OpenRequest#
device_idrequired: stringclick_id: string | nullurl: string | null — The deep link that opened the appoccurred_at: string
PushTokenRequest#
device_idrequired: stringpush_tokenrequired: string — APNs device token or FCM registration tokenplatformrequired: string (ios | android | tvos | android_tv | fire_tv)
SubscriptionRequest#
device_idrequired: stringinstall_id: string | nullstorerequired: string (apple | google)original_transaction_id: string | null — StoreKit 2 Transaction.originalIDpurchase_token: string | null — Play Billing purchaseTokenproduct_idrequired: stringis_trial: booleanprice_micros: integer — Price × 1,000,000currency: string | nullexpires_at: string | nulloccurred_at: string | null
AdRevenueRequest#
device_idrequired: stringinstall_id: string | nulleventsrequired: array<-networkrequired: string — admob | max | ironsource | …ad_unit: string | nullformat: string | null — banner | interstitial | rewarded | nativeplacement: string | nullrevenuerequired: number — Currency units (AdMob micros ÷ 1,000,000)currency: stringprecision: string | nullsource: string | nullts: string | null>
BeaconRequest#
click_idrequired: stringfingerprint: string — Client fingerprint hashscreen: string — e.g. 390x844timezone: stringlanguages: stringwebdriver: booleantouch: booleandwell_ms: integerscroll: integer — Max scroll depth %
SkanPostback#
versionrequired: string — 2.2 – 4.0ad-network-idrequired: stringtransaction-idrequired: stringapp-id: string | integercampaign-id: string | integersource-identifier: string | integerconversion-value: integercoarse-conversion-value: stringfidelity-type: integerdid-win: booleansource-app-id: string | integerpostback-sequence-index: integerattribution-signature: string
RouteTestRequest#
slugrequired: stringcountry: stringregion: stringcity: stringos: string — ios | android | desktopua: stringip: stringlanguage: stringtimezone: stringhour: integerparams: string — Query stringinApp: string — 'true' to simulate an in-app browser
McpRequest#
jsonrpcrequired: stringid: string | integermethodrequired: string — initialize | tools/list | tools/call | resources/list | resources/read | prompts/list | prompts/get | pingparams: object
Health#
status: stringdb: stringlatencyMs: integerversion: string