# Mobile App Intelligence API - Downloads, Revenue, Ranks (`nabeelbaghoor/mobile-app-intelligence-api`) Actor

App Store and Google Play data as rows: app metadata, modelled download and revenue estimates by country and day, top chart positions, store reviews and daily, weekly and monthly active users. Read one app, a publisher's whole catalogue or a whole chart. Bring your own key.

- **URL**: https://apify.com/nabeelbaghoor/mobile-app-intelligence-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Business, Developer tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 app record returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Mobile App Intelligence API - Downloads, Revenue, Ranks

Turn App Store and Google Play into rows: what an app is, how much it is downloading and earning, where it sits in the charts, what people are saying about it, and how many of them open it.

### What it does

- **Six questions, one dataset.** Store metadata for apps you already have, a publisher's entire catalogue, download and revenue estimates, a top chart on a given day, store reviews, and active user counts. Every mode writes into the same dataset.
- **Estimates broken down properly.** One row per app, per country, per date, with iPhone, iPad and Android downloads and revenue kept apart as well as totalled, so you can see where the money actually comes from.
- **Revenue in units, not cents.** The provider reports revenue in cents; rows carry it in currency units, so a spreadsheet sums correctly without a conversion column.
- **Charts as ranked rows.** A top free, top paid or top grossing chart arrives as one row per position, so joining it to your own app list is a lookup rather than a parse.
- **Reviews with the rating attached.** Rating, title, body, author, app version and date, paged through until the range is exhausted.
- **Both stores, or both at once.** iOS, Android, or unified, which joins an iOS app and its Android twin under a single identifier so a cross-platform app is one thing rather than two.
- **Takes store URLs.** Paste an App Store or Google Play listing URL and the identifier is read out of it. You do not have to know that 284882215 is Facebook.
- **Keeps the misses.** An identifier the provider has no record of still produces a row saying so, and it is not charged for.
- **Batches to save your allowance.** Identifiers are grouped into as few provider requests as each route allows, then fanned out into rows, so the request allowance on your plan goes further.

### Input

#### Store metadata for a few apps

```json
{
  "mode": "apps",
  "platform": "ios",
  "appIds": ["284882215", "https://apps.apple.com/us/app/nfl/id389781154"],
  "countries": ["US"]
}
```

#### Download and revenue estimates

```json
{
  "mode": "estimates",
  "platform": "unified",
  "appIds": ["284882215"],
  "countries": ["US", "GB", "DE"],
  "startDate": "2026-08-01",
  "endDate": "2026-08-31",
  "dateGranularity": "daily",
  "maxResults": 500
}
```

#### A top chart on a day

```json
{
  "mode": "ranking",
  "platform": "ios",
  "category": "6005",
  "chartType": "topfreeapplications",
  "countries": ["US"],
  "endDate": "2026-09-01",
  "maxResults": 200
}
```

#### Reviews for one app

```json
{
  "mode": "reviews",
  "platform": "android",
  "appIds": ["com.facebook.katana"],
  "countries": ["US"],
  "startDate": "2026-08-01",
  "endDate": "2026-08-31"
}
```

### Example output

An app row and an estimate row.

```json
{
  "recordType": "app",
  "platform": "ios",
  "appId": "284882215",
  "name": "Facebook",
  "publisherId": "284882218",
  "publisherName": "Meta Platforms, Inc.",
  "country": "US",
  "categories": ["6005", "6002"],
  "releaseDate": "2019-02-05",
  "currentVersion": "512.0",
  "price": 0,
  "contentRating": "12+",
  "ratingAverage": 4.2,
  "ratingCount": 6100000,
  "iconUrl": "https://is1-ssl.mzstatic.com/image/thumb/...",
  "found": true
}
```

```json
{
  "recordType": "estimate",
  "platform": "unified",
  "appId": "284882215",
  "country": "US",
  "date": "2026-08-14",
  "iphoneDownloads": 41200,
  "iphoneRevenue": 0,
  "androidDownloads": 96500,
  "androidRevenue": 0,
  "totalDownloads": 137700,
  "totalRevenue": 0,
  "found": true
}
```

### Bring your own key

This actor calls a mobile app intelligence API with **your own account's API token**. Paste it into the API token field, or set it as the `DATA_API_KEY` environment secret on the actor. It is never written to the dataset or the log, and nothing is shared between runs.

Without a token the run ends cleanly and tells you what to add, rather than failing.

### Pricing

Pay per result, platform usage included.

| Event | Price |
| --- | --- |
| App record returned | $0.012 |
| Metric row returned (estimate, chart position, usage bucket) | $0.006 |
| Review returned | $0.004 |

Rows for identifiers the provider has no record of, and requests it refused, are never charged.

### FAQ

#### What data does this mobile app intelligence API return?

Store metadata (name, publisher, categories, release date, current version, price, in-app purchases, content rating, rating average and count, icon and description), modelled download and revenue estimates per app, country and date, top chart positions, store reviews with ratings, and daily, weekly and monthly active user estimates.

#### Does it cover both the App Store and Google Play?

Yes. Set the platform to `ios` for the Apple App Store, `android` for Google Play, or `unified` to treat an iOS app and its Android twin as one app under a single identifier.

#### What app identifier do I need?

