{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play ASO Scraper — Reviews, Rankings, Competitors",
    "description": "All-in-one Google Play intelligence: app details + ratings histogram, reviews (star/date filters), keyword rankings with ASO popularity/difficulty/opportunity scores, top charts, similar-apps competitor maps, permissions, install & revenue estimates. Multi-country batching, no login/proxies/browser.",
    "version": "0.1",
    "x-build-id": "nYnzi1IKqtSJWjLPa"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nomad-agent~google-play-aso-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nomad-agent-google-play-aso-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/nomad-agent~google-play-aso-scraper/runs": {
      "post": {
        "operationId": "runs-sync-nomad-agent-google-play-aso-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/nomad-agent~google-play-aso-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-nomad-agent-google-play-aso-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "app-details",
              "reviews",
              "search",
              "top-charts",
              "similar-apps",
              "permissions"
            ],
            "type": "string",
            "description": "What to scrape: full app details + ratings histogram, reviews, keyword search rankings (with ASO popularity/difficulty/opportunity scores), top charts, similar apps (competitor mapping), or app permissions.",
            "default": "app-details"
          },
          "appIds": {
            "title": "App IDs",
            "type": "array",
            "description": "Package names (e.g. com.spotify.music) or full Play Store URLs. Used by app-details, reviews, similar-apps and permissions modes.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Keywords to search for (search mode). One ranked result list per query, each result also tagged with keyword-level ASO scores (popularityScore / difficultyScore / opportunityScore, 0-100).",
            "items": {
              "type": "string"
            }
          },
          "language": {
            "title": "Language (hl)",
            "type": "string",
            "description": "Store language code, e.g. en, de, es, ja.",
            "default": "en"
          },
          "country": {
            "title": "Country (gl)",
            "type": "string",
            "description": "Store country code, e.g. us, gb, de, in, br. Charts, rankings and review sets differ per country. Ignored when `countries` (below) is set to a non-empty list.",
            "default": "us"
          },
          "countries": {
            "title": "Countries (batch)",
            "type": "array",
            "description": "Run the selected mode once per store country (ISO codes, e.g. us, gb, de) in a single run. When non-empty this takes precedence over the singular `country` field above. Every output record gets a `country` field so you can tell which store front it came from — this applies whether you used `country` or `countries`. Multiplies cost: N countries ≈ N× the items of a single-country run.",
            "items": {
              "type": "string"
            }
          },
          "reviewsSort": {
            "title": "Reviews sort",
            "enum": [
              "newest",
              "rating",
              "relevance"
            ],
            "type": "string",
            "description": "Order of reviews (reviews mode). Automatically forced to 'Newest first' when `reviewsNewerThan` is set, since the date cutoff only works on newest-first order.",
            "default": "newest"
          },
          "reviewsFilterScore": {
            "title": "Reviews star filter",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Only reviews with this star rating, 1–5. 0 = all ratings (reviews mode). Combine with `reviewsNewerThan` for e.g. '1-star reviews since my last release'.",
            "default": 0
          },
          "reviewsNewerThan": {
            "title": "Reviews newer than (date)",
            "type": "string",
            "description": "Only return reviews posted on or after this date (YYYY-MM-DD; reviews mode). Reviews are fetched newest-first and fetching stops as soon as an older review is seen — so this composes with `maxReviewsPerApp`: fetching stops at whichever limit is hit first, the review count cap or this date cutoff. Leave empty for no date filter."
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app",
            "minimum": 1,
            "type": "integer",
            "description": "Cap reviews fetched per app (reviews mode). Pagination is handled automatically. Stops at whichever limit is hit first: this count, or the `reviewsNewerThan` date cutoff if that's set.",
            "default": 200
          },
          "topChartsCollection": {
            "title": "Top charts collection",
            "enum": [
              "TOP_FREE",
              "TOP_PAID",
              "GROSSING"
            ],
            "type": "string",
            "description": "Which chart to fetch (top-charts mode).",
            "default": "TOP_FREE"
          },
          "topChartsCategory": {
            "title": "Top charts category",
            "type": "string",
            "description": "Play Store category id (top-charts mode): APPLICATION (all apps), GAME (all games), or a specific one like HEALTH_AND_FITNESS, FINANCE, PRODUCTIVITY, GAME_PUZZLE, MUSIC_AND_AUDIO.",
            "default": "APPLICATION"
          },
          "maxResults": {
            "title": "Max results per query / chart / app",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Cap results per search query (max 30 per store page), per top chart (max 500) and per similar-apps lookup.",
            "default": 50
          },
          "fullDetail": {
            "title": "Enrich with full app details",
            "type": "boolean",
            "description": "For search / top-charts / similar-apps results, also fetch each app's full detail record (slower — one extra request per app).",
            "default": false
          },
          "maxItems": {
            "title": "Max items (total)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Hard cap on total items returned across the whole run (all modes/countries combined). Each item is billed at $0.004 — e.g. 500 items ≈ $2.05, plus the one-time $0.05 actor-start fee. 0 = no cap; use with caution, since uncapped review or multi-country pulls can bill a large amount.",
            "default": 100
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "How many app pages to fetch at the same time. Higher is faster but more likely to get temporarily rate-limited by Google Play — leave at the default unless you have a reason to change it.",
            "default": 4
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}