iOS App Store chart rankings, app details, reviews, keywords and revenue estimates.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <API key>; create one at https://www.appstoretracker.com/account/api
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Add an app to your watchlist, and with a keyword_id also track that keyword for the app. A keyword is tracked only for an app on your watchlist. Needs an API key bound to an account.
App Store ID of the app to watch
Keyword uuid to track for the app (optional; from the keyword tools)
Two-letter storefront code (default: "us"); with keyword_id it must match the keyword's storefront
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Add an app to your watchlist, and with a keyword_id also track that keyword for the app. A keyword is tracked only for an app on your watchlist. Needs an API key bound to an account.
| Argument | Type | Description |
|---|---|---|
| app_id* | integer | App Store ID of the app to watch |
| keyword_id | string | Keyword uuid to track for the app (optional; from the keyword tools) |
| country_code | string | Two-letter storefront code (default: "us"); with keyword_id it must match the keyword's storefront |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "integer",
"description": "App Store ID of the app to watch"
},
"keyword_id": {
"type": "string",
"description": "Keyword uuid to track for the app (optional; from the keyword tools)"
},
"country_code": {
"type": "string",
"default": "us",
"description": "Two-letter storefront code (default: \"us\"); with keyword_id it must match the keyword's storefront"
}
}
}Get the ad creatives one iOS app is running, with the ad library each came from and how many that library holds for the app.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Ads per page (1-100, default: 30) |
| app_id* | integer | App Store ID (numeric ID from the app URL) |
| offset | integer | Ads to skip (default: 0) |
| platform | string | Narrow to one ad library |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"limit": {
"type": "integer",
"default": 30,
"maximum": 100,
"minimum": 1,
"description": "Ads per page (1-100, default: 30)"
},
"app_id": {
"type": "integer",
"description": "App Store ID (numeric ID from the app URL)"
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Ads to skip (default: 0)"
},
"platform": {
"enum": [
"meta",
"google",
"apple"
],
"type": "string",
"description": "Narrow to one ad library"
}
}
}Get the listing for one iOS app by app_id: name, developer, subtitle, description, version, price, languages, content rating, screenshot URLs, an AI-written short summary, plus the storefront's rating and rating count, its latest recorded chart position (and the one before it), and the latest revenue and downloads estimate. Use this for a single app's current snapshot; use get_ranking_history for positions over time, get_revenue_history for estimates over time and get_timeline for listing changes. Errors with 'App not found' when the id is not in our data. Get the id from search_apps.
| Argument | Type | Description |
|---|---|---|
| app_id* | integer | App Store ID (numeric ID from the app URL) |
| country | string | Two-letter country code (default: "us") |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "integer",
"description": "App Store ID (numeric ID from the app URL)"
},
"country": {
"type": "string",
"default": "us",
"description": "Two-letter country code (default: \"us\")"
}
}
}List every App Store category as a category_id and category_name pair (a fixed list, no arguments, no network call). Use it to find the category_id to pass to get_rankings; the overall chart is category_id 36.
No arguments.
{
"type": "object",
"properties": {}
}Get the keywords this API key's own account has asked us to track, with each keyword's next scheduled SERP sweep. Scoped to the caller, same as get_tracked_apps.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of keywords (1-200, default: 100) |
| app_id | integer | Only return keywords watched for this App Store ID (default: every app the account watches) |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 100,
"maximum": 200,
"minimum": 1,
"description": "Maximum number of keywords (1-200, default: 100)"
},
"app_id": {
"type": "integer",
"description": "Only return keywords watched for this App Store ID (default: every app the account watches)"
}
}
}Get the App Store search terms one iOS app is collected as ranking for, with its position and the day that position was observed.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum keywords (1-200, default: 50) |
| app_id* | integer | App Store ID (numeric ID from the app URL) |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"limit": {
"type": "integer",
"default": 50,
"maximum": 200,
"minimum": 1,
"description": "Maximum keywords (1-200, default: 50)"
},
"app_id": {
"type": "integer",
"description": "App Store ID (numeric ID from the app URL)"
}
}
}Get one app's top-free chart position per day in one storefront, as ranking_position and created_at points. The chart is the overall chart when the app has ever ranked there, otherwise the app's own category chart. Look back 1 to 3650 days (default 30). Use it for trends and for explaining a move; use get_rankings for a whole chart on one day. Top paid and top grossing history is not collected.
| Argument | Type | Description |
|---|---|---|
| days | integer | Number of days of history (1-3650, default: 30) |
| app_id* | integer | App Store ID of the app |
| country | string | Two-letter country code (default: "us") |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"days": {
"type": "integer",
"default": 30,
"maximum": 3650,
"minimum": 1,
"description": "Number of days of history (1-3650, default: 30)"
},
"app_id": {
"type": "integer",
"description": "App Store ID of the app"
},
"country": {
"type": "string",
"default": "us",
"description": "Two-letter country code (default: \"us\")"
}
}
}Get the App Store top free chart for a country, in chart order with #1 first: the overall chart by default, or one category via category_id (see get_categories). Each app comes with its position, previous position, name, developer, rating and revenue and download estimates, and the response gives the chart day it describes. Only top free is collected; top paid and top grossing are not. Use get_ranking_history for how one app's position moved over time.
| Argument | Type | Description |
|---|---|---|
| chart | string | Which chart. Only top_free is collected (top paid and top grossing are not, and return no items), so this is the default and the only option. |
| limit | integer | Maximum number of results (1-200, default: 100) |
| country | string | Two-letter country code (default: "us") |
| category_id | string | App Store category ID (default: "36", the overall chart; e.g. "6015" for Finance, "6014" for Games). get_categories lists them. |
{
"type": "object",
"properties": {
"chart": {
"enum": [
"top_free"
],
"type": "string",
"default": "top_free",
"description": "Which chart. Only top_free is collected (top paid and top grossing are not, and return no items), so this is the default and the only option."
},
"limit": {
"type": "integer",
"default": 100,
"maximum": 200,
"minimum": 1,
"description": "Maximum number of results (1-200, default: 100)"
},
"country": {
"type": "string",
"default": "us",
"description": "Two-letter country code (default: \"us\")"
},
"category_id": {
"type": "string",
"description": "App Store category ID (default: \"36\", the overall chart; e.g. \"6015\" for Finance, \"6014\" for Games). get_categories lists them."
}
}
}Get the worldwide monthly downloads and revenue estimates for one iOS app, one point per data month (dated its first day). Values are Sensor Tower buckets; downloadsFloor/revenueFloor mark the stored 1,000, which means "< 5K", not an exact figure.
| Argument | Type | Description |
|---|---|---|
| range | string | How far back to read |
| app_id* | integer | App Store ID (numeric ID from the app URL) |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"range": {
"enum": [
"30d",
"90d",
"1y",
"all"
],
"type": "string",
"default": "all",
"description": "How far back to read"
},
"app_id": {
"type": "integer",
"description": "App Store ID (numeric ID from the app URL)"
}
}
}Get the most recent user reviews we have stored for one iOS app, newest first: title, text, star rating (rating), author, app version reviewed and date. Takes no country argument. Use it to read what users say; use get_app_details for the overall rating and rating count. Returns an empty list when we hold no reviews for the app.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of reviews (1-50, default: 10) |
| app_id* | integer | App Store ID of the app |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Maximum number of reviews (1-50, default: 10)"
},
"app_id": {
"type": "integer",
"description": "App Store ID of the app"
}
}
}Find apps similar in meaning to one app, using embedding similarity over their listings (limited to the given storefront). Each result has rating, rating count, revenue and downloads estimates and a distance (lower means closer). Results are sorted by downloads estimate, biggest first, not by distance. Use it to build a competitor list; use search_apps to look up an app by name instead.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of similar apps (1-50, default: 12) |
| app_id* | integer | App Store ID of the reference app |
| country | string | Two-letter country code (default: "us") |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"limit": {
"type": "integer",
"default": 12,
"maximum": 50,
"minimum": 1,
"description": "Maximum number of similar apps (1-50, default: 12)"
},
"app_id": {
"type": "integer",
"description": "App Store ID of the reference app"
},
"country": {
"type": "string",
"default": "us",
"description": "Two-letter country code (default: \"us\")"
}
}
}Get every recorded change to one iOS app listing: version, name, subtitle, price, screenshots and description, newest first, with the day each change was first seen.
| Argument | Type | Description |
|---|---|---|
| app_id* | integer | App Store ID (numeric ID from the app URL) |
| country | string | Two-letter country code (default: "us") |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "integer",
"description": "App Store ID (numeric ID from the app URL)"
},
"country": {
"type": "string",
"default": "us",
"description": "Two-letter country code (default: \"us\")"
}
}
}Get the apps this API key's own account is monitoring, newest first. Scoped to the caller: a key bound to another account sees a different set, and a key bound to no account is refused.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of tracked apps (1-1000, default: 200) |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 200,
"maximum": 1000,
"minimum": 1,
"description": "Maximum number of tracked apps (1-1000, default: 200)"
}
}
}Find iOS apps by name or keyword, using Apple's iTunes Search API at call time (a text search over Apple's catalogue, not our own data). Returns app_store_id, name, developer, category id, rating, rating count and price for each match. Call this first to turn an app name into the app_store_id (the 'app_id' argument) that every per-app tool needs.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of results (1-50, default: 25) |
| query* | string | Search query (e.g., "fitness tracker", "photo editor") |
| country | string | Two-letter country code (default: "us") |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 25,
"maximum": 50,
"minimum": 1,
"description": "Maximum number of results (1-50, default: 25)"
},
"query": {
"type": "string",
"description": "Search query (e.g., \"fitness tracker\", \"photo editor\")"
},
"country": {
"type": "string",
"default": "us",
"description": "Two-letter country code (default: \"us\")"
}
}
}Search real iPhone app screens that App Store Tracker captured itself (the library at /designs) by describing what you want to see, e.g. "paywall with a free trial toggle and the yearly plan preselected", "onboarding that asks for the user's goals", "notification permission pre-prompt". Describe one screen in plain words; narrow with pattern or app_id rather than with negations or keyword lists. Ranked by meaning, with exact on-screen words counting extra, and at most per_app screens per app. Each item gives the app_id for every per-app tool, the flow and screen it belongs to, a short summary, the image URL and the App Store Tracker page to cite. Covers only the apps we captured, not the whole App Store; an empty list means none of those matched.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Screens per page (1-20, default: 8) |
| query* | string | What the screen shows, in plain language (at most 300 characters) |
| app_id | integer | Only this app's screens (App Store ID, from search_apps) |
| offset | integer | Screens to skip, for the next page (use next_offset; at most 100) |
| pattern | string | Only screens of this kind (default: any) |
| per_app | integer | Most screens from one app (1-5, default: 2; ignored with app_id) |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 8,
"maximum": 20,
"minimum": 1,
"description": "Screens per page (1-20, default: 8)"
},
"query": {
"type": "string",
"description": "What the screen shows, in plain language (at most 300 characters)"
},
"app_id": {
"type": "integer",
"description": "Only this app's screens (App Store ID, from search_apps)"
},
"offset": {
"type": "integer",
"default": 0,
"maximum": 100,
"minimum": 0,
"description": "Screens to skip, for the next page (use next_offset; at most 100)"
},
"pattern": {
"enum": [
"onboarding",
"paywall",
"sign_up",
"login",
"permission_dialog",
"home_feed",
"discover",
"search",
"content_list",
"content_detail",
"media_player",
"profile",
"settings",
"modal_sheet",
"empty_state",
"mood_checkin",
"other"
],
"type": "string",
"description": "Only screens of this kind (default: any)"
},
"per_app": {
"type": "integer",
"default": 2,
"maximum": 5,
"minimum": 1,
"description": "Most screens from one app (1-5, default: 2; ignored with app_id)"
}
}
}