Google Play Store App Search Scraper

Export ranked public Google Play app search results by keyword, country, and language for ASO and competitor monitoring.

Data fields

FieldTypeDescription
searchQuerystringKeyword that produced this app result.
positionintegerOne-based rank within the returned results for this query.
appIdstringGoogle Play Android package identifier.
appTitlestringPublic app name shown in the search result.
developerstring | nullDeveloper name when displayed on the search card.
ratingnumber | nullVisible average star rating, or null when unavailable.
ratingCountstring | nullVisible compact rating or review count, retained as displayed, or null.
installRangestring | nullVisible install or download range when Google Play includes it in search results; otherwise null.

Input preview

searchQueriesSearch queries *
maxItemsPerQueryMaximum apps per query
countryCountry
languageLanguage
maxRuntimeSecsSafe runtime limit

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Export ranked public Google Play app search results by keyword, country, and language for ASO research, competitor monitoring, and app-market analysis.

Enter up to 20 search terms and receive one dataset row per visible app result. The Actor works without a Google account, preserves the query and rank for every app, and can be scheduled or called through the Apify API and official Apify MCP server.

What data can you export?

  • Android package ID, app title, developer, icon, and canonical Google Play URL
  • Search keyword and one-based result position
  • Visible rating, rating/review count, price text, and free-download status
  • Requested country and language plus the exact localized search URL
  • Collection timestamp
  • A RUN_SUMMARY with completed, empty, failed, and pending queries
  • A PENDING_WORK checkpoint when a larger run reaches its safe runtime limit

Google Play search cards do not expose every app-detail field in every layout. installRange, category, and other unavailable values are returned as null rather than guessed.

Input example

{
  "searchQueries": ["meditation", "budget tracker"],
  "country": "US",
  "language": "en",
  "maxItemsPerQuery": 10
}

Output example

{
  "searchQuery": "meditation",
  "position": 1,
  "appId": "com.calm.android",
  "appTitle": "Calm - Sleep, Meditate, Relax",
  "developer": "Calm.com, Inc.",
  "rating": 4.4,
  "ratingCount": null,
  "installRange": null,
  "priceText": "In-app purchases",
  "isFree": true,
  "category": null,
  "detailUrl": "https://play.google.com/store/apps/details?id=com.calm.android",
  "iconUrl": "https://play-lh.googleusercontent.com/...",
  "country": "US",
  "language": "en",
  "sourceUrl": "https://play.google.com/store/search?q=meditation&c=apps&hl=en&gl=US",
  "scrapedAt": "2026-07-20T12:00:00.000Z"
}

Input settings

Setting JSON key Description
Search queries searchQueries Required list of 1-20 keyword strings. Each query can contain up to 200 characters.
Maximum apps per query maxItemsPerQuery Number of visible results to save per query, from 1 to 100. Default: 10.
Country country Two-letter country code such as US, GB, DE, or IN. Default: US.
Language language Language code such as en, es, de, fr, or pt-BR. Default: en.
Safe runtime limit maxRuntimeSecs Runtime budget from 35 to 270 seconds. The default 240 leaves time to save progress before shutdown.

Existing inputs that omit maxRuntimeSecs continue to use the default.

Who is it for?

  • ASO teams: capture keyword rankings across countries and languages.
  • App publishers: identify competing Android apps returned for product terms.
  • Agencies: build recurring app-visibility reports for clients.
  • Market researchers: create localized lists of app IDs, developers, ratings, and listing URLs.
  • Developers and data teams: export results to CSV, Excel, JSON, API pipelines, warehouses, or agents.

Input recipes

  • US meditation competitors: {"searchQueries":["meditation"],"country":"US","language":"en","maxItemsPerQuery":10}
  • UK budgeting apps: {"searchQueries":["budget tracker"],"country":"GB","language":"en","maxItemsPerQuery":10}
  • German fitness results: {"searchQueries":["fitness tracker"],"country":"DE","language":"de","maxItemsPerQuery":20}
  • Multi-keyword snapshot: add several related terms to searchQueries; each row retains its originating query.

