{
  "data": {
    "id": "lDjfP3tMb4neCMtu6",
    "actId": "VCknmnj5f5O6X56Ho",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-10T16:05:04.849Z",
    "finishedAt": "2026-11-10T16:05:08.541Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 3549,
      "runTimeSecs": 3.549,
      "computeUnits": 0.003943333333333333,
      "imageSizeBytes": 319187968
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Google Play Store Scraper Input\",\n  \"description\": \"Choose what to collect from Google Play: search results, app details, reviews, developer catalogs, similar apps, permissions, or data safety.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to scrape.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"details\",\n        \"reviews\",\n        \"developer\",\n        \"similar\",\n        \"permissions\",\n        \"dataSafety\"\n      ],\n      \"enumTitles\": [\n        \"Search apps by keyword\",\n        \"App details by package name or URL\",\n        \"Reviews for apps\",\n        \"Developer catalog\",\n        \"Similar apps\",\n        \"App permissions\",\n        \"Data safety labels\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"search\"\n    },\n    \"searchQuery\": {\n      \"title\": \"Search query\",\n      \"type\": \"string\",\n      \"description\": \"Keyword to search for in mode=search, for example `photo editor` or `calculator`.\",\n      \"editor\": \"textfield\",\n      \"default\": \"calculator\",\n      \"prefill\": \"calculator\"\n    },\n    \"appIds\": {\n      \"title\": \"App IDs\",\n      \"type\": \"array\",\n      \"description\": \"Package names or Google Play URLs. Used by details, reviews, similar, permissions, and dataSafety modes.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"packageNames\": {\n      \"title\": \"Package names\",\n      \"type\": \"array\",\n      \"description\": \"Android package names such as `com.whatsapp`. Play URLs are also accepted.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"startUrls\": {\n      \"title\": \"Google Play app URLs\",\n      \"type\": \"array\",\n      \"description\": \"Full Google Play app URLs, for example `https://play.google.com/store/apps/details?id=com.whatsapp`.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"developerId\": {\n      \"title\": \"Developer ID\",\n      \"type\": \"string\",\n      \"description\": \"Numeric Google Play developer ID or a developer page URL, used in mode=developer.\",\n      \"editor\": \"textfield\"\n    },\n    \"developerName\": {\n      \"title\": \"Developer name\",\n      \"type\": \"string\",\n      \"description\": \"Display name shown on Google Play, for example `Google LLC`, used in mode=developer.\",\n      \"editor\": \"textfield\"\n    },\n    \"country\": {\n      \"title\": \"Country\",\n      \"type\": \"string\",\n      \"description\": \"Storefront for search results, pricing, and availability. Reviews are selected by Language, not Country.\",\n      \"editor\": \"select\",\n      \"default\": \"us\",\n      \"prefill\": \"us\",\n      \"enum\": [\n        \"us\",\n        \"gb\",\n        \"ca\",\n        \"au\",\n        \"in\",\n        \"de\",\n        \"fr\",\n        \"es\",\n        \"it\",\n        \"jp\",\n        \"kr\",\n        \"br\",\n        \"mx\",\n        \"nl\",\n        \"be\",\n        \"at\",\n        \"ch\",\n        \"se\",\n        \"no\",\n        \"dk\",\n        \"fi\",\n        \"pl\",\n        \"pt\",\n        \"cz\",\n        \"ro\",\n        \"hu\",\n        \"gr\",\n        \"tr\",\n        \"ru\",\n        \"ua\",\n        \"za\",\n        \"eg\",\n        \"ng\",\n        \"ke\",\n        \"id\",\n        \"th\",\n        \"vn\",\n        \"ph\",\n        \"my\",\n        \"sg\",\n        \"tw\",\n        \"hk\",\n        \"nz\",\n        \"ar\",\n        \"cl\",\n        \"co\",\n        \"pe\",\n        \"il\",\n        \"ae\",\n        \"sa\"\n      ],\n      \"enumTitles\": [\n        \"United States\",\n        \"United Kingdom\",\n        \"Canada\",\n        \"Australia\",\n        \"India\",\n        \"Germany\",\n        \"France\",\n        \"Spain\",\n        \"Italy\",\n        \"Japan\",\n        \"South Korea\",\n        \"Brazil\",\n        \"Mexico\",\n        \"Netherlands\",\n        \"Belgium\",\n        \"Austria\",\n        \"Switzerland\",\n        \"Sweden\",\n        \"Norway\",\n        \"Denmark\",\n        \"Finland\",\n        \"Poland\",\n        \"Portugal\",\n        \"Czech Republic\",\n        \"Romania\",\n        \"Hungary\",\n        \"Greece\",\n        \"Turkey\",\n        \"Russia\",\n        \"Ukraine\",\n        \"South Africa\",\n        \"Egypt\",\n        \"Nigeria\",\n        \"Kenya\",\n        \"Indonesia\",\n        \"Thailand\",\n        \"Vietnam\",\n        \"Philippines\",\n        \"Malaysia\",\n        \"Singapore\",\n        \"Taiwan\",\n        \"Hong Kong\",\n        \"New Zealand\",\n        \"Argentina\",\n        \"Chile\",\n        \"Colombia\",\n        \"Peru\",\n        \"Israel\",\n        \"United Arab Emirates\",\n        \"Saudi Arabia\"\n      ]\n    },\n    \"language\": {\n      \"title\": \"Language\",\n      \"type\": \"string\",\n      \"description\": \"Language for app pages and the review bucket. Google Play uses this language, not Country, to choose reviews.\",\n      \"editor\": \"select\",\n      \"default\": \"en\",\n      \"prefill\": \"en\",\n      \"enum\": [\n        \"en\",\n        \"es\",\n        \"fr\",\n        \"de\",\n        \"it\",\n        \"pt\",\n        \"ja\",\n        \"ko\",\n        \"zh\",\n        \"ru\",\n        \"ar\",\n        \"hi\",\n        \"th\",\n        \"vi\",\n        \"id\",\n        \"tr\",\n        \"pl\",\n        \"nl\",\n        \"sv\",\n        \"da\",\n        \"no\",\n        \"fi\",\n        \"cs\",\n        \"ro\",\n        \"hu\",\n        \"el\",\n        \"he\",\n        \"uk\",\n        \"ms\",\n        \"tl\"\n      ],\n      \"enumTitles\": [\n        \"English\",\n        \"Spanish\",\n        \"French\",\n        \"German\",\n        \"Italian\",\n        \"Portuguese\",\n        \"Japanese\",\n        \"Korean\",\n        \"Chinese\",\n        \"Russian\",\n        \"Arabic\",\n        \"Hindi\",\n        \"Thai\",\n        \"Vietnamese\",\n        \"Indonesian\",\n        \"Turkish\",\n        \"Polish\",\n        \"Dutch\",\n        \"Swedish\",\n        \"Danish\",\n        \"Norwegian\",\n        \"Finnish\",\n        \"Czech\",\n        \"Romanian\",\n        \"Hungarian\",\n        \"Greek\",\n        \"Hebrew\",\n        \"Ukrainian\",\n        \"Malay\",\n        \"Filipino\"\n      ]\n    },\n    \"maxItems\": {\n      \"title\": \"Max items\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on dataset rows. Search returns at most 250 apps per query. For similar mode one seed app is one row.\",\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"default\": 100,\n      \"prefill\": 3\n    },\n    \"maxReviewsPerApp\": {\n      \"title\": \"Max reviews per app\",\n      \"type\": \"integer\",\n      \"description\": \"Reviews to collect for each app. Google Play returns at most 4,500 reviews per page; the actor paginates up to this cap.\",\n      \"minimum\": 1,\n      \"maximum\": 50000,\n      \"default\": 100,\n      \"prefill\": 100\n    },\n    \"reviewSort\": {\n      \"title\": \"Review sort\",\n      \"type\": \"string\",\n      \"description\": \"Order used when fetching reviews.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"newest\",\n        \"rating\",\n        \"helpfulness\"\n      ],\n      \"enumTitles\": [\n        \"Newest first\",\n        \"Rating\",\n        \"Most helpful\"\n      ],\n      \"default\": \"newest\",\n      \"prefill\": \"newest\"\n    },\n    \"includeDetails\": {\n      \"title\": \"Include full app details\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch the full app page for search and developer results, and include app metadata in permissions/dataSafety output. Adds one request per app.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includePermissions\": {\n      \"title\": \"Include permissions\",\n      \"type\": \"boolean\",\n      \"description\": \"Add the app's permission list to app records. Works in search, details, developer, and similar modes.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeDataSafety\": {\n      \"title\": \"Include data safety\",\n      \"type\": \"boolean\",\n      \"description\": \"Add shared data, collected data, security practices, and the privacy policy URL to app records.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy configuration\",\n      \"type\": \"object\",\n      \"description\": \"Optional. The actor works without a proxy; use one only if Google Play blocks your runs.\",\n      \"editor\": \"proxy\"\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Google Play App Intelligence Scraper - Details, Reviews & Safety Labels\n\nCollect public Google Play data in one run: keyword search results, full app records, long review histories, developer catalogs, similar apps, permission lists, and data safety labels. Everything is read from public Play pages and RPC endpoints, so no Google account, cookie, or API key is needed.\n\n## Modes\n\n| Mode | What it returns |\n|---|---|\n| `search` | Apps matching a keyword, with search rank and an exact-match marker. Add full details, permissions, data safety, or reviews with the toggles. |\n| `details` | One full app record per package name or Play URL. |\n| `reviews` | One flat record per review, with author, rating, text, date, helpful votes, app version, and developer replies. |\n| `developer` | The app catalog for a numeric developer ID or a display name. |\n| `similar` | One record per seed app, with a `similarApps` array of related apps. |\n| `permissions` | One record per app with grouped and flat permission lists. |\n| `dataSafety` | One record per app with shared data, collected data, security practices, and the privacy policy URL. |\n\n## What you can collect\n\n### App records\n\n- Identity: `id`, `packageName`, `name`, `developer`, `developerId`, `developerUrl`, `url`, `sourceUrl`\n- Ratings: `rating`, `ratingCount`, `scoreText`, `reviewCount`, `histogram`\n- Reach and pricing: `installs`, `minInstalls`, `maxInstalls`, `price`, `currency`, `priceText`, `free`, `offersIAP`, `IAPRange`\n- Store metadata: `genre`, `genreId`, `categories`, `contentRating`, `version`, `updated`, `released`, `androidVersion`, `recentChanges`, `size` when Google publishes it\n- Creative and copy: `description`, `descriptionHTML`, `summary`, `icon`, `headerImage`, `screenshots`, `video`\n- Developer contact: `developerEmail`, `developerWebsite`, `developerAddress`, `developerLegalName`, `developerLegalEmail`, `developerLegalAddress`, `developerLegalPhone`, `privacyPolicy`\n- Search context: `searchQuery`, `rank`, `isExactMatch`\n- Optional trust data: `permissions`, `permissionGroups`, `dataSafety`\n- Optional related data: `similarApps`, nested `reviews`\n- Run metadata: `recordType`, `language`, `country`, `scrapedAt`\n\n### Review records\n\n- `id`, `reviewId`, `appId`, `appTitle`\n- `author`, `userName`, `userImage`\n- `rating`, `score`, `text`, `content`, `date`\n- `helpfulCount`, `thumbsUpCount`\n- `version`, `appVersion`, `criterias`\n- `developerReply` with reply text and date; `replyContent` and `repliedAt` are kept for existing integrations\n- `reviewUrl`, `language`, `storeCountry`, `sort`, `recordType`, `scrapedAt`\n\n### Permission records\n\n`permissions` is a flat list of `{permission, group, type}` objects. `permissionGroups` keeps Google Play's grouping. Permission names are localised by `language`.\n\n### Data safety records\n\n`dataSafety` contains `sharedData`, `collectedData`, `securityPractices`, and `privacyPolicyUrl`. Each shared or collected entry has `type`, `data`, `optional`, and `purpose` when Google provides them.\n\n## Input\n\n| Field | Default | Notes |\n|---|---|---|\n| `mode` | `search` | One of the seven modes above. |\n| `searchQuery` | `calculator` | Keyword for search mode. |\n| `appIds` | – | Package names or Play URLs. |\n| `packageNames` | – | Package names or Play URLs for details, reviews, similar, permissions, or data safety. |\n| `startUrls` | – | Full Play app URLs; the `id` parameter is extracted. |\n| `developerId` | – | Numeric developer ID or developer page URL. |\n| `developerName` | – | Display name such as `Google LLC`. |\n| `country` | `us` | Storefront for search results, pricing, and availability. |\n| `language` | `en` | Language for app pages and the review bucket. Google Play selects reviews by language, not country. |\n| `maxItems` | `100` | Hard row cap, 1–10,000. Search returns at most 250 apps per query. In similar mode one seed app is one row. |\n| `maxReviewsPerApp` | `100` | Review cap per app, 1–50,000. Requests use up to 4,500 reviews per page. |\n| `reviewSort` | `newest` | `newest`, `rating`, or `helpfulness`. |\n| `includeDetails` | `false` | Fetch the full app page for search and developer results, and include app metadata in permissions/dataSafety output. |\n| `includePermissions` | `false` | Add permissions to app records in search, details, developer, and similar modes. |\n| `includeDataSafety` | `false` | Add data safety labels to app records. |\n| `proxyConfiguration` | – | Optional. The actor works without a proxy. |\n\nUse at least one of `searchQuery`, `appIds`, `packageNames`, `startUrls`, or a developer field, depending on the mode.\n\n### Examples\n\nSearch with full details and permissions:\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"photo editor\",\n  \"country\": \"us\",\n  \"language\": \"en\",\n  \"maxItems\": 10,\n  \"includeDetails\": true,\n  \"includePermissions\": true\n}\n```\n\nDeep reviews for two apps:\n\n```json\n{\n  \"mode\": \"reviews\",\n  \"packageNames\": [\"com.whatsapp\", \"com.instagram.android\"],\n  \"language\": \"en\",\n  \"maxReviewsPerApp\": 5000,\n  \"reviewSort\": \"newest\",\n  \"maxItems\": 10000\n}\n```\n\nDeveloper catalog:\n\n```json\n{\n  \"mode\": \"developer\",\n  \"developerName\": \"Google LLC\",\n  \"country\": \"us\",\n  \"language\": \"en\",\n  \"maxItems\": 200\n}\n```\n\nData safety labels:\n\n```json\n{\n  \"mode\": \"dataSafety\",\n  \"packageNames\": [\"com.whatsapp\", \"com.spotify.music\"],\n  \"language\": \"en\",\n  \"includeDetails\": true\n}\n```\n\n## Output behaviour\n\n- Records are omit-empty at every depth. A field Google Play does not publish for an app is left out, never set to `null`, `\"\"`, `0`, or `[]`.\n- Existing field names from earlier versions (`appId`, `title`, `score`, `ratings`, `lastUpdated`, `reviewId`, `content`, `thumbsUpCount`, `replyContent`, `repliedAt`, `appVersion`) are still emitted beside the newer names so saved integrations keep working.\n- Old input keys are mapped in code: `searchTerms` to `searchQuery`, `maxResults` to `maxItems`, `reviewCount` to `maxReviewsPerApp`, and `includeReviews` to nested reviews on app records.\n- A run that produces zero records fails with a clear status message instead of returning an empty dataset. If some apps fail and others succeed, the dataset is kept and the run ends with a warning summary.\n- `RUN_SUMMARY` in the key-value store records counts, caps, warnings, errors, and whether any request was blocked.\n\n## Limits and honest caps\n\n- **Search:** most keywords return 15–50 apps. A minority expose a continuation token; the actor follows it up to 250 apps per query. To collect more, run several queries.\n- **Reviews:** Google Play serves up to 4,500 reviews per page. `maxReviewsPerApp` is capped at 50,000 and pagination stops when Google runs out of tokens or returns no new review IDs.\n- **Similar apps:** up to 150 related apps per seed. Similarity is broad; \"similar\" means related, not necessarily a direct competitor.\n- **Version history:** Google Play no longer exposes a version-history page or working RPC. Only the latest `version`, `updated`, and `recentChanges` are returned, and they are absent when Google does not publish them.\n- **App size:** Google Play's web pages do not expose a download size for most apps. `size` is emitted only when the source includes it.\n- **Developer catalogs:** pagination follows the continuation token. A very large publisher can still have more apps than the selected `maxItems`.\n- **Permissions and data safety:** these are separate Play endpoints. If one app has no declaration, the record still includes its identity and omits the empty section with a warning.\n\n## FAQ\n\n**Do I need a Google account, cookie, or API key?** No. All seven modes use public Play pages and RPCs that work without authentication.\n\n**Does `country` change reviews?** No. `country` controls the storefront, pricing, search result set, and availability. Reviews are selected by `language`; this is why the actor keeps the two inputs separate.\n\n**Why is a package missing from a search run?** Google Play's search covers a limited result set per keyword, and some terms return fewer than 20 apps. Try a broader keyword or add the package directly in `packageNames`.\n\n**What happens when Google blocks a request?** The actor retries with bounded exponential backoff. If every request is blocked, the run fails loudly with a blocked-request message. A proxy can be supplied, but it is never required.\n\n**Can I mix apps and search in one run?** Use `details` or `search` with `includeDetails`, or run separate tasks. Keeping modes separate makes row counts and output shapes predictable.\n\n**Is this affiliated with Google?** No. This is an independent third-party actor that reads public Google Play pages.\n\n## Use it as an API (server mode)\n\nNeed one answer right away instead of a batch job? Send the input as an HTTP request and the results come back in the response. There's no run to start and poll.\n\n```bash\ncurl -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  \"https://vcknmnj5f5o6x56ho.apify.actor/?mode=search&searchQuery=calculator&maxItems=3\"\n```\n\nOr POST the same input as JSON:\n\n```bash\ncurl -X POST -H \"Authorization: Bearer $APIFY_TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"mode\": \"search\", \"searchQuery\": \"calculator\", \"maxItems\": 3}' \\\n  \"https://vcknmnj5f5o6x56ho.apify.actor/\"\n```\n\n- The fields are the same as in the input above. With GET, repeat a parameter once for each value in a list.\n- You get back a JSON array with the same records a normal run saves. They're saved to the run's dataset too.\n- Each request is capped at 100 results and 4 minutes. For bigger jobs, start a normal run.\n- The request runs in your own Apify account at the Actor's normal price (a start fee plus a price per result). The server shuts down after a minute with no requests.\n- The Server tab on this page lists every parameter and lets you try a request from your browser.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "google-play-app-search-lookup-and-reviews-scraper",
      "title": "Google Play Apps, Reviews & Trust Data",
      "description": "Collect Google Play app details, deep review corpora, developer catalogs, similar apps, permission lists, and data safety labels without cookies or API keys. Separate storefront and review language, structured trust data, and honest caps.",
      "version": "2.0",
      "buildTag": "latest",
      "meta": {
        "templateId": "python-start"
      },
      "input": {
        "title": "Google Play Store Scraper Input",
        "description": "Choose what to collect from Google Play: search results, app details, reviews, developer catalogs, similar apps, permissions, or data safety.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to scrape.",
            "editor": "select",
            "enum": [
              "search",
              "details",
              "reviews",
              "developer",
              "similar",
              "permissions",
              "dataSafety"
            ],
            "enumTitles": [
              "Search apps by keyword",
              "App details by package name or URL",
              "Reviews for apps",
              "Developer catalog",
              "Similar apps",
              "App permissions",
              "Data safety labels"
            ],
            "default": "search",
            "prefill": "search"
          },
          "searchQuery": {
            "title": "Search query",
            "type": "string",
            "description": "Keyword to search for in mode=search, for example `photo editor` or `calculator`.",
            "editor": "textfield",
            "default": "calculator",
            "prefill": "calculator"
          },
          "appIds": {
            "title": "App IDs",
            "type": "array",
            "description": "Package names or Google Play URLs. Used by details, reviews, similar, permissions, and dataSafety modes.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "packageNames": {
            "title": "Package names",
            "type": "array",
            "description": "Android package names such as `com.whatsapp`. Play URLs are also accepted.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "startUrls": {
            "title": "Google Play app URLs",
            "type": "array",
            "description": "Full Google Play app URLs, for example `https://play.google.com/store/apps/details?id=com.whatsapp`.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "developerId": {
            "title": "Developer ID",
            "type": "string",
            "description": "Numeric Google Play developer ID or a developer page URL, used in mode=developer.",
            "editor": "textfield"
          },
          "developerName": {
            "title": "Developer name",
            "type": "string",
            "description": "Display name shown on Google Play, for example `Google LLC`, used in mode=developer.",
            "editor": "textfield"
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Storefront for search results, pricing, and availability. Reviews are selected by Language, not Country.",
            "editor": "select",
            "default": "us",
            "prefill": "us",
            "enum": [
              "us",
              "gb",
              "ca",
              "au",
              "in",
              "de",
              "fr",
              "es",
              "it",
              "jp",
              "kr",
              "br",
              "mx",
              "nl",
              "be",
              "at",
              "ch",
              "se",
              "no",
              "dk",
              "fi",
              "pl",
              "pt",
              "cz",
              "ro",
              "hu",
              "gr",
              "tr",
              "ru",
              "ua",
              "za",
              "eg",
              "ng",
              "ke",
              "id",
              "th",
              "vn",
              "ph",
              "my",
              "sg",
              "tw",
              "hk",
              "nz",
              "ar",
              "cl",
              "co",
              "pe",
              "il",
              "ae",
              "sa"
            ],
            "enumTitles": [
              "United States",
              "United Kingdom",
              "Canada",
              "Australia",
              "India",
              "Germany",
              "France",
              "Spain",
              "Italy",
              "Japan",
              "South Korea",
              "Brazil",
              "Mexico",
              "Netherlands",
              "Belgium",
              "Austria",
              "Switzerland",
              "Sweden",
              "Norway",
              "Denmark",
              "Finland",
              "Poland",
              "Portugal",
              "Czech Republic",
              "Romania",
              "Hungary",
              "Greece",
              "Turkey",
              "Russia",
              "Ukraine",
              "South Africa",
              "Egypt",
              "Nigeria",
              "Kenya",
              "Indonesia",
              "Thailand",
              "Vietnam",
              "Philippines",
              "Malaysia",
              "Singapore",
              "Taiwan",
              "Hong Kong",
              "New Zealand",
              "Argentina",
              "Chile",
              "Colombia",
              "Peru",
              "Israel",
              "United Arab Emirates",
              "Saudi Arabia"
            ]
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language for app pages and the review bucket. Google Play uses this language, not Country, to choose reviews.",
            "editor": "select",
            "default": "en",
            "prefill": "en",
            "enum": [
              "en",
              "es",
              "fr",
              "de",
              "it",
              "pt",
              "ja",
              "ko",
              "zh",
              "ru",
              "ar",
              "hi",
              "th",
              "vi",
              "id",
              "tr",
              "pl",
              "nl",
              "sv",
              "da",
              "no",
              "fi",
              "cs",
              "ro",
              "hu",
              "el",
              "he",
              "uk",
              "ms",
              "tl"
            ],
            "enumTitles": [
              "English",
              "Spanish",
              "French",
              "German",
              "Italian",
              "Portuguese",
              "Japanese",
              "Korean",
              "Chinese",
              "Russian",
              "Arabic",
              "Hindi",
              "Thai",
              "Vietnamese",
              "Indonesian",
              "Turkish",
              "Polish",
              "Dutch",
              "Swedish",
              "Danish",
              "Norwegian",
              "Finnish",
              "Czech",
              "Romanian",
              "Hungarian",
              "Greek",
              "Hebrew",
              "Ukrainian",
              "Malay",
              "Filipino"
            ]
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "Hard cap on dataset rows. Search returns at most 250 apps per query. For similar mode one seed app is one row.",
            "minimum": 1,
            "maximum": 10000,
            "default": 100,
            "prefill": 3
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app",
            "type": "integer",
            "description": "Reviews to collect for each app. Google Play returns at most 4,500 reviews per page; the actor paginates up to this cap.",
            "minimum": 1,
            "maximum": 50000,
            "default": 100,
            "prefill": 100
          },
          "reviewSort": {
            "title": "Review sort",
            "type": "string",
            "description": "Order used when fetching reviews.",
            "editor": "select",
            "enum": [
              "newest",
              "rating",
              "helpfulness"
            ],
            "enumTitles": [
              "Newest first",
              "Rating",
              "Most helpful"
            ],
            "default": "newest",
            "prefill": "newest"
          },
          "includeDetails": {
            "title": "Include full app details",
            "type": "boolean",
            "description": "Fetch the full app page for search and developer results, and include app metadata in permissions/dataSafety output. Adds one request per app.",
            "default": false,
            "prefill": false
          },
          "includePermissions": {
            "title": "Include permissions",
            "type": "boolean",
            "description": "Add the app's permission list to app records. Works in search, details, developer, and similar modes.",
            "default": false,
            "prefill": false
          },
          "includeDataSafety": {
            "title": "Include data safety",
            "type": "boolean",
            "description": "Add shared data, collected data, security practices, and the privacy policy URL to app records.",
            "default": false,
            "prefill": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. The actor works without a proxy; use one only if Google Play blocks your runs.",
            "editor": "proxy"
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Google Play App Intelligence Output",
        "description": "Google Play apps, reviews, permissions, data safety labels, developer catalogs, and similar apps.",
        "type": "object",
        "properties": {
          "items": {
            "type": "string",
            "title": "Google Play records",
            "description": "Dataset containing app, review, permission, data safety, and similar-app records.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "dockerfile": "./Dockerfile",
      "readme": "# Google Play App Intelligence Scraper - Details, Reviews & Safety Labels\n\nCollect public Google Play data in one run: keyword search results, full app records, long review histories, developer catalogs, similar apps, permission lists, and data safety labels. Everything is read from public Play pages and RPC endpoints, so no Google account, cookie, or API key is needed.\n\n## Modes\n\n| Mode | What it returns |\n|---|---|\n| `search` | Apps matching a keyword, with search rank and an exact-match marker. Add full details, permissions, data safety, or reviews with the toggles. |\n| `details` | One full app record per package name or Play URL. |\n| `reviews` | One flat record per review, with author, rating, text, date, helpful votes, app version, and developer replies. |\n| `developer` | The app catalog for a numeric developer ID or a display name. |\n| `similar` | One record per seed app, with a `similarApps` array of related apps. |\n| `permissions` | One record per app with grouped and flat permission lists. |\n| `dataSafety` | One record per app with shared data, collected data, security practices, and the privacy policy URL. |\n\n## What you can collect\n\n### App records\n\n- Identity: `id`, `packageName`, `name`, `developer`, `developerId`, `developerUrl`, `url`, `sourceUrl`\n- Ratings: `rating`, `ratingCount`, `scoreText`, `reviewCount`, `histogram`\n- Reach and pricing: `installs`, `minInstalls`, `maxInstalls`, `price`, `currency`, `priceText`, `free`, `offersIAP`, `IAPRange`\n- Store metadata: `genre`, `genreId`, `categories`, `contentRating`, `version`, `updated`, `released`, `androidVersion`, `recentChanges`, `size` when Google publishes it\n- Creative and copy: `description`, `descriptionHTML`, `summary`, `icon`, `headerImage`, `screenshots`, `video`\n- Developer contact: `developerEmail`, `developerWebsite`, `developerAddress`, `developerLegalName`, `developerLegalEmail`, `developerLegalAddress`, `developerLegalPhone`, `privacyPolicy`\n- Search context: `searchQuery`, `rank`, `isExactMatch`\n- Optional trust data: `permissions`, `permissionGroups`, `dataSafety`\n- Optional related data: `similarApps`, nested `reviews`\n- Run metadata: `recordType`, `language`, `country`, `scrapedAt`\n\n### Review records\n\n- `id`, `reviewId`, `appId`, `appTitle`\n- `author`, `userName`, `userImage`\n- `rating`, `score`, `text`, `content`, `date`\n- `helpfulCount`, `thumbsUpCount`\n- `version`, `appVersion`, `criterias`\n- `developerReply` with reply text and date; `replyContent` and `repliedAt` are kept for existing integrations\n- `reviewUrl`, `language`, `storeCountry`, `sort`, `recordType`, `scrapedAt`\n\n### Permission records\n\n`permissions` is a flat list of `{permission, group, type}` objects. `permissionGroups` keeps Google Play's grouping. Permission names are localised by `language`.\n\n### Data safety records\n\n`dataSafety` contains `sharedData`, `collectedData`, `securityPractices`, and `privacyPolicyUrl`. Each shared or collected entry has `type`, `data`, `optional`, and `purpose` when Google provides them.\n\n## Input\n\n| Field | Default | Notes |\n|---|---|---|\n| `mode` | `search` | One of the seven modes above. |\n| `searchQuery` | `calculator` | Keyword for search mode. |\n| `appIds` | – | Package names or Play URLs. |\n| `packageNames` | – | Package names or Play URLs for details, reviews, similar, permissions, or data safety. |\n| `startUrls` | – | Full Play app URLs; the `id` parameter is extracted. |\n| `developerId` | – | Numeric developer ID or developer page URL. |\n| `developerName` | – | Display name such as `Google LLC`. |\n| `country` | `us` | Storefront for search results, pricing, and availability. |\n| `language` | `en` | Language for app pages and the review bucket. Google Play selects reviews by language, not country. |\n| `maxItems` | `100` | Hard row cap, 1–10,000. Search returns at most 250 apps per query. In similar mode one seed app is one row. |\n| `maxReviewsPerApp` | `100` | Review cap per app, 1–50,000. Requests use up to 4,500 reviews per page. |\n| `reviewSort` | `newest` | `newest`, `rating`, or `helpfulness`. |\n| `includeDetails` | `false` | Fetch the full app page for search and developer results, and include app metadata in permissions/dataSafety output. |\n| `includePermissions` | `false` | Add permissions to app records in search, details, developer, and similar modes. |\n| `includeDataSafety` | `false` | Add data safety labels to app records. |\n| `proxyConfiguration` | – | Optional. The actor works without a proxy. |\n\nUse at least one of `searchQuery`, `appIds`, `packageNames`, `startUrls`, or a developer field, depending on the mode.\n\n### Examples\n\nSearch with full details and permissions:\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"photo editor\",\n  \"country\": \"us\",\n  \"language\": \"en\",\n  \"maxItems\": 10,\n  \"includeDetails\": true,\n  \"includePermissions\": true\n}\n```\n\nDeep reviews for two apps:\n\n```json\n{\n  \"mode\": \"reviews\",\n  \"packageNames\": [\"com.whatsapp\", \"com.instagram.android\"],\n  \"language\": \"en\",\n  \"maxReviewsPerApp\": 5000,\n  \"reviewSort\": \"newest\",\n  \"maxItems\": 10000\n}\n```\n\nDeveloper catalog:\n\n```json\n{\n  \"mode\": \"developer\",\n  \"developerName\": \"Google LLC\",\n  \"country\": \"us\",\n  \"language\": \"en\",\n  \"maxItems\": 200\n}\n```\n\nData safety labels:\n\n```json\n{\n  \"mode\": \"dataSafety\",\n  \"packageNames\": [\"com.whatsapp\", \"com.spotify.music\"],\n  \"language\": \"en\",\n  \"includeDetails\": true\n}\n```\n\n## Output behaviour\n\n- Records are omit-empty at every depth. A field Google Play does not publish for an app is left out, never set to `null`, `\"\"`, `0`, or `[]`.\n- Existing field names from earlier versions (`appId`, `title`, `score`, `ratings`, `lastUpdated`, `reviewId`, `content`, `thumbsUpCount`, `replyContent`, `repliedAt`, `appVersion`) are still emitted beside the newer names so saved integrations keep working.\n- Old input keys are mapped in code: `searchTerms` to `searchQuery`, `maxResults` to `maxItems`, `reviewCount` to `maxReviewsPerApp`, and `includeReviews` to nested reviews on app records.\n- A run that produces zero records fails with a clear status message instead of returning an empty dataset. If some apps fail and others succeed, the dataset is kept and the run ends with a warning summary.\n- `RUN_SUMMARY` in the key-value store records counts, caps, warnings, errors, and whether any request was blocked.\n\n## Limits and honest caps\n\n- **Search:** most keywords return 15–50 apps. A minority expose a continuation token; the actor follows it up to 250 apps per query. To collect more, run several queries.\n- **Reviews:** Google Play serves up to 4,500 reviews per page. `maxReviewsPerApp` is capped at 50,000 and pagination stops when Google runs out of tokens or returns no new review IDs.\n- **Similar apps:** up to 150 related apps per seed. Similarity is broad; \"similar\" means related, not necessarily a direct competitor.\n- **Version history:** Google Play no longer exposes a version-history page or working RPC. Only the latest `version`, `updated`, and `recentChanges` are returned, and they are absent when Google does not publish them.\n- **App size:** Google Play's web pages do not expose a download size for most apps. `size` is emitted only when the source includes it.\n- **Developer catalogs:** pagination follows the continuation token. A very large publisher can still have more apps than the selected `maxItems`.\n- **Permissions and data safety:** these are separate Play endpoints. If one app has no declaration, the record still includes its identity and omits the empty section with a warning.\n\n## FAQ\n\n**Do I need a Google account, cookie, or API key?** No. All seven modes use public Play pages and RPCs that work without authentication.\n\n**Does `country` change reviews?** No. `country` controls the storefront, pricing, search result set, and availability. Reviews are selected by `language`; this is why the actor keeps the two inputs separate.\n\n**Why is a package missing from a search run?** Google Play's search covers a limited result set per keyword, and some terms return fewer than 20 apps. Try a broader keyword or add the package directly in `packageNames`.\n\n**What happens when Google blocks a request?** The actor retries with bounded exponential backoff. If every request is blocked, the run fails loudly with a blocked-request message. A proxy can be supplied, but it is never required.\n\n**Can I mix apps and search in one run?** Use `details` or `search` with `includeDetails`, or run separate tasks. Keeping modes separate makes row counts and output shapes predictable.\n\n**Is this affiliated with Google?** No. This is an independent third-party actor that reads public Google Play pages.\n\n## Use it as an API (server mode)\n\nNeed one answer right away instead of a batch job? Send the input as an HTTP request and the results come back in the response. There's no run to start and poll.\n\n```bash\ncurl -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  \"https://vcknmnj5f5o6x56ho.apify.actor/?mode=search&searchQuery=calculator&maxItems=3\"\n```\n\nOr POST the same input as JSON:\n\n```bash\ncurl -X POST -H \"Authorization: Bearer $APIFY_TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"mode\": \"search\", \"searchQuery\": \"calculator\", \"maxItems\": 3}' \\\n  \"https://vcknmnj5f5o6x56ho.apify.actor/\"\n```\n\n- The fields are the same as in the input above. With GET, repeat a parameter once for each value in a list.\n- You get back a JSON array with the same records a normal run saves. They're saved to the run's dataset too.\n- Each request is capped at 100 results and 4 minutes. For bigger jobs, start a normal run.\n- The request runs in your own Apify account at the Actor's normal price (a start fee plus a price per result). The server shuts down after a minute with no requests.\n- The Server tab on this page lists every parameter and lets you try a request from your browser.\n",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Google Play Store records",
          "fields": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Stable identifier. For app records this is the Android package name; for reviews it is the review ID."
              },
              "packageName": {
                "type": "string",
                "description": "Android package name, for example com.whatsapp."
              },
              "appId": {
                "type": "string",
                "description": "Backward-compatible alias of packageName."
              },
              "name": {
                "type": "string",
                "description": "App name."
              },
              "title": {
                "type": "string",
                "description": "Backward-compatible alias of name."
              },
              "url": {
                "type": "string",
                "description": "Google Play app URL."
              },
              "sourceUrl": {
                "type": "string",
                "description": "URL the record was collected from."
              },
              "developer": {
                "type": "string",
                "description": "Developer display name."
              },
              "developerId": {
                "type": "string",
                "description": "Google Play developer ID."
              },
              "developerUrl": {
                "type": "string",
                "description": "Developer catalog URL."
              },
              "developerEmail": {
                "type": "string",
                "description": "Developer contact email."
              },
              "developerWebsite": {
                "type": "string",
                "description": "Developer website."
              },
              "developerAddress": {
                "type": "string",
                "description": "Developer contact address."
              },
              "developerLegalName": {
                "type": "string",
                "description": "Legal developer name."
              },
              "developerLegalEmail": {
                "type": "string",
                "description": "Legal developer email."
              },
              "developerLegalAddress": {
                "type": "string",
                "description": "Legal developer address."
              },
              "developerLegalPhone": {
                "type": "string",
                "description": "Legal developer phone number."
              },
              "privacyPolicy": {
                "type": "string",
                "description": "Privacy policy URL."
              },
              "rating": {
                "type": "number",
                "description": "Average rating from 0 to 5."
              },
              "score": {
                "type": "number",
                "description": "Backward-compatible alias of rating."
              },
              "scoreText": {
                "type": "string",
                "description": "Rating as displayed by Google Play."
              },
              "ratingCount": {
                "type": "integer",
                "description": "Total number of ratings."
              },
              "ratings": {
                "type": "integer",
                "description": "Backward-compatible alias of ratingCount."
              },
              "reviewCount": {
                "type": "integer",
                "description": "Total number of written reviews."
              },
              "histogram": {
                "type": "array",
                "description": "Rating distribution from 1 star to 5 stars.",
                "items": {
                  "type": "integer"
                }
              },
              "installs": {
                "type": "string",
                "description": "Displayed install count, for example 1,000,000,000+."
              },
              "minInstalls": {
                "type": "integer",
                "description": "Lower bound of the install estimate."
              },
              "maxInstalls": {
                "type": "integer",
                "description": "Upper bound of the install estimate."
              },
              "realInstalls": {
                "type": "integer",
                "description": "Google Play install estimate."
              },
              "price": {
                "type": "number",
                "description": "App price in the selected storefront currency. Zero means free."
              },
              "currency": {
                "type": "string",
                "description": "ISO currency code."
              },
              "priceText": {
                "type": "string",
                "description": "Localized price text."
              },
              "free": {
                "type": "boolean",
                "description": "Whether the app is free."
              },
              "offersIAP": {
                "type": "boolean",
                "description": "Whether the app offers in-app purchases."
              },
              "IAPRange": {
                "type": "string",
                "description": "Displayed in-app purchase range."
              },
              "genre": {
                "type": "string",
                "description": "Primary genre name."
              },
              "genreId": {
                "type": "string",
                "description": "Primary genre ID."
              },
              "categories": {
                "type": "array",
                "description": "Categories as objects with name and id.",
                "items": {
                  "type": "object"
                }
              },
              "version": {
                "type": "string",
                "description": "Latest app version when Google Play publishes it."
              },
              "updated": {
                "type": "string",
                "description": "Last update date."
              },
              "lastUpdated": {
                "type": "string",
                "description": "Backward-compatible alias of updated."
              },
              "released": {
                "type": "string",
                "description": "Original release date as displayed by Google Play."
              },
              "androidVersion": {
                "type": "string",
                "description": "Minimum Android version when published."
              },
              "size": {
                "type": "string",
                "description": "Download size when Google Play exposes it."
              },
              "recentChanges": {
                "type": "string",
                "description": "Latest changelog."
              },
              "contentRating": {
                "type": "string",
                "description": "Content rating, for example Everyone or Teen."
              },
              "adSupported": {
                "type": "boolean",
                "description": "Whether the app contains ads."
              },
              "containsAds": {
                "type": "boolean",
                "description": "Whether the app is marked as containing ads."
              },
              "description": {
                "type": "string",
                "description": "Full app description as plain text."
              },
              "descriptionHTML": {
                "type": "string",
                "description": "Full app description with Google Play HTML markup."
              },
              "summary": {
                "type": "string",
                "description": "Short app summary."
              },
              "icon": {
                "type": "string",
                "description": "App icon URL."
              },
              "headerImage": {
                "type": "string",
                "description": "Header image URL."
              },
              "screenshots": {
                "type": "array",
                "description": "Screenshot URLs.",
                "items": {
                  "type": "string"
                }
              },
              "video": {
                "type": "string",
                "description": "Promo video URL."
              },
              "available": {
                "type": "boolean",
                "description": "Whether the app is listed in the selected storefront."
              },
              "permissions": {
                "type": "array",
                "description": "Flat permission list with permission, group, and type.",
                "items": {
                  "type": "object"
                }
              },
              "permissionGroups": {
                "type": "array",
                "description": "Permissions grouped the way Google Play presents them.",
                "items": {
                  "type": "object"
                }
              },
              "dataSafety": {
                "type": "object",
                "description": "Shared data, collected data, security practices, and privacy policy URL."
              },
              "similarApps": {
                "type": "array",
                "description": "Apps related to the seed app.",
                "items": {
                  "type": "object"
                }
              },
              "reviews": {
                "type": "array",
                "description": "Nested reviews when reviews are requested alongside app records.",
                "items": {
                  "type": "object"
                }
              },
              "searchQuery": {
                "type": "string",
                "description": "Search query that produced the record."
              },
              "rank": {
                "type": "integer",
                "description": "One-based position in search or developer results."
              },
              "isExactMatch": {
                "type": "boolean",
                "description": "Whether the record is Google Play's exact-match card."
              },
              "developerInput": {
                "type": "string",
                "description": "Developer ID or display name used for the run."
              },
              "reviewId": {
                "type": "string",
                "description": "Review ID (backward-compatible alias of id)."
              },
              "appTitle": {
                "type": "string",
                "description": "App name for a review record."
              },
              "userName": {
                "type": "string",
                "description": "Reviewer name (backward-compatible alias of author)."
              },
              "author": {
                "type": "string",
                "description": "Reviewer name."
              },
              "userImage": {
                "type": "string",
                "description": "Reviewer avatar URL."
              },
              "text": {
                "type": "string",
                "description": "Review text."
              },
              "content": {
                "type": "string",
                "description": "Backward-compatible alias of text."
              },
              "date": {
                "type": "string",
                "description": "Review date in ISO 8601 format."
              },
              "helpfulCount": {
                "type": "integer",
                "description": "Number of helpful votes."
              },
              "thumbsUpCount": {
                "type": "integer",
                "description": "Backward-compatible alias of helpfulCount."
              },
              "developerReply": {
                "type": "object",
                "description": "Developer reply text and date when present."
              },
              "replyContent": {
                "type": "string",
                "description": "Backward-compatible developer reply text."
              },
              "repliedAt": {
                "type": "string",
                "description": "Backward-compatible developer reply date."
              },
              "appVersion": {
                "type": "string",
                "description": "App version the review was written for."
              },
              "criterias": {
                "type": "array",
                "description": "Per-criterion ratings when Google Play provides them.",
                "items": {
                  "type": "object"
                }
              },
              "reviewUrl": {
                "type": "string",
                "description": "Permalink to the review."
              },
              "recordType": {
                "type": "string",
                "description": "app, review, permissions, dataSafety, or similar."
              },
              "language": {
                "type": "string",
                "description": "Language used for the request."
              },
              "country": {
                "type": "string",
                "description": "Storefront used for the request."
              },
              "storeCountry": {
                "type": "string",
                "description": "Storefront used for a review request."
              },
              "sort": {
                "type": "string",
                "description": "Review sort order."
              },
              "scrapedAt": {
                "type": "string",
                "description": "ISO 8601 collection timestamp."
              }
            }
          },
          "views": {
            "overview": {
              "title": "Apps",
              "transformation": {
                "fields": [
                  "packageName",
                  "name",
                  "developer",
                  "rating",
                  "ratingCount",
                  "installs",
                  "price",
                  "currency",
                  "genre",
                  "updated",
                  "url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "packageName": {
                    "label": "Package",
                    "format": "text"
                  },
                  "name": {
                    "label": "App",
                    "format": "text"
                  },
                  "developer": {
                    "label": "Developer",
                    "format": "text"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "ratingCount": {
                    "label": "Ratings",
                    "format": "number"
                  },
                  "installs": {
                    "label": "Installs",
                    "format": "text"
                  },
                  "price": {
                    "label": "Price",
                    "format": "number"
                  },
                  "currency": {
                    "label": "Currency",
                    "format": "text"
                  },
                  "genre": {
                    "label": "Genre",
                    "format": "text"
                  },
                  "updated": {
                    "label": "Updated",
                    "format": "text"
                  },
                  "url": {
                    "label": "URL",
                    "format": "text"
                  }
                }
              }
            },
            "reviews": {
              "title": "Reviews",
              "transformation": {
                "fields": [
                  "reviewId",
                  "appId",
                  "appTitle",
                  "author",
                  "rating",
                  "text",
                  "date",
                  "helpfulCount"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "reviewId": {
                    "label": "Review ID",
                    "format": "text"
                  },
                  "appId": {
                    "label": "App ID",
                    "format": "text"
                  },
                  "appTitle": {
                    "label": "App",
                    "format": "text"
                  },
                  "author": {
                    "label": "Author",
                    "format": "text"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "text": {
                    "label": "Review",
                    "format": "text"
                  },
                  "date": {
                    "label": "Date",
                    "format": "text"
                  },
                  "helpfulCount": {
                    "label": "Helpful",
                    "format": "number"
                  }
                }
              }
            },
            "trust": {
              "title": "Permissions and data safety",
              "transformation": {
                "fields": [
                  "packageName",
                  "name",
                  "permissions",
                  "dataSafety"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "packageName": {
                    "label": "Package",
                    "format": "text"
                  },
                  "name": {
                    "label": "App",
                    "format": "text"
                  },
                  "permissions": {
                    "label": "Permissions",
                    "format": "text"
                  },
                  "dataSafety": {
                    "label": "Data safety",
                    "format": "text"
                  }
                }
              }
            },
            "similar": {
              "title": "Similar apps",
              "transformation": {
                "fields": [
                  "packageName",
                  "name",
                  "similarApps"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "packageName": {
                    "label": "Seed package",
                    "format": "text"
                  },
                  "name": {
                    "label": "Seed app",
                    "format": "text"
                  },
                  "similarApps": {
                    "label": "Similar apps",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      },
      "webServerSchema": {
        "openapi": "3.0.3",
        "info": {
          "title": "Google Play Apps, Reviews & Trust Data (server mode)",
          "version": "1.1",
          "description": "Send one lookup and get the results back in the response. It takes the same input as a normal run: query parameters with GET, or a JSON body with POST. At most 100 results and 240 seconds per request; start a normal run for bigger jobs. Requests run in your own Apify account at the Actor's normal price.",
          "x-oa-server-mode": "1.1"
        },
        "paths": {
          "/": {
            "get": {
              "operationId": "lookupGet",
              "summary": "Run one lookup (query parameters)",
              "parameters": [
                {
                  "name": "mode",
                  "in": "query",
                  "required": true,
                  "description": "What to scrape.",
                  "schema": {
                    "type": "string",
                    "enum": [
                      "search",
                      "details",
                      "reviews",
                      "developer",
                      "similar",
                      "permissions",
                      "dataSafety"
                    ],
                    "default": "search"
                  },
                  "example": "search"
                },
                {
                  "name": "searchQuery",
                  "in": "query",
                  "required": false,
                  "description": "Keyword to search for in mode=search, for example `photo editor` or `calculator`.",
                  "schema": {
                    "type": "string",
                    "default": "calculator"
                  },
                  "example": "calculator"
                },
                {
                  "name": "appIds",
                  "in": "query",
                  "required": false,
                  "description": "Package names or Google Play URLs. Used by details, reviews, similar, permissions, and dataSafety modes. (GET: repeat the parameter once per value.)",
                  "schema": {
                    "type": "array",
                    "default": [],
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 10
                  },
                  "style": "form",
                  "explode": true
                },
                {
                  "name": "packageNames",
                  "in": "query",
                  "required": false,
                  "description": "Android package names such as `com.whatsapp`. Play URLs are also accepted. (GET: repeat the parameter once per value.)",
                  "schema": {
                    "type": "array",
                    "default": [],
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 10
                  },
                  "style": "form",
                  "explode": true
                },
                {
                  "name": "startUrls",
                  "in": "query",
                  "required": false,
                  "description": "Full Google Play app URLs, for example `https://play.google.com/store/apps/details?id=com.whatsapp`. (GET: repeat the parameter once per value.)",
                  "schema": {
                    "type": "array",
                    "default": [],
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 10
                  },
                  "style": "form",
                  "explode": true
                },
                {
                  "name": "developerId",
                  "in": "query",
                  "required": false,
                  "description": "Numeric Google Play developer ID or a developer page URL, used in mode=developer.",
                  "schema": {
                    "type": "string"
                  }
                },
                {
                  "name": "developerName",
                  "in": "query",
                  "required": false,
                  "description": "Display name shown on Google Play, for example `Google LLC`, used in mode=developer.",
                  "schema": {
                    "type": "string"
                  }
                },
                {
                  "name": "country",
                  "in": "query",
                  "required": false,
                  "description": "Storefront for search results, pricing, and availability. Reviews are selected by Language, not Country.",
                  "schema": {
                    "type": "string",
                    "enum": [
                      "us",
                      "gb",
                      "ca",
                      "au",
                      "in",
                      "de",
                      "fr",
                      "es",
                      "it",
                      "jp",
                      "kr",
                      "br",
                      "mx",
                      "nl",
                      "be",
                      "at",
                      "ch",
                      "se",
                      "no",
                      "dk",
                      "fi",
                      "pl",
                      "pt",
                      "cz",
                      "ro",
                      "hu",
                      "gr",
                      "tr",
                      "ru",
                      "ua",
                      "za",
                      "eg",
                      "ng",
                      "ke",
                      "id",
                      "th",
                      "vn",
                      "ph",
                      "my",
                      "sg",
                      "tw",
                      "hk",
                      "nz",
                      "ar",
                      "cl",
                      "co",
                      "pe",
                      "il",
                      "ae",
                      "sa"
                    ],
                    "default": "us"
                  }
                },
                {
                  "name": "language",
                  "in": "query",
                  "required": false,
                  "description": "Language for app pages and the review bucket. Google Play uses this language, not Country, to choose reviews.",
                  "schema": {
                    "type": "string",
                    "enum": [
                      "en",
                      "es",
                      "fr",
                      "de",
                      "it",
                      "pt",
                      "ja",
                      "ko",
                      "zh",
                      "ru",
                      "ar",
                      "hi",
                      "th",
                      "vi",
                      "id",
                      "tr",
                      "pl",
                      "nl",
                      "sv",
                      "da",
                      "no",
                      "fi",
                      "cs",
                      "ro",
                      "hu",
                      "el",
                      "he",
                      "uk",
                      "ms",
                      "tl"
                    ],
                    "default": "en"
                  }
                },
                {
                  "name": "maxItems",
                  "in": "query",
                  "required": false,
                  "description": "Hard cap on dataset rows. Search returns at most 250 apps per query. For similar mode one seed app is one row.",
                  "schema": {
                    "type": "integer",
                    "default": 50,
                    "minimum": 1,
                    "maximum": 50
                  },
                  "example": 3
                },
                {
                  "name": "maxReviewsPerApp",
                  "in": "query",
                  "required": false,
                  "description": "Reviews to collect for each app. Google Play returns at most 4,500 reviews per page; the actor paginates up to this cap.",
                  "schema": {
                    "type": "integer",
                    "default": 100,
                    "minimum": 1,
                    "maximum": 100
                  }
                },
                {
                  "name": "reviewSort",
                  "in": "query",
                  "required": false,
                  "description": "Order used when fetching reviews.",
                  "schema": {
                    "type": "string",
                    "enum": [
                      "newest",
                      "rating",
                      "helpfulness"
                    ],
                    "default": "newest"
                  }
                },
                {
                  "name": "includeDetails",
                  "in": "query",
                  "required": false,
                  "description": "Fetch the full app page for search and developer results, and include app metadata in permissions/dataSafety output. Adds one request per app.",
                  "schema": {
                    "type": "boolean",
                    "default": false
                  }
                },
                {
                  "name": "includePermissions",
                  "in": "query",
                  "required": false,
                  "description": "Add the app's permission list to app records. Works in search, details, developer, and similar modes.",
                  "schema": {
                    "type": "boolean",
                    "default": false
                  }
                },
                {
                  "name": "includeDataSafety",
                  "in": "query",
                  "required": false,
                  "description": "Add shared data, collected data, security practices, and the privacy policy URL to app records.",
                  "schema": {
                    "type": "boolean",
                    "default": false
                  }
                },
                {
                  "name": "proxyConfiguration",
                  "in": "query",
                  "required": false,
                  "description": "Optional. The actor works without a proxy; use one only if Google Play blocks your runs. (GET: pass it as JSON.)",
                  "content": {
                    "application/json": {
                      "schema": {
                        "type": "object"
                      }
                    }
                  }
                }
              ],
              "responses": {
                "200": {
                  "description": "The results as a JSON array (at most 100). They are also saved to the run's dataset and billed per result, like a normal run.",
                  "headers": {
                    "X-Item-Count": {
                      "schema": {
                        "type": "integer"
                      },
                      "description": "Results returned."
                    },
                    "X-Status-Message": {
                      "schema": {
                        "type": "string"
                      },
                      "description": "The Actor's last status message, e.g. why nothing was found."
                    }
                  },
                  "content": {
                    "application/json": {
                      "schema": {
                        "type": "array",
                        "items": {
                          "$ref": "#/components/schemas/Item"
                        }
                      },
                      "example": [
                        {
                          "packageName": "com.sec.android.app.popupcalculator",
                          "appId": "com.sec.android.app.popupcalculator",
                          "id": "com.sec.android.app.popupcalculator",
                          "name": "Samsung Calculator",
                          "title": "Samsung Calculator",
                          "url": "https://play.google.com/store/apps/details?id=com.sec.android.app.popupcalculator",
                          "sourceUrl": "https://play.google.com/store/apps/details?id=com.sec.android.app.popupcalculator",
                          "summary": "[Key features]\nPerform four fundamental operations and engineering calculations.\n\nTo start the engineering calculator, tap the engineering calculator icon.\n\n...",
                          "developer": "Samsung Electronics Co.,  Ltd.",
                          "developerUrl": "https://play.google.com/store/apps/developer?id=Samsung+Electronics+Co.%2C++Ltd.",
                          "rating": 4.45,
                          "score": 4.45,
                          "scoreText": "4.5",
                          "icon": "https://play-lh.googleusercontent.com/p8rUJZjn-oJQPhrNASuJEZu3njkIxXP6P_AdeSUrXl5BrrtZDBu_YUBxJp0_WgcsaQ5HnB5-j9Fa7whGc0vo6w",
                          "price": 0,
                          "currency": "USD",
                          "free": true,
                          "searchQuery": "calculator",
                          "rank": 1,
                          "isExactMatch": false,
                          "recordType": "app",
                          "language": "en",
                          "country": "us",
                          "scrapedAt": "2026-11-10T15:33:11.818504+00:00"
                        }
                      ]
                    }
                  }
                },
                "400": {
                  "description": "Invalid, missing or unknown input fields. Nothing ran.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/Error"
                      },
                      "example": {
                        "error": "invalid_input",
                        "errorDescription": "mode: required"
                      }
                    }
                  }
                },
                "422": {
                  "description": "The Actor could not complete this request (for example, nothing matches). No results were delivered.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/Error"
                      }
                    }
                  }
                },
                "500": {
                  "description": "Unexpected failure. Safe to retry.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/Error"
                      }
                    }
                  }
                },
                "504": {
                  "description": "The request used up its 240 s budget. The results found so far are in partialItems.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "allOf": [
                          {
                            "$ref": "#/components/schemas/Error"
                          },
                          {
                            "type": "object",
                            "properties": {
                              "partialItems": {
                                "type": "array",
                                "items": {
                                  "$ref": "#/components/schemas/Item"
                                }
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            },
            "post": {
              "operationId": "lookupPost",
              "summary": "Run one lookup (JSON body)",
              "requestBody": {
                "required": true,
                "content": {
                  "application/json": {
                    "schema": {
                      "type": "object",
                      "properties": {
                        "mode": {
                          "type": "string",
                          "enum": [
                            "search",
                            "details",
                            "reviews",
                            "developer",
                            "similar",
                            "permissions",
                            "dataSafety"
                          ],
                          "default": "search",
                          "description": "What to scrape."
                        },
                        "searchQuery": {
                          "type": "string",
                          "default": "calculator",
                          "description": "Keyword to search for in mode=search, for example `photo editor` or `calculator`."
                        },
                        "appIds": {
                          "type": "array",
                          "default": [],
                          "items": {
                            "type": "string"
                          },
                          "maxItems": 10,
                          "description": "Package names or Google Play URLs. Used by details, reviews, similar, permissions, and dataSafety modes."
                        },
                        "packageNames": {
                          "type": "array",
                          "default": [],
                          "items": {
                            "type": "string"
                          },
                          "maxItems": 10,
                          "description": "Android package names such as `com.whatsapp`. Play URLs are also accepted."
                        },
                        "startUrls": {
                          "type": "array",
                          "default": [],
                          "items": {
                            "type": "string"
                          },
                          "maxItems": 10,
                          "description": "Full Google Play app URLs, for example `https://play.google.com/store/apps/details?id=com.whatsapp`."
                        },
                        "developerId": {
                          "type": "string",
                          "description": "Numeric Google Play developer ID or a developer page URL, used in mode=developer."
                        },
                        "developerName": {
                          "type": "string",
                          "description": "Display name shown on Google Play, for example `Google LLC`, used in mode=developer."
                        },
                        "country": {
                          "type": "string",
                          "enum": [
                            "us",
                            "gb",
                            "ca",
                            "au",
                            "in",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "jp",
                            "kr",
                            "br",
                            "mx",
                            "nl",
                            "be",
                            "at",
                            "ch",
                            "se",
                            "no",
                            "dk",
                            "fi",
                            "pl",
                            "pt",
                            "cz",
                            "ro",
                            "hu",
                            "gr",
                            "tr",
                            "ru",
                            "ua",
                            "za",
                            "eg",
                            "ng",
                            "ke",
                            "id",
                            "th",
                            "vn",
                            "ph",
                            "my",
                            "sg",
                            "tw",
                            "hk",
                            "nz",
                            "ar",
                            "cl",
                            "co",
                            "pe",
                            "il",
                            "ae",
                            "sa"
                          ],
                          "default": "us",
                          "description": "Storefront for search results, pricing, and availability. Reviews are selected by Language, not Country."
                        },
                        "language": {
                          "type": "string",
                          "enum": [
                            "en",
                            "es",
                            "fr",
                            "de",
                            "it",
                            "pt",
                            "ja",
                            "ko",
                            "zh",
                            "ru",
                            "ar",
                            "hi",
                            "th",
                            "vi",
                            "id",
                            "tr",
                            "pl",
                            "nl",
                            "sv",
                            "da",
                            "no",
                            "fi",
                            "cs",
                            "ro",
                            "hu",
                            "el",
                            "he",
                            "uk",
                            "ms",
                            "tl"
                          ],
                          "default": "en",
                          "description": "Language for app pages and the review bucket. Google Play uses this language, not Country, to choose reviews."
                        },
                        "maxItems": {
                          "type": "integer",
                          "default": 50,
                          "minimum": 1,
                          "maximum": 50,
                          "description": "Hard cap on dataset rows. Search returns at most 250 apps per query. For similar mode one seed app is one row."
                        },
                        "maxReviewsPerApp": {
                          "type": "integer",
                          "default": 100,
                          "minimum": 1,
                          "maximum": 100,
                          "description": "Reviews to collect for each app. Google Play returns at most 4,500 reviews per page; the actor paginates up to this cap."
                        },
                        "reviewSort": {
                          "type": "string",
                          "enum": [
                            "newest",
                            "rating",
                            "helpfulness"
                          ],
                          "default": "newest",
                          "description": "Order used when fetching reviews."
                        },
                        "includeDetails": {
                          "type": "boolean",
                          "default": false,
                          "description": "Fetch the full app page for search and developer results, and include app metadata in permissions/dataSafety output. Adds one request per app."
                        },
                        "includePermissions": {
                          "type": "boolean",
                          "default": false,
                          "description": "Add the app's permission list to app records. Works in search, details, developer, and similar modes."
                        },
                        "includeDataSafety": {
                          "type": "boolean",
                          "default": false,
                          "description": "Add shared data, collected data, security practices, and the privacy policy URL to app records."
                        },
                        "proxyConfiguration": {
                          "type": "object",
                          "description": "Optional. The actor works without a proxy; use one only if Google Play blocks your runs."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "mode"
                      ]
                    },
                    "example": {
                      "mode": "search",
                      "searchQuery": "calculator",
                      "maxItems": 3
                    }
                  }
                }
              },
              "responses": {
                "200": {
                  "description": "The results as a JSON array (at most 100). They are also saved to the run's dataset and billed per result, like a normal run.",
                  "headers": {
                    "X-Item-Count": {
                      "schema": {
                        "type": "integer"
                      },
                      "description": "Results returned."
                    },
                    "X-Status-Message": {
                      "schema": {
                        "type": "string"
                      },
                      "description": "The Actor's last status message, e.g. why nothing was found."
                    }
                  },
                  "content": {
                    "application/json": {
                      "schema": {
                        "type": "array",
                        "items": {
                          "$ref": "#/components/schemas/Item"
                        }
                      },
                      "example": [
                        {
                          "packageName": "com.sec.android.app.popupcalculator",
                          "appId": "com.sec.android.app.popupcalculator",
                          "id": "com.sec.android.app.popupcalculator",
                          "name": "Samsung Calculator",
                          "title": "Samsung Calculator",
                          "url": "https://play.google.com/store/apps/details?id=com.sec.android.app.popupcalculator",
                          "sourceUrl": "https://play.google.com/store/apps/details?id=com.sec.android.app.popupcalculator",
                          "summary": "[Key features]\nPerform four fundamental operations and engineering calculations.\n\nTo start the engineering calculator, tap the engineering calculator icon.\n\n...",
                          "developer": "Samsung Electronics Co.,  Ltd.",
                          "developerUrl": "https://play.google.com/store/apps/developer?id=Samsung+Electronics+Co.%2C++Ltd.",
                          "rating": 4.45,
                          "score": 4.45,
                          "scoreText": "4.5",
                          "icon": "https://play-lh.googleusercontent.com/p8rUJZjn-oJQPhrNASuJEZu3njkIxXP6P_AdeSUrXl5BrrtZDBu_YUBxJp0_WgcsaQ5HnB5-j9Fa7whGc0vo6w",
                          "price": 0,
                          "currency": "USD",
                          "free": true,
                          "searchQuery": "calculator",
                          "rank": 1,
                          "isExactMatch": false,
                          "recordType": "app",
                          "language": "en",
                          "country": "us",
                          "scrapedAt": "2026-11-10T15:33:11.818504+00:00"
                        }
                      ]
                    }
                  }
                },
                "400": {
                  "description": "Invalid, missing or unknown input fields. Nothing ran.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/Error"
                      },
                      "example": {
                        "error": "invalid_input",
                        "errorDescription": "mode: required"
                      }
                    }
                  }
                },
                "422": {
                  "description": "The Actor could not complete this request (for example, nothing matches). No results were delivered.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/Error"
                      }
                    }
                  }
                },
                "500": {
                  "description": "Unexpected failure. Safe to retry.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/Error"
                      }
                    }
                  }
                },
                "504": {
                  "description": "The request used up its 240 s budget. The results found so far are in partialItems.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "allOf": [
                          {
                            "$ref": "#/components/schemas/Error"
                          },
                          {
                            "type": "object",
                            "properties": {
                              "partialItems": {
                                "type": "array",
                                "items": {
                                  "$ref": "#/components/schemas/Item"
                                }
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "components": {
          "schemas": {
            "Item": {
              "type": "object",
              "description": "One result, the same record a normal run saves to its dataset.",
              "properties": {
                "packageName": {
                  "type": "string"
                },
                "appId": {
                  "type": "string"
                },
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "sourceUrl": {
                  "type": "string"
                },
                "summary": {
                  "type": "string"
                },
                "developer": {
                  "type": "string"
                },
                "developerUrl": {
                  "type": "string"
                },
                "rating": {
                  "type": "number"
                },
                "score": {
                  "type": "number"
                },
                "scoreText": {
                  "type": "string"
                },
                "icon": {
                  "type": "string"
                },
                "price": {
                  "type": "number"
                },
                "currency": {
                  "type": "string"
                },
                "free": {
                  "type": "boolean"
                },
                "searchQuery": {
                  "type": "string"
                },
                "rank": {
                  "type": "integer"
                },
                "isExactMatch": {
                  "type": "boolean"
                },
                "recordType": {
                  "type": "string"
                },
                "language": {
                  "type": "string"
                },
                "country": {
                  "type": "string"
                },
                "scrapedAt": {
                  "type": "string"
                }
              },
              "example": {
                "packageName": "com.sec.android.app.popupcalculator",
                "appId": "com.sec.android.app.popupcalculator",
                "id": "com.sec.android.app.popupcalculator",
                "name": "Samsung Calculator",
                "title": "Samsung Calculator",
                "url": "https://play.google.com/store/apps/details?id=com.sec.android.app.popupcalculator",
                "sourceUrl": "https://play.google.com/store/apps/details?id=com.sec.android.app.popupcalculator",
                "summary": "[Key features]\nPerform four fundamental operations and engineering calculations.\n\nTo start the engineering calculator, tap the engineering calculator icon.\n\n...",
                "developer": "Samsung Electronics Co.,  Ltd.",
                "developerUrl": "https://play.google.com/store/apps/developer?id=Samsung+Electronics+Co.%2C++Ltd.",
                "rating": 4.45,
                "score": 4.45,
                "scoreText": "4.5",
                "icon": "https://play-lh.googleusercontent.com/p8rUJZjn-oJQPhrNASuJEZu3njkIxXP6P_AdeSUrXl5BrrtZDBu_YUBxJp0_WgcsaQ5HnB5-j9Fa7whGc0vo6w",
                "price": 0,
                "currency": "USD",
                "free": true,
                "searchQuery": "calculator",
                "rank": 1,
                "isExactMatch": false,
                "recordType": "app",
                "language": "en",
                "country": "us",
                "scrapedAt": "2026-11-10T15:33:11.818504+00:00"
              }
            },
            "Error": {
              "type": "object",
              "required": [
                "error",
                "errorDescription"
              ],
              "properties": {
                "error": {
                  "type": "string",
                  "enum": [
                    "invalid_input",
                    "request_failed",
                    "internal_error",
                    "timeout",
                    "busy",
                    "not_found",
                    "method_not_allowed",
                    "payload_too_large"
                  ]
                },
                "errorDescription": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "2.0.3",
    "imageDigest": "8e1f5f78495f12db5ea6065d43e82ee88c62c0bdd015d54e04bae66e319aba74",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "2.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.003943333333333333
    }
  }
}