StoreScope Analytics

API reference

Every StoreScope Analytics tool over REST: the same 38 tools, wording and rules as the MCP server. Connect your stores first (guides); a tool whose store is not connected says so and changes nothing.

Authentication

  • Create a workspace key on the MCP & API page (read, or read and write; it is shown once) and send it as Authorization: Bearer sws_….
  • An OAuth access token this host issued for its MCP server works the same way.
  • A key reaches one workspace. Revoking it on the MCP & API page stops it at once.
  • A read key never reaches a write tool; a viewer's key, or any key in a workspace whose owner turned AI changes off, is read-only.

Request and response

POST https://storescope.devino.ca/api/tools/<tool name> with the tool's arguments as one JSON object (an empty body or {} when it needs none).

curl -X POST https://storescope.devino.ca/api/tools/data_freshness \
  -H "Authorization: Bearer sws_…" \
  -H "Content-Type: application/json" \
  -d '{}'
  • 200: the tool's own JSON answer.
  • 400: the tool refused ({"code": …, "message": …}), the arguments did not match its schema, or the body was not JSON.
  • 401, 404, 413, 429, 502, 503: refused before the tool ran. Every code is on Error codes.

The machine-readable form of this page is https://storescope.devino.ca/openapi.json (OpenAPI 3.1), generated from the same tool definitions the MCP server lists.

Writes: preview first, then confirm

  1. Call the write tool with its arguments. Nothing reaches the store: the answer is a preview (the diff or plan) with a confirm_token (for example play_review_reply).
  2. Repeat the same call with "apply": true and "confirmToken": "<the token>". When the preview returned commit_args, merge them into the arguments: they pin the store state the preview saw, and a store that changed since is refused.
  3. The token is single use, valid 10 minutes, and bound to the key or connection, the tool and those exact arguments.
  4. A preview with "status": "rejected" carries no token and cannot be committed.

Limits

  • 60 calls a minute per key or AI connection, MCP and API together. Over it: 429 rate_limited with a Retry-After header (seconds) and retry_after_s in the body.
  • Request bodies up to 256 KB (413 above).
  • A call runs at most 15 minutes (502 after). When every worker is busy: 503 with Retry-After: 5.
  • Answers are capped (at most 200 rows per read, 500 for sql_query where offered).

Tools (38)

data_freshness · fleet_overview · app_funnel · compare_periods · listing_change_impact · listing_history · reviews_digest · reviews_unanswered · reviews_inbox · developer_channels · search_performance · web_traffic · product_usage · app_stability · top_movers · app_health · listing_proposals · aso_audit · revenue_overview · subscription_metrics · warehouse_schema · sql_query · apple_reviews_recent · apple_review_reply · apple_report_status · play_reviews_recent · play_review_reply · play_store_performance · ms_analytics · ms_review_reply · ms_reviews_recent · registry_status · rank_check · store_search · store_app_lookup · rank_history · rank_keywords_get · rank_keywords_set

data_freshness read

