{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store & Google Play Reviews Scraper · $0.15/1k",
    "description": "Scrape App Store + Google Play reviews: 5,000+ per app, filters by stars, date or keyword, developer replies on Google Play, retries Apple's empty pages. No login. $0.15/1k; optional AI labels +$0.5/1k.",
    "version": "0.1",
    "x-build-id": "SN8e0lAdeOpeDsMT6"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/leoworks~app-review-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-leoworks-app-review-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/leoworks~app-review-scraper/runs": {
      "post": {
        "operationId": "runs-sync-leoworks-app-review-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/leoworks~app-review-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-leoworks-app-review-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": "Apple App Store apps (URL or numeric ID, e.g. https://apps.apple.com/us/app/duolingo/id570060128 or 570060128) and Google Play apps (URL or package name, e.g. https://play.google.com/store/apps/details?id=com.duolingo or com.duolingo). The store is detected from each value. Up to 50 apps. Leave empty only when you use \"Dataset ID\" under Advanced.",
            "items": {
              "type": "string"
            }
          },
          "reviewsPerApp": {
            "title": "Reviews per app",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum reviews to collect for each app, country and store (charged per review: $0.15 per 1,000, or $0.65 per 1,000 with AI labels). The App Store feed stops at 500 reviews per country and sort order; Google Play goes deeper. The form starts at 20 for a quick, low-cost first run (default when omitted via API: 100).",
            "default": 100
          },
          "classify": {
            "title": "Add AI labels (optional)",
            "type": "boolean",
            "description": "Off by default: the Actor collects the reviews and writes them to the dataset ($0.15 per 1,000). Turn on to add complaint types (bugs and crashes, performance, design and usability, missing features, price and billing, ads, account and login, support, privacy and trust), praise, sentiment, a serious-issue alert and a needs-a-reply flag to each review, plus the per-app summary with headline. Adds $0.5 per 1,000 labelled reviews. Giving Custom labels or a Dataset ID turns labels on.",
            "default": false
          },
          "customLabels": {
            "title": "Custom labels",
            "type": "array",
            "description": "Up to 10 yes/no criteria in plain language, e.g. \"mentions a competitor app\", \"asks for dark mode\", \"complains about the subscription price after the free trial\". Giving labels turns AI labels on. Each classified review gets a probability and `matched` per label. Included in the classification price.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Store countries",
            "type": "array",
            "description": "2-letter country codes, e.g. us, gb, kr, jp, de. Used for the App Store country (one feed per country) and as the Google Play region. Google Play returns the same reviews for every country, so each Google Play app is read once, using the first country.",
            "default": [
              "us"
            ],
            "items": {
              "type": "string"
            }
          },
          "sort": {
            "title": "Sort order",
            "enum": [
              "newest",
              "helpful"
            ],
            "type": "string",
            "description": "Newest first is best for monitoring. Most helpful (App Store: most helpful; Google Play: most relevant) shows the reviews other users found useful.",
            "default": "newest"
          },
          "maxStars": {
            "title": "Maximum stars",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Keep only reviews with at most this many stars — e.g. 3 to read only the critical ones. Filtered reviews are not stored or charged."
          },
          "reviewsNewerThan": {
            "title": "Only reviews newer than",
            "type": "string",
            "description": "A date (`2026-09-01`) or a period (`30 days`, `6 months`)."
          },
          "keywords": {
            "title": "Review must mention one of",
            "type": "array",
            "description": "Keep only reviews that contain at least one of these words or phrases (any language, case-insensitive), e.g. \"crash\", \"refund\", \"subscription\".",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "playLanguage": {
            "title": "Google Play language",
            "type": "string",
            "description": "Language code for the Google Play store page (en, ko, ja …). Reviews are returned in the reviewers' own languages whatever you choose here.",
            "default": "en"
          },
          "outputMode": {
            "title": "Output",
            "enum": [
              "full",
              "minimal"
            ],
            "type": "string",
            "description": "Full adds the flat label columns and probabilities for every label. Minimal stores only the label keys.",
            "default": "full"
          },
          "monitorKey": {
            "title": "Monitor key",
            "maxLength": 64,
            "type": "string",
            "description": "Optional name for a recurring check (e.g. `my-apps`). The summary then reports what changed since the last run with the same key: rating change, new reviews, new serious issues and unanswered-review change. Only summary figures (no review text) are kept, in the named key-value store `monitor-app-reviews` of your own Apify account."
          },
          "datasetId": {
            "title": "Dataset ID (classify reviews you already have)",
            "type": "string",
            "description": "Instead of \"Apps\": the ID of an Apify dataset with app reviews collected elsewhere. The text, rating, date, version and developer-reply fields are detected automatically. AI labels are always on in this mode. Only classification is charged ($0.5 per 1,000)."
          },
          "maxConcurrency": {
            "title": "Parallel classifications",
            "minimum": 1,
            "maximum": 40,
            "type": "integer",
            "description": "How many reviews are classified at the same time.",
            "default": 10
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}