{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store & Google Play Charts & Keyword Rank Tracker",
    "description": "App Store & Google Play top charts and keyword rankings in any of 122 countries: rank, rank change, 7/30-day history, rating and version per app. Plus ASO keyword ideas and chart reports. $1 per 1,000 rows, spending cap per run, MCP-ready.",
    "version": "1.0",
    "x-build-id": "lr9Vm8IDaduBdfQsA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/signalscope-data~app-charts-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-signalscope-data-app-charts-tracker",
        "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/signalscope-data~app-charts-tracker/runs": {
      "post": {
        "operationId": "runs-sync-signalscope-data-app-charts-tracker",
        "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/signalscope-data~app-charts-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-signalscope-data-app-charts-tracker",
        "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": [
          "countries"
        ],
        "properties": {
          "stores": {
            "title": "Stores",
            "type": "array",
            "description": "Which stores to track.",
            "items": {
              "type": "string",
              "enum": [
                "apple",
                "google"
              ],
              "enumTitles": [
                "Apple App Store",
                "Google Play"
              ]
            },
            "default": [
              "apple",
              "google"
            ]
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "2-letter country codes, e.g. \"us\", \"gb\", \"de\", \"jp\", \"br\". Each country is a separate chart. Use \"all\" for every App Store country (122, biggest markets first; Google Play 121). With \"trackApps\" you also get a RANK_MAP record: each app's rank in every country, best country and countries where it is not ranked.",
            "items": {
              "type": "string"
            }
          },
          "charts": {
            "title": "Charts",
            "type": "array",
            "description": "Chart types. iPad charts exist only on Apple and are skipped for Google Play.",
            "items": {
              "type": "string",
              "enum": [
                "top-free",
                "top-paid",
                "top-grossing",
                "top-free-ipad",
                "top-paid-ipad",
                "top-grossing-ipad"
              ],
              "enumTitles": [
                "Top free",
                "Top paid",
                "Top grossing",
                "Top free iPad (Apple only)",
                "Top paid iPad (Apple only)",
                "Top grossing iPad (Apple only)"
              ]
            },
            "default": [
              "top-free"
            ]
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "\"overall\" (all apps) or category names: books, business, developer-tools, education, entertainment, finance, food-drink, games, graphics-design, health-fitness, lifestyle, medical, music, navigation, news, photo-video, productivity, reference, shopping, social, sports, travel, utilities, weather, games-action, games-adventure, games-casual, games-board, games-card, games-casino, games-family, games-music, games-puzzle, games-racing, games-role-playing, games-simulation, games-sports, games-strategy, games-trivia, games-word. Store-specific IDs also work: \"apple:6014\", \"google:GAME_PUZZLE\".",
            "default": [
              "overall"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxRank": {
            "title": "Max rank",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many positions to collect per chart (Apple provides up to 100, Google Play up to 200).",
            "default": 100
          },
          "keywords": {
            "title": "Keywords (search rank tracking / ASO)",
            "type": "array",
            "description": "Track where apps rank in App Store and Google Play SEARCH results for these keywords (e.g. \"habit tracker\", \"vpn\"), per country. When set, the actor tracks keyword rankings instead of top charts (\"charts\" and \"categories\" are ignored). Apple: exact App Store order for the first ~12 results, then the iTunes Search API order up to 200. Google Play: the up-to-30 results the Play Store shows. Combine with \"trackApps\" to follow only your own apps and competitors.",
            "items": {
              "type": "string"
            }
          },
          "trackApps": {
            "title": "Track specific apps (optional)",
            "type": "array",
            "description": "Only output these apps: Apple numeric ID (\"284882215\" or \"id284882215\"), bundle / Google Play package ID (\"com.spotify.music\"), or part of the app name (\"Duolingo\"). Every chart/country where a tracked app is missing gets a 'not-ranked' row, so you see where your app (or a competitor) ranks across all countries in one table.",
            "items": {
              "type": "string"
            }
          },
          "suggestKeywordsFor": {
            "title": "Keyword discovery: seed terms (ASO research)",
            "type": "array",
            "description": "Short, generic seed words such as \"habit\", \"budget\" or \"meditation\". For each store and country the actor collects the store's search autocomplete suggestions for the seed (and seed + a…z) and outputs one row per suggested keyword with popularity (how few letters users type before the store suggests it, 1–100), difficulty (strength of the apps already ranking, 1–100), opportunity, the top 5 ranking apps and, with \"Track specific apps\", where your apps rank for it.",
            "items": {
              "type": "string"
            }
          },
          "expandAlphabet": {
            "title": "Expand seeds with a–z",
            "type": "boolean",
            "description": "Also query \"seed a\" … \"seed z\" (27 autocomplete lookups per seed) to find long-tail keywords. Turn off for a quick look at the top suggestions only.",
            "default": true
          },
          "maxSuggestions": {
            "title": "Max keywords per store & country",
            "minimum": 1,
            "maximum": 300,
            "type": "integer",
            "description": "How many discovered keywords to score and output per store × country (the most prominent suggestions first).",
            "default": 50
          },
          "measurePopularity": {
            "title": "Measure popularity",
            "type": "boolean",
            "description": "Probe shorter prefixes of every keyword to find after how many letters the store suggests it (the popularity score). Adds a few fast autocomplete lookups per keyword.",
            "default": true
          },
          "includeCompetition": {
            "title": "Measure difficulty (competition)",
            "type": "boolean",
            "description": "Run one store search per keyword and score the apps already ranking: top-10 title matches, average rating, median rating count (App Store) and a 1–100 difficulty score.",
            "default": true
          },
          "mode": {
            "title": "Output mode",
            "enum": [
              "all",
              "changes"
            ],
            "type": "string",
            "description": "'Full chart' outputs every position with previousRank/rankChange. 'Changes only' outputs just new entries, apps that moved at least 'Min rank change' places, and apps that dropped out. The first run of a monitor always outputs the full chart as a baseline.",
            "default": "all"
          },
          "minRankChange": {
            "title": "Min rank change",
            "minimum": 1,
            "type": "integer",
            "description": "Used in 'Changes only' mode: minimum number of places an app must move to be reported.",
            "default": 5
          },
          "includeDropped": {
            "title": "Report dropouts",
            "type": "boolean",
            "description": "Output a 'dropped' record for apps that were in the chart last run but are not any more.",
            "default": true
          },
          "stateKey": {
            "title": "Monitor name",
            "type": "string",
            "description": "The previous snapshot is stored under this name and used to compute rank changes. Use a different name for each separate schedule.",
            "default": "default"
          },
          "historyLength": {
            "title": "Rank history length (snapshots)",
            "minimum": 0,
            "maximum": 60,
            "type": "integer",
            "description": "How many past runs of this monitor (same stateKey) are kept per chart / keyword to build rank history. Every row then gets rankHistory (last 14 snapshots), rank7dAgo / rankChange7d, rank30dAgo / rankChange30d, averageRank7d, bestRank (+ date), isNewBestRank, snapshotsInChart, consecutiveSnapshotsInChart, enteredChartLast7d and trend (rising / falling / stable, from the last 6 snapshots). Schedule the Actor daily: 30 = one month of daily history. History starts with your first run (the stores do not publish past rankings). 0 = off.",
            "default": 30
          },
          "includeChartReport": {
            "title": "Include chart report (developers, global hits, local breakouts)",
            "type": "boolean",
            "description": "Also output one chart-report row per store × chart × category (or keyword) across all countries of the run (recordType = \"chart-report\"): which developers own the most chart slots (and top-10 slots), developer concentration (top-5 share), global hits (apps charting in the most countries, median rank, #1 countries), local breakouts (top 10 in only a few countries), the #1 app per country, genre mix (English genre names), paid share, in-app purchase / ads share (Google Play), median rating and rating count, app age and apps released in the last 90 / 365 days, and plain-English opportunity signals. With a previous run of the same stateKey it adds sinceLastRun: new entries, biggest climbers, new top-10 entries and rising apps. Also saved as the CHART_REPORT record.",
            "default": false
          },
          "chartReportOnly": {
            "title": "Chart report only",
            "type": "boolean",
            "description": "Output only the chart-report rows (no per-app chart rows). Each report is charged as one chart-report event; the chart entries read for it are not charged. Rank history and state are still updated, so a daily report-only schedule still gets sinceLastRun.",
            "default": false
          },
          "includeDescription": {
            "title": "Include app description",
            "type": "boolean",
            "description": "Add the store description/summary text to every record (makes the dataset larger).",
            "default": false
          },
          "language": {
            "title": "Google Play language",
            "type": "string",
            "description": "Language code for Google Play titles and descriptions, e.g. \"en\", \"de\", \"ja\".",
            "default": "en"
          },
          "includeDetails": {
            "title": "Include ratings & app details",
            "type": "boolean",
            "description": "Add rating, rating count, version, last update date and content rating (Apple, via the iTunes lookup API) plus installs, review count, in-app purchases and ads flags (Google Play). Turn off for the fastest runs.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}