Data freshness. Per-adapter last sync status/time/rows, latest fact date per store, apps with no data, stale (>3d over the store's own lag) warnings, and the count of pending Apple analytics report requests.

No arguments: send an empty body.

fleet_overview read

Overview of every app. Every app x store for the last N days: downloads/installs/acquisitions totals, impressions -> page_views -> downloads funnel where the store provides it, conversion, rating average and review count, plus a one-line…

ArgumentTypeWhat it is
daysinteger 1-365lookback window in days (default 28) Default: 28.
includeEmptybooleankeep app x store rows that have nothing actionable in the window Default: false.

app_funnel read

App funnel. Daily impressions/page_views/downloads time series for one app on one store plus a grouped funnel with conversion computed per group.

ArgumentTypeWhat it is
app requiredstringapp slug (as on the Apps page)
store requiredstringapple | play | microsoft | claude | chatgpt | copilot | registry
daysinteger 1-365Default: 28.
groupBy"source_type" | "page_type" | "territory" | "device" | "source_info"Default: "source_type".

compare_periods read

Compare periods. Current vs previous period for one metric, broken down per group (defaults: group by store when store is omitted, by source_type when it is given).

ArgumentTypeWhat it is
app requiredstringapp slug (as on the Apps page)
storestringapple | play | microsoft | claude | chatgpt | copilot | registry
metric requiredstringraw or canonical metric, e.g. downloads_first_time | impressions | page_views | tool_calls
periodDaysinteger 1-180Default: 14.
groupBy"store" | "source_type" | "page_type" | "territory" | "device" | "source_info"

listing_change_impact read

Listing change impact. For each listing change (listing_changes audit rows and detected listing_versions snapshot diffs), the 14d-before vs 14d-after impressions / page_views / downloads / conversion.

ArgumentTypeWhat it is
app requiredstringapp slug (as on the Apps page)
store requiredstringapple | play | microsoft | claude | chatgpt | copilot | registry
changeIdinteger -9007199254740991-9007199254740991a listing_changes.id; when given, only that change is analysed
sincestringISO date/timestamp lower bound for events
windowDaysinteger 1-90Default: 14.

listing_history read

Listing history. The listing_versions snapshot chain for an app/store (optionally one locale) with field-level diffs between consecutive snapshots, plus the listing_changes audit rows (what this MCP planned or applied, in which mode).

ArgumentTypeWhat it is
app requiredstringapp slug (as on the Apps page)
store requiredstringapple | play | microsoft | claude | chatgpt | copilot | registry
localestring

reviews_digest read

Reviews digest. Review counts by rating, average, unanswered count, top recurring words and two-word phrases (simple stopword tokenizer), and the 10 most recent low-rating (<=3) reviews.

ArgumentTypeWhat it is
appstringapp slug (as on the Apps page)
storestringapple | play | microsoft | claude | chatgpt | copilot | registry
daysinteger 1-365Default: 30.
minRatinginteger 1-5
maxRatinginteger 1-5

reviews_unanswered read

Reviews awaiting a developer reply. Lists the archived reviews that have NO developer response yet, newest first, with the ids the *_review_reply tools take (apple_review_reply / play_review_reply / ms_review_reply).

ArgumentTypeWhat it is
appstringapp slug (as on the Apps page)
storestringapple | play | microsoft
min_ratinginteger 1-5
max_ratinginteger 1-5
daysinteger 1-365Default: 30.
limitinteger 1-200Default: 50.

reviews_inbox read

Reviews inbox, per app. Every app's reviews in one place: per app, a per-store summary (count, average rating, unanswered, unanswered <= 3 stars, newest review date) and the newest reviews, unanswered low ratings first, each with the reply…

ArgumentTypeWhat it is
appstringapp slug (as on the Apps page)
storestringapple | play | microsoft
daysinteger 1-365Default: 30.
only_unansweredbooleanDefault: false.
max_ratinginteger 1-5
limitinteger 1-50reviews listed per app Default: 10.

developer_channels read

Developer channels (GitHub, npm, PyPI). Where developers find each app: GitHub traffic on its PUBLIC SDK repos (views, unique visitors, clones per day, stars/forks, and the top REFERRERS and paths that sent the visits) plus npm and PyPI downloads of every…

ArgumentTypeWhat it is
appstringapp slug (as on the Apps page)
daysinteger 1-365Default: 28.
topinteger 0-25referrers / paths listed per app Default: 10.

search_performance read

Web search performance (Search Console, Bing). Per app and engine (gsc = Google Search Console, bing = Bing Webmaster Tools): clicks, impressions, CTR and impression-weighted average position on the app's PUBLIC WEBSITE over `days`, anchored on that engine's own…

ArgumentTypeWhat it is
appstringapp slug (as on the Apps page)
engine"gsc" | "bing"
daysinteger 1-365Default: 28.
topinteger 0-50queries / pages listed per app and engine Default: 10.

web_traffic read

Website traffic (Google Analytics 4). Per app: sessions, engaged sessions (and the engagement rate), new users, page views and key events on the app's PUBLIC WEBSITE from Google Analytics 4, summed over `days` anchored on that app's own newest GA4 day, the…

ArgumentTypeWhat it is
appstringapp slug (as on the Apps page)
daysinteger 1-365Default: 28.

product_usage read

Product usage (PostHog). Per app: what people do IN the app, from PostHog: events, pageviews and sessions summed over `days` anchored on that app's own newest PostHog day, the same sums for the window before, active users of the latest day and…

ArgumentTypeWhat it is
appstringapp slug (as on the Apps page)
daysinteger 1-365Default: 28.

app_stability read

App stability (Sentry). Per app: Sentry errors and release-health sessions summed over `days` anchored on that app's own newest Sentry day, the window before, the crash-free session rate computed from the session sums (never an average of…

ArgumentTypeWhat it is
appstringapp slug (as on the Apps page)
daysinteger 1-365Default: 28.

top_movers read

Top movers. Workspace-wide biggest ups and downs across app x store x metric: last N days vs the N days before, each series anchored on its own latest date.

ArgumentTypeWhat it is
daysinteger 1-90Default: 7.
limitinteger 1-50Default: 10.

app_health read

App health. Sessions, crashes (+ computed crashes per 1k sessions with its basis), purchases (count only) and pre-orders per app x store over the last N days, from Apple's App Sessions / App Crashes / App Store Purchases /…

ArgumentTypeWhat it is
appstringapp slug (as on the Apps page)
daysinteger 1-365lookback window in days, per series (default 30) Default: 30.

listing_proposals read

Listing proposals (data-guided). THE optimization tool: deterministic, rule-based, evidence-backed changes to an app's store text and images, derived only from warehouse data.

ArgumentTypeWhat it is
app requiredstringapp slug (as on the Apps page)
store"apple" | "play" | "microsoft"apple | play | microsoft. Omit for every store this app is listed on.
localestringexact listing locale, e.g. en-US (Apple/Play) or en-us (Microsoft). Omit for all locales.
daysinteger 7-180window for the conversion and download-trend rules (default 28) Default: 28.

aso_audit read

ASO audit (every app). Workspace-wide triage over listing_proposals: one row per app x store x locale with its high/medium/low proposal counts, its downloads in the window, and the top 3 proposals as one-liners.

ArgumentTypeWhat it is
daysinteger 7-180window for downloads and the trend rules (default 28) Default: 28.

revenue_overview read

Revenue overview. Money for the last N days from the stores' own sales reports (warehouse only): proceeds, paid units, free units and refunds per app | store | country | currency.

ArgumentTypeWhat it is
appstringapp slug (as on the Apps page)
daysinteger 1-365window in days on each series' own anchor (default 30) Default: 30.
group_by"app" | "store" | "country" | "currency"app | store | country | currency Default: "app".

subscription_metrics read

Subscription metrics. Apple auto-renewable subscriptions per app (warehouse only): active_subscriptions and active_free_trials as the LATEST daily snapshot (as_of; a stock summed over countries and plans, never over days), plus…

ArgumentTypeWhat it is
appstringapp slug (as on the Apps page)
daysinteger 1-365Default: 30.

warehouse_schema read

Warehouse schema. DDL of every warehouse table plus the raw-metric -> canonical-family map and the known store ids.

No arguments: send an empty body.

sql_query read

SQL query (read-only). Escape hatch: run ONE read-only SELECT/WITH statement over the warehouse on a readonly connection (PRAGMA query_only).

ArgumentTypeWhat it is
sql requiredstringa single SELECT or WITH statement, no trailing semicolon needed

apple_reviews_recent read

Apple: recent App Store reviews (warehouse). Reads the most recent App Store reviews for an app from the warehouse (populated by the apple sync).

ArgumentTypeWhat it is
app requiredstring
limitinteger 1-200default 20

apple_review_reply write

Apple: reply to an App Store review (gated). Posts (or replaces) the developer response under one App Store review.

ArgumentTypeWhat it is
app requiredstringapp slug, Apple app id, or app name
review_id requiredstringcustomerReviews resource id, as returned by reviews_unanswered / apple_reviews_recent
response_text requiredstring, ≤ 5970 charsthe public developer response, max 5970 chars
rationale requiredstringwhy this reply — stored in the audit log
applybooleantrue = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
confirmTokenstringThe confirm_token from the dry-run preview (single use, 10-minute TTL).

apple_report_status read

Apple: analytics report pipeline status. Shows the app's analyticsReportRequests (including the stopped_due_to_inactivity flag — Apple stops an ONGOING request that is never downloaded), the report ids for the four ASO reports, and the latest DAILY/WEEKLY…

ArgumentTypeWhat it is
app requiredstring

play_reviews_recent read

Play: recent reviews. Most recent Google Play reviews for an app from the warehouse (synced from the bucket's reviews/ exports).

ArgumentTypeWhat it is
app requiredstring
limitinteger 1-200default 20

play_review_reply write

Play: reply to a Google Play review (gated). Posts (or edits) the developer reply under one Google Play review.

ArgumentTypeWhat it is
app requiredstringapp slug or Play package name
review_id requiredstringPlay review id (gp:…), as returned by reviews_unanswered / play_reviews_recent
response_text requiredstring, ≤ 350 charsthe public developer reply, max 350 chars
rationale requiredstringwhy this reply — stored in the audit log
applybooleantrue = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
confirmTokenstringThe confirm_token from the dry-run preview (single use, 10-minute TTL).

play_store_performance read

Play: store listing performance. Store-listing visitors, acquisitions and conversion rate by month × traffic source (and by territory) from the warehouse.

ArgumentTypeWhat it is
app requiredstring
monthsinteger 1-24how many recent months to include, default 3

ms_analytics read

Microsoft Store analytics (warehouse). Acquisitions and installs by day for an app from the warehouse, plus the legacy funnel totals and data freshness.

ArgumentTypeWhat it is
app requiredstring
daysinteger 1-365lookback window, default 30

ms_review_reply write

Microsoft Store review response (gated write). Posts the developer response under one Microsoft Store review through the Partner Center 'respond to reviews' API.

ArgumentTypeWhat it is
app requiredstringapp slug, app name, or Microsoft product id
review_id requiredstringPartner Center review id (a GUID), as returned by reviews_unanswered / ms_reviews_recent
response_text requiredstring, ≤ 1000 charsthe public developer response, max 1000 chars
rationale requiredstringwhy this response — stored in the listing_changes audit log
support_emailstring (email)support address Partner Center requires on every response; defaults to the listing's DefaultSupportEmail
applybooleantrue = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
confirmTokenstringThe confirm_token from the dry-run preview (single use, 10-minute TTL).

ms_reviews_recent read

Microsoft Store recent reviews. Most recent Microsoft Store reviews for an app from the warehouse (synced from the Partner Center reviews endpoint).

ArgumentTypeWhat it is
app requiredstring
limitinteger 1-200default 20

registry_status read

Public-registry listing + download proxies. Per app: whether the official MCP Registry lists it (and under which server name@version), plus the latest public download/usage proxies — npm, PyPI, Docker Hub, Smithery — from the warehouse.

ArgumentTypeWhat it is
appstringapp slug. Omit for every app.

rank_check read

Live keyword-rank check (calls the storefronts now). LIVE one-off check: queries Apple (iTunes Search), Google Play (search page) and the Microsoft Store search endpoint RIGHT NOW and returns this app's 1-based position per keyword x country x store, plus the top-5…

ArgumentTypeWhat it is
app requiredstringapp slug
keywordsarray of stringup to 10 search terms. Default: this app's tracked keywords.
countriesarray of stringISO-3166 alpha-2, e.g. ['us','ca']. Default: this app's configured countries.
storesarray of "apple" | "play" | "ms"which store legs to query. Default: every store the app is actually listed on.

store_app_lookup read

Public listing facts for ONE app (competitor listing audit). LIVE: reads one app's PUBLIC product listing — Apple via the iTunes Lookup API (app id or bundle id), Google Play via the product page — for one country and returns name, developer, rating, ratings_count, price,…

ArgumentTypeWhat it is
store required"apple" | "play"apple | play
id_or_package requiredstringApple numeric app id (or bundle id), or the Play package name
country requiredstring, ≤ 2 charsISO-3166 alpha-2 storefront, e.g. 'us'

rank_history read

Keyword-rank history from the warehouse. Warehouse-only (no network): tracked keyword positions over the last N days per store leg x keyword x country, with latest / best / worst / change.

ArgumentTypeWhat it is
app requiredstringapp slug
keywordstringsingle keyword; omit for all tracked keywords
store"apple" | "play" | "ms"apple | play | ms; omit for all
daysinteger 1-365lookback window in days (default 30)

rank_keywords_get read

Read the tracked keyword sets. The keyword sets the ranks adapter tracks, per app (the Keywords page).

ArgumentTypeWhat it is
appstringapp slug; omit for every app

rank_keywords_set write

Replace one app's tracked keyword set. Replaces (not merges) the keywords and countries tracked for one app and saves the set.

ArgumentTypeWhat it is
app requiredstringapp slug
keywords requiredarray of string, ≤ 100 charsfull replacement set, at most 25; [] removes the app from tracking
countriesarray of stringISO-3166 alpha-2, at most 10; defaults to us/ca/gb
applybooleantrue = commit for real. Requires the confirmToken returned by the preceding dry-run of this exact call.
confirmTokenstringThe confirm_token from the dry-run preview (single use, 10-minute TTL).