{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store & Google Play Reviews Scraper, $0.10/1K",
    "description": "Scrape App Store and Google Play reviews in one run with one schema. Each row has rating, title, text, date, app version, thumbs-up and developer reply, for many apps and countries. Filter by date and rating, and add an optional per-app summary with a rating histogram and top keywords.",
    "version": "0.3",
    "x-build-id": "anNMZ8TXEFJU40Ght"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/zovo-one~app-store-google-play-reviews/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-zovo-one-app-store-google-play-reviews",
        "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/zovo-one~app-store-google-play-reviews/runs": {
      "post": {
        "operationId": "runs-sync-zovo-one-app-store-google-play-reviews",
        "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/zovo-one~app-store-google-play-reviews/run-sync": {
      "post": {
        "operationId": "run-sync-zovo-one-app-store-google-play-reviews",
        "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",
            "type": "array",
            "description": "Apps to read, one per line. Mix App Store and Google Play freely. App Store: app URL (https://apps.apple.com/us/app/name/id324684580), numeric id (324684580) or id324684580. Google Play: app URL (https://play.google.com/store/apps/details?id=com.spotify.music) or package name (com.spotify.music). App names are not accepted. Up to 200 apps per run.",
            "default": [
              "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
              "https://play.google.com/store/apps/details?id=com.spotify.music"
            ],
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "2-letter ISO country codes such as us, gb, de, fr, jp (up to 50). Leave empty to read each app in the country of its URL (apps.apple.com/de/... or play.google.com/...&gl=DE), or in \"us\" when the URL has no country. App Store reviews differ per country. Google Play mostly shows the same reviews in every country for one language; duplicates are removed and not charged, so add languages instead of countries for more Google Play reviews. \"uk\" is read as \"gb\". A country without an App Store storefront (e.g. \"aq\") is reported as \"no storefront\" for App Store apps.",
            "items": {
              "type": "string"
            }
          },
          "languages": {
            "title": "Languages (Google Play)",
            "type": "array",
            "description": "Google Play language codes such as en, de, fr, es, ja, pt-br, en-gb, es-419, zh-tw (up to 20). Each language is read separately, so more languages give more distinct Google Play reviews. Unknown codes such as \"zz\" are rejected, because Google Play would answer them with reviews in another language. The App Store ignores this field (its reviews are grouped by country), so App Store rows have lang = null.",
            "default": [
              "en"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app and country",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Maximum reviews saved for each app in each country (and each language on Google Play), 1 to 20,000. You pay $0.0001 per saved review, so 1,000 reviews cost $0.10. The App Store returns 20 reviews per request (about 1,000-3,000 per minute in our tests), so 20,000 App Store reviews take about 7-20 minutes per app and country: raise \"Timeout\" in the run options for big runs. If the timeout gets near, the run stops reading and still writes summaries and the OUTPUT report. With a rating filter, each task reads at most 10 x this value (never more than 20,000 reviews), so it can save fewer when the rating is rare; OUTPUT then shows readLimitReached.",
            "default": 100
          },
          "sort": {
            "title": "Sort",
            "enum": [
              "newest",
              "helpful"
            ],
            "type": "string",
            "description": "Newest first (best for monitoring and with \"Only reviews since\", because reading stops at that date) or most helpful first.",
            "default": "newest"
          },
          "sinceDate": {
            "title": "Only reviews since",
            "pattern": "^(|\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?(Z|[+-]\\d{2}:\\d{2}))?|\\d{1,5}\\s*([Dd][Aa][Yy]|[Ww][Ee][Ee][Kk]|[Mm][Oo][Nn][Tt][Hh]|[Yy][Ee][Aa][Rr])[Ss]?(\\s+[Aa][Gg][Oo])?)$",
            "type": "string",
            "description": "Only save reviews posted on or after this date. Use YYYY-MM-DD (UTC), a full ISO timestamp with time zone (2026-10-01T08:00:00Z) or a relative value such as \"7 days\", \"2 weeks\" or \"3 months\" (at most 5 digits). Leave empty for no date limit. With sort = newest, the run stops reading as soon as it passes this date. Both stores show new reviews 1-2 days late, so \"1 day\" usually returns nothing; for daily monitoring use \"3 days\" and drop already-seen reviewId values on your side."
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Only save reviews with at least this many stars (1-5). Set min = max = 1 to collect only 1-star reviews. The stores cannot filter by stars, so the run reads and drops other reviews: each task reads at most 10 x \"Max reviews per app and country\" (never more than 20,000). Dropped reviews are not charged.",
            "default": 1
          },
          "maxRating": {
            "title": "Maximum rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Only save reviews with at most this many stars (1-5). Set it to 2 to get only 1- and 2-star complaints.",
            "default": 5
          },
          "includeSummary": {
            "title": "Add a summary row per app",
            "type": "boolean",
            "description": "Adds one row per app with type = \"summary\": review count, average rating, rating histogram (1-5 stars), developer reply rate, oldest and newest review date, and the top 15 keywords of the saved reviews. Summary rows are free.",
            "default": false
          },
          "includeAuthor": {
            "title": "Include reviewer display name",
            "type": "boolean",
            "description": "Adds the reviewer's public display name in the author field. Off by default to keep personal data out of your dataset. Profile pictures and user ids are never collected.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 4,
            "type": "integer",
            "description": "How many app/country tasks run in parallel (1-4). Kept low to respect the stores' rate limits; the default of 3 is fine for most runs.",
            "default": 3
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}