{
  "openapi": "3.0.1",
  "info": {
    "title": "iOS App Store & Google Play Reviews Scraper and API",
    "description": "Scrape App Store reviews and Google Play reviews for any app and country, then export and download them through the Apify API or as CSV. iOS app reviews and Play Store reviews in one schema, with rating, text, ISO date, app version and developer reply, ready for app review analysis.",
    "version": "0.1",
    "x-build-id": "xVonn2hz5Cop1Peq7"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/garje~app-store-play-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-garje-app-store-play-reviews-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/garje~app-store-play-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-garje-app-store-play-reviews-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/garje~app-store-play-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-garje-app-store-play-reviews-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": [
          "apps"
        ],
        "properties": {
          "apps": {
            "title": "Apps (paste the store links)",
            "type": "array",
            "description": "Paste each app's App Store or Google Play link, copied from the address bar, for example https://apps.apple.com/us/app/whatsapp-messenger/id310633997 or https://play.google.com/store/apps/details?id=com.whatsapp. You do not need to look up an ID. Optional: if you already have them, App Store IDs (310633997) and Google Play package names (com.whatsapp) work too. Mix both stores in one list.",
            "items": {
              "type": "string"
            }
          },
          "stores": {
            "title": "Stores",
            "type": "array",
            "description": "Which stores to read. Apps from a store that is not selected are skipped.",
            "items": {
              "type": "string",
              "enum": [
                "appStore",
                "googlePlay"
              ],
              "enumTitles": [
                "Apple App Store",
                "Google Play"
              ]
            },
            "default": [
              "appStore",
              "googlePlay"
            ]
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Two-letter ISO 3166 country codes, for example us or gb. Every row carries the country it came from. Apple's feed gives up to 500 reviews per country and sort order, so more countries means more App Store reviews.",
            "default": [
              "us"
            ],
            "items": {
              "type": "string"
            }
          },
          "languages": {
            "title": "Languages (Google Play)",
            "type": "array",
            "description": "Google Play language codes such as en, de or pt-BR. Apple's feed has no language filter; it follows the country.",
            "default": [
              "en"
            ],
            "items": {
              "type": "string"
            }
          },
          "sort": {
            "title": "Sort order",
            "enum": [
              "newest",
              "mostHelpful",
              "rating"
            ],
            "type": "string",
            "description": "newest, mostHelpful or rating. Apple's feed has no rating sort, so App Store apps fall back to newest when rating is chosen.",
            "default": "newest"
          },
          "appStoreSource": {
            "title": "App Store source",
            "enum": [
              "auto",
              "website"
            ],
            "type": "string",
            "description": "auto: Apple's public review feed (with app version and vote counts), switching to the App Store website for an app and country when the feed serves no reviews. website: always the App Store website, which goes past the feed's 500 reviews per country and sort order but has no app version or vote counts.",
            "default": "auto"
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app, store and country",
            "minimum": 0,
            "type": "integer",
            "description": "Honoured exactly for each app, store, country (and language on Google Play). Set 0 for no limit. If a store runs out first, the log and the RUN_SUMMARY record say why.",
            "default": 500
          },
          "since": {
            "title": "Only reviews since",
            "type": "string",
            "description": "ISO date or date-time, for example 2026-09-01. Only reviews on or after it are returned, which suits scheduled runs. <a href=\"https://garje-data-notes.laude--pify.workers.dev/articles/collect-only-new-app-reviews-each-week.html\" target=\"_blank\">Read an example</a>."
          },
          "ratings": {
            "title": "Star ratings",
            "type": "array",
            "description": "Keep only these star ratings, for example 1 and 2 for complaints. Leave empty for all. <a href=\"https://garje-data-notes.laude--pify.workers.dev/articles/star-ratings-in-4608-app-reviews.html\" target=\"_blank\">Read an example</a>.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ]
            },
            "default": []
          },
          "includeDeveloperReplies": {
            "title": "Include developer replies",
            "type": "boolean",
            "description": "Adds the developer's reply text and date (Google Play). Apple's public feed does not include replies. <a href=\"https://garje-data-notes.laude--pify.workers.dev/articles/developer-replies-in-google-play-reviews.html\" target=\"_blank\">Read an example</a>.",
            "default": true
          },
          "includeReviewerInfo": {
            "title": "Include reviewer names and profile links",
            "type": "boolean",
            "description": "Off by default for privacy. When on, rows add userName, userUrl (App Store) and userImage (Google Play).",
            "default": false
          },
          "continueOnError": {
            "title": "Continue on error",
            "type": "boolean",
            "description": "Skip an app or page that keeps failing and report it in RUN_SUMMARY, instead of stopping the run.",
            "default": true
          },
          "canary": {
            "title": "Drift canary (advanced)",
            "type": "object",
            "description": "For scheduled monitoring runs. Example: {\"baselineStore\": \"canary-baseline\", \"thresholdPoints\": 5}. The first run saves the null rate of key fields (and the mix of a status field) to that named key-value store; later runs compare and fail with an alert if any value moves by more than thresholdPoints percentage points. Leave empty for normal runs."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy datacenter IPs are enough for both stores.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}