{
  "openapi": "3.0.1",
  "info": {
    "title": "Competitor App Reviews Analysis Scraper - Compare Apps",
    "description": "Put several competing apps side by side: reviews from both stores for every app on your list in one dataset with identical columns, plus one profile row per app with average rating, star histogram, installs and current version. Filter to 1-3 stars to read what users leave a rival over.",
    "version": "1.0",
    "x-build-id": "9Hb9iCXNmRsbg59wm"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/vonsensey~competitor-app-reviews-analysis-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-vonsensey-competitor-app-reviews-analysis-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/vonsensey~competitor-app-reviews-analysis-scraper/runs": {
      "post": {
        "operationId": "runs-sync-vonsensey-competitor-app-reviews-analysis-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/vonsensey~competitor-app-reviews-analysis-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-vonsensey-competitor-app-reviews-analysis-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",
            "type": "array",
            "description": "One app per line, from either store: an App Store URL (https://apps.apple.com/us/app/whatsapp-messenger/id310633997), a Google Play URL (https://play.google.com/store/apps/details?id=com.whatsapp), a bare Apple app id (310633997) or a bare Android package name (com.whatsapp). Mix both stores freely. An app that cannot be found comes back as a free error row instead of failing the run.",
            "default": [
              "https://apps.apple.com/us/app/whatsapp-messenger/id310633997",
              "https://play.google.com/store/apps/details?id=com.whatsapp",
              "https://apps.apple.com/us/app/telegram-messenger/id686449807",
              "https://play.google.com/store/apps/details?id=org.telegram.messenger",
              "https://apps.apple.com/us/app/signal-private-messenger/id874139669",
              "https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms"
            ],
            "items": {
              "type": "string"
            }
          },
          "stores": {
            "title": "Stores",
            "enum": [
              "both",
              "app-store",
              "google-play"
            ],
            "type": "string",
            "description": "Collect from both stores, or only one. Apps from a store that is switched off are reported as a free row and never charged.",
            "default": "both"
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many reviews for each app, across all its storefronts and languages. Set 0 for everything this Actor can reach: on the App Store it reads the newest-first feed in both sort orders and then the store's deep catalog, which goes well past the 500-per-storefront limit other tools stop at. Every run reports exactly what it reached and what it could not.",
            "default": 300
          },
          "maxReviews": {
            "title": "Max reviews in total",
            "minimum": 0,
            "type": "integer",
            "description": "Hard ceiling across every app in the run. 0 means no overall limit.",
            "default": 0
          },
          "countries": {
            "title": "App Store storefronts",
            "type": "array",
            "description": "Two-letter storefront codes such as us, gb, de, jp — App Store reviews are published per storefront, and the same app has a completely different set in each one. Enter all to read every one of the 175 storefronts in a single run and get one merged, deduplicated dataset. For Google Play this only chooses which country's rating snapshot goes on the app profile; Play reviews are split by language, not country.",
            "default": [
              "us"
            ],
            "items": {
              "type": "string"
            }
          },
          "languages": {
            "title": "Google Play languages",
            "type": "array",
            "description": "Two-letter language codes such as en, de, es, pt. Google Play serves a separate set of reviews for each language — en, de and es for the same app share no reviews at all — so add every language you want covered. Leave it at en for English only.",
            "default": [
              "en"
            ],
            "items": {
              "type": "string"
            }
          },
          "appStoreSource": {
            "title": "App Store depth",
            "enum": [
              "both",
              "feed",
              "catalog"
            ],
            "type": "string",
            "description": "Feed then catalog reads the newest-first feed (fast, 500 per storefront and sort order, carries the app version) and continues into the store's deep catalog only where the feed hit its ceiling. Feed only stops at the feed. Catalog only reads the deep catalog alone — it is the only source that carries developer replies, and it is what a replied-only run uses.",
            "default": "both"
          },
          "includeAppProfile": {
            "title": "Include the app profile",
            "type": "boolean",
            "description": "Add one app intelligence row per app: average rating and rating count, the 1-to-5 star histogram and install counts where the store publishes them, developer name and the developer's published email, website, address and phone, category, price, current version and release notes, release and last-update dates, content rating, minimum OS and size. Turn it off and it is never charged.",
            "default": true
          },
          "appProfilesOnly": {
            "title": "App profiles only, no reviews",
            "type": "boolean",
            "description": "Return just the app intelligence row for each app and skip the reviews entirely — rating, histogram, installs, developer contact details, version. One or two requests per app and no review charges.",
            "default": false
          },
          "ratings": {
            "title": "Star ratings",
            "type": "array",
            "description": "Only return reviews with these star ratings. Leave empty for all of them. On Google Play the store applies this itself, so a 1-star pull never reads the 5-star reviews at all.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ]
            },
            "default": []
          },
          "sort": {
            "title": "Order reviews by",
            "enum": [
              "newest",
              "most-helpful",
              "rating"
            ],
            "type": "string",
            "description": "Newest first is what a monitor wants and is what lets a date bound stop the run early. Most helpful surfaces the reviews other users voted up. By rating is a Google Play order only; the App Store feed falls back to newest first.",
            "default": "newest"
          },
          "reviewsSince": {
            "title": "Only reviews published since",
            "type": "string",
            "description": "A date such as 2026-01-31. Older reviews are skipped and never charged, and on a newest-first run the Actor stops paging as soon as it gets past the date. Ideal on a schedule."
          },
          "publishedBefore": {
            "title": "Only reviews published before",
            "type": "string",
            "description": "Upper bound on the publication date, for a fixed historical window."
          },
          "appVersions": {
            "title": "App versions",
            "type": "array",
            "description": "Only reviews written on these app versions, exactly as the store shows them, for example 4.2.1. Useful for \"what broke in the last release\". Not every review carries a version; those are skipped by this filter.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "searchTerm": {
            "title": "Keyword",
            "type": "string",
            "description": "Only keep reviews whose title or text contains this word, for example crash, refund or login. Reviews without it are never charged."
          },
          "onlyWithReplies": {
            "title": "Only reviews the developer replied to",
            "type": "boolean",
            "description": "Keep only reviews that carry a developer reply. On the App Store this switches to the catalog feed, the only one that publishes replies.",
            "default": false
          },
          "onlyNewSinceLastRun": {
            "title": "Only reviews I have not had before",
            "type": "boolean",
            "description": "Remember which reviews were already delivered and skip them next time, so a daily or weekly schedule only ever charges for genuinely new feedback. Needs a tracking label below.",
            "default": false
          },
          "stateLabel": {
            "title": "Tracking label",
            "type": "string",
            "description": "A name for this watch list, for example our-apps. Reuse exactly the same label on every run so the Actor knows which history to compare against. A different label is a separate, independent memory."
          },
          "maxCostUsd": {
            "title": "Stop after this much (USD)",
            "minimum": 0,
            "type": "integer",
            "description": "A hard spending ceiling for this run. The run stops delivering once it would exceed it. Leave empty for no ceiling."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Leave this off. Both stores publish their reviews openly and are read directly from Apify's own network. Only change it if you have a specific reason.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}