Skip to main content

Revenue APIs

The Revenue APIs return the data behind the Revenue Statistics dashboard in the Developers Console, with one endpoint for each tile, chart, and table. Use them to pull your app's ads revenue data into your own BI dashboards or monitoring tools.

New endpoints

The Revenue APIs moved to new revenue-v2 endpoints that match the Beta Revenue Statistics dashboard. The legacy revenue endpoints keep working until they retire on December 1, 2026, the same date as the legacy Revenue Statistics dashboard. To find the new endpoint for each legacy endpoint, see Moving from the legacy endpoints.

Base URL​

Every endpoint is a GET request to:

https://console.overwolf.com/api/stats/revenue-v2/<endpoint>

Authenticating​

Send your Developers Console account email and API key in the Authorization header of every request:

Authorization: Key <your-console-email>:<your-api-key>

To generate an API key, see Accessing the endpoints. Generating a new key revokes the previous one.

Making a request​

Pass app_id and the endpoint's filters as query parameters. Filter values are the labels shown in the dashboard filters, such as Last 30 Days or All Countries, so URL-encode them.

curl -G "https://console.overwolf.com/api/stats/revenue-v2/daily-ads-revenue-gross-net" \
-H "Authorization: Key <your-console-email>:<your-api-key>" \
--data-urlencode "app_id=<your-app-uid>" \
--data-urlencode "days_back=Last 30 Days" \
--data-urlencode "country=All Countries"

The same request in Node.js 18 or later, as an ES module (.mjs):

const params = new URLSearchParams({
app_id: '<your-app-uid>',
days_back: 'Last 30 Days',
country: 'All Countries',
});

const response = await fetch(
`https://console.overwolf.com/api/stats/revenue-v2/daily-ads-revenue-gross-net?${params}`,
{
headers: {
Authorization: `Key ${process.env.OW_CONSOLE_EMAIL}:${process.env.OW_CONSOLE_API_KEY}`,
},
},
);

if (!response.ok) {
throw new Error(`Request failed with status ${response.status}`);
}

const { columns, rows } = await response.json();
console.log(columns.map((column) => column.name), rows.length);

Reading the response​

Every endpoint returns a JSON object with two arrays:

  • columns: one entry per field, with its name, friendly_name, and type.
  • rows: the data. Each row is an object keyed by field name.

A shortened response from daily-ads-revenue-gross-net, with placeholder values:

{
"columns": [
{ "name": "revenue_date", "friendly_name": "revenue_date", "type": "date" },
{ "name": "daily_total_gross_revenue", "friendly_name": "daily_total_gross_revenue", "type": "float" }
],
"rows": [
{ "revenue_date": "YYYY-MM-DD", "daily_total_gross_revenue": 0 }
]
}

Each endpoint page lists every field it returns. Every row includes updated_at, the time the data was last updated.

Gross and net values​

Gross revenue is ads revenue before the Overwolf revenue share. Net revenue is ads revenue after the revenue share. Most endpoints return both, and each endpoint page states which fields are gross and which are net.

Units​

  • Revenue and CPM fields are in USD.
  • ARPDAU and RPS fields in the KPI endpoints and in Daily Average Revenue per DAU are in US cents.

Opportunities​

The Opportunities field starts with a capital O. Opportunities data is available from late July 2026, so earlier dates and months show no opportunities data.

Filtering​

Filters are query parameters. Every filter an endpoint lists is required: send all of them on each request. Omitting a filter returns an error, it does not fall back to a default. Each endpoint page lists the filters it accepts, their allowed values, and the value to send for the default result (for example All Countries or Last 90 Days).

ParameterDescription
app_idRequired. The UID of an app you have access to.
days_backThe period to return: Yesterday, Last 30 Days, or Last 90 Days. The allowed values differ per endpoint.
countryA country name as it appears in the dashboard Country filter, All Countries, or All. Daily Average Revenue per DAU also accepts the combined options US and Non US (a full name such as United States is not accepted). Daily Ad Inventory & Fill Rate takes country_name instead.
window_nameAn app window name, All Windows, or All.
ad_sizeAn ad size, All Sizes, or All.
container_idAn ad container ID, All Containers, or All.
app_versionAn app version, All Versions, or All.

Getting a breakdown with All​

The filters country, country_name, window_name, ad_size, container_id, and app_version accept two different "all" values, and they return different data:

ValueReturns
All Countries, All Windows, All Sizes, All Containers, All VersionsThe summary row only: one total across every value of that filter.
AllOne row for each value of that filter, plus the summary rows.

For example, to get Daily Ads Revenue broken down by country in one request, pass country=All instead of country=All Countries:

curl -G "https://console.overwolf.com/api/stats/revenue-v2/daily-ads-revenue-gross-net" \
-H "Authorization: Key <your-console-email>:<your-api-key>" \
--data-urlencode "app_id=<your-app-uid>" \
--data-urlencode "days_back=Last 30 Days" \
--data-urlencode "country=All"

Each row names its value in the filter's fields. For countries, country holds the two-letter country code and country_name holds the full name.

All applies to these filters only. days_back takes one of the period values listed on the endpoint page.

Large responses

