Google Play Apps Scraper: App Details, Installs, Ratings avatar

Google Play Apps Scraper: App Details, Installs, Ratings

Pricing

from $0.30 / 1,000 apps

Go to Apify Store
Google Play Apps Scraper: App Details, Installs, Ratings

Google Play Apps Scraper: App Details, Installs, Ratings

Public Google Play app details as flat rows: installs, rating, number of ratings, price, version, last update, minimum Android, ads and in-app purchases. From app IDs, developer pages or category pages. No login, no proxy, no reviews, no personal data.

Pricing

from $0.30 / 1,000 apps

Rating

0.0

(0)

Developer

Rowcraft

Rowcraft

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 hours ago

Last modified

Share

Get the public details of any app on Google Play as one flat row: title, category, installs (the bucket shown on the page and the more precise count the page carries), average rating, number of ratings and the 1-to-5-star breakdown, price and currency, ads, in-app purchases and their price range, Play Pass, version, minimum Android version, release and last update dates, what's new, age rating, icon, screenshots and the developer when it is a company. This Google Play scraper reads the same public app pages anyone can open in a browser (play.google.com/store/apps/details?id=...), with no Google account, no cookies and no proxies, and exports JSON, CSV or Excel.

Give it app IDs or app links, developer pages or category pages, pick the country and the language of the store, and schedule it with Only new rows to receive only the apps that are new or have a new version or update date since the last run. Google Play's robots.txt is read at the start of every run and every page is checked against it; search, comment and data safety pages are never requested.

Input form of Google Play Apps Scraper: App Details, Installs, Ratings

What you get

One row per app, the same columns for every source:

  • App: package name (app ID), link, title, short summary, full description as plain text (contact details masked), what's new in the latest version
  • Popularity: installs as shown (50,000,000+), the lower bound of that bucket as a number, and the more precise install count carried in the page data
  • Ratings: average rating, number of ratings, and the number of 1, 2, 3, 4 and 5-star ratings
  • Price and monetisation: free or paid, price as a number with its currency and as shown, contains ads, in-app purchases and their price range, included in Play Pass
  • Versions and dates: current version, minimum Android version and API level, release date, last update date
  • Category and age rating: genre and genre code, game or not, tags, age rating with its reasons and interactive elements
  • Media: icon, header image, number of screenshots, promo video link
  • Developer (companies only): developer name, the legal name Google shows for traders, developer ID, developer page, website, privacy policy link; for an individual developer these stay empty
  • Source: whether the row came from an app ID, a developer page or a category, the category code, the position on the list, country and language
  • Coverage: one line per input in the run summary with its result (read, not found, invalid, disallowed by robots.txt, not read because the run stopped)

Why this actor

  • No login, no proxy, no tricks: public pages, read once each, with a clear user agent. No Google account, no cookies kept beyond the run, no CAPTCHA solving.
  • robots.txt first: the file is fetched at the start and every path, including its query, is checked before it is requested. Paths it disallows are skipped and listed in the run summary.
  • Stops politely: a rate limit (HTTP 429), a consent page, an "unusual traffic" page or a redirect away from Google Play ends the run at once. You keep what was delivered and the run summary says why; nothing is retried with another identity.
  • Developer pages and categories: paste a developer page or a category and every app listed there is read, in the order Google Play shows them (sourceRank).
  • New and updated apps only: with Only new rows a scheduled run delivers apps it has not delivered to you before and apps that got a new version or update date, and tells you which is which (changeSinceLastRun).
  • Count before you pay: Count only reads the developer and category pages, counts the apps and estimates the cost, without opening a single app page.
  • No personal data: developer names are delivered only for companies and organisations; descriptions are passed through the Rowcraft privacy filter.

How to use it

  1. Open the Actor and fill in App IDs or app links (for example com.spotify.music), Developer pages or Categories. One of the three is enough.
  2. Choose the Country and Language of the store (US and en by default).
  3. Set Maximum apps to a small number for a first try (the form starts with 20).
  4. Optional: tick Count only and start once. You get the number of apps your developer pages and categories list and the estimated cost, for free (only the start event is charged). Untick it to get the data.
  5. Click Start. The status line shows progress; the run stops cleanly at your limit or at the charge limit you set in the run options.
  6. Open the Dataset tab and download JSON, CSV, Excel, XML or HTML, or send the rows to Google Sheets, Slack, Make, n8n or Zapier with the Integrations tab.
  7. To follow apps over time, create a schedule in Apify Console and turn on Only new rows since the last run: every run then costs only the new and updated apps, and a webhook URL tells you when something changed.

