Data & API

Everything StoreTally shows is also available as JSON and CSV, free and without a key. The endpoints below are the same ones the site's own pages use, so any filter you can set on a store page you can also ask for directly.

Terms

  • Free to use with attribution, in the spirit of CC BY 4.0: credit “Data: StoreTally” with a link to https://storetally.com wherever you publish or show the data.
  • Fair use: keep to about one request per second. Heavy or abusive use may be throttled. If you need more, get in touch.
  • No warranty. The figures are store data as StoreTally observed it, with the limits described in the Methodology. Stores change their pages without notice, and a figure can be missing or late.

Conventions

  • Plain HTTPS GET requests. No key, no sign-up.
  • JSON field names are camelCase. A field with no value is null, not left out.
  • Stores are numbered: 0 Chrome, 1 Edge, 2 Firefox, 3 Apple, 4 Google Play.
  • Dates in query parameters are yyyy-MM-dd. A value that cannot be read (a malformed date or number) returns 400.
  • Listing results cover live listings only unless you ask for delisted ones.

Endpoints

GET /api/extensions

Searches and filters every listing in one or all stores and returns one page of results. Every parameter is optional; with none you get the first 50 live listings across all stores, largest usage figure first.

ParameterMeaning
Which listings
platformStore number (0-4). Leave it out for all stores.
qSearch text. Matches the name and developer; from 3 characters it also matches the description on Chrome, Edge and Firefox.
categoryExact category name, as listed by /api/categories.
typeKind of listing: 1 extension, 2 theme, 3 app, 0 unknown.
featuredtrue for listings the store currently features (Chrome, Edge and Firefox).
Size and ratings
minInstalls, maxInstallsBounds on the store's usage figure (users, installs or daily users). Listings with no figure - all of Apple - drop out when either is set.
ratedyes for listings with a rating, no for listings with none.
minRating, maxRatingBounds on the average rating (0-5). Unrated listings drop out.
minRatingCount, maxRatingCountBounds on the number of ratings. Unrated listings drop out.
Versions and dates
minVersion, maxVersionBounds on the version, compared as versions (2.10 is above 2.9). Versions that do not start with a number drop out.
updatedAfter, updatedBeforeThe store's last-updated date, inclusive at both ends. Listings with no date drop out.
firstSeenAfter, firstSeenBeforeWhen StoreTally first found the listing, inclusive. Not a creation date - see Methodology.
Delisted listings
includeDelistedtrue to include listings that have left their store.
delistedOnlytrue for delisted listings only.
delistedAfter, delistedBeforeWhen the listing left its store, inclusive. Either one implies delisted listings only.
Permissions and access (Chrome and Edge manifests)
manifestVersion2 or 3.
permissionExact permission name, as listed by /api/permissions (case-sensitive).
hostAccessall for listings that can reach every website. Other values are ignored.
minAccessLevelAccess level floor: 1 minimal, 2 limited, 3 broad, 4 extensive. Listings with no manifest to judge drop out.
Order and paging
sort installs (the default, and what any unknown value means), name, category, rating, ratingcount, updated, firstseen, access; growth in the usage figure per window: growth1d, growth7d, growth30d, growth365d, and as a percentage growthpct1d … growthpct365d; growth in ratings: ratinggrowth1d, ratinggrowth7d, ratinggrowthpct1d, ratinggrowthpct7d. A growth sort returns only listings that have a figure for that window.
dirdesc (default) or asc. Missing values sort last either way.
pagePage number, from 1 (default 1).
pageSizeRows per page: default 50, maximum 200 (larger values are cut to 200).

Response (abridged; the values are illustrative):

