- Auth: none
- Cost: Free; no key. 30 requests a minute per IP.
Use it for aggregate charts and landing pages. It never names a store; for stores, use a key.
No key. Recomputed daily over every store we scanned. Per app category: how many stores run any
app in it, and its ten most installed apps, each broken down by region and top-level industry
(unknown for stores without a country or an industry reading yet). 30 requests a minute per IP;
cacheable for an hour.
Request
curl "https://api.installgraph.com/v1/public/stats?category=email-sms"
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
category |
Category | No | One of 28 values (see Data model). |
Response
200. The example's stores are fictional.
{
"data": {
"computedAt": "2026-11-06T02:00:00.000Z",
"companies": 412806,
"byRegion": {
"north-america": 221034,
"europe": 109877,
"asia-pacific": 52410,
"latin-america": 14988,
"middle-east-africa": 9877,
"unknown": 4620
},
"byIndustry": {
"Apparel": 88312,
"Beauty & Fitness": 51207,
"unknown": 30114
},
"regions": {
"north-america": "North America",
"europe": "Europe"
},
"categories": [
{
"category": "email-sms",
"companies": 198440,
"byRegion": {
"north-america": 112307,
"europe": 50122
},
"byIndustry": {
"Apparel": 47210
},
"apps": [
{
"slug": "klaviyo",
"name": "Klaviyo",
"category": "email-sms",
"companies": 96120,
"share": 0.2328,
"byRegion": {
"north-america": 58014
},
"byIndustry": {
"Apparel": 24877
}
}
]
}
]
},
"meta": {
"requestId": "6f1c2a9e-4b7d-4e2a-9c51-0d3b8e7f2a14"
}
}
Fields
| Field | Type | Description |
|---|---|---|
data.computedAt |
string (date-time) | |
data.companies |
integer | |
data.byRegion |
Breakdown | Store counts by region id or industry name, with unknown for stores lacking one. |
data.byIndustry |
Breakdown | Store counts by region id or industry name, with unknown for stores lacking one. |
data.regions |
object | Region id to name. |
data.categories |
object[] | |
data.categories[].category |
Category | One of 28 values (see Data model). |
data.categories[].companies |
integer | |
data.categories[].byRegion |
Breakdown | Store counts by region id or industry name, with unknown for stores lacking one. |
data.categories[].byIndustry |
Breakdown | Store counts by region id or industry name, with unknown for stores lacking one. |
data.categories[].apps |
object[] | |
data.categories[].apps[].slug |
string | |
data.categories[].apps[].name |
string | |
data.categories[].apps[].kind |
string | One of shopify-app, web. |
data.categories[].apps[].companies |
integer | |
data.categories[].apps[].share |
number | Share of all stores counted, 0–1. |
data.categories[].apps[].byRegion |
Breakdown | Store counts by region id or industry name, with unknown for stores lacking one. |
data.categories[].apps[].byIndustry |
Breakdown | Store counts by region id or industry name, with unknown for stores lacking one. |
Errors
| Status | Code | Meaning | What to do |
|---|---|---|---|
| 404 | not_found |
No such endpoint, app, or store (or not scanned yet). | Check the slug or domain. Store 404s are free within the lookup-miss allowance. |
| 429 | rate_limited |
Too many requests this minute. | Wait Retry-After seconds, then retry. |
All codes: Errors.