Skip to main content
Which reporting tool should I use?
  • Aggregated stats (totals, trends, breakdowns) → run_performance_report or run_network_summary
  • Raw event records (individual clicks or conversions over a window) → search_activity (set type to click or conversion)
  • Single event by ID (attribution troubleshooting, dispute resolution) → get_entity with type="click", type="conversion", or type="transaction" (full attribution chain). See Events & Attribution.

get_report_schema

Returns the complete list of valid dimension keys, filter keys, and metric names for run_performance_report, plus an authoritative definition for every metric. Call this first if you’re unsure which keys to use — the exact strings returned here are the accepted values for dimensions, filters, and sort_by. It is also the source of truth for “what metrics are available?”, “how is <metric> calculated?”, and “what custom metrics do I have?”. Parameters: None. Response fields: The metric_definitions entries describe how each metric is computed. For built-in metrics, unit is one of count, currency, percent, or ratio, and the human-readable formula is in the description (the formula field itself may be empty). For custom metrics (is_custom: truethis network’s user-defined metrics), the formula field is populated but unit may be empty. Custom metrics are distinct from the custom_payout_revenue entity.

run_performance_report

Queries aggregated performance data grouped by one or more dimensions. The primary tool for campaign analysis, partner comparison, and revenue reporting. Parameters:
The filters parameter uses comma-separated type:value strings — for example offer:123,affiliate:456,country_code:US. To match multiple values for the same ID filter, separate them with a pipe — offer:1|2|5 returns all three offers in a single query instead of running a separate report per offer. The type:value string form is the documented, preferred form here; a JSON-object form (e.g. {"offer":"1|2"}) is also accepted but should not be mixed with the string form in one call. (list_entities, by contrast, accepts only a JSON object.) See the filters accordion below for all valid keys.
filters and metric_filters are different axes. filters narrows by dimension/entity values (offer, affiliate, country, sub1, …); metric_filters narrows by metric values (clicks, conversions, invalid_clicks, revenue, cvr, …). A metric name is not a valid filters key, and vice-versa.Percent metrics: cvr, ctr, and margin are expressed as percentages (e.g. 2.84 means 2.84%), not 0–1 fractions. In metric_filters, write cvr<2 to mean “CVR under 2%”. For “no invalid traffic”, use invalid_clicks<=0.
Response envelope:
run_performance_report uses total_rows (not total_matching) in its pagination envelope, which differs from list tools like list_offers and list_affiliates.
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 — to get complete data, narrow the date range, add more specific filters (e.g. a single affiliate or offer), or split the request into multiple smaller queries.
The response also carries an applied_query object — the exact, resolved query that produced the rows, so you can audit a number and reproduce it in the portal rather than trust it blind. It echoes from, to, the resolved timezone and currency (after defaulting to the network’s settings when omitted), dimensions, and — when supplied — filters, metric_filters, and sort_by/sort_direction. Empty sections are omitted.
Timezone resolution. Everflow supports a fixed set of timezones. If you request a valid IANA zone that isn’t in that set, it’s resolved to the supported zone with identical day boundaries and DST rules (e.g. America/TorontoAmerica/New_York) — the numbers are unaffected. When this happens, applied_query additionally carries timezone_requested (what you asked for) and a timezone_note explaining the mapping, so the resolved timezone isn’t mistaken for the request being ignored.
It also carries a metric_glossary object — inline one-line definitions for the metrics that are easy to misread, so methodology travels with the numbers instead of needing a separate get_report_schema call. It covers the conversion-counting family (conversions vs total_conversions vs events), revenue’s event inclusion, and the percent/ratio metrics (cvr, ctr, margin, roas) so 2.84 isn’t mistaken for a fraction. And a totals object with every metric aggregated over the full matched set — all rows, before pagination and the display cap — computed server-side so you never sum rows yourself. Additive metrics (clicks, conversions, payout, revenue, …) are summed; the ratio metrics (cvr, roas, margin, …) are re-derived from those sums (e.g. overall cvr = Σtotal_conversions ÷ Σclicks), never averaged — so the totals stay correct even when only one page of rows is returned.

Period-over-period comparison

