# Google Play Scraper: App Details and Keyword Search (`redfoxscout/google-play-scraper`) Actor

Get Google Play app data by package ID or search keyword: title, developer, rating, ratings count, installs, price, genre, last updated, version, icon, screenshots and description. Pay per app row. No login or API key.

- **URL**: https://apify.com/redfoxscout/google-play-scraper.md
- **Developed by:** [Red Fox Scout](https://apify.com/redfoxscout) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 apps

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Get full **Google Play app details** by **package ID or Play Store URL**, and **keyword search results**, in one Actor: **more than 40 fields per app**, including the **rating histogram, installs, price, in-app purchases, ads flag, version and release and update dates**. Pick the **country and language** for each run. **No login and no API key.**

**Price: $1.00 per 1,000 apps.** Failed lookups are free. Apify's free plan ($5 monthly credit) covers about 5,000 apps.

![Google Play Scraper output table: app, developer, rating, ratings, installs, price, genre and last update](https://raw.githubusercontent.com/TikTop-Data/apify-store-assets/main/images/google-play-scraper-output.png)

### Questions it answers

- How many installs and what rating does an app have right now?
- Which apps does Google Play show for a keyword, and in what order?
- When was an app last updated, and what does its What's new text say?
- Which apps offer in-app purchases or show ads?
- What does an app cost in a given country?

### Who uses this

- 📱 **App developers and ASO teams:** compare ratings, installs and update frequency with competitors.
- 📈 **Market researchers:** list the apps that appear for a keyword, with installs and prices by country.
- 🧭 **Product managers:** read what changed in a competitor's latest version.
- 🔎 **Researchers:** build datasets of public app listings.

### Why this Google Play Scraper

- 📊 **Details and search in one Actor:** pass package IDs, Play Store links, keywords or all of them.
- 🔎 **More than 40 fields per app:** rating histogram, installs as a range and as a number, price and currency, in-app purchase range, ads flag, release and update dates.
- 🌍 **Country and language per run:** the store region sets prices and availability, the language sets the listing text.
- 💵 **One price:** $1.00 per 1,000 apps, failed lookups free.

### How to use the Google Play Scraper

1. Click **Try for free** (a free Apify account is enough).
2. Enter package IDs or Play Store links (`com.spotify.music`) and/or search keywords (`habit tracker`), one per line.
3. Optional: set the country and language, for example `de` and `de`.
4. Click **Start**, then download as JSON, CSV or Excel, or schedule the run.

### Input

| Field | Default | What it does |
|---|---|---|
| `appIds` | – | Package IDs or Play Store links, one per line. Invalid entries show up as free error rows. |
| `searchTerms` | – | Keywords to search, one per line. Each keyword reads one Google Play results page. |
| `maxItems` | 50 | Apps per keyword (max 250). A search cannot return more than its results page holds. |
| `country` | `us` | Two-letter store region, for example `us`, `de` or `gb`. |
| `language` | `en` | Listing language, for example `en`, `de` or `pt-BR`. |

Example (the input behind the output row below):

```json
{ "appIds": ["com.spotify.music", "com.duolingo"], "searchTerms": ["habit tracker"], "maxItems": 8 }
```

### Output

One row per app. Search rows also carry `searchRank`, the app's position on the results page. `searchQuery` holds the app ID or keyword that produced the row. The run above returned 10 rows: 2 apps by ID and 8 from the search. A real row (Spotify, shortened):

```json
{
  "appId": "com.spotify.music",
  "url": "https://play.google.com/store/apps/details?id=com.spotify.music",
  "title": "Spotify: Music and Podcasts",
  "developer": "Spotify AB",
  "developerWebsite": "https://www.spotify.com",
  "genre": "Music & Audio",
  "score": 4.3474507,
  "ratingsCount": 36447872,
  "reviewsCount": 1855515,
  "histogram": { "1": 3716389, "2": 1064981, "3": 1312252, "4": 3098997, "5": 27255237 },
  "installs": "1,000,000,000+",
  "free": true,
  "price": 0,
  "currency": "USD",
  "inAppPurchases": true,
  "inAppPurchasesRange": "$4.99 - $203.88 per item",
  "containsAds": true,
  "releasedAt": "2014-05-27T13:12:17.000Z",
  "updatedAt": "2026-10-07T06:27:03.000Z",
  "version": null,
  "recentChanges": "We’re always making changes and improvements to Spotify. ...",
  "description": "With the Spotify music and podcast app, you can play millions of songs, albums and original podcasts for free. ...",
  "screenshots": ["https://play-lh.googleusercontent.com/...", "..."],
  "country": "US",
  "language": "en",
  "searchRank": null,
  "searchQuery": "com.spotify.music"
}
```

### Example tasks

Ready-made inputs you can open, change and run:

- [Compare Headspace and Calm on installs and ratings](https://apify.com/redfoxscout/google-play-scraper/examples/google-play-headspace-vs-calm)

### How much does it cost?

$1.00 per 1,000 apps.

- 100 apps: about $0.10
- 10,000 apps: about $10
- Failed lookups and error rows: free
- A package ID repeated in the same input: charged once

Apify's free plan gives $5 of credit every month, enough for about 5,000 apps.

### FAQ

**Is this legal?** It reads the public app pages that Google Play shows to any visitor, without signing in. It uses no login, cookies, CAPTCHA solving or private data. Developer contact fields are only what the developer publishes on the listing. This is not legal advice: check the rules that apply where you store and use the data.

**How many apps does a search return?** One search reads the one results page that Google Play shows for that keyword, in Google's order. In our test runs that page held 19 to 30 apps. Raising `maxItems` cannot get more than the page holds. For a longer list, use several narrower keywords.

**Can I get reviews?** Not in this Actor. You get the rating summary instead: score, ratings count, reviews count and the one-to-five star histogram. Review text, reviewer names and developer replies are not included.

**Why does an app come back as "not found"?** The ID is wrong, the app was removed, or it is not available in the country you chose. Try another country code. The failed lookup is free.

### Related Actors

- [Tech Stack Detector](https://apify.com/redfoxscout/tech-stack-detector): what a website runs on, including its CMS, analytics and marketing tools.
- [Company Social Links Finder](https://apify.com/redfoxscout/company-social-links): official social profiles and contact pages from a list of company websites.
- [Bulk URL Status & SSL Checker](https://apify.com/redfoxscout/url-status-ssl-checker): status, redirects and SSL expiry for many URLs, such as the developerWebsite field from this Actor.

# Actor input Schema

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

Package IDs or Play Store links, one per line, e.g. com.spotify.music or https://play.google.com/store/apps/details?id=com.spotify.music.

## `searchTerms` (type: `array`):

Keywords to search Google Play for, one per line, e.g. habit tracker or budget app.

## `country` (type: `string`):

Two-letter country code that sets the store region and prices, e.g. us, de or gb.

## `language` (type: `string`):

Language of the listing text, e.g. en, de or pt-BR.

## `maxItems` (type: `integer`):

Stop each search after this many results.

## `maxConcurrency` (type: `integer`):

How many searches run at once.

## Actor input object example

```json
{
  "appIds": [
    "com.spotify.music"
  ],
  "searchTerms": [
    "vpn"
  ],
  "country": "us",
  "language": "en",
  "maxItems": 50,
  "maxConcurrency": 3
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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": [
        "com.spotify.music"
    ],
    "searchTerms": [
        "vpn"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("redfoxscout/google-play-scraper").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": ["com.spotify.music"],
    "searchTerms": ["vpn"],
}

# Run the Actor and wait for it to finish
run = client.actor("redfoxscout/google-play-scraper").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": [
    "com.spotify.music"
  ],
  "searchTerms": [
    "vpn"
  ]
}' |
apify call redfoxscout/google-play-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,redfoxscout/google-play-scraper"
        }
    }
}
```

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/76bfkxJ1vnk0kJY9a/builds/thw1N9fXsmFnXGbtw/openapi.json
