# Google Play Store API > Source: https://scrape.do/documentation/google-scraper-api/play-store/ Search Android apps, fetch full app details, and pull user reviews from Google Play Store as structured JSON The Google Play Store API returns structured data from the Play Store across three endpoints: 1. **Search**: find apps by query, category, or top-chart and get titles, ratings, prices, and package identifiers. 2. **App Details**: fetch the full details page for a single app (description, version, downloads, screenshots, release notes, developer info). 3. **Reviews**: pull paginated user reviews with ratings, dates, app version, and developer responses. > [!NOTE] > **Credit Usage:** Each successful request costs **10 credits**. For bulk processing, use the [Async API with plugins](/documentation/async-api/plugins/). ## Key Features - **Three endpoints, one schema family**: search, product, and reviews all return structured JSON with consistent field naming. - **Search by query, category, or chart**: keyword search, Play Store category browsing (`GAME_PUZZLE`, `MEDICAL`, …), or top-chart listings (`topselling_free`, `topselling_paid`, `topgrossing`). - **Device filters**: restrict search results to `phone`, `tablet`, `tv`, `chromebook`, `watch`, or `car`. - **Family / age filters**: when browsing the `FAMILY` category, filter by age bucket. - **Localization**: per-request `hl` (language) and `gl` (country) for region-specific results. - **Paginated reviews**: 20 reviews per page, unlimited depth via `next_page_token`. - **Developer responses**: review payloads include the developer's reply when present. --- ## Search Endpoint Returns a list of apps matching your query, category, or chart. ``` GET https://api.scrape.do/plugin/google/play-store ``` ### Basic Example **cURL (API mode)** ```bash curl --location --request GET 'https://api.scrape.do/plugin/google/play-store?token=&q=weather' ``` **Python (API mode)** ```python import requests import json token = "" url = f"https://api.scrape.do/plugin/google/play-store?token={token}&q=weather" response = requests.request("GET", url) print(json.dumps(response.json(), indent=2)) ``` **Node.js (API mode)** ```javascript const axios = require('axios'); const token = ""; const url = `https://api.scrape.do/plugin/google/play-store?token=${token}&q=weather`; axios.get(url) .then(response => { console.log(JSON.stringify(response.data, null, 2)); }) .catch(error => { console.error(error); }); ``` *(Go, Ruby, Java, C#, PHP examples are also available on the HTML version.)* ```bash curl "https://api.scrape.do/plugin/google/play-store?token=$TOKEN&q=weather" ``` You must provide at least one of `q`, `apps_category`, or `chart`. ### Request Parameters #### Required | Parameter | Type | Description | |-----------|------|-------------| | `token` | string | Your Scrape.do API authentication token | #### Search (provide at least one) | Parameter | Type | Description | |-----------|------|-------------| | `q` | string | Search query (e.g., `weather`, `fitness tracker`) | | `apps_category` | string | Category identifier (e.g., `ART_AND_DESIGN`, `MEDICAL`, `GAME_PUZZLE`) | | `chart` | string | Top charts: `topselling_free`, `topselling_paid`, `topgrossing` | #### Localization | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `hl` | string | `en` | Language code (e.g., `en`, `es`, `fr`) | | `gl` | string | `us` | Country code (e.g., `us`, `gb`, `de`) | #### Pagination | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `num` | integer | `20` | Number of results per page (1–100) | | `next_page_token` | string | | From the previous response's `pagination.next_page_token`. Pass back unchanged | #### Filters | Parameter | Type | Description | |-----------|------|-------------| | `store_device` | string | Device type: `phone`, `tablet`, `tv`, `chromebook`, `watch`, `car` | | `age` | string | Age filter (only valid with `apps_category=FAMILY`): `AGE_RANGE1` (up to 5), `AGE_RANGE2` (6–8), `AGE_RANGE3` (9–12) | ### More Examples ```bash # Search apps curl "https://api.scrape.do/plugin/google/play-store?token=$TOKEN&q=coffee" # Search with localization curl "https://api.scrape.do/plugin/google/play-store?token=$TOKEN&q=fitness&gl=de&hl=de" # Browse by category curl "https://api.scrape.do/plugin/google/play-store?token=$TOKEN&apps_category=GAME_PUZZLE" # Top free charts curl "https://api.scrape.do/plugin/google/play-store?token=$TOKEN&chart=topselling_free" # Paginate with 10 results per page curl "https://api.scrape.do/plugin/google/play-store?token=$TOKEN&q=coffee&num=10" ``` ### Response ```json { "search_parameters": { "q": "coffee", "hl": "en", "gl": "us", "store": "apps" }, "organic_results": [ { "items": [ { "title": "Good Coffee, Great Coffee", "link": "https://play.google.com/store/apps/details?id=com.tapblaze.coffeebusiness", "product_id": "com.tapblaze.coffeebusiness", "rating": 4.4, "author": "TapBlaze", "video": "https://www.youtube.com/embed/RFUNyVrGCzE?...", "thumbnail": "https://play-lh.googleusercontent.com/..." }, { "title": "Coffee Roaster", "link": "https://play.google.com/store/apps/details?id=de.brettspielwelt.coffee_roaster", "product_id": "de.brettspielwelt.coffee_roaster", "rating": 3.8, "author": "Brettspielwelt GmbH", "price": "$3.99", "extracted_price": 3.99, "thumbnail": "https://play-lh.googleusercontent.com/...", "feature_image": "https://play-lh.googleusercontent.com/..." } ] } ], "pagination": { "next_page_token": "eyJvIjoyMH0" } } ``` #### `organic_results[].items[]` | Field | Type | Description | |-------|------|-------------| | `title` | string | App name | | `link` | string | Google Play Store URL | | `product_id` | string | Package identifier (e.g., `com.example.app`) | | `rating` | float | Rating 0–5. Omitted if unrated | | `author` | string | Developer name | | `price` | string | Price string (e.g., `$3.99`). Omitted for free apps | | `extracted_price` | float | Numeric price. Omitted for free apps | | `video` | string | YouTube embed URL. Present when the app has a promo video | | `thumbnail` | string | App icon URL | | `feature_image` | string | Feature banner or screenshot URL. Present when available | #### `pagination` | Field | Type | Description | |-------|------|-------------| | `next_page_token` | string | Pass this value as `next_page_token` to get the next page. Absent when no more results | --- ## App Details Endpoint Returns the full details page for one app: title, description, developer, version, downloads, screenshots, release notes, and more. ``` GET https://api.scrape.do/plugin/google/play-store/product ``` ### Basic Example **cURL (API mode)** ```bash curl --location --request GET 'https://api.scrape.do/plugin/google/play-store/product?token=&product_id=com.discord' ``` **Python (API mode)** ```python import requests import json token = "" url = f"https://api.scrape.do/plugin/google/play-store/product?token={token}&product_id=com.discord" response = requests.request("GET", url) print(json.dumps(response.json(), indent=2)) ``` **Node.js (API mode)** ```javascript const axios = require('axios'); const token = ""; const url = `https://api.scrape.do/plugin/google/play-store/product?token=${token}&product_id=com.discord`; axios.get(url) .then(response => { console.log(JSON.stringify(response.data, null, 2)); }) .catch(error => { console.error(error); }); ``` *(Go, Ruby, Java, C#, PHP examples are also available on the HTML version.)* ```bash curl "https://api.scrape.do/plugin/google/play-store/product?token=$TOKEN&product_id=com.discord" ``` ### Request Parameters #### Required | Parameter | Type | Description | |-----------|------|-------------| | `token` | string | Your Scrape.do API authentication token | | `product_id` | string | App package identifier (e.g., `com.discord`, `com.whatsapp`) | #### Localization | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `hl` | string | `en` | Language code | | `gl` | string | `us` | Country code | ### More Examples ```bash # Default (US / English) curl "https://api.scrape.do/plugin/google/play-store/product?token=$TOKEN&product_id=com.discord" # Localized to Germany curl "https://api.scrape.do/plugin/google/play-store/product?token=$TOKEN&product_id=com.duolingo&gl=de&hl=de" ``` ### Response ```json { "search_parameters": { "product_id": "com.discord", "hl": "en", "gl": "us" }, "title": "Discord - Talk, Play, Hang Out", "product_id": "com.discord", "description": "Discord is designed for gaming and great for just chilling with friends ...", "category": "Communication", "category_id": "COMMUNICATION", "content_rating": "Teen", "rating": 4.28, "rating_count": 6769967, "free": true, "downloads": "500,000,000+", "in_app_purchases": "$1.99 - $274.94 per item", "version": "327.12 - Stable", "min_android": "7.0", "updated": "May 8, 2026", "release_notes": "We've been hard at work making Discord better for you. ...", "icon": "https://play-lh.googleusercontent.com/...", "header_image": "https://play-lh.googleusercontent.com/...", "screenshots": [ "https://play-lh.googleusercontent.com/...", "https://play-lh.googleusercontent.com/..." ], "developer": { "name": "Discord Inc.", "url": "https://discord.com/", "email": "support@discord.com" } } ``` #### Top-Level Fields | Field | Type | Description | |-------|------|-------------| | `title` | string | App display name | | `product_id` | string | Package identifier | | `description` | string | Long-form description | | `category` | string | Display category (e.g., `"Communication"`) | | `category_id` | string | Category identifier (e.g., `"COMMUNICATION"`) | | `content_rating` | string | `"Everyone"`, `"Teen"`, `"Mature 17+"`, etc. | | `rating` | float | Average rating, 1–5 | | `rating_count` | int | Total number of ratings | | `price` | string | Price + currency. Omitted on free apps | | `free` | bool | `true` if the app is free | | `downloads` | string | Download bucket (e.g., `"500,000,000+"`) | | `in_app_purchases` | string | Price range for IAPs. Omitted if none | | `version` | string | Current published version. Absent when the developer ships device-targeted bundles ("Varies with device" in the Play Store UI) | | `min_android` | string | Minimum Android version (e.g., `"7.0"`) | | `updated` | string | Last-updated date (e.g., `"May 8, 2026"`) | | `release_notes` | string | What's new text. Omitted if not published | | `icon` | string | App icon URL | | `header_image` | string | Feature graphic / header image URL | | `screenshots` | string[] | Screenshot URLs | #### `developer` | Field | Type | Description | |-------|------|-------------| | `name` | string | Developer / publisher name | | `url` | string | Developer website | | `email` | string | Developer contact email | | `address` | string | Physical address. Omitted if not published | --- ## Reviews Endpoint Returns user reviews for a specific app, with pagination support. ``` GET https://api.scrape.do/plugin/google/play-store/reviews ``` ### Basic Example **cURL (API mode)** ```bash curl --location --request GET 'https://api.scrape.do/plugin/google/play-store/reviews?token=&product_id=com.tapblaze.coffeebusiness' ``` **Python (API mode)** ```python import requests import json token = "" url = f"https://api.scrape.do/plugin/google/play-store/reviews?token={token}&product_id=com.tapblaze.coffeebusiness" response = requests.request("GET", url) print(json.dumps(response.json(), indent=2)) ``` **Node.js (API mode)** ```javascript const axios = require('axios'); const token = ""; const url = `https://api.scrape.do/plugin/google/play-store/reviews?token=${token}&product_id=com.tapblaze.coffeebusiness`; axios.get(url) .then(response => { console.log(JSON.stringify(response.data, null, 2)); }) .catch(error => { console.error(error); }); ``` *(Go, Ruby, Java, C#, PHP examples are also available on the HTML version.)* ```bash curl "https://api.scrape.do/plugin/google/play-store/reviews?token=$TOKEN&product_id=com.tapblaze.coffeebusiness" ``` ### Request Parameters #### Required | Parameter | Type | Description | |-----------|------|-------------| | `token` | string | Your Scrape.do API authentication token | | `product_id` | string | App package identifier (e.g., `com.tapblaze.coffeebusiness`) | #### Localization | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `hl` | string | `en` | Language code | | `gl` | string | `us` | Country code | #### Sorting & Pagination | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `sort_by` | integer | `1` | Sort order. Currently only `1` (most relevant) is supported | | `next_page_token` | string | | From the previous response's `pagination.next_page_token`. Pass back unchanged | ### More Examples ```bash # First page of reviews curl "https://api.scrape.do/plugin/google/play-store/reviews?token=$TOKEN&product_id=com.tapblaze.coffeebusiness" # Next page using the returned token curl "https://api.scrape.do/plugin/google/play-store/reviews?token=$TOKEN&product_id=com.tapblaze.coffeebusiness&next_page_token=CrkBIrAB..." ``` ### Response ```json { "search_parameters": { "product_id": "com.tapblaze.coffeebusiness", "hl": "en", "gl": "us", "store": "apps", "sort_by": 1, "num": 20 }, "reviews": [ { "id": "707d91c4-0510-455d-9288-71eddf9784be", "title": "Rebecca Saurer", "avatar": "https://play-lh.googleusercontent.com/a-/ALV-...", "rating": 4, "snippet": "generally speaking, this games great! ...", "likes": 52, "date": "February 16, 2026", "iso_date": "2026-02-16T02:26:14Z", "app_version": "1.18.0", "response": { "title": "TapBlaze", "snippet": "Hello! Thank you so much for your feedback ...", "date": "February 16, 2026", "iso_date": "2026-02-16T23:30:38Z" } } ], "pagination": { "next_page_token": "CrkBIrABAYw1..." } } ``` #### `reviews[]` | Field | Type | Description | |-------|------|-------------| | `id` | string | Unique review identifier | | `title` | string | Reviewer name | | `avatar` | string | Reviewer avatar URL | | `rating` | float | Rating 1–5 | | `snippet` | string | Review text | | `likes` | int | Number of people who found this review helpful | | `date` | string | Human-readable date (e.g., `"February 16, 2026"`) | | `iso_date` | string | ISO 8601 date | | `app_version` | string | App version installed when the review was written. Absent on older reviews | | `response` | object | Developer response. Absent if the developer hasn't replied | #### `reviews[].response` | Field | Type | Description | |-------|------|-------------| | `title` | string | Developer name | | `snippet` | string | Response text | | `date` | string | Human-readable date | | `iso_date` | string | ISO 8601 date | #### `pagination` | Field | Type | Description | |-------|------|-------------| | `next_page_token` | string | Pass this value as `next_page_token` to get the next page. Absent when no more results | --- ## Notes - Search returns up to ~30 apps total. With the default `num=20`, you get two pages. - Reviews return 20 per page with unlimited pagination depth. - The `rating` field is omitted for apps and reviews that have no rating. - The `response` field on reviews is only present when the developer has replied. - On the product endpoint, `version` is absent for apps that publish device-targeted bundles (these show as "Varies with device" in the Play Store UI). For per-review installed versions, use `app_version` on each review. > [!WARNING] > **Known limitation:** `apps_category=MEDICAL` currently returns `500 failed to parse play store results`. Other categories (`GAME_PUZZLE`, `FAMILY`, `COMMUNICATION`, etc.) work normally. Browsing the medical app catalog via `q=medical` returns matching apps.