Input

FieldWhat it does
appsApp IDs or app links, one per line: com.spotify.music or https://play.google.com/store/apps/details?id=com.spotify.music
developersDeveloper pages: https://play.google.com/store/apps/dev?id=..., https://play.google.com/store/apps/developer?id=..., the numeric developer ID, or the developer name as written on Google Play
categoriesCategory codes or names (PRODUCTIVITY, GAME_PUZZLE, Music & Audio), category links, or the link of a "See more" list
country, languageStore country (two letters, US by default) and language of the texts (en by default)
maxItems, maxItemsPerSourceStop after this many apps in total; stop each developer page or category after this many apps
expandCategoriesAlso read the "See more" lists of each category section (on by default)
countOnly, onlyNew, stateName, notifyUrl, notifyWhenEmptyCount only (deliver nothing); see Automation below
requestIntervalMsPause between requests, one second by default, 500 ms at the lowest

The sources are read one after the other. An app that appears in two sources is delivered once. A link pasted in the wrong list (a developer page among the apps) is moved to the right one and the run summary says so.

Example: every app of one developer and the top of one category in Germany, in German, as a daily feed of new and updated apps.

{
"developers": ["https://play.google.com/store/apps/developer?id=Spotify+AB"],
"categories": ["GAME_PUZZLE"],
"country": "DE",
"language": "de",
"maxItemsPerSource": 30,
"onlyNew": true,
"stateName": "spotify-and-puzzle-de"
}

Output

55 fields per row. Empty values are null, never missing, so CSV and Excel columns are stable.

FieldTypeExample
idstringcom.mojang.minecraftpe
appIdstringcom.mojang.minecraftpe
urlstringhttps://play.google.com/store/apps/details?id=com.mojang.minecraftp…
titlestringMinecraft: Dream it, Build it!
summarystringMillions of crafters have smashed billions of blocks! Now you can j…
descriptionstringDive into an open world of building, crafting, and survival in the …
developerNamestringMojang
developerLegalNamestringMicrosoft Corporation
developerIdstring4772240228547998649
developerUrlstringhttps://play.google.com/store/apps/dev?id=4772240228547998649
developerWebsitestringhttp://help.mojang.com
privacyPolicyUrlstringhttp://go.microsoft.com/fwlink/?LinkId=521839
developerIsOrganizationbooleanTrue
genrestringArcade
genreIdstringGAME_ARCADE
isGamebooleanTrue
tagsarray["Simulation", "Sandbox", "Casual"]
contentRatingstringEveryone 10+
contentRatingDescriptorsstringFantasy Violence
interactiveElementsstringUsers Interact, In-Game Purchases
installsstring50,000,000+
minInstallsinteger50000000
realInstallsinteger98905386
ratingnumber4.304894
ratingsCountinteger5857866
ratings1Starinteger624945
ratings2Starinteger178360
ratings3Starinteger270640
ratings4Starinteger495670
ratings5Starinteger4288239
freebooleanFalse
pricenumber6.99
currencystringUSD
priceTextstring$6.99
containsAdsbooleanFalse
inAppPurchasesbooleanTrue
inAppPurchasesRangestring$0.99 - $49.99 per item
inPlayPassbooleanFalse
versionstring1.26.52.3
minAndroidVersionstring8.0
minAndroidApiinteger26
releasedstring2011-08-15
lastUpdatedstring2026-09-25T17:26:28.000Z
whatsNewstringWhat’s new in 26.52: Various bug fixes!
iconUrlstringhttps://play-lh.googleusercontent.com/tI4StRSPVhpGJH5R013naszLUawOj…
headerImageUrlstringhttps://play-lh.googleusercontent.com/S_Z7YSNVWWd3BNh3AwV0iVv0hNqJ8…
screenshotCountinteger8
videoUrlstringhttps://www.youtube.com/embed/BLtLrFNRE-E?vq=large&rel=0&autohide=1…
sourceTypestringapp
sourceCategorystringPRODUCTIVITY
sourceRankinteger3
countrystringUS
languagestringen
changeSinceLastRunstringnew
scrapedAtstring2026-10-12T15:59:26.229Z

