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.
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 itsname,friendly_name, andtype.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).
| Parameter | Description |
|---|---|
app_id | Required. The UID of an app you have access to. |
days_back | The period to return: Yesterday, Last 30 Days, or Last 90 Days. The allowed values differ per endpoint. |
country | A 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_name | An app window name, All Windows, or All. |
ad_size | An ad size, All Sizes, or All. |
container_id | An ad container ID, All Containers, or All. |
app_version | An 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:
| Value | Returns |
|---|---|
All Countries, All Windows, All Sizes, All Containers, All Versions | The summary row only: one total across every value of that filter. |
All | One 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.
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 CountriesequalsUSplusNon 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.
| Widget | Endpoint | Filters |
|---|---|---|
| Revenue KPI | revenue-yesterday | None |
| ARPDAU KPI | arpdau-yesterday | None |
| RPS KPI | rps-yesterday | None |
| CPM KPI | cpm-yesterday | None |
| Daily Ads Revenue | daily-ads-revenue-gross-net | days_back, country |
| Month to Date Revenue | month-to-date-revenue | country |
| Ads Revenue - Year over Year | ads-revenue-year-over-year | country |
| Daily Ad Inventory & Fill Rate | daily-ad-inventory-fill-rate | days_back, window_name, country_name |
| Daily Average Revenue per DAU | daily-avg-revenue-per-dau | days_back, country |
| Monetized Users Ratio by Window | monetized-users-ratio-by-window | days_back, app_version. Native apps only. |
| Average Ad Container Open Time | average-ads-container-open-time | days_back, window_name |
| Country Performance | country-performance | days_back |
| Window Performance | window-performance | days_back, country |
| Ad Size Performance | ad-size-performance | days_back, country |
| Daily Ads Metrics | daily-ads-metrics | days_back, ad_size, window_name, country, container_id |
| Monthly Ads Metrics | monthly-ads-metrics | window_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:
- 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 andAuthorizationheader stay the same. - Update the field names your code reads. The new endpoints return different fields, and some values changed from net to gross.
- Check your filter values. Most new endpoints add a
countryfilter, anddays_backno longer acceptsLast 180 DaysorLast 365 Days.
| Legacy endpoint | New endpoint |
|---|---|
daily-ads-revenue-gross-net | daily-ads-revenue-gross-net. Adds a country filter and seven-day rolling averages. |
month-to-date-revenue-net | month-to-date-revenue. Adds a country filter and gross revenue. |
ads-revenue-net-yearly-comparison | ads-revenue-year-over-year. Adds a country filter and gross revenue. |
average-ads-container-open-time | average-ads-container-open-time. |
daily-avg-revenue-per-dau-per-country, daily-avg-revenue-per-dau-us, daily-avg-revenue-per-dau-non-us | daily-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-metrics | monthly-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-metrics | No 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.