How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
pdf scannerin Search terms. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Search Google Play by keyword in one or many countries and get the ranked list of apps for every term, with rating, ratings count, install range, price, genre, age rating, version and last update. Or add package names or Google Play URLs and get the same app details.
search— for each keyword (term) and country, it runs one Google Play search and returns the apps in the same order as Google shows them. Every row hasrank(1, 2, 3…),termandcountry. By default it also opens each app page and adds installs, ratings count, genre, age rating, version and last update.details— for each package name (for examplecom.whatsapp) or Google Play URL, it opens the app page in every country you choose and returns one row per app and country.
Good for
- App store optimization (ASO): check which apps rank for your keywords in each country.
- Rank tracking: see where your own apps stand for 10–30 keywords, run after run.
- Competitor research: compare install range, rating, price, in-app purchases and last update of rival apps.
- App catalog enrichment: turn a list of package names into rows with title, developer, genre and age rating.
Not a good fit
- No exact install numbers. Google shows a public range such as
10,000,000+. The Actor returns this text ininstallsand its lower bound inminInstalls. It never estimates an exact count. - About 30 apps per search. Google's search page shows about 30 apps for a term and has no next page.
maxItemsis 1–30. - No reviews, screenshots, permissions, data safety or developer contact details (email, phone, address).
- No top charts, categories or "similar apps" lists.
- Results are what Google shows to a signed-out visitor in that country and language. Personal results on a phone can differ.
Who uses it
ASO specialists
Check which apps rank for your keywords.
Android developers
Track your own app rank run after run.
Competitor analysts
Compare installs, rating and price of rival apps.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.003 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Google Play query answered | $0.0001 | One keyword search (term × country) or one app ID lookup (app ID × country) that Google Play answered, even when it had no apps or the app does not exist. Failed or skipped queries are free. |
| App row | $0.00045 (from $0.00038 on paid Apify plans) | One app stored in the dataset (with app page details when they are on). Partial, not_found and error rows are free. |
Examples
- One app: about $0.0034.
- 1,000 apps: about $0.46 (3 runs of up to 400).
- Every day 100 apps, for 30 days: about $1.44 a month.
- 400 apps once a week (4 runs a month): about $0.73 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 10,000 apps.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Why no exact install numbers?
Google Play shows only a range, like 10,000,000+. The tool returns that range.
Are results the same as on my phone?
Not always. The tool sees what a signed-out visitor sees.
Why is the version empty?
Many big apps show Varies with device instead of a number.
Do I need a Google account?
No. It reads public pages without login.
Why don't I get the exact number of installs?
Google Play shows only a range, such as 10,000,000+. Other numbers you may see elsewhere are estimates. This Actor returns only what Google shows: installs and its lower bound minInstalls.
Why is score null for some apps?
Nobody has rated the app yet. In that case ratings is 0 and score is null, not 0.
Why is version null?
Many large apps show "Varies with device" instead of a version number. The Actor returns null instead of a wrong value.
How fresh is the data?
Every run reads Google Play live. fetchedAt shows when each row was read.
Details
Step by step on Apify
- Open the Input tab.
- Keep Mode =
Search by keywords(the default). - Keep the prefilled Search terms
pdf scannerand Countriesus, or add your own. - Keep Results per term and country = 20 and click Start.
- Open the Output tab and the Search results view. Check
rank,title,installsandscore.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Keyword rank research | terms + countries | App row per rank | term, country, rank, appId, title | Export CSV, compare countries |
| Track my app's rank | terms + trackAppIds | Run summary rankTracking | rank, status (ranked / not_in_results) | Schedule a daily run |
| Competitor snapshot | mode: details + appIds | App row per app and country | installs, score, ratings, price, updatedAt, version | Google Sheets or API |
| Fast keyword scan | includeDetails: false | Search row | rank, title, developer, score, price | Pick apps for a details run |
Tips for better results
- Turn off app page details for a fast keyword scan.
- Use package names like com.whatsapp in details mode.
- Schedule a daily run to see rank changes.
Limits and good to know
- Up to 60 searches (terms × countries) and up to 30 apps per search
- With app page details: up to 400 app pages per run (for example 20 terms × 2 countries × 10 apps). Such a run takes about 3.5 minutes
- Without details: up to 60 × 30 = 1,800 rows, in under a minute
- Details mode: up to 300 app IDs and 400 lookups (app IDs × countries)
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"status": "complete",
"mode": "search",
"term": "pdf scanner",
"country": "us",
"rank": 2,
"appId": "imagetopdf.pdfconverter.jpgtopdf.pdfeditor",
"title": "Image to PDF - PDF Maker",
"developer": "Simple Design Ltd.",
"score": 4.877,
"ratings": 2426697,
"installs": "50,000,000+",
"minInstalls": 50000000,
"free": true,
"offersIAP": true,
"genre": "Productivity",
"contentRating": "Everyone",
"updatedAt": "2026-09-28T13:34:21.000Z",
"version": "1.7.8",
"description": null,
"detailsIncluded": true,
"errorCode": null
}Use it from code
Actor ID: cliqtomedia/google-play-apps-search. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/google-play-apps-search").call(run_input={
"mode": "search",
"terms": [
"pdf scanner"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~google-play-apps-search/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode": "search", "terms": ["pdf scanner"]}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/google-play-apps-search")
result = tool.invoke({"run_input": {"mode": "search", "terms": ["pdf scanner"]}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (40)
| Field | Type | Meaning |
|---|---|---|
status | string | Row result: complete (app data, charged), partial (search row whose app page failed to load or answered 404; search fields only, not charged), not_found (search with no apps, or app ID not on Google Play in that country) or error (see errorCode, not charged). |
mode | string | search or details, as in the input. |
queryType | string | term for search rows, appId for details rows. |
query | string | The search term or app ID this row answers. Grouped status rows list several IDs, comma-separated. |
queryIds | array | Only on grouped details status rows: the app IDs this one not_found or error row covers (one row per batch of up to 10 IDs in one country). null on app rows and search rows. |
term | string | Search term (search mode). null in details mode. |
country | string | Two-letter Google Play country code used for the request (gl). null only on the INVALID_IDENTIFIER error row, whose identifiers were never sent to Google Play. |
language | string | Language code used for the request (hl); texts such as genre and content rating come in this language. |
rank | integer | 1-based position of the app in Google Play search results for this term and country, as shown to a signed-out user. null in details mode. |
isTracked | boolean | true when the app is in trackAppIds; null when no apps are tracked or in details mode. |
appId | string | Google Play package name, e.g. com.whatsapp. |
title | string | App name. |
summary | string | Short promo text from the app page. null without app details. |
developer | string | Developer name as shown on Google Play. |
developerId | string | Google Play developer ID: numeric, or a name-style ID such as WhatsApp+LLC. |
developerUrl | string | Developer page on Google Play, built from developerId. |
score | number | Average star rating (1–5), rounded to 3 decimals. null when the app has no ratings. |
ratings | integer | Number of ratings shown by Google; 0 for an app nobody has rated yet. null without app details. |
reviews | integer | Number of written reviews shown by Google; 0 for an app nobody has rated yet. null without app details. |
ratingHistogram | object | Ratings per star: oneStar … fiveStars. null without app details. |
installs | string | Google's public install range, e.g. 10,000,000+. Google does not publish exact install counts, and this Actor does not estimate them. null without app details. |
minInstalls | integer | Lower bound of the install range as a number (10,000,000+ → 10000000), for sorting and filtering. Not an exact count. |
price | number | Price in currency units; 0 for free apps. |
free | boolean | true for free apps. |
currency | string | ISO currency of price for this country, e.g. USD or EUR. |
priceText | string | Price as Google shows it, e.g. Free or $4.99. null without app details. |
offersIAP | boolean | true when the app has in-app purchases, false when it has none. null without app details. |
iapRange | string | In-app purchase price range as shown by Google, e.g. $0.99 - $49.99 per item. |
adSupported | boolean | true when Google marks the app as containing ads. null without app details. |
genre | string | Main category name in the request language, e.g. Productivity. |
genreId | string | Main category ID, e.g. PRODUCTIVITY or GAME_PUZZLE. |
contentRating | string | Age rating for this country, e.g. Everyone, Teen, USK: Ages 12+. |
released | string | Release date as Google shows it (text in the request language, e.g. May 31, 2017). null when Google hides it. |
updatedAt | string | Last update time of the app on Google Play, ISO 8601 UTC. |
version | string | Current version. null when Google shows Varies with device. |
androidVersion | string | Minimum Android version, e.g. 8.0. null when it varies with device. |
url | string | App page on Google Play. |
icon | string | App icon URL. |
description | string | Full description (only with includeDescription). |
recentChanges | string | What's new text (only with includeDescription). |
Input settings (9)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Mode | mode | string | "search" |
| Search terms | terms | array | ["pdf scanner"] |
| Countries | countries | array | ["us"] |
| Language | language | string | "en" |
| Results per term and country | maxItems | integer | 20 |
| Add app page details to search results | includeDetails | boolean | true |
| Track my apps' rank (search mode) | trackAppIds | array | |
| Package names or Google Play URLs (details mode) | appIds | array | |
| Include description and what's new | includeDescription | boolean | false |
Use cases with this tool
Each guide shows all the steps and the other tools.