{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store & Google Play Scraper",
    "description": "Scrape app metadata and reviews from the Apple App Store and Google Play. Ratings and prices per country, exact install counts, star histograms, versions and release notes, plus Play reviews with developer replies. Same app, every storefront, one run.",
    "version": "0.0",
    "x-build-id": "2GhvJ4ss65bZ1xCPw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/eiv~app-store-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-eiv-app-store-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/eiv~app-store-scraper/runs": {
      "post": {
        "operationId": "runs-sync-eiv-app-store-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/eiv~app-store-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-eiv-app-store-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": {
          "apps": {
            "title": "Apps",
            "type": "array",
            "description": "App identifiers or store URLs, one per line. Accepts an Android package name ('com.spotify.music'), a numeric App Store id ('1459969523'), or a full apps.apple.com / play.google.com URL. A URL that names a storefront wins over the country list below.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Search both stores and profile everything found. Use to map a whole category rather than a known list of apps.",
            "items": {
              "type": "string"
            }
          },
          "maxAppsPerSearch": {
            "title": "Max apps per search term",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Cap on results taken from each search term, per store, per country. Your main billing guard when using search.",
            "default": 30
          },
          "startUrls": {
            "title": "Start URLs (for chaining)",
            "type": "array",
            "description": "Alternative to Apps, for feeding output from another Actor straight into this one.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "sourceDatasetId": {
            "title": "Source dataset ID",
            "type": "string",
            "description": "Read app identifiers from an existing dataset instead of typing them."
          },
          "sourceDatasetField": {
            "title": "Source dataset field",
            "type": "string",
            "description": "Which field on the source dataset holds the app identifier.",
            "default": "appId"
          },
          "stores": {
            "title": "Stores",
            "type": "array",
            "description": "Which stores to query. Only applies to bare identifiers and search terms — a package name is always Google Play and a numeric id is always the App Store, whatever is selected here.",
            "items": {
              "type": "string",
              "enum": [
                "apple",
                "google"
              ],
              "enumTitles": [
                "Apple App Store",
                "Google Play"
              ]
            },
            "default": [
              "apple",
              "google"
            ]
          },
          "countries": {
            "title": "Storefronts",
            "type": "array",
            "description": "Two-letter country codes to profile, e.g. us, gb, de, jp, br. Worth more than it looks: the same app scored 4.57 in the US App Store and 3.62 in Germany, and Pokémon GO runs 3.50 in Germany against 4.06 in India on Google Play. One record is produced per app per storefront, and each is billed.",
            "default": [
              "us"
            ],
            "items": {
              "type": "string"
            }
          },
          "includeReviews": {
            "title": "Include reviews",
            "type": "boolean",
            "description": "Also scrape user reviews with star rating, text, date, helpful count, the reviewer's app version and any developer reply. Google Play only — Apple retired its public reviews feed and the replacement needs credentials this Actor does not have.",
            "default": false
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app",
            "minimum": 0,
            "maximum": 20000,
            "type": "integer",
            "description": "Hard cap per app per storefront. 100 reviews arrive per request. Set 0 to skip reviews entirely.",
            "default": 200
          },
          "reviewRating": {
            "title": "Only this star rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Keep only reviews with this many stars, 1 to 5. Pushed into the request so the store does the filtering. 0 keeps every rating.",
            "default": 0
          },
          "reviewsWithinDays": {
            "title": "Only reviews from the last N days",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "Keep only recent reviews. Costs more requests than you might expect: Google Play does not return reviews in date order — a single page was measured spanning two years — so the Actor pages past old reviews rather than stopping at the first one. 0 keeps everything.",
            "default": 0
          },
          "repliedOnly": {
            "title": "Only reviews with a developer reply",
            "type": "boolean",
            "description": "Keep only reviews the developer has publicly answered. Useful for studying how a competitor handles complaints.",
            "default": false
          },
          "includeDescriptions": {
            "title": "Include full descriptions",
            "type": "boolean",
            "description": "Store each app's full store description and release notes. Off by default because descriptions dominate dataset size; a 300-character snippet is always included.",
            "default": false
          },
          "includeScreenshots": {
            "title": "Include screenshot URLs",
            "type": "boolean",
            "description": "Store the full list of screenshot URLs. A count is always included regardless.",
            "default": false
          },
          "flattenOutput": {
            "title": "Flatten output for CSV",
            "type": "boolean",
            "description": "Emit flat dot-notation columns with arrays joined by ' | '. Use for spreadsheets; leave off for warehouses.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "App listings processed in parallel. A Google Play listing is about 1.2 MB, so raise memory alongside this.",
            "default": 10
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 3,
            "maximum": 180,
            "type": "integer",
            "description": "Per-request timeout.",
            "default": 45
          },
          "maxRetries": {
            "title": "Retries per request",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Retries for connection resets and 5xx responses. A 404 is not retried, because an app missing from a storefront stays missing.",
            "default": 1
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Usually unnecessary — both stores serve this data to anonymous clients. Worth enabling for very large runs, or to pin requests to a country.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}