{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play & App Store Reviews | AppReview Radar",
    "description": "Track new-to-baseline and edited Google Play/App Store reviews. Filter ratings, app versions and visible replies before billing. Export CSV and feedback reports with keyword evidence; skip unchanged reviews using a supplied snapshot.",
    "version": "0.2",
    "x-build-id": "EPkad7qI6DSNhl4jF"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/reliable_quatrain~google-play-app-store-review-radar/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-reliable_quatrain-google-play-app-store-review-radar",
        "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/reliable_quatrain~google-play-app-store-review-radar/runs": {
      "post": {
        "operationId": "runs-sync-reliable_quatrain-google-play-app-store-review-radar",
        "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/reliable_quatrain~google-play-app-store-review-radar/run-sync": {
      "post": {
        "operationId": "run-sync-reliable_quatrain-google-play-app-store-review-radar",
        "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": {
          "appPreset": {
            "title": "Demo app (optional)",
            "enum": [
              "none",
              "chatgpt"
            ],
            "type": "string",
            "description": "ChatGPT selects its Android and iOS app IDs as a demo, not a customer or endorsement. Custom app IDs are added before the preset. Choose Custom only to use your own apps.",
            "default": "none"
          },
          "googlePlayApps": {
            "title": "Google Play apps",
            "type": "array",
            "description": "Android package IDs such as com.openai.chatgpt or HTTPS play.google.com/store/apps/details?id=... URLs. Up to 10 apps across both stores and the selected demo.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "appStoreApps": {
            "title": "Apple App Store apps",
            "type": "array",
            "description": "Numeric Apple IDs such as 6448311069 or HTTPS apps.apple.com/.../id... URLs. Reads a limited public feed; no promise of full review history.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "Requested storefront country",
            "pattern": "^[a-zA-Z]{2}$",
            "type": "string",
            "description": "Two-letter store code, e.g. us, gb or vn. This is request context, not the reviewer's country of residence. Results may vary by storefront.",
            "default": "us"
          },
          "language": {
            "title": "Google Play language hint",
            "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z]{2})?$",
            "type": "string",
            "description": "Language code such as en or vi. Google Play request hint only; no guaranteed language filtering. Does not change Apple's public storefront feed.",
            "default": "en"
          },
          "maxReviews": {
            "title": "Maximum saved matching reviews",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Global cap after filters and known-ID skips; also bounded by the run spending limit. Source data can yield fewer or zero matching reviews.",
            "default": 100
          },
          "maxReviewsPerApp": {
            "title": "Maximum saved reviews per app",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Per app/store cap after filtering. Apps are processed in input order; a low global cap can skip later apps.",
            "default": 100
          },
          "maxPagesPerApp": {
            "title": "Maximum source pages per app",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Bounds scans even if filters reject most reviews. Public feeds are partial; max 10 pages is not a guarantee of 500/1000 reviews or complete history.",
            "default": 3
          },
          "minRating": {
            "title": "Minimum star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Inclusive 1-5 star filter applied before saving and charging.",
            "default": 1
          },
          "maxRating": {
            "title": "Maximum star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Inclusive 1-5 star filter. Choose 3 for a low-rating shortlist; a rating does not prove a particular problem or sentiment.",
            "default": 5
          },
          "appVersionKeywords": {
            "title": "App version contains any value",
            "type": "array",
            "description": "Optional case-insensitive substring OR matching against the version exposed by each review. Unknown versions are excluded when set; no release date is inferred. Up to 30 values.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "replyFilter": {
            "title": "Visible developer reply",
            "enum": [
              "all",
              "with-reply",
              "without-visible-reply"
            ],
            "type": "string",
            "description": "Google Play can expose replies. Apple RSS reply status is unavailable, so Apple reviews are excluded by either reply-specific filter. Not shown means no reply in this public feed, not proof of no reply elsewhere.",
            "default": "all"
          },
          "includeKeywords": {
            "title": "Review contains any keyword",
            "type": "array",
            "description": "Case-insensitive substring OR matching across review title and text. Empty means unrestricted. Up to 30 terms; combined with other filters using AND.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude review containing any keyword",
            "type": "array",
            "description": "Case-insensitive substring OR exclusions. Up to 30 terms. Applied before saving/charging.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "topicFilters": {
            "title": "Require any keyword topic (optional)",
            "type": "array",
            "description": "Allowed labels: stability, performance, billing, login, ads, privacy, feature-request. Matches literal English/Vietnamese terms, not AI intent. Praise and negations can match. Empty means any topic; see each row's evidence.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "featureRequestsOnly": {
            "title": "Require an explicit feature-request phrase",
            "type": "boolean",
            "description": "Requires a configured phrase such as 'please add', 'I wish' or 'vui lòng thêm'. This is a keyword heuristic, not proof of demand or intended meaning. English/Vietnamese phrases only.",
            "default": false
          },
          "reviewedAfter": {
            "title": "Reviewed on or after (optional)",
            "type": "string",
            "description": "Inclusive ISO date/timestamp. Reviews with unknown dates are excluded when set. Dates may reflect edits; this is not guaranteed original publication.",
            "default": ""
          },
          "knownReviewIds": {
            "title": "Previously saved review keys",
            "type": "array",
            "description": "Paste the KNOWN_REVIEW_IDS array from a previous run to skip those keys before saving/billing. Same-ID edited reviews are also skipped. Up to 10,000 keys; callers must transfer the returned state explicitly.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "previousSnapshot": {
            "title": "Previous review fingerprint snapshot",
            "type": "object",
            "description": "Paste SNAPSHOT from a prior run to identify NEW/UPDATED/UNCHANGED reviews. Must match country/language. Bounded to 10,000 review hashes and 2 MiB UTF-8; oldest saved entries are evicted with snapshotTruncated=true if needed. Only saved rows advance state; absent reviews are never marked deleted. Keep knownReviewIds empty to allow same-ID edits to be checked.",
            "default": {}
          },
          "changedOnly": {
            "title": "Save only reviews new to snapshot or updated",
            "type": "boolean",
            "description": "With previousSnapshot, skip unchanged reviews before saving and review-saved billing. NEW means absent from this supplied baseline, not newly posted. Text/rating/version/reply changes within exposed fields are detected; votes, dates and observation time alone are not edits. Schedules must explicitly pass SNAPSHOT to the next run.",
            "default": false
          },
          "timeoutSeconds": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 45,
            "type": "integer",
            "description": "Verified HTTPS requests with no redirect following. At most one retry for transient network/5xx errors; access denials and rate limits stop that source.",
            "default": 20
          },
          "minDelaySeconds": {
            "title": "Minimum pause per host (seconds)",
            "minimum": 0.25,
            "maximum": 10,
            "type": "number",
            "description": "Sequential paced requests, bounded by 60 HTTP attempts and a 180-second source-processing deadline per run. No proxies or login bypass.",
            "default": 0.5
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}