Example rows

Two real rows from a run (long texts shortened here, complete in the dataset):

[
{
"id": "com.spotify.music",
"appId": "com.spotify.music",
"url": "https://play.google.com/store/apps/details?id=com.spotify.music&hl=en&gl=US",
"title": "Spotify: Music and Podcasts",
"summary": "Listen to songs, play podcasts, create playlists and discover music you'll love",
"description": "With the Spotify music and podcast app, you can play millions of songs, albums and original podcasts for free. We have even added audiobo…",
"developerName": "Spotify AB",
"developerLegalName": "Spotify AB",
"developerId": "6523013212965523194",
"developerUrl": "https://play.google.com/store/apps/developer?id=Spotify+AB",
"developerWebsite": "https://www.spotify.com",
"privacyPolicyUrl": "https://www.spotify.com/legal/privacy-policy/",
"developerIsOrganization": true,
"genre": "Music & Audio",
"genreId": "MUSIC_AND_AUDIO",
"isGame": false,
"tags": [],
"contentRating": "Teen",
"contentRatingDescriptors": null,
"interactiveElements": "In-App Purchases",
"installs": "1,000,000,000+",
"minInstalls": 1000000000,
"realInstalls": 3158555008,
"rating": 4.348109,
"ratingsCount": 36467891,
"ratings1Star": 3714644,
"ratings2Star": 1063300,
"ratings3Star": 1312683,
"ratings4Star": 3099222,
"ratings5Star": 27278026,
"free": true,
"price": 0,
"currency": "USD",
"priceText": null,
"containsAds": true,
"inAppPurchases": true,
"inAppPurchasesRange": "$4.99 - $203.88 per item",
"inPlayPass": false,
"version": null,
"minAndroidVersion": null,
"minAndroidApi": null,
"released": "2014-05-27",
"lastUpdated": "2026-10-07T06:27:03.000Z",
"whatsNew": "We’re always making changes and improvements to Spotify. To make sure you don’t miss a thing, just keep your Updates turned on.",
"iconUrl": "https://play-lh.googleusercontent.com/IzQgYCcnCFCD08GR-3bdtcT8xzOvrNkC84avGT5CwTX2VIqmTmKKJcP_Cd4JoBOdmCMlTndlOzV6hrthg2fOWA",
"headerImageUrl": "https://play-lh.googleusercontent.com/WdedaGD6EAXZgy88wZM97aIcenQ5Cqzu_IUWBMMalkZmVe2lhv_3YqIUh-6pFqLv27kZ44cQX3qxyZTXHH-S91Q",
"screenshotCount": 40,
"videoUrl": null,
"sourceType": "app",
"sourceCategory": null,
"sourceRank": null,
"country": "US",
"language": "en",
"changeSinceLastRun": null,
"scrapedAt": "2026-10-12T16:15:25.499Z"
},
{
"id": "com.mojang.minecraftpe",
"appId": "com.mojang.minecraftpe",
"url": "https://play.google.com/store/apps/details?id=com.mojang.minecraftpe&hl=en&gl=US",
"title": "Minecraft: Dream it, Build it!",
"summary": "Millions of crafters have smashed billions of blocks! Now you can join the fun!",
"description": "Dive into an open world of building, crafting, and survival in the ultimate sandbox adventure. Gather resources, survive the night, and b…",
"developerName": "Mojang",
"developerLegalName": "Microsoft Corporation",
"developerId": "4772240228547998649",
"developerUrl": "https://play.google.com/store/apps/dev?id=4772240228547998649",
"developerWebsite": "http://help.mojang.com",
"privacyPolicyUrl": "http://go.microsoft.com/fwlink/?LinkId=521839",
"developerIsOrganization": true,
"genre": "Arcade",
"genreId": "GAME_ARCADE",
"isGame": true,
"tags": [
"Simulation",
"Sandbox",
"Casual",
"… 8 more"
],
"contentRating": "Everyone 10+",
"contentRatingDescriptors": "Fantasy Violence",
"interactiveElements": "Users Interact, In-Game Purchases",
"installs": "50,000,000+",
"minInstalls": 50000000,
"realInstalls": 98905386,
"rating": 4.3048773,
"ratingsCount": 5857862,
"ratings1Star": 624993,
"ratings2Star": 178351,
"ratings3Star": 270626,
"ratings4Star": 495641,
"ratings5Star": 4288239,
"free": false,
"price": 6.99,
"currency": "USD",
"priceText": "$6.99",
"containsAds": false,
"inAppPurchases": true,
"inAppPurchasesRange": "$0.99 - $49.99 per item",
"inPlayPass": false,
"version": "1.26.52.3",
"minAndroidVersion": "8.0",
"minAndroidApi": 26,
"released": "2011-08-15",
"lastUpdated": "2026-09-25T17:26:28.000Z",
"whatsNew": "What's new in 26.52: Various bug fixes!",
"iconUrl": "https://play-lh.googleusercontent.com/tI4StRSPVhpGJH5R013naszLUawOjao1ya8FvyaNO7XY_cJFHFqo1EFaEJv_7zz3rRJ5lEpLiw14ZqQLCOYc",
"headerImageUrl": "https://play-lh.googleusercontent.com/S_Z7YSNVWWd3BNh3AwV0iVv0hNqJ8zvn-HwLTlYqVLU4uxSohpwKpIa-EmwwwoxOlSw8voqu5CsxQGbojanT",
"screenshotCount": 8,
"videoUrl": "https://www.youtube.com/embed/BLtLrFNRE-E?vq=large&rel=0&autohide=1&showinfo=0",
"sourceType": "app",
"sourceCategory": null,
"sourceRank": null,
"country": "US",
"language": "en",
"changeSinceLastRun": null,
"scrapedAt": "2026-10-12T16:15:25.499Z"
}
]

