{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store & Google Play Reviews Scraper – New Only + Alerts",
    "description": "App Store & Google Play reviews scraper for your apps and competitors. Only new reviews each run, low-rating alerts, complaint topics, rating & version tracking, developer reply rate and an HTML report.",
    "version": "1.0",
    "x-build-id": "MSPBydU30s8PbX0xc"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kirozhang~app-review-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kirozhang-app-review-monitor",
        "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/kirozhang~app-review-monitor/runs": {
      "post": {
        "operationId": "runs-sync-kirozhang-app-review-monitor",
        "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/kirozhang~app-review-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-kirozhang-app-review-monitor",
        "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": [
          "myApps"
        ],
        "properties": {
          "myApps": {
            "title": "Your apps",
            "type": "array",
            "description": "Required. One app per line: an App Store or Google Play URL, an App Store id (id1232780281) or an Android package name (notion.id). These apps get alerts.",
            "items": {
              "type": "string"
            }
          },
          "competitorApps": {
            "title": "Competitor apps",
            "type": "array",
            "description": "Optional. Competitor apps in the same formats, tracked side by side for benchmarking.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "App Store reviews and ratings are per country. Google Play reviews are per language, so Play apps are checked once (store data from the first country).",
            "items": {
              "type": "string",
              "enum": [
                "us",
                "gb",
                "ca",
                "au",
                "ie",
                "nz",
                "in",
                "de",
                "fr",
                "es",
                "it",
                "nl",
                "se",
                "pl",
                "br",
                "mx",
                "ar",
                "jp",
                "kr",
                "sg",
                "id",
                "ph",
                "tr",
                "ae",
                "sa",
                "za"
              ],
              "enumTitles": [
                "United States",
                "United Kingdom",
                "Canada",
                "Australia",
                "Ireland",
                "New Zealand",
                "India",
                "Germany",
                "France",
                "Spain",
                "Italy",
                "Netherlands",
                "Sweden",
                "Poland",
                "Brazil",
                "Mexico",
                "Argentina",
                "Japan",
                "South Korea",
                "Singapore",
                "Indonesia",
                "Philippines",
                "Turkey",
                "UAE",
                "Saudi Arabia",
                "South Africa"
              ]
            },
            "default": [
              "us"
            ]
          },
          "language": {
            "title": "Language (Google Play)",
            "enum": [
              "en",
              "de",
              "fr",
              "es",
              "it",
              "nl",
              "pt",
              "ja",
              "ko",
              "id",
              "tr",
              "pl",
              "sv",
              "ar",
              "hi"
            ],
            "type": "string",
            "description": "Google Play returns reviews written in this language.",
            "default": "en"
          },
          "trackingId": {
            "title": "Tracking name",
            "type": "string",
            "description": "Stable name for this group of apps, e.g. one per product ('notion-us'). Runs with the same name share history, so only reviews you have not received yet are returned and charged."
          },
          "alertMaxRating": {
            "title": "Alert on reviews rated at most",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Reviews with this many stars or fewer are flagged as alerts (isAlert = true).",
            "default": 2
          },
          "maxReviewsFirstRun": {
            "title": "Reviews to backfill on the first run",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "How many of the newest reviews per app and country to save on the first run (baseline). Each saved review is one 'review' charge.",
            "default": 100
          },
          "maxReviewsPerRun": {
            "title": "Max new reviews per app per run",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Safety cap for very popular apps.",
            "default": 2000
          },
          "includeReviewText": {
            "title": "Include review text",
            "type": "boolean",
            "description": "Store the full review text.",
            "default": true
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL",
            "type": "string",
            "description": "Optional. A Slack <a href=\"https://api.slack.com/messaging/webhooks\" target=\"_blank\">Incoming Webhook</a> URL (https://hooks.slack.com/services/…). After a run you get one summary message in that channel. Stored encrypted."
          },
          "webhookUrl": {
            "title": "Webhook URL (JSON)",
            "type": "string",
            "description": "Optional. Any https endpoint (Make, Zapier, n8n, a Microsoft Teams workflow or your own server). Receives one JSON POST per run with counts, items and the report link. Stored encrypted."
          },
          "notifyOn": {
            "title": "Send a notification when",
            "enum": [
              "alerts",
              "new",
              "always"
            ],
            "type": "string",
            "description": "When the Slack / webhook message is sent.",
            "default": "alerts"
          },
          "alertKeywords": {
            "title": "Alert keywords",
            "type": "array",
            "description": "Optional. A review that mentions any of these words or phrases is flagged as an alert whatever its rating, e.g. <code>refund</code>, <code>food poisoning</code>, <code>lawyer</code> or a staff member's name. Case- and accent-insensitive.",
            "items": {
              "type": "string"
            }
          },
          "customTopics": {
            "title": "Custom topics",
            "type": "array",
            "description": "Optional. One topic per line: <code>Topic name: word, phrase, word</code>, e.g. <code>Parking: parking, car park, valet</code>. Matching reviews get the topic in <code>customTopics</code> and the report counts them. Built-in topics stay as they are.",
            "items": {
              "type": "string"
            }
          },
          "unansweredAlertHours": {
            "title": "Remind me about unanswered alerts after (hours)",
            "minimum": 0,
            "maximum": 336,
            "type": "integer",
            "description": "Optional (empty or 0 = off; 48 is a good start). Alert reviews are re-checked on later runs; if the business has not replied after this many hours you get one reminder in the Slack / webhook message, and the report shows the alert reply rate and median time to reply. Re-checked reviews are not charged again."
          },
          "publicReport": {
            "title": "Shareable report link",
            "type": "boolean",
            "description": "Off by default. When on, the HTML report with 7- and 30-day trends is kept at one fixed link per Tracking name (shown in OUTPUT.reportUrl and in notifications) – send it to a client or your team. Anyone with the link can open it; reviewer names are never included.",
            "default": 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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}