Server definition
- Hash
- sha256:aaade044be4458d5e51235054289d3721e2712ffcb546255f9029e7b3756ed03
- What it is
- What a remote MCP server returned when asked what it offers: 15 tools
The blob, as servednamed by its sha256
{
"instructions": "# ASO research with AppSkyline\n\nThis guide drives the AppSkyline MCP connector. Every tool below is provided by\nthat connector, so the user must have connected AppSkyline and be signed in to\nan account with access to at least one tracked app. If a tool call fails with an\nauthorization error, tell the user to connect AppSkyline rather than retrying.\n\n## Interactive workspace\n\nUse `open_appskyline` with no arguments when the user wants to open the product\nand browse visually. It is a read-only sidebar entrypoint with up to 100 items,\nusing the same tenant authorization as the other tools. Selection shares bounded\nentity context with the host; subsequent writes still require their normal approval.\n\n## Stores\n\nFour stores are supported everywhere a `store` parameter appears. Use these\nexact values:\n\n`ios-app-store` · `macos-app-store` · `google-play` · `microsoft-store`\n\nAn app only has data for the stores it is registered on. When a tool returns\n`store-not-configured`, the app has no id set for that store — say so and move\non rather than retrying with different parameters.\n\n## Identifiers: two different things\n\nGetting these confused is the most common source of empty results.\n\n- **`appId`** is the AppSkyline app id (a uuid). Every tool that reads _your_\n data takes this: `get_app`, `list_keywords`, `get_keyword_rank`,\n `get_keyword_history`, `get_store_metadata`, `get_app_engagement_summary`,\n `list_google_play_reviews`, `add_keyword`.\n- **`storeId`** is the store-native identifier: a numeric Apple id, a Google\n Play package name like `com.example.app`, or a Microsoft Store product id\n like `9wXXXXXXXX`. Only `get_store_listing` takes this, because it reads\n public listings for apps that need not be tracked in AppSkyline at all.\n\nStart from `list_apps` when you do not yet have an `appId`. It returns each\napp's id, name, default locale, and per-store ids.\n\n## Available tools\n\nReading your own data:\n\n| Tool | Use it when someone asks… |\n| ---------------------------- | ----------------------------------------------------------------------------------------- |\n| `list_apps` | which apps they track; also resolves the app id the other tools need |\n| `get_app` | about one app's store ids, locales and timestamps |\n| `list_keywords` | which keywords they track: id, term, language, country, bid |\n| `get_keyword_rank` | where their app ranks right now for one term in one store and country |\n| `get_keyword_history` | how that rank changed over time, one row per stored search snapshot |\n| `get_store_metadata` | to audit their synced listing text per locale, or whether the latest version is in review |\n| `get_app_engagement_summary` | how many downloads, installs, uninstalls or crashes over a period, plus top countries |\n| `list_google_play_reviews` | what Google Play users said in the last 7 days: stars, text, version, reply state |\n| `show_app_overview` | for a one-card overview of one app, its stores and up to 50 tracked keywords |\n\nReading public or shared data:\n\n| Tool | Use it when someone asks… |\n| ---------------------- | -------------------------------------------------------------------------------- |\n| `search_store_results` | which apps rank for a term right now — the competitive field |\n| `get_keyword_overview` | how popular terms are: Google web-search volume, difficulty, CPC, up to 50 terms |\n| `get_store_listing` | about any app's public listing by store-native id — competitor research |\n\nWriting:\n\n| Tool | Use it when someone asks… |\n| ---------------- | ---------------------------------------------------------------- |\n| `add_keyword` | to start tracking a term, with a country. Non-idempotent — below |\n| `delete_keyword` | to stop tracking a term, by keyword id. Idempotent |\n\n## Batch `get_keyword_overview`; never loop it\n\nThis tool accepts up to 50 terms per call and is the one place where careless\nusage costs real money. Terms missing or stale in AppSkyline's shared cache\ntrigger a live billable upstream lookup. Calling it once per keyword turns one\ncheap request into dozens of billable ones.\n\nAlways collect the full candidate list first, then make a single call per\ncountry. Note that `country` is required here and must be exactly two letters,\nunlike most other tools where it is optional.\n\nThe volume is Google web-search demand in that country: a proxy for interest\nin a term, not a count of App Store, Google Play or Microsoft Store searches.\nSay so when you report it.\n\n## Writes need the user's intent, not just their question\n\n`add_keyword` and `delete_keyword` change the user's tracked set.\n\n`add_keyword` is **not idempotent** — adding the same term twice creates two\nrows. Before adding, call `list_keywords` and check the term is not already\ntracked for that language and country. Pass a `country` with every new\nkeyword: the weekly rank check skips keywords that have none. When adding\nseveral keywords, show the list and get agreement first; do not infer a batch\nadd from a research question.\n\n`delete_keyword` stops future snapshots but leaves historical search data\nintact, so it is recoverable in the sense that past rows survive — but the\ntracking gap it creates is not backfillable. Confirm before deleting, and use\n`list_keywords` to map a term the user named to its keyword id rather than\nguessing.\n\n## Reading rank results correctly\n\n`get_keyword_rank` returns a `status` that must drive your wording:\n\n- `ranked` — the app appears; `rank` is its position and `resultsScanned` is how\n deep the scan went. \"#6 of 10 scanned\" is honest; \"#6\" alone implies a\n ranking universe that was not measured.\n- `not-ranked` — the app is genuinely absent from the scanned window. Say \"not\n in the top N\", not \"rank unknown\". Widening `num` (up to 200) can find an app\n ranked deeper.\n- `app-not-found` — the `appId` is wrong. Re-check with `list_apps`.\n- `store-not-configured` — the app has no id for that store.\n\nA single rank is a point sample of a noisy series. Before calling a change a\nregression or a win, pull `get_keyword_history` for the same term and country\nand look at the trend. Ranks move on their own day to day. History has one row\nper stored search snapshot: tracked keywords are re-checked weekly, plus any\nday the term was searched in AppSkyline, so gaps between rows are normal.\n\n## A standard ASO report\n\nWhen asked for an ASO report on an app, work in this order:\n\n1. `list_apps` → resolve the app and see which stores it is registered on.\n2. `list_keywords` → the tracked set, which is the report's spine.\n3. `get_keyword_rank` per important term and market, for the stores that are\n configured. Prefer the markets the user cares about over an exhaustive sweep.\n4. `get_keyword_history` for terms whose current rank looks notably good or bad,\n to separate a real move from daily noise.\n5. `get_keyword_overview` — **one batched call** per country over every term\n from steps 2–4 plus any candidates you are considering, to learn which terms\n are worth the effort at all.\n6. `get_store_metadata` → audit titles, subtitles and the keyword field per\n locale. On Apple, check the reported character count against the\n 100-character limit; unused characters there are wasted ranking surface.\n7. `search_store_results` on the top few terms → who actually occupies the\n results, and `get_store_listing` on any competitor worth understanding.\n\nThen report: where the app stands, which terms have volume the app is not\ncompetitive on, which metadata fields are underused, and what you would change.\nRank without volume is vanity — a #1 for a term nobody searches is not a win,\nand `get_keyword_overview` is what tells you the difference.\n\n## Interactive cards\n\n`get_keyword_rank` renders an interactive rank card, and the connector also\nprovides an app-overview card, in hosts that support MCP Apps. When a card\nrenders, do not restate its full contents in prose. Add what the card cannot\nshow: the trend behind the number, and what to do about it.\n",
"tools": [
{
"description": "Use this when someone asks to start tracking a keyword for their app in a given language and country. Returns the new keyword; adding the same term twice creates two rows. Keywords without a country are skipped by the weekly rank check. Not for a one-off rank lookup.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appId": {
"description": "AppSkyline app id (uuid)",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"country": {
"description": "Two-letter store country code such as US; without one the weekly rank check skips this keyword",
"maxLength": 10,
"type": "string"
},
"language": {
"description": "Two-letter language code such as en",
"maxLength": 32,
"type": "string"
},
"searchTerms": {
"description": "Keyword phrase to track, as users type it in the store, 1 to 200 characters",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"appId",
"searchTerms"
],
"type": "object"
},
"name": "add_keyword",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"keyword": {
"additionalProperties": false,
"properties": {
"appId": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"country": {
"anyOf": [
{
"maxLength": 10,
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"language": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"term": {
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"appId",
"term",
"language",
"country"
],
"type": "object"
},
"status": {
"const": "added",
"type": "string"
}
},
"required": [
"status",
"keyword"
],
"type": "object"
}
},
{
"description": "Use this when someone asks to stop tracking one of their keywords. Returns deleted, or not-found for an unknown id or one outside the account. Weekly rank checks stop and past snapshots stay, leaving a gap if it is tracked again later. Not for pausing tracking temporarily.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"id": {
"description": "Keyword id",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "delete_keyword",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"keywordId": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"status": {
"enum": [
"deleted",
"not-found"
],
"type": "string"
}
},
"required": [
"status",
"keywordId"
],
"type": "object"
}
},
{
"description": "Use this when someone asks about one of their AppSkyline apps, such as which stores it is on or which languages it supports. Returns the app's name, default and supported locales, App Store, Mac App Store, Google Play and Microsoft Store ids, and creation and edit times. Not for the live public store page or ratings.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appId": {
"description": "AppSkyline app id (uuid)",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"appId"
],
"type": "object"
},
"name": "get_app",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"app": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"creationTime": {
"anyOf": [
{
"maxLength": 64,
"type": "string"
},
{
"type": "null"
}
]
},
"defaultLocale": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"googlePlayStorePackage": {
"$ref": "#/properties/app/anyOf/0/properties/name"
},
"id": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"iosAppStoreId": {
"$ref": "#/properties/app/anyOf/0/properties/name"
},
"lastEditTime": {
"anyOf": [
{
"maxLength": 64,
"type": "string"
},
{
"type": "null"
}
]
},
"locales": {
"items": {
"maxLength": 32,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"macosAppStoreId": {
"$ref": "#/properties/app/anyOf/0/properties/name"
},
"name": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"windowsStoreProductId": {
"$ref": "#/properties/app/anyOf/0/properties/name"
}
},
"required": [
"id",
"name",
"defaultLocale",
"locales",
"iosAppStoreId",
"macosAppStoreId",
"googlePlayStorePackage",
"windowsStoreProductId",
"creationTime",
"lastEditTime"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "Null when the app is not in the signed-in account"
},
"status": {
"enum": [
"found",
"not-found"
],
"type": "string"
}
},
"required": [
"status",
"app"
],
"type": "object"
}
},
{
"description": "Use this when someone asks how many downloads, installs, uninstalls or crashes their app had over a period. Returns store-reported totals, the latest 30 daily rows and top countries for one app and store; metric names differ by store. Not for keyword rankings.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appId": {
"description": "AppSkyline app id (uuid)",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"days": {
"description": "Rolling window of the last 1 to 365 days, used when no dates are given; omit dates and days for every synced day",
"exclusiveMinimum": 0,
"maximum": 365,
"type": "integer"
},
"endDate": {
"description": "Last day of the window as YYYY-MM-DD; applies only together with startDate",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"startDate": {
"description": "First day of the window as YYYY-MM-DD; applies only together with endDate",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"store": {
"description": "Store to summarize: ios-app-store, macos-app-store, google-play or microsoft-store",
"enum": [
"ios-app-store",
"macos-app-store",
"google-play",
"microsoft-store"
],
"type": "string"
}
},
"required": [
"appId",
"store"
],
"type": "object"
},
"name": "get_app_engagement_summary",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appId": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"dailySeries": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"name": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"rows": {
"items": {
"additionalProperties": false,
"properties": {
"date": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"metrics": {
"items": {
"$ref": "#/properties/totals/items"
},
"maxItems": 6,
"type": "array"
}
},
"required": [
"date",
"metrics"
],
"type": "object"
},
"maxItems": 30,
"type": "array"
},
"totalRows": {
"maximum": 1000000,
"minimum": 0,
"type": "integer"
},
"totalRowsIsLowerBound": {
"type": "boolean"
},
"truncated": {
"type": "boolean"
}
},
"required": [
"name",
"rows",
"totalRows",
"totalRowsIsLowerBound",
"truncated"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "The most recent 30 days of one daily metric series"
},
"dataThrough": {
"anyOf": [
{
"maxLength": 64,
"type": "string"
},
{
"type": "null"
}
]
},
"lastSyncedAt": {
"anyOf": [
{
"maxLength": 64,
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"enum": [
"found",
"empty"
],
"type": "string"
},
"store": {
"enum": [
"ios-app-store",
"macos-app-store",
"google-play",
"microsoft-store"
],
"type": "string"
},
"topTerritories": {
"description": "Up to 8 leading countries or territories by downloads or installs",
"items": {
"maxLength": 100,
"type": "string"
},
"maxItems": 8,
"type": "array"
},
"totals": {
"description": "Store-reported totals for the window; metric names differ by store",
"items": {
"additionalProperties": false,
"properties": {
"name": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"value": {
"maximum": 1000000000000000,
"minimum": -1000000000000000,
"type": "number"
}
},
"required": [
"name",
"value"
],
"type": "object"
},
"maxItems": 30,
"type": "array"
},
"totalsTruncated": {
"type": "boolean"
}
},
"required": [
"status",
"appId",
"store",
"dataThrough",
"lastSyncedAt",
"totals",
"totalsTruncated",
"topTerritories",
"dailySeries"
],
"type": "object"
}
},
{
"description": "Use this when someone asks how their app's ranking for a keyword has changed over time in one store and country. Returns the app's rank on each date AppSkyline stored a search snapshot, newest first, up to 365 rows; tracked keywords are re-checked weekly. Not for today's live rank.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appId": {
"description": "AppSkyline app id (uuid)",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"country": {
"description": "Two-letter store country code such as US or IT (required)",
"maxLength": 10,
"minLength": 1,
"type": "string"
},
"limit": {
"description": "Snapshots to return, newest first, from 1 to 365; defaults to 365",
"exclusiveMinimum": 0,
"maximum": 365,
"type": "integer"
},
"store": {
"description": "Store to read: ios-app-store, macos-app-store, google-play or microsoft-store; the app needs an id on that store",
"enum": [
"ios-app-store",
"macos-app-store",
"google-play",
"microsoft-store"
],
"type": "string"
},
"term": {
"description": "Search term to read history for, 1 to 200 characters",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"appId",
"store",
"term",
"country"
],
"type": "object"
},
"name": "get_keyword_history",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"app": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"id": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"name": {
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"name"
],
"type": "object"
},
{
"type": "null"
}
]
},
"country": {
"anyOf": [
{
"maxLength": 10,
"type": "string"
},
{
"type": "null"
}
]
},
"returned": {
"maximum": 365,
"minimum": 0,
"type": "integer"
},
"snapshots": {
"description": "One row per stored search snapshot, newest first; rank is null when the app was not in that snapshot",
"items": {
"additionalProperties": false,
"properties": {
"date": {
"anyOf": [
{
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
{
"type": "null"
}
]
},
"rank": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 200,
"type": "integer"
},
{
"type": "null"
}
]
},
"resultsScanned": {
"maximum": 200,
"minimum": 0,
"type": "integer"
},
"resultsTruncated": {
"type": "boolean"
}
},
"required": [
"date",
"rank",
"resultsScanned",
"resultsTruncated"
],
"type": "object"
},
"maxItems": 365,
"type": "array"
},
"status": {
"enum": [
"found",
"app-not-found",
"store-not-configured",
"no-history"
],
"type": "string"
},
"store": {
"enum": [
"ios-app-store",
"macos-app-store",
"google-play",
"microsoft-store"
],
"type": "string"
},
"term": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"totalSnapshots": {
"maximum": 1000000,
"minimum": 0,
"type": "integer"
},
"totalSnapshotsIsLowerBound": {
"type": "boolean"
},
"truncated": {
"type": "boolean"
}
},
"required": [
"status",
"app",
"store",
"term",
"country",
"snapshots",
"returned",
"totalSnapshots",
"totalSnapshotsIsLowerBound",
"truncated"
],
"type": "object"
}
},
{
"description": "Use this when someone asks how popular a keyword is or which keyword ideas are worth targeting. Returns monthly Google web-search volume (a demand proxy, not app-store search counts), difficulty, CPC and competition for up to 50 terms in one country. Terms missing from the 30-day cache trigger a billable lookup. Not for rankings.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"country": {
"description": "Two-letter country code such as US or IT (required)",
"maxLength": 2,
"minLength": 2,
"pattern": "^[A-Za-z]{2}$",
"type": "string"
},
"lang": {
"description": "Two-letter language code such as en or it; optional",
"maxLength": 32,
"type": "string"
},
"terms": {
"description": "Keyword ideas to look up in one batch, 1 to 50 terms of up to 200 characters, none containing a comma",
"items": {
"maxLength": 200,
"minLength": 1,
"pattern": "^[^,]+$",
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"type": "array"
}
},
"required": [
"terms",
"country"
],
"type": "object"
},
"name": "get_keyword_overview",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"country": {
"maxLength": 2,
"minLength": 2,
"type": "string"
},
"keywords": {
"description": "Google web-search demand per term from the shared 30-day cache, highest volume first; a proxy for interest, not app-store search counts",
"items": {
"additionalProperties": false,
"properties": {
"competition": {
"anyOf": [
{
"maxLength": 50,
"type": "string"
},
{
"type": "null"
}
]
},
"cpc": {
"anyOf": [
{
"maximum": 1000000,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
]
},
"fetchedAt": {
"anyOf": [
{
"maxLength": 64,
"type": "string"
},
{
"type": "null"
}
]
},
"keyword": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"keywordDifficulty": {
"anyOf": [
{
"maximum": 100,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
]
},
"searchVolume": {
"anyOf": [
{
"maximum": 1000000000,
"minimum": 0,
"type": "integer"
},
{
"type": "null"
}
]
}
},
"required": [
"keyword",
"searchVolume",
"keywordDifficulty",
"cpc",
"competition",
"fetchedAt"
],
"type": "object"
},
"maxItems": 50,
"type": "array"
},
"lang": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"returned": {
"maximum": 50,
"minimum": 0,
"type": "integer"
},
"status": {
"enum": [
"found",
"empty"
],
"type": "string"
},
"truncated": {
"type": "boolean"
}
},
"required": [
"status",
"country",
"lang",
"keywords",
"returned",
"truncated"
],
"type": "object"
}
},
{
"description": "Use this when someone asks where their app ranks for a keyword right now in one store and country. Returns the app's live position, or not-ranked, after scanning the top 50 results by default and up to 200, and renders a rank card. Not for how a rank changed over time.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appId": {
"description": "AppSkyline app id (uuid)",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"country": {
"description": "Two-letter store country code such as US or IT; defaults to US",
"maxLength": 10,
"type": "string"
},
"lang": {
"description": "Two-letter language code such as en or it; defaults to en except on Google Play, which uses the store default",
"maxLength": 32,
"type": "string"
},
"num": {
"default": 50,
"description": "How many search results to scan for the app, from 1 to 200; defaults to 50",
"exclusiveMinimum": 0,
"maximum": 200,
"type": "integer"
},
"store": {
"description": "Store to check: ios-app-store, macos-app-store, google-play or microsoft-store; the app needs an id on that store",
"enum": [
"ios-app-store",
"macos-app-store",
"google-play",
"microsoft-store"
],
"type": "string"
},
"term": {
"description": "Search term to check, 1 to 200 characters",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"appId",
"store",
"term"
],
"type": "object"
},
"name": "get_keyword_rank",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"app": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"id": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"name": {
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"name"
],
"type": "object"
},
{
"type": "null"
}
]
},
"country": {
"anyOf": [
{
"maxLength": 10,
"type": "string"
},
{
"type": "null"
}
]
},
"lang": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"rank": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 200,
"type": "integer"
},
{
"type": "null"
}
],
"description": "1-based position; null unless status is ranked"
},
"resultsScanned": {
"description": "How many results were scanned; report a rank as #N of this",
"maximum": 200,
"minimum": 0,
"type": "integer"
},
"status": {
"enum": [
"ranked",
"not-ranked",
"app-not-found",
"store-not-configured"
],
"type": "string"
},
"store": {
"enum": [
"ios-app-store",
"macos-app-store",
"google-play",
"microsoft-store"
],
"type": "string"
},
"term": {
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"status",
"app",
"term",
"store",
"country",
"lang",
"rank",
"resultsScanned"
],
"type": "object"
}
},
{
"description": "Use this when someone asks about a competitor's or any app's public store page, such as its rating, number of ratings, price, version or last update. Returns the live listing for one store id, with description and release notes cut to 600 characters. Not for your own app's synced text per language.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"country": {
"description": "Two-letter store country code such as US or IT; defaults to the store's own default",
"maxLength": 10,
"type": "string"
},
"lang": {
"description": "Two-letter language code such as en or it; defaults to the store's own default",
"maxLength": 32,
"type": "string"
},
"store": {
"description": "Store to read: ios-app-store, macos-app-store, google-play or microsoft-store",
"enum": [
"ios-app-store",
"macos-app-store",
"google-play",
"microsoft-store"
],
"type": "string"
},
"storeId": {
"description": "The app's id in that store: numeric Apple id, Google Play package name such as com.example.app, or Microsoft Store product id",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"store",
"storeId"
],
"type": "object"
},
"name": "get_store_listing",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"country": {
"anyOf": [
{
"maxLength": 10,
"type": "string"
},
{
"type": "null"
}
]
},
"lang": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"listing": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"currency": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"description": {
"anyOf": [
{
"maxLength": 600,
"type": "string"
},
{
"type": "null"
}
]
},
"developer": {
"anyOf": [
{
"maxLength": 300,
"type": "string"
},
{
"type": "null"
}
]
},
"developerId": {
"anyOf": [
{
"maxLength": 300,
"type": "string"
},
{
"type": "null"
}
]
},
"free": {
"type": [
"boolean",
"null"
]
},
"genres": {
"items": {
"maxLength": 100,
"type": "string"
},
"maxItems": 20,
"type": "array"
},
"id": {
"anyOf": [
{
"maxLength": 300,
"type": "string"
},
{
"type": "null"
}
]
},
"price": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
]
},
"ratings": {
"anyOf": [
{
"maximum": 1000000000000,
"minimum": 0,
"type": "integer"
},
{
"type": "null"
}
]
},
"releaseNotes": {
"anyOf": [
{
"maxLength": 600,
"type": "string"
},
{
"type": "null"
}
]
},
"released": {
"anyOf": [
{
"maxLength": 64,
"type": "string"
},
{
"type": "null"
}
]
},
"requiredOsVersion": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
]
},
"score": {
"anyOf": [
{
"maximum": 1000000,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"description": "Average rating as the store reports it"
},
"screenshotCount": {
"maximum": 10000,
"minimum": 0,
"type": "integer"
},
"title": {
"anyOf": [
{
"maxLength": 300,
"type": "string"
},
{
"type": "null"
}
]
},
"updated": {
"anyOf": [
{
"maxLength": 64,
"type": "string"
},
{
"type": "null"
}
]
},
"version": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"title",
"developer",
"developerId",
"score",
"ratings",
"price",
"free",
"currency",
"version",
"released",
"updated",
"requiredOsVersion",
"genres",
"screenshotCount",
"description",
"releaseNotes"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "The live public listing; description and release notes are cut to 600 characters. Null when the store has no app with that id."
},
"status": {
"enum": [
"found",
"not-found"
],
"type": "string"
},
"store": {
"enum": [
"ios-app-store",
"macos-app-store",
"google-play",
"microsoft-store"
],
"type": "string"
},
"storeId": {
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"status",
"store",
"storeId",
"country",
"lang",
"listing"
],
"type": "object"
}
},
{
"description": "Use this when someone asks about their own app's listing text per language, such as the title, subtitle, keywords or release notes, or whether the latest version is still in review or approved. Returns the metadata AppSkyline last synced for each locale, with the version, its review state and the keyword field's length against Apple's 100-character limit; longer texts are cut to 600 characters. Not for a live competitor listing.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appId": {
"description": "AppSkyline app id (uuid)",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"locale": {
"description": "Only this locale, written as in the listing such as en-US or it; every synced locale when absent",
"maxLength": 32,
"type": "string"
},
"store": {
"description": "Store listing to read: ios-app-store, macos-app-store, google-play or microsoft-store",
"enum": [
"ios-app-store",
"macos-app-store",
"google-play",
"microsoft-store"
],
"type": "string"
}
},
"required": [
"appId",
"store"
],
"type": "object"
},
"name": "get_store_metadata",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appId": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"listings": {
"description": "Metadata as last synced into AppSkyline, one row per locale; it may differ from what the store shows now. Long texts are cut to 600 characters.",
"items": {
"additionalProperties": false,
"properties": {
"description": {
"anyOf": [
{
"maxLength": 600,
"type": "string"
},
{
"type": "null"
}
]
},
"keywordCharacters": {
"anyOf": [
{
"maximum": 200,
"minimum": 0,
"type": "integer"
},
{
"type": "null"
}
]
},
"keywords": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"lastSyncedAt": {
"anyOf": [
{
"maxLength": 64,
"type": "string"
},
{
"type": "null"
}
]
},
"locale": {
"maxLength": 32,
"minLength": 1,
"type": "string"
},
"name": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"promotionalText": {
"anyOf": [
{
"maxLength": 600,
"type": "string"
},
{
"type": "null"
}
]
},
"state": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
]
},
"subtitle": {
"anyOf": [
{
"maxLength": 300,
"type": "string"
},
{
"type": "null"
}
]
},
"version": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
]
},
"whatsNew": {
"anyOf": [
{
"maxLength": 600,
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"locale",
"name",
"subtitle",
"keywords",
"keywordCharacters",
"promotionalText",
"whatsNew",
"description",
"version",
"state",
"lastSyncedAt"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"localeFilter": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"returned": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"status": {
"enum": [
"found",
"empty"
],
"type": "string"
},
"store": {
"enum": [
"ios-app-store",
"macos-app-store",
"google-play",
"microsoft-store"
],
"type": "string"
},
"truncated": {
"type": "boolean"
}
},
"required": [
"status",
"appId",
"store",
"localeFilter",
"listings",
"returned",
"truncated"
],
"type": "object"
}
},
{
"description": "Use this when someone asks which apps they track in AppSkyline, or an app's id is needed. Returns each app's id, name, default locale and its App Store, Mac App Store, Google Play and Microsoft Store ids, up to 100 apps. Not for finding other apps in a store.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "list_apps",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"apps": {
"description": "Apps the signed-in account can access, at most 100",
"items": {
"additionalProperties": false,
"properties": {
"defaultLocale": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"googlePlayStorePackage": {
"$ref": "#/properties/apps/items/properties/id"
},
"id": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"iosAppStoreId": {
"$ref": "#/properties/apps/items/properties/id"
},
"macosAppStoreId": {
"$ref": "#/properties/apps/items/properties/id"
},
"name": {
"$ref": "#/properties/apps/items/properties/id"
},
"windowsStoreProductId": {
"$ref": "#/properties/apps/items/properties/id"
}
},
"required": [
"id",
"name",
"defaultLocale",
"iosAppStoreId",
"macosAppStoreId",
"googlePlayStorePackage",
"windowsStoreProductId"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"status": {
"enum": [
"found",
"empty"
],
"type": "string"
},
"truncated": {
"description": "True when the account has more than 100 apps",
"type": "boolean"
}
},
"required": [
"status",
"apps",
"truncated"
],
"type": "object"
}
},
{
"description": "Use this when someone asks what users say about their Android app on Google Play, or about recent ratings and complaints. Returns reviews with stars, text cut to 300 characters, app version, device, language and whether the developer replied, up to 100 per page. Google Play only returns reviews from the last 7 days. Not for App Store reviews.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appId": {
"description": "AppSkyline app id (uuid); the app needs a Google Play service account in AppSkyline",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxResults": {
"description": "Reviews to return per page, from 1 to 100",
"exclusiveMinimum": 0,
"maximum": 100,
"type": "integer"
},
"token": {
"description": "nextPageToken from the previous page; absent for the first page",
"maxLength": 2000,
"type": "string"
},
"translationLanguage": {
"description": "Translate review text into this language, such as en; omit to keep the original language",
"maxLength": 32,
"type": "string"
}
},
"required": [
"appId"
],
"type": "object"
},
"name": "list_google_play_reviews",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appId": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"nextPageToken": {
"anyOf": [
{
"maxLength": 2000,
"type": "string"
},
{
"type": "null"
}
],
"description": "Pass as token to get the next page; null on the last page"
},
"returned": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"reviews": {
"description": "Reviews created or edited in the last 7 days, as the Google Play API returns them; review text is cut to 300 characters",
"items": {
"additionalProperties": false,
"properties": {
"author": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"date": {
"anyOf": [
{
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
{
"type": "null"
}
]
},
"device": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"language": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"replied": {
"type": "boolean"
},
"reviewId": {
"anyOf": [
{
"maxLength": 300,
"type": "string"
},
{
"type": "null"
}
]
},
"stars": {
"anyOf": [
{
"maximum": 5,
"minimum": 1,
"type": "integer"
},
{
"type": "null"
}
]
},
"text": {
"anyOf": [
{
"maxLength": 300,
"type": "string"
},
{
"type": "null"
}
]
},
"version": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"reviewId",
"author",
"stars",
"date",
"version",
"device",
"language",
"replied",
"text"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"status": {
"enum": [
"available",
"empty",
"not-configured"
],
"type": "string"
},
"truncated": {
"type": "boolean"
}
},
"required": [
"status",
"appId",
"reviews",
"returned",
"nextPageToken",
"truncated"
],
"type": "object"
}
},
{
"description": "Use this when someone asks which keywords they track for an app, or before adding or deleting one. Returns each tracked keyword's id, search term, language, country and bid, up to 500 per call. Not for current rankings or search volume.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"appId": {
"description": "AppSkyline app id (uuid)",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"limit": {
"description": "Keywords to return, from 1 to 500; omit for all tracked keywords, capped at 500",
"exclusiveMinimum": 0,
"maximum": 500,
"type": "integer"
},
"skip": {
"description": "Keywords to skip before the first one returned, for paging; defaults to 0",
"maximum": 1000000,
"minimum": 0,
"type": "integer"
}
},
"required": [
"appId"
],
"type": "object"
},
"name": "list_keywords",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"keywords": {
"description": "Tracked keywords for the app, at most 500 per call",
"items": {
"additionalProperties": false,
"properties": {
"bid": {
"anyOf": [
{
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"description": "Bid amount stored for the keyword; null when none is set"
},
"country": {
"anyOf": [
{
"maxLength": 10,
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"language": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"term": {
"$ref": "#/properties/keywords/items/properties/id"
}
},
"required": [
"id",
"term",
"language",
"country",
"bid"
],
"type": "object"
},
"maxItems": 500,
"type": "array"
},
"offset": {
"maximum": 1000000,
"minimum": 0,
"type": "integer"
},
"returned": {
"maximum": 500,
"minimum": 0,
"type": "integer"
},
"status": {
"enum": [
"found",
"empty"
],
"type": "string"
},
"truncated": {
"description": "True when more than 500 keywords matched; page with skip",
"type": "boolean"
}
},
"required": [
"status",
"keywords",
"offset",
"returned",
"truncated"
],
"type": "object"
}
},
{
"description": "Use this when someone wants to open AppSkyline and browse their workspace interactively. Apps, connected stores and tracked keywords. Starts with up to 100 items. Not for changing data.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"type": "object"
},
"name": "open_appskyline",
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"items": {
"items": {
"additionalProperties": false,
"properties": {
"defaultLocale": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"locales": {
"items": {
"maxLength": 32,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"logoUrl": {
"anyOf": [
{
"maxLength": 2048,
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"maxLength": 200,
"type": "string"
},
"subtitle": {
"maxLength": 300,
"type": "string"
}
},
"required": [
"id",
"name",
"subtitle",
"logoUrl",
"defaultLocale",
"locales"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"truncated": {
"type": "boolean"
}
},
"required": [
"items",
"truncated"
],
"type": "object"
}
},
{
"description": "Use this when someone asks which apps show up for a search term, or who their competitors are for a keyword, on the App Store, Mac App Store, Google Play or Microsoft Store. Returns the live results in rank order with store id, title, rating and developer (10 by default, up to 200). Not for one app's own position.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"country": {
"description": "Two-letter store country code such as US or IT; defaults to US",
"maxLength": 10,
"type": "string"
},
"lang": {
"description": "Two-letter language code such as en or it; defaults to en except on Google Play, which uses the store default",
"maxLength": 32,
"type": "string"
},
"num": {
"description": "Number of results to return, from 1 to 200; defaults to 10",
"exclusiveMinimum": 0,
"maximum": 200,
"type": "integer"
},
"store": {
"description": "Store to search: ios-app-store, macos-app-store, google-play or microsoft-store",
"enum": [
"ios-app-store",
"macos-app-store",
"google-play",
"microsoft-store"
],
"type": "string"
},
"term": {
"description": "Search term as a user would type it in the store, 1 to 200 characters",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"store",
"term"
],
"type": "object"
},
"name": "search_store_results",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"country": {
"anyOf": [
{
"maxLength": 10,
"type": "string"
},
{
"type": "null"
}
]
},
"lang": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"results": {
"description": "Live search results in store rank order; nothing is stored in AppSkyline",
"items": {
"additionalProperties": false,
"properties": {
"developer": {
"$ref": "#/properties/results/items/properties/id"
},
"id": {
"anyOf": [
{
"maxLength": 300,
"type": "string"
},
{
"type": "null"
}
]
},
"rank": {
"exclusiveMinimum": 0,
"maximum": 200,
"type": "integer"
},
"score": {
"anyOf": [
{
"maximum": 1000000,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"description": "Rating score as the store reports it"
},
"title": {
"$ref": "#/properties/results/items/properties/id"
}
},
"required": [
"rank",
"id",
"title",
"score",
"developer"
],
"type": "object"
},
"maxItems": 200,
"type": "array"
},
"status": {
"enum": [
"found",
"empty"
],
"type": "string"
},
"store": {
"enum": [
"ios-app-store",
"macos-app-store",
"google-play",
"microsoft-store"
],
"type": "string"
},
"term": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"truncated": {
"description": "True when the store returned more than 200 results",
"type": "boolean"
}
},
"required": [
"status",
"store",
"term",
"country",
"lang",
"results",
"truncated"
],
"type": "object"
}
},
{
"description": "Use this when someone wants a quick overview of one of the apps they track in AppSkyline. Returns an overview card with the app's connected stores, locales and up to 50 tracked keywords. Not for keyword rankings.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"appId": {
"description": "AppSkyline app id (uuid)",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"appId"
],
"type": "object"
},
"name": "show_app_overview",
"outputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"app": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"defaultLocale": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"googlePlayId": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"iosAppStoreId": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"locales": {
"items": {
"maxLength": 32,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"macosAppStoreId": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"microsoftStoreId": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"name",
"defaultLocale",
"locales",
"iosAppStoreId",
"macosAppStoreId",
"googlePlayId",
"microsoftStoreId"
],
"type": "object"
},
{
"type": "null"
}
]
},
"keywordCount": {
"maximum": 1000000,
"minimum": 0,
"type": "integer"
},
"keywords": {
"description": "The first 50 tracked keywords; keywordCount has the total",
"items": {
"additionalProperties": false,
"properties": {
"country": {
"anyOf": [
{
"maxLength": 10,
"type": "string"
},
{
"type": "null"
}
]
},
"id": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"language": {
"anyOf": [
{
"maxLength": 32,
"type": "string"
},
{
"type": "null"
}
]
},
"term": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"term",
"language",
"country"
],
"type": "object"
},
"maxItems": 50,
"type": "array"
},
"storeCount": {
"maximum": 4,
"minimum": 0,
"type": "integer"
}
},
"required": [
"app",
"keywordCount",
"storeCount",
"keywords"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:aaade044be4458d5e51235054289d3721e2712ffcb546255f9029e7b3756ed03 | sha256sum