Tips for better results

  • Start with one specific keyword and 5-10 results before scaling.
  • Use matching country and language values when comparing localized rankings.
  • Schedule separate tasks per market so country-specific snapshots remain easy to compare.
  • Check RUN_SUMMARY when a run returns fewer rows than expected; it distinguishes verified no-match searches, query failures, spending-limit stops, and safe-runtime cutoff.
  • Resurrect an interrupted run with the same input to continue from PENDING_WORK.

Limits and practical notes

  • The Actor covers the public Google Play /store/search surface only. It does not fetch app-detail pages, reviews, charts, collections, developer catalogs, or private data.
  • It does not log in, accept cookies, solve CAPTCHAs, use private endpoints, or attempt stealth bypasses.
  • Google Play can vary results by country, language, time, and user context, so ranks are snapshots rather than permanent positions.
  • Search cards expose fewer fields than app-detail pages. Missing values remain null.
  • Temporary rate limits and source error pages are retried within a bounded run budget. One failed query does not discard valid rows from other queries.
  • A no-match query finishes as a verified empty result when a bounded control search confirms that Google Play's result layout is healthy. If that control search is also empty, the query is reported as source drift instead of a misleading successful-empty result.

API usage

Node.js

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/google-play-store-app-search-scraper').call({
  searchQueries: ['meditation'],
  country: 'US',
  language: 'en',
  maxItemsPerQuery: 10,
});

console.log(run.defaultDatasetId);

Python

import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/google-play-store-app-search-scraper').call(run_input={
    'searchQueries': ['meditation'],
    'country': 'US',
    'language': 'en',
    'maxItemsPerQuery': 10,
})

print(run['defaultDatasetId'])

cURL

curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~google-play-store-app-search-scraper/runs?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"searchQueries":["meditation"],"country":"US","language":"en","maxItemsPerQuery":10}'

MCP and AI agents

Use the official Apify MCP server. The general endpoint, https://mcp.apify.com, can search and run Actors. This focused endpoint exposes only this Actor:

https://mcp.apify.com?tools=fetch_cat/google-play-store-app-search-scraper

Claude Code:

claude mcp add --transport http apify-google-play-search 'https://mcp.apify.com?tools=fetch_cat/google-play-store-app-search-scraper'

Claude Desktop, Cursor, or another MCP client:

{
  "mcpServers": {
    "apify-google-play-search": {
      "url": "https://mcp.apify.com?tools=fetch_cat/google-play-store-app-search-scraper"
    }
  }
}

Example prompts:

  • "Find the top 10 meditation apps in the US and return app IDs, rank, developer, and rating."
  • "Run separate German and UK searches for fitness tracker apps and compare the top results."
  • "Create a CSV-ready competitor list for budget tracker and expense manager keywords."

Schedule Google Play keyword monitoring

Save one task per market, then use an Apify schedule to run it daily or weekly. Export each dataset to Google Sheets or a warehouse, or attach a webhook that notifies your workflow when the run finishes. Compare appId and position across snapshots to detect new competitors and ranking changes.

Support

If a run fails, returns no data, or a field looks wrong, open an issue or report a bug from the Actor page. Include the Apify run ID or run URL, input JSON, expected output, actual output, and one reproducible public URL, such as the corresponding Google Play search URL. Small, public examples make localization or source-layout problems faster to diagnose.

Common questions

Questions and answers reused from the canonical actor README.

Is this a Google Play Search API alternative?

It provides a structured API workflow for public Google Play search results, but it is not an official Google API and does not provide private account data or every app-detail field.

Can I export results to CSV, Excel, or JSON?

Yes. Apify datasets support CSV, Excel, JSON, JSONL, XML, RSS, and HTML exports, plus API access.

Does it require a Google account, cookies, or a token?

No. It reads public search pages without Google login credentials or cookies. You still need an Apify token when calling the Actor through the API.

Can I search multiple keywords?

Yes. Add up to 20 strings to searchQueries. maxItemsPerQuery applies separately to each query.

Can I compare countries and languages in one run?

One run uses one country and language pair. Use separate runs or saved tasks for clean market comparisons.