Results can be downloaded as JSON, CSV, Excel, XML or HTML from the Dataset tab, or read through the Apify API.

Results of Google Play Apps Scraper: App Details, Installs, Ratings in the Apify dataset view

Pricing

Pay per result. You pay for each app delivered to your dataset, nothing else: no subscription, no minimum.

Your Apify planPrice per 1,000 appsPrice per app
Free plan$0.40$0.0004
Starter plan$0.35$0.00035
Scale plan$0.30$0.0003
Business plan and above$0.30$0.0003

Example: 1,000 apps cost $0.40 on the Free plan and $0.30 on the Business plan. A start event of $0.00005 is charged once per run (Apify default).

Not charged: apps already delivered to you (with Only new rows), an app listed twice, app IDs that do not exist, developer and category pages themselves, and anything counted with Count only.

Cap your spend: set Maximum total charge in the run options. The actor stops cleanly when the cap is reached and you keep everything delivered until then. The run summary (RUN_SUMMARY in the key-value store) says why a run stopped.

Check before you pay: turn on Count only to see how many apps your developer pages and categories list and what they would cost at your tier. That run delivers nothing and costs only the start event.

Automation: only new rows, notifications, schedules

Only new and updated apps since the last run. Turn on onlyNew and the actor remembers every app it delivered to you, with its version and last update date (in a key-value store named rowcraft-google-play-apps-scraper-state in your Apify account). The next run with the same stateName skips the apps that did not change and delivers the rest: apps never delivered before (changeSinceLastRun = new) and apps with a new version or update date (updated). The first run delivers everything that matches. Use a different stateName for each schedule so they keep separate memories. Skipped apps are not charged.

Notification when the run ends. Put a webhook address in notifyUrl and the actor sends one JSON POST with the number of new rows, links to the dataset (JSON and CSV) and the run. It works out of the box with Slack and Discord incoming webhooks (the message is in text and content), with Make, n8n and Zapier catch hooks, and with your own endpoint. By default it is sent only when at least one app was delivered; notifyWhenEmpty sends it every time.

Schedules. Create a schedule in Apify Console (hourly, daily, weekly or cron) with onlyNew on. A daily schedule over a developer page gives you each new app and each update of that developer for the price of those rows only.

Integrations. Send the results to Make, n8n, Zapier, Google Sheets, Slack, Google Drive, Airtable or any webhook from the Integrations tab of the Actor, with no code.

API, SDKs and AI agents. Every run is available through the Apify API and the official JavaScript and Python clients; the Actor can also be called by AI agents through the Apify MCP server. The example input in the API tab is a working call.

