{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play Store Scraper  Reviews, Details, Search & Emails",
    "description": "Scrape Google Play reviews, full app details (developer email, phone, address, price, installs, permissions, Data safety), ranked search results, similar apps and developer portfolios across countries \\u2014 plus contact emails found on developers' websites. No login or API key needed.",
    "version": "0.0",
    "x-build-id": "WRz0a3P7OHxqBWDhM"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/reviewly~google-play-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-reviewly-google-play-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/reviewly~google-play-scraper/runs": {
      "post": {
        "operationId": "runs-sync-reviewly-google-play-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/reviewly~google-play-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-reviewly-google-play-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",
        "properties": {
          "action": {
            "title": "What to scrape",
            "enum": [
              "reviews",
              "appDetails",
              "similar",
              "search",
              "developer"
            ],
            "type": "string",
            "description": "Reviews, app details, similar apps and developer apps use the apps you list. Search uses the search terms. If the chosen action's input is empty but another input is filled, the actor runs the matching action instead.",
            "default": "reviews"
          },
          "startUrls": {
            "title": "App URLs",
            "type": "array",
            "description": "Google Play app URLs, e.g. https://play.google.com/store/apps/details?id=com.shopee.id. Used by Reviews, App details and Similar apps.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "appIds": {
            "title": "Package names",
            "type": "array",
            "description": "Android package names, one per line, e.g. com.spotify.music (the id= value in a Play Store URL). Use instead of App URLs, or alongside them — an app listed in both is only scraped once.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search terms",
            "type": "array",
            "description": "Keywords to search on Google Play, one per line. Results keep Play's ranked order, so `rank` is the app's position (ASO rank) for that term. Used by Search results.",
            "items": {
              "type": "string"
            }
          },
          "developerIds": {
            "title": "Developers",
            "type": "array",
            "description": "Developer page URLs or ids, one per line, e.g. https://play.google.com/store/apps/developer?id=Spotify+AB, Spotify AB, or a numeric id such as 4772240228547998649. Used by Developer's apps.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Two-letter country codes (gl), e.g. us, gb, in. Every input runs once per country, so prices, ratings, availability, rankings and reviews are collected per market.",
            "default": [
              "us"
            ],
            "items": {
              "type": "string"
            }
          },
          "language": {
            "title": "Language",
            "pattern": "^[a-zA-Z]{2,3}([-_][a-zA-Z0-9]{2,4})?$",
            "type": "string",
            "description": "Language code (hl), e.g. en, id, fr, pt-BR. It sets the language of texts, and for reviews it picks which reviews you get: Google Play keeps a separate review list per language.",
            "default": "en"
          },
          "maxReviews": {
            "title": "Max reviews per app",
            "minimum": 0,
            "type": "integer",
            "description": "Reviews only. Maximum number of reviews per app and country. 0 means no limit. Play serves 100 reviews per request.",
            "default": 100
          },
          "sortBy": {
            "title": "Sort reviews by",
            "enum": [
              "newest",
              "mostRelevant",
              "rating"
            ],
            "type": "string",
            "description": "Reviews only. 'Newest' is the only date-sorted option and the only one where the target date cuts the run short.",
            "default": "newest"
          },
          "filterByRating": {
            "title": "Star rating",
            "enum": [
              "all",
              "1",
              "2",
              "3",
              "4",
              "5"
            ],
            "type": "string",
            "description": "Reviews only. Only collect reviews with this star rating.",
            "default": "all"
          },
          "targetDate": {
            "title": "Target date",
            "type": "string",
            "description": "Reviews only. Skip reviews posted before this date (ISO 8601, e.g. 2026-01-01). With 'Newest' this also stops early, which makes it useful for incremental runs — set it to the date of your last run."
          },
          "includeAppInfo": {
            "title": "Add an app row",
            "type": "boolean",
            "description": "Reviews only. Before each app's reviews, push one row with the app's full details (charged as one result row). It also adds the app title to every review row.",
            "default": true
          },
          "includePermissions": {
            "title": "Include permissions",
            "type": "boolean",
            "description": "App details only. Attach every declared Android permission, grouped by type. Charged as one detail enrichment when the app declares any.",
            "default": false
          },
          "includeDataSafety": {
            "title": "Include Data safety",
            "type": "boolean",
            "description": "App details only. Attach the full Data safety section: data shared, data collected, purposes and security practices. One extra request per app, charged as one detail enrichment when it returns data. A short summary (dataSafetySummary) is always included for free.",
            "default": false
          },
          "includeSimilar": {
            "title": "Include similar apps",
            "type": "boolean",
            "description": "App details only. Attach a similarApps list (up to the results limit). Charged as one detail enrichment when Play lists any similar apps.",
            "default": false
          },
          "resultsLimit": {
            "title": "Results limit",
            "minimum": 0,
            "type": "integer",
            "description": "Search, similar apps and developer apps: maximum results per search term, app or developer (per country). 0 means everything Play returns. Web search returns about 30 results per term.",
            "default": 50
          },
          "includeFullDetails": {
            "title": "Full details for every listed app",
            "type": "boolean",
            "description": "Search, similar apps and developer apps: fetch each result's app page and add every app-details field to its row. One extra request per result, charged as one detail enrichment.",
            "default": false
          },
          "enrichEmails": {
            "title": "Find contact emails on developer websites",
            "type": "boolean",
            "description": "Crawl each developer's website (homepage plus up to 4 contact/about/imprint pages) for contact emails, ranked so that business addresses on the developer's own domain come first. Adds contactEmail and emailEnrichment to every app row. Applies to rows with full app details: App details, the Reviews app row, and Search / Similar / Developer rows with 'Full details' on. Charged once per row when at least one email is found; lookups that find nothing are free.",
            "default": false
          },
          "maxItems": {
            "title": "Max rows",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on total dataset rows across all inputs and countries. 0 means no cap.",
            "default": 0
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many inputs (input × country) are processed at the same time.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. Google Play serves these endpoints without a bot wall; a proxy only spreads load on long or repeated runs. Country is set in the request, not by the proxy location."
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}