An App Store numeric id such as `284882215`, a Google Play package name such as `com.facebook.katana`, or a store listing URL containing either. The URL is parsed for you.

#### How do I get download and revenue estimates for a whole month?

Use `mode: "estimates"` with `startDate`, `endDate` and `dateGranularity`. Daily granularity returns one row per app, per country, per day; monthly returns one row per app, per country, per month.

#### Are downloads and revenue actual figures or estimates?

They are modelled estimates produced by the data provider, not figures reported by Apple or Google. They are widely used for market sizing and competitive tracking, and they are estimates.

#### Which countries are supported?

Any two-letter country code the provider covers, plus `WW` for worldwide. Estimates and active users accept several countries in one run; ranking and reviews use the first one given.

#### What are the category and chart type values for rankings?

The store's own vocabulary. The App Store uses numeric categories such as `6005` (Social Networking) with chart types `topfreeapplications`, `toppaidapplications` and `topgrossingapplications`. Google Play uses names such as `GAME_ACTION` with `topselling_free`, `topselling_paid` and `topgrossing`.

#### Do I need my own API key?

Yes. This actor is bring-your-own-key: it calls the provider with your account's token, so you keep your own plan, allowance and terms. There is no shared or bundled key.

#### How is the price calculated?

Per row stored. App rows are $0.012, modelled metric rows are $0.006 and reviews are $0.004. Rows saying an app was not found cost nothing.

#### How do I keep a run from getting large?

Set `maxResults`. A daily estimates run over 3 countries and 31 days is 93 rows per app, so the cap is what keeps a multi-app run predictable.

### Keyword map

mobile app intelligence API, app store data API, google play data API, app download estimates API, app revenue estimates API, app store rankings API, top charts API, app reviews API, mobile app analytics API, app market intelligence, DAU MAU API, app store scraper alternative, competitive app tracking, ASO data, unified app data

# Actor input Schema

## `mode` (type: `string`):

A run answers one question. Apps returns store metadata for identifiers you already have. Publisher returns everything one publisher has shipped. Estimates returns modelled downloads and revenue. Ranking returns a store chart on a day. Reviews returns store reviews. Active users returns modelled user counts. Fields belonging to another mode are ignored rather than causing an error.

## `apiKey` (type: `string`):

Your own account's API token for this provider, issued from your account settings. Bring your own key: nothing is shared between runs and the token is never written to the dataset or the log.

## `platform` (type: `string`):

Which store to read. Unified joins an iOS app and its Android twin under one identifier, so unified mode takes the provider's own unified ids rather than store ids.

## `appIds` (type: `array`):

Apps to read, one per line. An App Store numeric id such as 284882215, a Google Play package name such as com.facebook.katana, or a store listing URL that carries one. Used by the apps, estimates, reviews and active users modes.

## `publisherId` (type: `string`):

The publisher to read in publisher mode. A numeric id on the App Store, a developer name on Google Play, or the provider's own unified publisher id.

## `countries` (type: `array`):

Two letter country codes, one per line, such as US or GB. Estimates and active users accept several and WW for worldwide. Ranking and reviews use the first one only. Leave empty for worldwide.

## `startDate` (type: `string`):

First day to cover, as YYYY-MM-DD. Used by estimates, reviews and active users. Defaults to 30 days before the end date.

## `endDate` (type: `string`):

Last day to cover, as YYYY-MM-DD. Used by estimates, reviews and active users, and it is also the day a ranking chart is read for. Defaults to yesterday.

## `dateGranularity` (type: `string`):

How download and revenue estimates are bucketed in estimates mode. Daily gives one row per app, country and day, which is the most detail and the most rows.

## `timePeriod` (type: `string`):

How active user counts are bucketed in active users mode.

## `category` (type: `string`):

The category to chart in ranking mode. A number such as 6005 on the App Store, or a name such as GAME\_ACTION on Google Play. Passing one store's vocabulary to the other returns nothing rather than an error.

## `chartType` (type: `string`):

Which chart to read in ranking mode. The App Store names are topfreeapplications, toppaidapplications and topgrossingapplications. Google Play uses topselling\_free, topselling\_paid and topgrossing.

## `maxResults` (type: `integer`):

The most rows this run may store, and so the most it can charge for. A daily estimate run produces one row per app, country and day, which adds up quickly, so this is the cap that keeps a run predictable.

## `requestsPerMinute` (type: `integer`):

How fast this run calls the provider. Lower it if your plan is rate limited more tightly than the default.

## `baseUrl` (type: `string`):

Overrides the API host. Only needed if the provider has given your account a different endpoint.

## Actor input object example

```json
{
  "mode": "apps",
  "platform": "ios",
  "appIds": [
    "284882215"
  ],
  "dateGranularity": "daily",
  "timePeriod": "month",
  "maxResults": 100,
  "requestsPerMinute": 120
}
```

# Actor output Schema

## `records` (type: `string`):

One row per record, alongside the app, country and date that produced it.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "appIds": [
        "284882215"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/mobile-app-intelligence-api").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "appIds": ["284882215"] }

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/mobile-app-intelligence-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "appIds": [
    "284882215"
  ]
}' |
apify call nabeelbaghoor/mobile-app-intelligence-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/mobile-app-intelligence-api"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Y2Aah0BxjoTPvdeAz/builds/4iWcAtc4arD3FkI2G/openapi.json