{
  "total": 1834,
  "page": 1,
  "pageSize": 50,
  "rows": [
    {
      "id": "abcdefghijklmnopabcdefghijklmnop",
      "s": "example-extension",
      "n": "Example Extension",
      "d": "Example Developer",
      "c": "Productivity",
      "t": 1,
      "p": 0,
      "i": 200000,
      "wd": null,
      "cd": null,
      "r": 4.6,
      "rc": 1520,
      "v": "3.2.1",
      "u": "2026-08-14",
      "fs": "2026-09-01T03:12:44",
      "du": null,
      "al": 3,
      "ic": "https://...",
      "f": false,
      "ds": "The first 200 characters of the description...",
      "sp": [[89.6, 190000], [41.2, 195000], [0, 200000]],
      "g1": null, "g1p": null, "g1b": null,
      "g7": 10000, "g7p": 5.26, "g7b": "2026-09-16T04:02:10",
      "g30": null, "g30p": null, "g30b": null,
      "g365": null, "g365p": null, "g365b": null,
      "rg1": 3, "rg1p": 0.2, "rg1b": "2026-09-23T04:10:51",
      "rg7": 21, "rg7p": 1.4, "rg7b": "2026-09-16T04:02:10",
      "lc": "2026-09-24T04:05:33"
    }
  ]
}
FieldMeaning
total, page, pageSizeRows matching the filters, this page's number, and the page size actually used.
id, sThe store's id for the listing, and its URL slug where the store has one.
n, d, cName, developer, category.
t, pKind of listing (as type above) and store number.
iThe store's usage figure: users on Chrome (rounded by the store), active installs on Edge, average daily users on Firefox, installs on Google Play. null on Apple, which publishes none.
wdWeekly downloads (Firefox only).
cdCreation date, where the store publishes one.
r, rcAverage rating and number of ratings; both null when unrated.
v, uVersion, and the store's last-updated date.
fs, duWhen StoreTally first found the listing, and when it left its store (null while live). UTC.
alAccess level 1-4 as minAccessLevel above; 0 when there is no manifest to judge.
ic, fIcon URL, and whether the store currently features it.
dsThe first 200 characters of the description.
spThe usage figure over the last 90 days as [daysAgo, value] pairs, oldest first. On Apple it is the rating count.
g1, g7, g30, g365Change in the usage figure per day, week, month and year. null until there is enough history.
g1p … g365pThe same change as a percentage.
g1b … g365bThe reading each change is measured from.
rg1, rg7, rg1p, rg7p, rg1b, rg7bThe same for the number of ratings, per day and per week (not on Apple, whose usage figure already is its rating count).
lcWhen the growth figures were last recomputed.

How growth is measured and scaled: Methodology.

GET /api/extensions.csv

The same filters and sort as /api/extensions, as a spreadsheet: the first 1,000 matching rows, UTF-8 with a byte-order mark so Excel reads names correctly. page and pageSize do not apply. Columns:

platform, id, name, developer, category, type, usage, weekly_downloads,
rating, rating_count, version, updated, store_created, first_seen, delisted,
featured, access_level, growth_1d, growth_1d_pct, growth_7d, growth_7d_pct,
ratings_growth_1d, ratings_growth_1d_pct, ratings_growth_7d,
ratings_growth_7d_pct, url

platform is the store's name (chrome, edge, …), usage is the usage figure (the rating count on Apple), featured is yes or no, and url is the listing's StoreTally page.

GET /api/summary

Census totals - how many listings are known, live and delisted, per store and overall - and breakdowns of the live ones. Response (illustrative values):

{
  "known": 2710000, "crawled": 2650000, "delisted": 41000, "live": 2609000,
  "rated": 1200000, "noVersionKey": 5200, "snapshots": 18400000, "pending": 900,
  "platforms": [ { "platform": 0, "known": 250000, "crawled": 248000, "live": 240000, "delisted": 8000 } ],
  "buckets": [ { "label": "1M+", "n": 1400 } ],
  "cats": [ { "label": "Productivity", "n": 52000, "unrated": 30000 } ],
  "years": [ { "label": 2026, "n": 610000 } ]
}
  • known every listing ever found; crawled read at least once; live crawled and still in its store; delisted gone from its store; rated live with a rating; noVersionKey live with a version that cannot be compared; snapshots history records kept; pending listings queued to be read.
  • buckets live listings by usage figure: under 100, 100-1K, 1K-10K, 10K-100K, 100K-1M, 1M+ and not shown.
  • cats the 10 biggest categories; years live listings by year of last update, the 9 most recent years.

GET /api/categories

Category names, sorted, for one store (?platform=2) or all of them. Use these as the category filter.

["Alerts & Updates", "Appearance", "Bookmarks", "Download Management", ...]

GET /api/permissions

Every permission requested by live Chrome and Edge listings (the stores whose manifests StoreTally reads), with how many request it, most common first. Use the names as the permission filter.

[ { "permission": "storage", "count": 180000 }, { "permission": "tabs", "count": 95000 }, ... ]

The summary, category and permission lists are computed on a schedule rather than on each request, so they can trail the listings by up to about a day.

Examples