Count only. countOnly returns the number of apps your developer pages and categories list and the estimated cost without delivering anything, so you can size a job before paying for it.

Use cases

  • App market research: the apps of a category with installs, ratings, price and monetisation side by side, per country.
  • Competitor tracking: a competitor's developer page on a daily schedule with Only new rows: you get each new app and each new version the day it appears.
  • Store presence monitoring: installs bucket, rating, number of ratings and star breakdown of your own apps and your competitors', collected over time into one sheet.
  • Monetisation analysis: who shows ads, who sells in-app purchases and in which price range, who is in Play Pass, which apps are paid and at what price in each country.
  • Release and update tracking: version, minimum Android version, last update date and what's new for a list of apps, for compatibility checks or a portfolio report.
  • Lead lists of app companies: developer company names, websites and privacy policy links from a category (companies only; individual developers stay empty).

Ready-made examples, each with the input filled in (open one and press Start, or save it as your own task):

What this actor does not do

  • Read what users write about an app, or anything about those users: the comment data in the page is skipped and the comment pages are never requested.
  • Search Google Play by keyword: the search pages are disallowed by Google Play's robots.txt and never requested. Give app IDs, developer pages or categories instead.
  • Deliver the names of developers who are private persons: for them the developer fields stay empty (see Privacy).
  • Read the data safety section: the data safety pages are disallowed by robots.txt and never requested.
  • Read the developer's e-mail, postal address or phone number, which Google shows for traders: that block is never read into a row.
  • Read the "Top charts" lists: they load through an internal address that robots.txt disallows. Category pages and their "See more" lists are read instead.
  • Log in, keep cookies between runs, use proxies, solve CAPTCHAs or retry a blocked run with another identity.
  • Download APK files or anything else from the app.

Limits and fair use

  • One request per second by default, 500 ms at the lowest: about 60 apps a minute. Each app costs one request; each developer page, category page and "See more" list costs one more.
  • A developer page lists only the apps Google Play shows on it. Measured on 12.10.2026: up to 20 apps on a /store/apps/developer?id= page (Google LLC: 20 of the 92 the page counts) and 11 on the /store/apps/dev?id= page of Google. For a larger catalogue, add the remaining app IDs to apps.
  • A category page lists about 40 apps in 4 or 5 sections; with the "See more" lists it gave 65 different apps for Productivity in the US (12.10.2026). Google Play does not offer a full list of a category.
  • For some apps the page data carries no version, minimum Android version or update date (one of 40 apps in the Productivity test of 12.10.2026); those fields are then empty, and Only new rows cannot see a new version of that app. Apps that show "Varies with device" have no single version either.
  • The app page has no documented format. The actor reads the structured data the page carries for itself; if Google changes it, some fields come back empty and three failed app pages in a row stop the run, which the run summary reports.
  • Prices, currency and availability depend on the country, and so can the average rating and the star breakdown (Minecraft on 12.10.2026: 4.30 in the US in English, 4.37 in Germany in German, same total number of ratings). Texts come in the chosen language when the developer provides it.
  • The legal name of the developer is shown by Google for traders in some countries (we saw it from an EU connection). When it is missing, the decision company or person is made on the developer name alone, and more developer fields stay empty.
  • Google may slow down or block automated access. The run then stops at once, keeps everything delivered and explains it in the run summary and the status message.

Data source (and licence)

