# Google Play Store Reviews Scraper API | App Review Extraction (`code-node-tools/google-play-reviews-scraper`) Actor

Automate Google Play review scraping with our powerful API. Export user feedback, star ratings, and developer replies directly to your database in JSON or CSV. Perfect for sentiment analysis, competitor research, and tracking Android app performance at scale. Try it free today!

- **URL**: https://apify.com/code-node-tools/google-play-reviews-scraper.md
- **Developed by:** [CodeNodeTools](https://apify.com/code-node-tools) (community)
- **Categories:** Automation, Developer tools, Other
- **Stats:** 30 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Google Play Reviews Scraper

**Extract Google Play Store reviews at scale with this powerful scraper API. Download app reviews in JSON, CSV, or Excel format for sentiment analysis, competitor research, and automated monitoring.**

The Google Play Reviews Scraper is a reliable tool to **scrape Google Play reviews** from any Android app without coding. Extract thousands of reviews with ratings, user feedback, developer replies, and metadata. Perfect for app developers, marketers, and data analysts who need to **automate app store review scraping** and track competitor app reviews.

### ✨ What can Google Play Reviews Scraper do?

- 🎯 **Scrape multiple apps** - Extract reviews from unlimited Google Play apps in a single run
- 🔄 **Automated pagination** - Automatically fetch thousands of reviews with smart pagination
- 🌍 **Multi-language support** - Scrape reviews in any language and from any country
- 🎚️ **Advanced filtering** - Filter by star rating, date range, keywords, developer replies, and more
- 📊 **Export to any format** - Download data as JSON, CSV, Excel, HTML, or RSS feed
- ⚡ **Fast and reliable** - Built-in rate limiting and proxy rotation to avoid blocks
- 🔗 **API & webhooks** - Integrate with n8n, Zapier, Make, or any tool via REST API
- ⏰ **Schedule runs** - Set up automated daily, weekly, or monthly review monitoring
- 📈 **No coding required** - Simple point-and-click interface for non-technical users

### 📊 What data can you extract from Google Play Store?

| Field               | Description                                 |
| ------------------- | ------------------------------------------- |
| **Review Text**     | Full review content written by users        |
| **Rating**          | Star rating (1-5) given by the reviewer     |
| **User Name**       | Name of the reviewer                        |
| **Date**            | When the review was posted                  |
| **Thumbs Up**       | Number of helpful votes the review received |
| **Developer Reply** | Response from the app developer (if any)    |
| **Reply Date**      | When the developer responded                |
| **App Title**       | Name of the application                     |
| **App ID**          | Unique Google Play identifier               |
| **Developer**       | App developer/publisher name                |
| **App Score**       | Overall app rating                          |
| **Total Ratings**   | Total number of ratings received            |

### 🚀 How to scrape Google Play reviews

1. **Add app IDs** - Enter one or more Google Play app IDs (e.g., `com.whatsapp`)
2. **Configure filters** - Set maximum reviews, date range, rating filters, or keywords
3. **Run the scraper** - Click "Start" and let the scraper collect reviews
4. **Export data** - Download results as JSON, CSV, Excel, or connect via API

#### How to find the app ID

The app ID is in the Google Play Store URL. For example:

- URL: `https://play.google.com/store/apps/details?id=com.spotify.music`
- App ID: `com.spotify.music`

### 💰 How much does it cost to scrape Google Play reviews?

Google Play Reviews Scraper uses **consumption-based pricing** - you only pay for what you use. The cost depends on the number of reviews scraped and filters applied.

**Free tier**: Get started with Apify's free plan and scrape up to **500 reviews for free** every month.

**Typical costs**:

- 1,000 reviews ≈ $0.50 - $1.00
- 10,000 reviews ≈ $5.00 - $10.00
- 100,000 reviews ≈ $50.00 - $100.00

The scraper is optimized for efficiency with smart pagination and rate limiting to minimize compute unit consumption while maximizing results.

### 📥 Input

Configure the scraper through an intuitive interface or JSON input:

```json
{
  "appIds": ["com.whatsapp", "com.spotify.music"],
  "maxReviews": 1000,
  "sort": "NEWEST",
  "lang": "en",
  "country": "us",
  "minScore": 1,
  "maxScore": 3,
  "keywords": ["bug", "crash"],
  "dateFrom": "2024-01-01"
}
````

#### Input parameters

- **appIds** (required) - Array of Google Play app IDs to scrape
- **maxReviews** - Maximum reviews per app (default: 500)
- **sort** - Sort by NEWEST, RATING, or HELPFULNESS
- **lang** - Two-letter language code (default: "en")
- **country** - Two-letter country code (default: "us")
- **minScore** - Filter by minimum star rating (1-5)
- **maxScore** - Filter by maximum star rating (1-5)
- **minThumbsUp** - Minimum helpful votes required
- **hasReply** - Filter by developer reply status
- **keywords** - Array of keywords to search in reviews
- **minReviewLength** - Minimum review text length
- **dateFrom** - Start date (YYYY-MM-DD)
- **dateTo** - End date (YYYY-MM-DD)

### 📤 Output

The scraper stores results in a dataset that you can **export to CSV, JSON, Excel, HTML, or RSS**. Each review includes complete metadata and app information.

#### Output example

```json
{
  "id": "gp:AOqpTOFmAVORqfWGcaqfF39ftwFjGkjecjvjXnC3g",
  "userName": "John Smith",
  "userImage": "https://lh3.googleusercontent.com/...",
  "date": "2024-02-15T10:30:00.000Z",
  "score": 5,
  "scoreText": "5",
  "text": "Amazing app! Works perfectly and the support is great.",
  "title": "Best app ever",
  "replyDate": "2024-02-16T09:00:00.000Z",
  "replyText": "Thank you for your feedback!",
  "thumbsUp": 42,
  "url": "https://play.google.com/store/apps/details?id=com.example.app",
  "version": "2.1.0"
}
```

### 🔗 Google Play scraper API and integrations

#### How to use the Google Play scraper Python API

Access scraped reviews programmatically using the Apify API:

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_API_TOKEN')

## Start the scraper
run = client.actor('YOUR_ACTOR_ID').call(run_input={
    'appIds': ['com.whatsapp'],
    'maxReviews': 1000
})

## Fetch results
dataset = client.dataset(run['defaultDatasetId'])
reviews = dataset.list_items().items
```

#### How to automate Google Play review alerts in Slack

Set up automated notifications when new reviews are posted:

1. Run the scraper on a schedule (daily/hourly)
2. Use Apify webhooks to trigger on run completion
3. Connect webhook to Slack via Zapier or n8n
4. Filter for negative reviews (1-3 stars) to get instant alerts

#### How to connect Google Play reviews to n8n

Integrate with n8n for powerful automation workflows:

1. Use the **Apify node** in n8n
2. Configure the Google Play Reviews Scraper
3. Process results with n8n's data transformation
4. Send to Google Sheets, databases, or notification services

**Example workflow**: Scrape reviews → Filter negative feedback → Create Jira tickets → Notify team in Slack

#### How to track competitor app reviews automatically

Monitor competitor apps and stay ahead:

1. Add competitor app IDs to the input
2. Schedule the scraper to run daily or weekly
3. Set up webhooks to trigger on new negative reviews
4. Export data to your analytics dashboard or CRM

### 📊 How to export Google Play reviews to CSV

The scraper automatically formats data for easy export:

1. Run the scraper with your target apps
2. Go to the **Storage** tab after the run completes
3. Click **Export** and select CSV format
4. Download or send directly to Google Drive, Dropbox, or S3

You can also use the API to **bulk download Android app reviews** programmatically.

### 📈 How to visualize app store reviews in Looker Studio

Connect scraped data to Looker Studio for visual analytics:

1. Export reviews to Google Sheets using Apify integration
2. Connect Google Sheets to Looker Studio as a data source
3. Create dashboards with sentiment trends, rating distribution, and keyword analysis
4. Set up automated refresh to update dashboards daily

### 🎯 Use cases for Google Play reviews data

#### App store competitor review analysis

- Track competitor ratings and sentiment trends
- Identify feature requests users are asking for
- Monitor competitor app updates and user reactions
- Benchmark your app performance against competitors

#### Sentiment analysis and product insights

- Analyze user sentiment with NLP tools
- Extract common complaints and feature requests
- Identify bugs and technical issues from reviews
- Track sentiment changes over time after updates

#### Customer support and engagement

- Find unanswered negative reviews that need responses
- Monitor brand mentions and user feedback
- Identify power users and brand advocates
- Track customer satisfaction metrics (NPS, CSAT)

#### Market research and ASO

- Research keywords users mention in reviews
- Understand user language for app store optimization
- Identify market gaps and opportunities
- Analyze seasonal trends in user feedback

### 🔧 Advanced tips and tricks

#### How to scrape Play Store reviews without coding

This scraper requires zero coding knowledge:

1. Simply enter app IDs in the input form
2. Configure filters using dropdown menus
3. Click "Start" and wait for results
4. Download data in your preferred format

#### How to bypass rate limits when scraping Google Play

The scraper includes built-in protections:

- Automatic rate limiting with delays between requests
- Proxy rotation to avoid IP blocks
- Smart retry logic for failed requests
- Pagination handling to fetch large datasets

#### Filter reviews for specific insights

**Find bugs and crashes**:

```json
{
  "maxScore": 2,
  "keywords": ["bug", "crash", "broken", "not working"]
}
```

**Track unanswered complaints**:

```json
{
  "maxScore": 3,
  "hasReply": "withoutReply"
}
```

**Get popular positive reviews for marketing**:

```json
{
  "minScore": 5,
  "minThumbsUp": 50,
  "minReviewLength": 100
}
```

### ❓ Frequently Asked Questions

#### Is it legal to scrape Google Play reviews?

Yes, scraping publicly available Google Play reviews is legal. The scraper only extracts public data that users have chosen to share. It does not access private information, user accounts, or any data behind authentication. However, always review Google's Terms of Service and consult legal counsel for your specific use case.

#### What is the best tool to scrape app store reviews?

The Google Play Reviews Scraper on Apify is one of the most reliable tools for extracting app reviews. It offers:

- No coding required
- Advanced filtering options
- Automatic pagination and rate limiting
- Multiple export formats
- API access and webhook integrations
- Scheduled runs for automation

#### How to scrape Google Play reviews without getting blocked?

This scraper includes anti-blocking measures:

- Built-in delays between requests
- Proxy rotation (when using Apify proxies)
- Realistic request patterns
- Automatic retry logic

#### Can I scrape reviews from multiple apps at once?

Yes! Simply add multiple app IDs to the `appIds` array. The scraper will process each app sequentially with proper rate limiting between apps.

#### How often can I run the scraper?

You can run the scraper as often as needed. For automated monitoring, we recommend:

- Popular apps: Daily or hourly
- Medium apps: 2-3 times per week
- Small apps: Weekly

Use Apify's scheduling feature to automate runs.

#### Can I integrate this with my existing tools?

Absolutely! The scraper supports:

- **REST API** for programmatic access
- **Webhooks** for real-time notifications
- **Zapier, Make, n8n** for no-code automation
- **Direct exports** to Google Sheets, S3, Dropbox

#### What's the difference between this and the official Google Play API?

The official Google Play Developer API only provides access to reviews for apps you own. This scraper allows you to:

- Extract reviews from any public app
- Scrape competitor app reviews
- Get more detailed filtering options
- Export data in multiple formats
- No API key or app ownership required

### 🆚 Apify Google Play Reviews Scraper alternative

Looking for alternatives? This scraper stands out because:

✅ **No coding required** - Simple interface for everyone
✅ **Advanced filters** - More options than most alternatives
✅ **Bulk scraping** - Process multiple apps simultaneously
✅ **Reliable infrastructure** - Built on Apify's proven platform
✅ **Fair pricing** - Pay only for what you use
✅ **Great support** - Active maintenance and updates

### 🐛 Troubleshooting and known issues

#### No reviews returned

- Check that the app ID is correct
- Try different language/country combinations
- Some apps may have reviews disabled
- Verify the app has public reviews on Google Play

#### Fewer reviews than expected

- Filters may be too restrictive
- Some reviews may not match your criteria
- The app may have fewer reviews in the selected language/country
- Try increasing `maxReviews` or adjusting filters

#### Rate limiting errors

- The scraper includes automatic rate limiting
- If you encounter issues, try reducing the number of apps
- Use Apify's residential proxies for better reliability

### 💬 Feedback and support

Found a bug or have a feature request? We'd love to hear from you!

- 🐛 **Report issues** in the Issues tab
- 💡 **Request features** via the Issues tab
- 📧 **Contact us** for custom solutions or enterprise needs
- ⭐ **Rate the Actor** if you find it useful

### 🔗 Related Actors

- **App Store Reviews Scraper** - Scrape iOS app reviews from Apple App Store
- **Google Play App Details Scraper** - Extract app metadata, screenshots, and descriptions
- **Review Sentiment Analyzer** - Analyze sentiment of scraped reviews with AI

***

Made with ❤️ by the Apify community. This Actor is not affiliated with Google or Google Play Store.

# Actor input Schema

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

List of Google Play app IDs to scrape (e.g., com.google.android.apps.translate). You can find the app ID in the app's URL on Google Play Store.

## `maxReviews` (type: `integer`):

Maximum number of reviews to scrape per app. The scraper will stop after reaching this limit for each app.

## `sort` (type: `string`):

How to sort the reviews: by newest first, highest rating, or most helpful.

## `lang` (type: `string`):

Two-letter language code (ISO 639-1) for the reviews. Different languages may return different reviews.

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

Two-letter country code (ISO 3166-1 alpha-2) to fetch reviews from a specific region.

## `minScore` (type: `integer`):

Filter reviews by minimum star rating (1-5). Leave empty to include all ratings.

## `maxScore` (type: `integer`):

Filter reviews by maximum star rating (1-5). Leave empty to include all ratings.

## `minThumbsUp` (type: `integer`):

Only include reviews with at least this many helpful votes. Leave empty for no filter.

## `hasReply` (type: `string`):

Filter by developer reply status.

## `keywords` (type: `array`):

Filter reviews containing any of these keywords (case-insensitive). Leave empty for no keyword filter.

## `minReviewLength` (type: `integer`):

Only include reviews with at least this many characters. Leave empty for no filter.

## `dateFrom` (type: `string`):

Only include reviews from this date onwards (YYYY-MM-DD format). Leave empty for no date filter.

## `dateTo` (type: `string`):

Only include reviews up to this date (YYYY-MM-DD format). Leave empty for no date filter.

## Actor input object example

```json
{
  "appIds": [
    "com.google.android.apps.translate"
  ],
  "maxReviews": 500,
  "sort": "NEWEST",
  "lang": "en",
  "country": "us",
  "hasReply": "all"
}
```

# Actor output Schema

## `reviews` (type: `string`):

All scraped reviews with app information

# 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.google.android.apps.translate"
    ],
    "maxReviews": 500,
    "sort": "NEWEST",
    "lang": "en",
    "country": "us",
    "hasReply": "all"
};

