Skip to main content
Four tools cover every reporting question. Pick by the shape of the answer you need, not the subject.

get_report_schema

Returns every valid dimension key, filter key, and metric name for run_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
Returns Gotchas
  • For built-in metrics, unit is count, currency, percent or ratio, and the human-readable formula lives in description (the formula field may be empty).
  • For custom metrics (is_custom: true — your network’s own definitions), formula is populated but unit may 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
Returns
has_more and result_capped are independent. has_more: true alone just means “page for the rest.” result_capped: true means the result is genuinely incomplete and paging every page will not recover the missing rows — narrow the date range, add filters, or use fewer dimensions.
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. totals re-derives ratios from the underlying sums (overall cvr = Σtotal_conversions ÷ Σclicks), so it stays correct even when only one page of rows is returned.
  • filters and metric_filters are different axes. filters narrows by dimension/entity (offer, affiliate, country, sub1…); metric_filters narrows by metric (clicks, revenue, cvr…). A metric name is not a valid filters key, and vice versa. Use conversions, not cv.
  • Percent metrics are percentages. cvr, ctr and margin return 2.84 for 2.84%, not 0.0284. In metric_filters, cvr<2 means “under 2%”. For “no invalid traffic” use invalid_clicks<=0.
  • This tool returns total_rows. List tools like list_offers return total_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/TorontoAmerica/New_York) — the numbers are unaffected. When that happens, applied_query carries timezone_requested and a timezone_note, so the resolved zone isn’t mistaken for your request being ignored.
  • filters also accepts a JSON-object form{"offer":"1|2"} or {"offer":["1","2"]} (array values work too). Don’t mix it with the key:value string 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. Set comparison=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.
Comparison mode has its own rules: 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 a custom_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

Pass one or more of these keys as a comma-separated 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), sub1sub10, adv1adv10, 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.
TimeEntitiesGeoDevice & technologyTracking & attributionPeople & managersPayout & revenueSub-parametersApp
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_idoffer, affiliate_id/partneraffiliate, advertiser_id/brandadvertiser, offer_group_idoffer_group, campaign_id/smart_linkcampaign, and the error-code dimensions click_error_code/conversion_error_codeerror_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.EntitiesGeoregion/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 & technologyPeople & managers — numeric employee IDs; resolve a name with list_entities type=employee.Sub-parametersBilling & labels
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 & efficiencycvr, 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
Returns Headline totals for the window, plus 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 filters with include=comparison for 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, including timezone_requested and timezone_note.

search_activity

Searches raw event records within a date-time window. Set type to choose the stream. Requires: Reporting (Read Only) Ask for it: “Show me yesterday’s rejected conversions on offer 1234.” Parameters Type-specific: Example
Returns 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, sub1sub10, 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, sub1sub10, adv1adv10, source_id. Empty or zero fields are omitted — coupon_code, email, notes, is_scrub, is_view_through and adv1adv10 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.
Gotchas
  • Pagination differs by type. type="conversion" is paginated (page_size + cursor; page while has_more is true). type="click" is not — it returns a single set capped at 1,000 records, most-recent first.
  • Window rules differ by type. click has a maximum 14-day window. conversion needs a minimum of one full day in the network timezone (00:00:0023:59:59); shorter windows may return an error.
  • Passing a filter that doesn’t apply to the chosen type (e.g. status with type="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_id filter.
  • email is 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_code or conversion_error_code).

Single-event and transaction lookup

Single events are served by the generic get_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.