{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play Store Scraper — Apps, Reviews, Charts",
    "description": "Scrape Google Play: app details, reviews, keyword search, top charts, similar apps and developer portfolios. Auto-detects mode from URL or query. MCP-ready, HTTP-only.",
    "version": "1.0",
    "x-build-id": "zzWW9oSe3ML9rHqwk"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/khadinakbar~google-play-all-in-one-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-khadinakbar-google-play-all-in-one-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/khadinakbar~google-play-all-in-one-scraper/runs": {
      "post": {
        "operationId": "runs-sync-khadinakbar-google-play-all-in-one-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/khadinakbar~google-play-all-in-one-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-khadinakbar-google-play-all-in-one-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "title": "Scrape mode",
            "enum": [
              "auto",
              "app-details",
              "reviews",
              "search",
              "list",
              "similar",
              "developer"
            ],
            "type": "string",
            "description": "What to scrape from Google Play. Leave as 'auto' to infer per item: a /store/apps/details URL or package id (e.g. 'com.spotify.music') becomes app-details, a /store/search URL or 'searchQuery' becomes search, a /store/apps/dev URL becomes developer. Set explicitly to force one behavior. NOT a free-text field — pick one of the listed values.",
            "default": "auto"
          },
          "appIds": {
            "title": "App package IDs or URLs",
            "type": "array",
            "description": "Google Play package IDs (e.g. 'com.spotify.music') or full app URLs (e.g. 'https://play.google.com/store/apps/details?id=com.spotify.music'). Used by app-details, reviews, and similar modes. Each entry yields one or more dataset records depending on mode. NOT a search keyword — use 'searchQuery' for that.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Google Play URLs to scrape — app, search, or developer pages. Each URL is auto-classified when mode is 'auto'. Use this instead of 'appIds' when you already have full URLs. NOT for non-Play URLs; only play.google.com links are accepted.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "searchQuery": {
            "title": "Search query",
            "type": "string",
            "description": "Free-text keyword run on Google Play search (e.g. 'meditation timer'). Triggers search mode and returns matching apps with title, developer, score, price, and icon. Combine with 'maxSearchResults' to cap volume and 'fullDetails' to enrich each hit into a full 50+ field record. NOT a package ID — use 'appIds' for direct app lookups."
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Two-letter ISO country code for the Play storefront (e.g. 'us', 'gb', 'de', 'in'). Controls localized pricing, availability, ranking, and which reviews are returned. Defaults to 'us'. NOT a full country name — use the 2-letter code.",
            "default": "us"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Two-letter ISO language code for localized text such as descriptions and review content (e.g. 'en', 'es', 'fr'). Defaults to 'en'. Combine with 'country' for region-accurate results. NOT a locale string like 'en-US' — use the 2-letter code.",
            "default": "en"
          },
          "maxReviews": {
            "title": "Max reviews per app",
            "minimum": 0,
            "maximum": 50000,
            "type": "integer",
            "description": "Maximum reviews to fetch per app in reviews mode (or when 'includeReviews' is on). Reviews are paginated automatically until this cap. Defaults to 100; set to 0 to skip reviews. Large values increase run cost — each review is one billable result.",
            "default": 100
          },
          "reviewsSort": {
            "title": "Reviews sort order",
            "enum": [
              "newest",
              "rating",
              "helpfulness"
            ],
            "type": "string",
            "description": "Order in which reviews are returned: 'newest' (most recent first), 'rating' (highest score first), or 'helpfulness' (most thumbs-up first). Defaults to 'newest'. Applies only to reviews mode and 'includeReviews'. NOT a filter — it sorts, it does not drop reviews.",
            "default": "newest"
          },
          "maxSearchResults": {
            "title": "Max search results",
            "minimum": 1,
            "maximum": 250,
            "type": "integer",
            "description": "Maximum apps to return from a keyword search. Google Play caps search at roughly 250 results per query. Defaults to 30. Each result is one billable result row unless 'fullDetails' upgrades it to a full app-detail charge.",
            "default": 30
          },
          "listCollection": {
            "title": "Chart collection",
            "enum": [
              "TOP_FREE",
              "TOP_PAID",
              "GROSSING"
            ],
            "type": "string",
            "description": "Which top chart to pull in list mode: 'TOP_FREE', 'TOP_PAID', or 'GROSSING'. Defaults to 'TOP_FREE'. Combine with 'listCategory' to scope the chart to a category like games. NOT a search — it returns ranked chart entries.",
            "default": "TOP_FREE"
          },
          "listCategory": {
            "title": "Chart category",
            "type": "string",
            "description": "Optional Google Play category to scope the chart in list mode (e.g. 'GAME', 'GAME_ACTION', 'SOCIAL', 'PRODUCTIVITY', 'FINANCE'). Leave blank for the overall chart across all categories. Must be a valid Play category constant in UPPER_SNAKE_CASE. NOT a free-text genre name."
          },
          "maxListResults": {
            "title": "Max chart results",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Maximum ranked apps to return in list mode. Google Play charts cap at roughly 500 entries. Defaults to 50. Each entry is one billable result row unless 'fullDetails' upgrades it.",
            "default": 50
          },
          "fullDetails": {
            "title": "Enrich list/search/similar/developer results to full details",
            "type": "boolean",
            "description": "When on, every app returned by search, list, similar, or developer mode is enriched with a full 50+ field app-details lookup (description, install count, screenshots, content rating, version, etc.). Off returns the lighter summary each endpoint provides natively. Enriched rows are billed as app-detail events, which cost more than summary results. Defaults to off for speed and lower cost.",
            "default": false
          },
          "includeReviews": {
            "title": "Include reviews with app details",
            "type": "boolean",
            "description": "When on in app-details mode, also fetch up to 'maxReviews' reviews for each app and emit them as separate review records. Off returns app details only. Useful for one-shot app + sentiment pulls. Each review is one billable result.",
            "default": false
          },
          "includeSimilar": {
            "title": "Include similar apps",
            "type": "boolean",
            "description": "When on in app-details mode, also fetch the list of similar/related apps Google Play recommends for each app, emitted as separate result rows. Off skips it. Each similar app is one billable result. Useful for competitor discovery and ASO.",
            "default": false
          },
          "maxResults": {
            "title": "Max total results (hard cost cap)",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Global ceiling on billable records for the entire run, across all modes and apps combined. The actor stops and exits cleanly once reached, so this is your hard cost cap. Defaults to 1000. Set lower to bound spend, higher for large jobs.",
            "default": 1000
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy used for Google Play requests. Apify Proxy (datacenter) is enabled by default and is sufficient for these endpoints; switch to residential only if you hit rate limits at high volume. Geo-targeting is independent of the 'country' field, which controls the storefront.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}