{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store Top Charts & App Search API",
    "description": "App Store top charts by category and country — free, paid, grossing, new — as ranked rows. Plus Google Play category listings, and app search across both stores: title, developer, price, rating, installs, icon, store link. No API key, no login. Google Play top charts are not available.",
    "version": "0.1",
    "x-build-id": "gFnrD6vhjJ40mduiV"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/insight.solutions~app-charts-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-insight.solutions-app-charts-api",
        "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/insight.solutions~app-charts-api/runs": {
      "post": {
        "operationId": "runs-sync-insight.solutions-app-charts-api",
        "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/insight.solutions~app-charts-api/run-sync": {
      "post": {
        "operationId": "run-sync-insight.solutions-app-charts-api",
        "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": {
          "appleCharts": {
            "title": "App Store charts",
            "type": "array",
            "description": "One entry per chart, written as `country/chart` or `country/chart/genreId`. Charts: **`top-free`**, **`top-paid`**, **`top-grossing`**, **`new`**, **`new-free`**, **`new-paid`**. The country is a two-letter storefront code (`us`, `gb`, `de`, `jp`) — every storefront has its own chart. The optional third part is Apple's **numeric genre ID**: `6014` Games, `6013` Health & Fitness, `6016` Entertainment, `6007` Productivity, `6015` Finance, `7012` Games — Puzzle, `7017` Games — Strategy. Genre *names* are not accepted and an unknown genre ID is refused with a free diagnostic row: Apple answers an unknown genre with the **overall** chart and HTTP 200, so a typo would otherwise return the wrong chart and look right. Duplicates are read, and billed, once.",
            "items": {
              "type": "string"
            }
          },
          "chartSize": {
            "title": "Chart size",
            "minimum": 10,
            "maximum": 100,
            "type": "integer",
            "description": "How deep each App Store chart goes, 10 to 100. Apple's chart feeds stop at 100 ranks — both the modern feed (published at exactly 10, 25, 50 and 100; any other number is served from the next size up and trimmed) and the older feed used for grossing, new and per-genre charts, which ignores anything above 100. There is no top 200 any more (checked 2026-09-11).",
            "default": 50
          },
          "googleCategories": {
            "title": "Google Play categories",
            "type": "array",
            "description": "One entry per Google Play category page, written as `country/CATEGORY` — for example `us/HEALTH_AND_FITNESS`, `de/GAME_PUZZLE`, `gb/FINANCE`. You get **the apps Play shows on that category's page**: its carousels, deduplicated, ranked by where each app first appears. Categories are `ART_AND_DESIGN`, `BOOKS_AND_REFERENCE`, `BUSINESS`, `COMMUNICATION`, `DATING`, `EDUCATION`, `ENTERTAINMENT`, `FINANCE`, `FOOD_AND_DRINK`, `HEALTH_AND_FITNESS`, `LIFESTYLE`, `MAPS_AND_NAVIGATION`, `MEDICAL`, `MUSIC_AND_AUDIO`, `NEWS_AND_MAGAZINES`, `PERSONALIZATION`, `PHOTOGRAPHY`, `PRODUCTIVITY`, `SHOPPING`, `SOCIAL`, `SPORTS`, `TOOLS`, `TRAVEL_AND_LOCAL`, `VIDEO_PLAYERS`, `WEATHER` and the `GAME_*` family. **This is not a Google Play top-sellers chart** — Play no longer serves one publicly, and this Actor does not pretend otherwise.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Keywords to search the app stores for. Each query returns up to `maxResultsPerQuery` `app` rows per store in the store's own ranking order — which is the ranking an app store optimisation report is about. This is the input for \"every meditation app on both stores\", or for tracking where your app sits for a keyword week to week.",
            "items": {
              "type": "string"
            }
          },
          "stores": {
            "title": "Which stores to search",
            "type": "array",
            "description": "Which stores the **search queries** go to. It has no effect on `appleCharts` (App Store only) or `googleCategories` (Google Play only). Leave both selected to get one row per app per store, which is how you compare a keyword's results side by side.",
            "items": {
              "type": "string",
              "enum": [
                "apple",
                "google"
              ],
              "enumTitles": [
                "App Store (Apple)",
                "Google Play"
              ]
            },
            "default": [
              "apple",
              "google"
            ]
          },
          "maxResultsPerQuery": {
            "title": "Results per query",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many apps each search query returns per store. The App Store's own ceiling is 200 and asking for more does not get more. Google Play serves one page of results — around 20 to 30 apps, 22 on the capture this was built against — and there is no \"next page\" to ask for, so a larger number has no effect on the Play side.",
            "default": 25
          },
          "includeAppDetails": {
            "title": "Add full app details",
            "type": "boolean",
            "description": "Fill in the columns a chart or a listing does not carry: `description`, `screenshots`, `version`, `sizeBytes`, `minimumOs`, `contentRating`, and — on App Store charts — the star rating, rating count and price. **The two stores charge very different amounts of work for this.** Apple looks up 100 apps in one request, so an enriched Top 200 is two extra requests. Google Play has no such endpoint: every app is its own 1.2 MB page, so an enriched 50-app category listing is fifty extra requests and takes a few minutes. Off by default. It adds nothing to App Store *search* rows, which already carry every field Apple has.",
            "default": false
          },
          "country": {
            "title": "Country (storefront)",
            "type": "string",
            "description": "Two-letter ISO country code, lower case. It is the default for any `appleCharts` or `googleCategories` entry that does not name its own country, and it is the storefront every search query runs in. Both stores are per-country: catalogues, rankings, prices and currencies all differ, and an app published only in Germany is not in the `us` store at all.",
            "default": "us"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Two-letter language code for Google Play's `hl` parameter — it decides the language of the titles, descriptions and category names Play returns. It does not change which apps come back; `country` does that. Apple's endpoints are keyed on the storefront rather than on a language, so this has little effect on App Store rows.",
            "default": "en"
          },
          "maxConcurrency": {
            "title": "Jobs in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many charts, category pages or searches are read at once. Each parallel worker keeps its own proxy session, so one blocked page burns only its own exit IP. Google Play category pages are around 2 MB each, so raising this raises memory as well as speed.",
            "default": 3
          },
          "maxRunSecs": {
            "title": "Maximum run time (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "Wall-clock budget for the whole run. When it is reached the Actor stops fetching, keeps and bills for every row it already wrote, and files a free diagnostic row for each entry it never reached. A chart stopped part-way keeps its ranks. Nothing is charged for work that did not happen. Raise it when you turn on `includeAppDetails` for Google Play.",
            "default": 240
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apple's chart, search and lookup endpoints and Google Play's store pages all answered Apify's datacenter proxy in every capture this Actor was built against, so the default is datacenter — much cheaper than residential, and the proxy cost is already inside the per-row price. Switch to residential if you are reading many Play pages in one run and start seeing `blocked` rows. Sessions rotate automatically when an exit IP is refused.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}