The data comes from the public Google Play web pages: app pages (https://play.google.com/store/apps/details?id=...), developer pages (/store/apps/dev?id=... and /store/apps/developer?id=...) and category pages (/store/apps/category/... and their "See more" lists). Google's Terms of Service (https://policies.google.com/terms) forbid automated access that goes against machine-readable instructions such as robots.txt; the actor fetches https://play.google.com/robots.txt at the start of every run and requests only paths it allows. Use of Google Play is also governed by the Google Play Terms of Service (https://play.google.com/about/play-terms/). Google does not publish this data under an open licence: app names, descriptions, icons and screenshots belong to their developers, so check the terms that apply to your use before republishing them. By running the actor you confirm that your use is allowed under those terms and the law that applies to you. Rowcraft is independent and not affiliated with or endorsed by Google; Google Play is a trademark of Google LLC.

Privacy: no personal data

Rowcraft actors are built not to collect personal data:

  • Developers who are companies keep their name, the others do not. A developer counts as a company or organisation when its legal name (or, when Google does not show one, its developer name) carries a legal form (Inc., LLC, Ltd, GmbH, AG, AB, Oy, S.A., S.p.A., B.V., sp. z o.o., OÜ, K.K. and other forms) or an organisation word (Corporation, Foundation, University). Sole-trader forms do not count. For everyone else developerName, developerLegalName, developerId, developerUrl, developerWebsite and privacyPolicyUrl are empty and developerIsOrganization is false, and the developer's name is masked in the description.
  • No contact data: the developer's e-mail, postal address and phone number are never read into a row. E-mail addresses and phone numbers inside descriptions and what's new become [email removed] and [phone removed]; e-mail parameters are cut from the website and privacy policy links.
  • No users: comments, user names and anything about the people who rate an app are never read.

You are responsible for using the data in line with the law that applies to you and with Google's terms.

Other Rowcraft actors

All Rowcraft actors read official or public sources, deliver flat rows without personal data and support only-new runs and notifications:

FAQ

Is it legal? The actor reads public pages that anyone can open without an account, follows Google Play's robots.txt for every request, stops at the first sign of a block and delivers no personal data. Google does not license the store data openly, so how you use it (internal analysis or republishing) is your responsibility under Google's terms and the law that applies to you. See Data source.

Does it collect personal data? No personal data: developer names only for companies and organisations, no developer e-mail, address or phone, no users, and contact details masked in descriptions. See Privacy.

Why is the result empty? The run summary (RUN_SUMMARY in the key-value store) names every input with its result. The usual reasons: the app ID does not exist in that country (not_found), the input is not an app ID or a Google Play link (invalid), robots.txt disallows the path, everything was already delivered to you with Only new rows on, or Google Play stopped the run (the summary then says blocked). With no app delivered, only the start event is charged.

Why is the developer name empty for some apps? The developer is a private person, or the actor could not see a legal form in the name. Only companies and organisations keep their developer fields; see Privacy for the exact rule. developerIsOrganization tells you which case you have.

Can it read the comments users write about an app? No. The comments are personal data of the people who wrote them and the pages that load them are disallowed by robots.txt. The rating, the number of ratings and the star breakdown are delivered.

Can I search Google Play by keyword? No. Google Play's robots.txt disallows the search pages. Use developer pages or categories, or paste the app IDs you already know.

Why does a developer page give fewer apps than the developer has? The page shows a selection (up to 20 apps on a /store/apps/developer?id= page; the /store/apps/dev?id= page of Google showed 11). Add the other app IDs to apps and they are read too.

Which country and language should I use? The country of the store you care about: price, currency and availability depend on it, and the average rating and star breakdown can differ too. The language changes the texts (title, description, installs as shown) when the developer has translated them. An app not available in a country comes back as not_found there.

What happens if Google Play blocks the run? On HTTP 429, a consent page, an "unusual traffic" page or a redirect away from Google Play, the run stops at once. You keep and pay only for the apps delivered, and the run summary and status message say what happened. Try again later, with a longer requestIntervalMs.

What does Count only do? It reads your developer and category pages, counts the apps they list (and the app IDs you gave) and writes the number and the estimated cost at your plan into the run summary. No app page is opened, nothing is delivered and only the start event is charged.

How much does it cost? $0.40 per 1,000 apps on the Free plan, less on paid plans (see Pricing). You pay only for apps delivered to your dataset; set a maximum total charge in the run options to cap a run.

Can I pay only for new or updated apps? Yes. Turn on Only new rows since the last run: later runs with the same state name deliver (and charge) only apps that are new or have a new version or update date.

How do I get the results into Slack, Google Sheets, Make, n8n or Zapier? Use the Integrations tab of the Actor for the data, and the notifyUrl field for a message when a run ends (Slack and Discord webhooks work directly; catch hooks of Make, n8n and Zapier too).

Can I call it from code or from an AI agent? Yes: through the Apify API, the JavaScript and Python clients, and the Apify MCP server. The API tab shows a working example with the input of this Actor.

Support and reviews

Problems, missing fields, questions: open an issue on the Issues tab of this Actor. We answer within one working day and fix confirmed bugs in the next release; the changelog lists every change.

If this Actor saved you time, a short review on its page helps other users find it and helps us keep improving it.