{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play Scraper - App Details & Rating Tracker",
    "description": "For ASO teams, app marketers and competitor trackers: rating, rating count, star histogram, installs, price, ads, in-app purchases, last update and version for many Google Play apps. Matched the live store page on 5 of 5 apps checked 2026-09-21. Monitoring mode returns only apps that changed.",
    "version": "0.1",
    "x-build-id": "AbbaXf88apx8BmpbG"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~google-play-app-details-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-google-play-app-details-tracker",
        "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/neverempty~google-play-app-details-tracker/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-google-play-app-details-tracker",
        "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/neverempty~google-play-app-details-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-google-play-app-details-tracker",
        "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": {
          "apps": {
            "title": "Google Play apps (package names or URLs)",
            "type": "array",
            "description": "Apps to read: a package name such as com.spotify.music, or an app URL such as https://play.google.com/store/apps/details?id=com.spotify.music. Package names are case-sensitive. If a URL carries its own gl (country) or hl (language), those win over the fields below for that app. A repeated app (same country and language) is read and charged once and the repeat gets a free 'duplicate' row. If you leave this field out with monitoring off, two example apps are read; with monitoring on it is required. An empty list is rejected.",
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "Country (store)",
            "type": "string",
            "description": "Two-letter country code of the Google Play store to read (gl), such as us, gb, de, jp or in. The average rating, the split of the star histogram, price, currency and whether the app can be installed differ by country; the rating count and installs are the same in every store. Google Play answers HTTP 400 for some unknown codes (such apps come back as a free 'country-not-accepted' row) but silently shows the US store for others, so check the currency column if you are unsure.",
            "default": "us"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language code of the page (hl), such as en, en-GB, de or ja. It changes the title, description, category name and the shown labels (rating, installs, price and date text), not the numbers. Google Play falls back to English for a language it does not know; every row says the language the page was actually in (pageLanguage).",
            "default": "en"
          },
          "maxApps": {
            "title": "Maximum rows to return",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "With monitoring off, reading stops once this many charged rows have been returned, and a free row says how many entries at the end of the list were not read. Apps that do not exist and unreadable pages do not count. In monitoring mode it does not limit the changes returned: every app in the list is checked, as far as the run's maximum total charge allows. Up to 1,000 entries are read per run.",
            "default": 100
          },
          "monitoringMode": {
            "title": "Monitoring mode: return an app only when it changed",
            "type": "boolean",
            "description": "Off = every app comes back with its current details, charged per row. On = the Actor remembers each app's details and, on later runs, returns an app only when its shown rating, rating count (by more than 0.01%), installs, last update date, version or price changed since the row last returned for it (narrow it with changeOn), with the previous values and the difference. The first run returns every app once to set the baseline. **In monitoring mode every app whose page is read costs $0.30 per 1,000 checks, changed or not** (apps that do not exist, unreadable pages and bot checks are free), plus the row price for the rows returned. Example: 100 apps every day = 3,000 checks a month = $0.90. The Actor reads only as many apps as the run's maximum total charge can pay for with a check and a change row each. Details are remembered per app, country, language and changeOn; do not put the same app in two schedules that can run at the same time. The rating count and installs are the same in every country, so watch them for an app in one country only.",
            "default": false
          },
          "changeOn": {
            "title": "In monitoring mode, return an app when",
            "enum": [
              "any",
              "rating",
              "installs",
              "release",
              "price"
            ],
            "type": "string",
            "description": "any = the shown rating, the rating count (by more than 0.01%), the installs (the shown tier or the finer number), the last update date, the version or the price changed. rating = only the shown rating or the rating count. installs = only the installs. release = only the last update date or the version. price = only the price or currency. A rating count moves back and forth by up to 0.002% between two reads a minute apart on large apps, so smaller moves are not reported as a change; an app that is not returned keeps the values of the row last returned for it, so small moves add up until they pass 0.01%. A change of only the rating count or shown rating is read again a few seconds later and returned only if it is still there. Each changeOn setting keeps its own memory, so a schedule with a new setting starts with a first check.",
            "default": "any"
          },
          "resetMonitoringState": {
            "title": "Forget what was remembered and start over",
            "type": "boolean",
            "description": "Clears every remembered app for this Actor, so the next monitoring run returns each app once again as a first check. This affects all your monitoring runs, because details are stored per app rather than per list. Turn it off again after one run: left on in a schedule, every run returns every app as a first check and charges the row price for it.",
            "default": false
          },
          "useProxy": {
            "title": "Use a proxy if Google Play answers with a bot check",
            "type": "boolean",
            "description": "Every app page is requested directly first. Only if Google Play answers a page with a bot check, a rate limit, an empty response or no response is that page retried through a datacenter proxy session; the next app is requested directly again. With it off, that answer is retried directly and then returned as a free 'blocked' row, and no proxy is used.",
            "default": 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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}