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
GETrequests. No key, no sign-up. - JSON field names are camelCase. A field with no value is
null, not left out. - Stores are numbered:
0Chrome,1Edge,2Firefox,3Apple,4Google Play. - Dates in query parameters are
yyyy-MM-dd. A value that cannot be read (a malformed date or number) returns400. - 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.
| Parameter | Meaning |
|---|---|
| Which listings | |
platform | Store number (0-4). Leave it out for all stores. |
q | Search text. Matches the name and developer; from 3 characters it also matches the description on Chrome, Edge and Firefox. |
category | Exact category name, as listed by /api/categories. |
type | Kind of listing: 1 extension, 2 theme, 3 app, 0 unknown. |
featured | true for listings the store currently features (Chrome, Edge and Firefox). |
| Size and ratings | |
minInstalls, maxInstalls | Bounds on the store's usage figure (users, installs or daily users). Listings with no figure - all of Apple - drop out when either is set. |
rated | yes for listings with a rating, no for listings with none. |
minRating, maxRating | Bounds on the average rating (0-5). Unrated listings drop out. |
minRatingCount, maxRatingCount | Bounds on the number of ratings. Unrated listings drop out. |
| Versions and dates | |
minVersion, maxVersion | Bounds on the version, compared as versions (2.10 is above 2.9). Versions that do not start with a number drop out. |
updatedAfter, updatedBefore | The store's last-updated date, inclusive at both ends. Listings with no date drop out. |
firstSeenAfter, firstSeenBefore | When StoreTally first found the listing, inclusive. Not a creation date - see Methodology. |
| Delisted listings | |
includeDelisted | true to include listings that have left their store. |
delistedOnly | true for delisted listings only. |
delistedAfter, delistedBefore | When the listing left its store, inclusive. Either one implies delisted listings only. |
| Permissions and access (Chrome and Edge manifests) | |
manifestVersion | 2 or 3. |
permission | Exact permission name, as listed by /api/permissions (case-sensitive). |
hostAccess | all for listings that can reach every website. Other values are ignored. |
minAccessLevel | Access 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. |
dir | desc (default) or asc. Missing values sort last either way. |
page | Page number, from 1 (default 1). |
pageSize | Rows 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"
}
]
}
| Field | Meaning |
|---|---|
total, page, pageSize | Rows matching the filters, this page's number, and the page size actually used. |
id, s | The store's id for the listing, and its URL slug where the store has one. |
n, d, c | Name, developer, category. |
t, p | Kind of listing (as type above) and store number. |
i | The 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. |
wd | Weekly downloads (Firefox only). |
cd | Creation date, where the store publishes one. |
r, rc | Average rating and number of ratings; both null when unrated. |
v, u | Version, and the store's last-updated date. |
fs, du | When StoreTally first found the listing, and when it left its store (null while live). UTC. |
al | Access level 1-4 as minAccessLevel above; 0 when there is no manifest to judge. |
ic, f | Icon URL, and whether the store currently features it. |
ds | The first 200 characters of the description. |
sp | The usage figure over the last 90 days as [daysAgo, value] pairs, oldest first. On Apple it is the rating count. |
g1, g7, g30, g365 | Change in the usage figure per day, week, month and year. null until there is enough history. |
g1p … g365p | The same change as a percentage. |
g1b … g365b | The reading each change is measured from. |
rg1, rg7, rg1p, rg7p, rg1b, rg7b | The same for the number of ratings, per day and per week (not on Apple, whose usage figure already is its rating count). |
lc | When 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 } ]
}
knownevery listing ever found;crawledread at least once;livecrawled and still in its store;delistedgone from its store;ratedlive with a rating;noVersionKeylive with a version that cannot be compared;snapshotshistory records kept;pendinglistings queued to be read.bucketslive listings by usage figure:under 100,100-1K,1K-10K,10K-100K,100K-1M,1M+andnot shown.catsthe 10 biggest categories;yearslive 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
- /api/extensions?platform=0&pageSize=5
- /api/extensions?platform=2&q=password&minRating=4.5&minRatingCount=100&sort=ratingcount
- /api/extensions?platform=0&permission=cookies&hostAccess=all&minInstalls=100000
- /api/extensions?platform=1&sort=growth7d&pageSize=20
- /api/extensions?platform=0&delistedAfter=2026-09-01&sort=installs
- /api/extensions.csv?platform=0&updatedBefore=2023-01-01&minInstalls=10000
- /api/summary
- /api/categories?platform=2
- /api/permissions