Each filter you set to All multiplies the number of rows, so responses can get very large. Set All only on the filters you need to break down.

Excluding summary rows​

A response for All mixes summary rows with the per-value rows. If you add up every row, you count the same revenue more than once, so the result is at least double the real total. For example, in a window-performance response, the All Windows row already equals the sum of the per-window rows. With country=All as well, the country summaries repeat that again for every window.

The summary rows are:

  • All Countries, All Windows, All Sizes, All Containers, All Versions: the total across every value of that filter.
  • Non US: every country except the US. All Countries equals US plus Non US.

Only some countries get their own row. The remaining countries are grouped into one Rest of the World row. Rest of the World isn't a summary row: count it with the individual countries. The individual countries plus Rest of the World equal Non US.

When you set more than one filter to All, every combination appears, so a row can be a summary on one filter and a single value on another. To get only the per-value rows, keep the rows where none of the fields you broke down holds a summary value. List the response fields for the filters you set to All. For countries, use country or country_name, whichever the endpoint returns:

const SUMMARY_VALUES = new Set([
'All Countries',
'Non US',
'All Windows',
'All Sizes',
'All Containers',
'All Versions',
]);

// The response fields for the filters you set to `All`.
const breakdownFields = ['country_name', 'window_name'];

const detailRows = rows.filter((row) =>
breakdownFields.every((field) => !SUMMARY_VALUES.has(String(row[field]))),
);

To use a summary total directly, keep the matching summary row instead of adding up the per-value rows.

Endpoints​

The endpoints follow the sections of the Revenue Statistics dashboard. For more information about each widget, see Revenue statistics.

WidgetEndpointFilters
Revenue KPIrevenue-yesterdayNone
ARPDAU KPIarpdau-yesterdayNone
RPS KPIrps-yesterdayNone
CPM KPIcpm-yesterdayNone
Daily Ads Revenuedaily-ads-revenue-gross-netdays_back, country
Month to Date Revenuemonth-to-date-revenuecountry
Ads Revenue - Year over Yearads-revenue-year-over-yearcountry
Daily Ad Inventory & Fill Ratedaily-ad-inventory-fill-ratedays_back, window_name, country_name
Daily Average Revenue per DAUdaily-avg-revenue-per-daudays_back, country
Monetized Users Ratio by Windowmonetized-users-ratio-by-windowdays_back, app_version. Native apps only.
Average Ad Container Open Timeaverage-ads-container-open-timedays_back, window_name
Country Performancecountry-performancedays_back
Window Performancewindow-performancedays_back, country
Ad Size Performancead-size-performancedays_back, country
Daily Ads Metricsdaily-ads-metricsdays_back, ad_size, window_name, country, container_id
Monthly Ads Metricsmonthly-ads-metricswindow_name, country

Rate limits and errors​

The API limits how many requests you can send in a time window. When you go over the limit, it returns HTTP 429. Read the X-RateLimit-Remaining and X-RateLimit-Reset response headers to pace your requests.

A request with an invalid API key, or for an app your account can't access, returns an HTTP error status instead of data.

Moving from the legacy endpoints​

The legacy endpoints use the path /api/stats/revenue/<endpoint> and match the legacy dashboard. They keep working until they retire on December 1, 2026, the same date as the legacy Revenue Statistics dashboard. For the legacy reference, see Legacy Revenue APIs.

To move to the new endpoints:

  1. Change the path from /api/stats/revenue/ to /api/stats/revenue-v2/, and change the endpoint name where the following table shows a new one. Your API key and Authorization header stay the same.
  2. Update the field names your code reads. The new endpoints return different fields, and some values changed from net to gross.
  3. Check your filter values. Most new endpoints add a country filter, and days_back no longer accepts Last 180 Days or Last 365 Days.
Legacy endpointNew endpoint
daily-ads-revenue-gross-netdaily-ads-revenue-gross-net. Adds a country filter and seven-day rolling averages.
month-to-date-revenue-netmonth-to-date-revenue. Adds a country filter and gross revenue.
ads-revenue-net-yearly-comparisonads-revenue-year-over-year. Adds a country filter and gross revenue.
average-ads-container-open-timeaverage-ads-container-open-time.
daily-avg-revenue-per-dau-per-country, daily-avg-revenue-per-dau-us, daily-avg-revenue-per-dau-non-usdaily-avg-revenue-per-dau. Set country to a country, or to the combined US or Non-US option.
all-ads-metrics-monthly, video-ads-metrics-monthly, display-ads-metrics-monthly, monthly-ads-metricsmonthly-ads-metrics. Adds window_name and country filters.
video-ads-general-metrics, video-ads-revenue-net, video-ads-completion-rate, video-ads-detailed-metrics, display-ads-general-metrics, display-ads-revenue-net, display-ads-estimated-metricsNo direct replacement. Video and display ads compete in one unified auction, so the new endpoints don't split them. Use daily-ad-inventory-fill-rate, ad-size-performance, and daily-ads-metrics. For more information, see Video and display ads in the unified auction.

The four KPI endpoints, daily-ad-inventory-fill-rate, monetized-users-ratio-by-window, country-performance, window-performance, ad-size-performance, and daily-ads-metrics are new and have no legacy equivalent.