get_report_schema
Returns every valid dimension key, filter key, and metric name forrun_performance_report, plus an authoritative definition for each metric. Call it first when you’re unsure which keys to use — the exact strings it returns are the accepted values.
Requires: Reporting (Read Only)
Ask for it: “What metrics can I report on, and how is EPC calculated?”
Parameters
None.
Example
Gotchas
- For built-in metrics,
unitiscount,currency,percentorratio, and the human-readable formula lives indescription(theformulafield may be empty). - For custom metrics (
is_custom: true— your network’s own definitions),formulais populated butunitmay be empty. These are definitions only; see Custom metrics. - This is the source of truth for “what metrics do I have?” and “how is X calculated?” — don’t infer a formula from the metric name.
run_performance_report
Queries aggregated performance data grouped by one or more dimensions. The primary tool for campaign analysis, partner comparison, and revenue reporting. Requires: Reporting (Read Only) Ask for it: “Show me revenue by offer for the last 7 days, top 10.” Parameters
Example
Gotchas
- Use
totals, don’t sum rows. Ratio metrics can’t be summed or averaged into an overall figure, and summing one page misses the rest.totalsre-derives ratios from the underlying sums (overallcvr = Σtotal_conversions ÷ Σclicks), so it stays correct even when only one page of rows is returned. filtersandmetric_filtersare different axes.filtersnarrows by dimension/entity (offer, affiliate, country, sub1…);metric_filtersnarrows by metric (clicks, revenue, cvr…). A metric name is not a validfilterskey, and vice versa. Useconversions, notcv.- Percent metrics are percentages.
cvr,ctrandmarginreturn2.84for 2.84%, not0.0284. Inmetric_filters,cvr<2means “under 2%”. For “no invalid traffic” useinvalid_clicks<=0. - This tool returns
total_rows. List tools likelist_offersreturntotal_matching. Different fields, different meanings. - Timezone resolution. Everflow supports a fixed set of timezones. A valid IANA zone outside that set resolves to the supported zone with identical day boundaries and DST rules (
America/Toronto→America/New_York) — the numbers are unaffected. When that happens,applied_querycarriestimezone_requestedand atimezone_note, so the resolved zone isn’t mistaken for your request being ignored. filtersalso accepts a JSON-object form —{"offer":"1|2"}or{"offer":["1","2"]}(array values work too). Don’t mix it with thekey:valuestring form in one call.list_entities, by contrast, accepts only a JSON object.
Period-over-period comparison
To answer “which offers or partners moved the most”, have the report compare two periods rather than running it twice and subtracting. Setcomparison=previous_period, or pass an explicit compare_from/compare_to baseline (e.g. the same month last year).
Each row then carries, for every metric, an object of { current, prior, delta, pct_change }, all computed server-side. pct_change is null when the prior value was 0 — the change is undefined, not infinite. Rank the movers with a delta sort key: sort_by accepts <metric>_delta and <metric>_pct_change (e.g. epc_delta, revenue_pct_change) alongside the raw metric names.
The prior period is fetched scoped to the current period’s entities, so for single-dimension comparisons narrowing the current period is enough. With multiple dimensions the prior scope is a cross-product of the current IDs, so a very active prior period can still exceed the cap.
Custom metrics
If your network defines custom metrics, every row also carries acustom_metrics object keyed by metric name. It is not selectable — there is no parameter to request or suppress it. Every custom metric defined on the network is computed and returned on every row; if the network defines none, the key is absent entirely.
Custom metrics are distinct from the
custom_payout_revenue entity.
Reference
Available dimensions
Available dimensions
Pass one or more of these keys as a comma-separated Time
dimensions string. The schema also returns two aliases not listed below: smart_link (alias of campaign) and device (a general device dimension alongside device_type).Dimensions are served from one of two stores, which affects latency, not correctness.Pre-aggregated summary (fast) — the time dimensions (
date, hour, hourly, week, month, day_of_week), the entity dimensions (offer, originating_offer, offer_status, advertiser, affiliate, affiliate_status, creative, campaign/smart_link), the manager dimensions (affiliate_manager, account_manager, sales_manager, account_executive), plus currency, project_id, advertiser_campaign_name, app_identifier, bundle_id and meta_platform.Raw event detail, backed by BigQuery (slower) — every other dimension: geo (country, region, city, dma, postal_code), device (device, device_type, platform, browser, os_version, device_make, device_model), connection (isp, carrier, language, connection_type, is_proxy), sub1–sub10, adv1–adv10, source_id, event_name, transaction_id, attribution_method, order_id, coupon_code, referer, tracking_domain, category, offer_group, and the error-code breakdowns.Grouping by any raw-detail dimension moves the whole query to BigQuery. Totals are computed over whichever store answers the query, so if a summary-backed grouping and a detail-backed grouping of the same window ever disagree, the two stores have drifted — report it rather than averaging them.Entities
Geo
Device & technology
Tracking & attribution
People & managers
Payout & revenue
Sub-parameters
App
Available filters
Available filters
Pass filters as comma-separated inclusive
type:value pairs — e.g. offer:123,affiliate:456,country_code:US. Only inclusive filters are supported — there is no exclusion syntax. status is not a supported filter or dimension on this tool; to filter conversions by status, use search_activity(type="conversion") instead.Multiple values (OR): for any ID filter, separate IDs with a pipe to match any of them in one query — offer:1|2|5 returns offers 1, 2, and 5 together. Repeating a key (offer:1,offer:2) does the same. Supported on the ID filters: offer, offer_group, affiliate, advertiser, creative, campaign, category, network, tracking_domain, channel. Prefer one multi-value query over many single-ID queries. list_entities supports the same pipe form on type="coupon_code" (coupon_code, affiliate_id, offer_id), capped at 100 values per filter.Accepted aliases: the _id form and common synonyms are normalized to the canonical key, so you don’t have to guess — offer_id→offer, affiliate_id/partner→affiliate, advertiser_id/brand→advertiser, offer_group_id→offer_group, campaign_id/smart_link→campaign, and the error-code dimensions click_error_code/conversion_error_code→error_code (so you can filter by the same key you grouped a breakdown on). An unrecognized filter key returns an error with a suggestion rather than being silently ignored. Note: campaign is the smart-link/rotator entity; the individual ad campaign is an offer.EntitiesGeo —
region/city take internal numeric IDs; resolve a name to its ID with list_entities (type=region / type=city, and type=country for the country_id that scopes a region lookup).Device & technology
People & managers — numeric employee IDs; resolve a name with
list_entities type=employee.Sub-parameters
Billing & labels
Available metrics
Available metrics
These are also the valid values for
sort_by and metric_filters. Call get_report_schema for the same definitions in machine-readable form (metric_definitions).VolumeThe conversion family reconciles exactly:
total_conversions − conversions − invalid_cv_scrub − view_through_cv == 0. Use invalid_cv_scrub to size scrubbing rather than inferring it from the gap.Revenue & costRates & efficiency
cvr, ctr and margin are percentages (2.84 = 2.84%); roas is a ratio. This matters in metric_filters: cvr<2 means “under 2%”.metric_definitions from get_report_schema also lists your network’s custom metrics, marked is_custom: true and carrying their formulas. Those entries are definitions only — not computed by this tool and never present in totals. They are also not usable in sort_by or metric_filters: an unrecognized sort_by name is silently ignored rather than rejected, so a report that looks unsorted usually means the metric name didn’t match. Sort and filter on the built-ins above.run_network_summary
Returns headline performance totals for a date range — no grouping, just aggregate numbers. Optionally compares against the prior equivalent period, and can be scoped to specific entities. Requires: Reporting (Read Only) Ask for it: “How did the network do last week compared with the week before?” Parameters
Example
applied_query (the exact resolved query — from, to, resolved timezone and currency, and any filters and include; empty sections omitted) and the same metric_glossary object as run_performance_report.
Gotchas
- Pair
filterswithinclude=comparisonfor a filtered period comparison — “is offer 91 up or down vs last week?” - Only the five entity keys above are supported here. For breakdowns by country, device, sub-parameter or error code, use
run_performance_report— those dimensions don’t exist on the summary. - Timezone resolution works exactly as it does for
run_performance_report, includingtimezone_requestedandtimezone_note.
search_activity
Searches raw event records within a date-time window. Settype to choose the stream.
Requires: Reporting (Read Only)
Ask for it: “Show me yesterday’s rejected conversions on offer 1234.”
Parameters
Type-specific:
Example
Per-record fields —
type="click"
transaction_id, timestamp, offer_id, affiliate_id, advertiser_id, campaign_id, error_code, error_message, is_unique, is_view_through, is_test_mode, payout, revenue, currency, country, region, city, browser, platform, device_type, os_version, user_ip, referer, coupon_code, previous_transaction_id, sub1–sub10, source_id.
Empty values are omitted. campaign_id is returned only when the click is on a smart link. offer_name, affiliate_name, advertiser_name and has_conversion are not on this stream — each needs a per-record lookup, so use get_entity(type="click") when you need them.
Per-record fields — type="conversion"
conversion_id, transaction_id, timestamp, click_timestamp, status, error_code, offer_id, offer_name, affiliate_id, affiliate_name, advertiser_id, advertiser_name, payout, revenue, sale_amount, payout_type, revenue_type, currency, event_id, event_name, order_id, country, region, city, platform, device_type, browser, os_version, referer, language, brand, dma, session_user_ip, conversion_user_ip, http_user_agent, isp, carrier, app_id, idfa, google_ad_id, android_id, sub1–sub10, adv1–adv10, source_id.
Empty or zero fields are omitted — coupon_code, email, notes, is_scrub, is_view_through and adv1–adv10 appear only when populated. event_name is resolved on this stream, and a non-zero event_id means the row is a post-conversion event. error_message and campaign_id are not on this stream — use get_entity(type="conversion") for those.
status filters on reporting categories, not on the conversion’s own status field. The four values don’t map one-to-one onto the stored conversion_status:So a conversion showing
"status": "rejected" in its own payload is returned by status="invalid" when it was neither scrubbed nor geo-blocked, and is not returned by status="rejected". This is intentional and matches the REST conversion report. The per-row status is always the raw value, so it will not always equal the filter that matched it — don’t read a mismatch as a bug.Known gap: a conversion whose conversion_status is rejected with error_code 1 and no scrub flag satisfies neither branch — rejected requires the scrub flag, invalid excludes error_code 1 — so no status filter value returns it, although it does appear in an unfiltered query. Don’t treat a set of status-filtered calls as an exhaustive partition of the window.- Pagination differs by
type.type="conversion"is paginated (page_size+cursor; page whilehas_moreistrue).type="click"is not — it returns a single set capped at 1,000 records, most-recent first. - Window rules differ by
type.clickhas a maximum 14-day window.conversionneeds a minimum of one full day in the network timezone (00:00:00→23:59:59); shorter windows may return an error. - Passing a filter that doesn’t apply to the chosen
type(e.g.statuswithtype="click") returns an error rather than being ignored. - Results are filtered by affiliate visibility. On a limited-scope account, rows for affiliates outside that scope are silently excluded — counts can look lower than expected when you query without an
affiliate_idfilter. emailis obfuscated for conversions from GDPR countries. See Event response fields.- For counts and breakdowns rather than raw records, use
run_performance_report(e.g.dimensions=click_error_codeorconversion_error_code).
Single-event and transaction lookup
Single events are served by the genericget_entity tool — type="click", type="conversion", or type="transaction" for the full attribution chain. For response fields and a walkthrough of using them together, see Attribution debugging.