To answer “which offers/partners moved the most”, have the report compare two periods instead of running it twice and subtracting the numbers yourself. Set comparison=previous_period (compares [from, to] against the equal-length window immediately before it) 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 an infinite increase). Rank the movers with a delta sort key: sort_by accepts <metric>_delta and <metric>_pct_change (e.g. epc_delta, revenue_pct_change) in addition to the raw metric names.
Comparison mode is current-anchored. It ranks rows that were active in the current period against their prior-period values. An entity that had activity in the prior period but none in the current period is not returned — so comparison mode cannot answer “what did I lose”. For that, run an explicit report over the prior window on its own.Comparison mode requires sort_by, does not support cursor (no pagination across a join), and cannot group by a time dimension (date, hour, month — a date never aligns across two windows). It is also bounded: if either period matches more rows than the comparison cap, the call returns an error asking you to narrow — add metric_filters (e.g. revenue>1000), add filters, or use fewer dimensions, rather than expecting truncation. 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 per-dimension (a cross-product of the current ids), so a very active prior period can still exceed the cap — narrow further with filters or drop a dimension if it does.
Don’t add up the rows yourself for a total — use totals. Row-level ratio metrics cannot be summed or averaged into an overall figure, and summing a single page misses the rest of the result set. totals handles both correctly.
Pass one or more of these keys as a comma-separated dimensions string. The schema (get_report_schema) also returns two aliases not listed below: smart_link (alias of campaign) and device (a general device dimension alongside device_type).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.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 the sort_by parameter. Call get_report_schema for the same definitions in machine-readable form (metric_definitions), including any network-specific custom metrics.VolumeRevenue & CostRates & Efficiency
cvr, ctr, and margin are percentages (e.g. 2.84 = 2.84%), and roas is a ratio. This matters in metric_filters: cvr<2 means “under 2%“.

run_network_summary

Returns headline performance totals for a date range — no grouping, just aggregate numbers. Optionally includes a comparison against the prior equivalent period, and can be scoped to specific entities. Parameters:
filters enables a filtered period comparison — pair it with include=comparison to answer “is offer 91 up or down vs last week?”. Only the entity keys above are supported here; for breakdowns by country / device / sub-parameter / error-code, use run_performance_report instead — those dimensions are not available on the summary.
Like run_performance_report, the response carries an applied_query object echoing exactly what ran — from, to, the resolved timezone and currency, and any filters and include — so the totals can be audited and reproduced (empty sections omitted). Timezone resolution works the same way here (a requested zone that isn’t supported maps to its equivalent, surfaced via timezone_requested/timezone_note — see the note under run_performance_report). It also carries the same metric_glossary object of inline definitions for the easily-confused metrics.

search_activity

Searches raw event records within a date-time window. Set type to choose the event stream:
  • type="click" — raw click events. Maximum 14-day window, up to 1,000 records (not paginated).
  • type="conversion" — conversion events. Minimum reliable window is one full day in the network timezone. Paginated via page_size (1–100, default 50) and next_cursor.
Pagination differs by type. type="conversion" is paginated — request page_size (1–100, default 50) and, while the response has has_more: true, pass its next_cursor back as cursor (with the same filters and window) to fetch the next page. type="click" is not paginated — it returns a single result set capped at 1,000 records, sorted most-recent first. For aggregated counts instead of raw records, use run_performance_report.
Results are automatically filtered by affiliate visibility. If your account has a limited affiliate scope, rows for affiliates outside that scope are silently excluded — counts may be lower than expected when querying without an affiliate_id filter.
Common parameters: Type-specific parameters:
The window is interpreted in the network’s timezone (matching run_performance_report / run_network_summary). For type="click" the maximum window is 14 days. For type="conversion" the minimum reliable window is one full day (YYYY-MM-DD 00:00:00 to YYYY-MM-DD 23: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.
Response envelope: Per-record fields (type="click"): transaction_id, timestamp, offer_id, affiliate_id, advertiser_id, campaign_id, error_code, is_unique, payout, revenue, currency, country, sub1sub10, source_id. campaign_id is returned only when the click is on a smart link. 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, event_id, order_id, country, sub1sub10, source_id. Fields that are empty/zero are omitted — coupon_code, is_scrub, event_name, and adv1adv10 appear only when populated.

Single-event & transaction lookup

Single-event lookups are served by the generic get_entity tool (type="click", type="conversion", or type="transaction" for the full attribution chain). Response fields, listing filters, and guidance on choosing between these and search_activity are on Events & Attribution.