// Run the Actor and wait for it to finish
const run = await client.actor("code-node-tools/google-play-reviews-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.google.android.apps.translate"],
    "maxReviews": 500,
    "sort": "NEWEST",
    "lang": "en",
    "country": "us",
    "hasReply": "all",
}

# Run the Actor and wait for it to finish
run = client.actor("code-node-tools/google-play-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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.google.android.apps.translate"
  ],
  "maxReviews": 500,
  "sort": "NEWEST",
  "lang": "en",
  "country": "us",
  "hasReply": "all"
}' |
apify call code-node-tools/google-play-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=code-node-tools/google-play-reviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Play Store Reviews Scraper API | App Review Extraction",
        "description": "Automate Google Play review scraping with our powerful API. Export user feedback, star ratings, and developer replies directly to your database in JSON or CSV. Perfect for sentiment analysis, competitor research, and tracking Android app performance at scale. Try it free today!",
        "version": "1.0",
        "x-build-id": "jKZizzTaxAocroomb"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/code-node-tools~google-play-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-code-node-tools-google-play-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/code-node-tools~google-play-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-code-node-tools-google-play-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/code-node-tools~google-play-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-code-node-tools-google-play-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "appIds"
                ],
                "properties": {
                    "appIds": {
                        "title": "App IDs",
                        "type": "array",
                        "description": "List of Google Play app IDs to scrape (e.g., com.google.android.apps.translate). You can find the app ID in the app's URL on Google Play Store.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxReviews": {
                        "title": "Maximum Reviews per App",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of reviews to scrape per app. The scraper will stop after reaching this limit for each app.",
                        "default": 500
                    },
                    "sort": {
                        "title": "Sort By",
                        "enum": [
                            "NEWEST",
                            "RATING",
                            "HELPFULNESS"
                        ],
                        "type": "string",
                        "description": "How to sort the reviews: by newest first, highest rating, or most helpful.",
                        "default": "NEWEST"
                    },
                    "lang": {
                        "title": "Language",
                        "pattern": "^[a-z]{2}$",
                        "type": "string",
                        "description": "Two-letter language code (ISO 639-1) for the reviews. Different languages may return different reviews.",
                        "default": "en"
                    },
                    "country": {
                        "title": "Country",
                        "pattern": "^[a-z]{2}$",
                        "type": "string",
                        "description": "Two-letter country code (ISO 3166-1 alpha-2) to fetch reviews from a specific region.",
                        "default": "us"
                    },
                    "minScore": {
                        "title": "Minimum Score",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Filter reviews by minimum star rating (1-5). Leave empty to include all ratings."
                    },
                    "maxScore": {
                        "title": "Maximum Score",
                        "minimum": 1,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Filter reviews by maximum star rating (1-5). Leave empty to include all ratings."
                    },
                    "minThumbsUp": {
                        "title": "Minimum Thumbs Up",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include reviews with at least this many helpful votes. Leave empty for no filter."
                    },
                    "hasReply": {
                        "title": "Developer Reply Filter",
                        "enum": [
                            "all",
                            "withReply",
                            "withoutReply"
                        ],
                        "type": "string",
                        "description": "Filter by developer reply status.",
                        "default": "all"
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Filter reviews containing any of these keywords (case-insensitive). Leave empty for no keyword filter.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minReviewLength": {
                        "title": "Minimum Review Length",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include reviews with at least this many characters. Leave empty for no filter."
                    },
                    "dateFrom": {
                        "title": "Date From",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Only include reviews from this date onwards (YYYY-MM-DD format). Leave empty for no date filter."
                    },
                    "dateTo": {
                        "title": "Date To",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Only include reviews up to this date (YYYY-MM-DD format). Leave empty for no date filter."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
