Programmatically access your Shopify App Store keyword ranking data.
Rankbase is a keyword ranking and analytics platform built by a Shopify app developer, for Shopify app developers. It connects to your Google Analytics 4 property and analyzes how users discover your app through App Store search, which keywords drive the most traffic and installs, and how your search position changes over time.
The Rankbase API lets you access this data programmatically so you can build custom dashboards, automate reporting, feed data into spreadsheets, or integrate keyword insights into your own tools and workflows. For a complete overview of all features, see the Rankbase documentation.
search) from paid search ads (search_ad)..myshopify.com URL, including the source classification (App Store Search, Direct, Organic Search, etc.), date, and locale.When a user searches the Shopify App Store, Shopify sends search query data to your connected Google Analytics 4 property. Rankbase reads this GA4 data, processes it into keyword reports, and exposes it through both the web dashboard and this API. You need to have Google Analytics connected for your app in the Rankbase dashboard before the API can return data.
All API requests require a Bearer token in the Authorization header. You can create API keys from the API section in your dashboard.
Authorization: Bearer rb_your_api_key_here
API keys are scoped to your team. Any app belonging to your team can be queried using the same key. Each team can have up to 5 API keys.
All API endpoints are served under the following base URL:
https://rankbase.io/api/v1
API requests are limited to 60 requests per minute per team. Rate limit information is included in response headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per minute |
X-RateLimit-Remaining | Remaining requests in current window |
Retry-After | Seconds until the rate limit resets (only present on 429 responses) |
Retrieve keyword ranking data for a specific Shopify app. Returns all search keywords that led users to your app listing on the Shopify App Store, along with position data, country breakdown, and importance scoring.
The appId is the numeric ID of your app in Rankbase. You can find it in the URL when viewing your app in the dashboard (e.g. /app/30 means appId is 30).
| Parameter | Type | Default | Description |
|---|---|---|---|
days | integer | 90 | Number of days to look back (1-365). Ignored if start_date and end_date are provided. |
start_date | string | - | Start of date range in YYYY-MM-DD format. Must be used together with end_date. |
end_date | string | - | End of date range in YYYY-MM-DD format. Must be used together with start_date. |
installed | string | "false" | Set to "true" to return only keywords that led to install button clicks (not just listing views). |
search_type | string | "all" | Filter by search type: "all" (both organic and ads), "search" (organic only), or "search_ad" (paid ads only). |
curl -H "Authorization: Bearer rb_your_api_key" \ "https://rankbase.io/api/v1/apps/30/keywords?days=30"
curl -H "Authorization: Bearer rb_your_api_key" \ "https://rankbase.io/api/v1/apps/30/keywords?start_date=2025-01-01&end_date=2025-01-31"
curl -H "Authorization: Bearer rb_your_api_key" \ "https://rankbase.io/api/v1/apps/30/keywords?days=30&installed=true&search_type=search"
| Field | Type | Description |
|---|---|---|
app_id | integer | The app's ID in Rankbase. |
app_name | string | The app's display name. |
days | integer | The number of days covered by the report. |
installed | boolean | Whether the results are filtered to install-click keywords only. |
search_type | string | The search type filter applied ("all", "search", or "search_ad"). |
total_keywords | integer | Total number of unique keywords returned. |
keywords | object | Map of keyword string to keyword data. Each keyword contains totalUsers (number of users who searched this term), positions (array of position records with position, date, locale, search_type, country), averagePosition, latestPosition, and score. |
most_important_keywords | object | Map of keyword string to percentage (integer). Shows keywords that drive more than 2 users, ranked by their share of total traffic. |
{
"app_id": 30,
"app_name": "My Shopify App",
"days": 30,
"installed": false,
"search_type": "all",
"total_keywords": 42,
"keywords": {
"variant image": {
"totalUsers": 24,
"positions": [
{
"position": 3,
"date": "2025-02-04",
"locale": "en",
"search_type": "search",
"country": "CA"
},
{
"position": 2,
"date": "2025-02-05",
"locale": "en",
"search_type": "search",
"country": "US"
}
],
"averagePosition": 2.4,
"latestPosition": 2,
"score": 624
},
"color swatch": {
"totalUsers": 5,
"positions": [
{
"position": 1,
"date": "2025-02-07",
"locale": "fr",
"search_type": "search",
"country": "FR"
}
],
"averagePosition": 2,
"latestPosition": 3,
"score": 72
}
},
"most_important_keywords": {
"variant image": 28,
"color swatch": 15
}
}
Look up the install source for one or more specific stores. Given Shopify .myshopify.com URLs,
returns the install event(s) recorded for each store along with the source that drove the install
(App Store Search, Direct, Organic Search, Google Ads, LLM, etc.) and the search keyword or referrer that brought the user.
Useful for deep-linking from your CRM, billing portal, or support dashboard so you can investigate where any specific customer originally came from. The lookup is not time-bounded: it returns the install regardless of when it happened, as long as the event is still retained in your Google Analytics property.
Up to 50 shops can be queried in a single request by passing a comma-separated list to shop_url.
Internally the call hits Google Analytics once for the whole batch (filtered server-side), so it is
meaningfully faster than making N separate calls.
The appId is the numeric ID of your app in Rankbase. You can find it in the URL when viewing your app in the dashboard (e.g. /app/30 means appId is 30).
| Parameter | Type | Required | Description |
|---|---|---|---|
shop_url | string | yes | One or more .myshopify.com domains (without protocol or trailing slash). Use a comma to separate multiple shops. Maximum 50 per request. Examples: examplestore.myshopify.com or shop-a.myshopify.com,shop-b.myshopify.com,shop-c.myshopify.com. |
curl -H "Authorization: Bearer rb_your_api_key" \ "https://rankbase.io/api/v1/apps/30/installs?shop_url=examplestore.myshopify.com"
curl -H "Authorization: Bearer rb_your_api_key" \ "https://rankbase.io/api/v1/apps/30/installs?shop_url=shop-a.myshopify.com,shop-b.myshopify.com,shop-c.myshopify.com"
| Field | Type | Description |
|---|---|---|
app_id | integer | The app's ID in Rankbase. |
app_name | string | The app's display name. |
total_shops | integer | Number of shops in the response. Equals the number of unique shop_url values supplied in the request. |
shops | array | One entry per requested shop, in the same order as the input. Each entry contains shop_url (the queried URL, echoed back), total_installs, and installs (records sorted newest first). Each install record contains date (YYYY-MM-DD), shop_id, shop_url, source (e.g. "App Store Search", "Direct", "Organic Search", "Google Ads", "LLM (AI)"), type (sub-classification, e.g. "Organic Search", "Search Ads", "Category Page"), value (the keyword, category, or referrer URL associated with the source — may be null), locale, and country (ISO 2-letter code). |
{
"app_id": 30,
"app_name": "My Shopify App",
"total_shops": 2,
"shops": [
{
"shop_url": "shop-a.myshopify.com",
"total_installs": 1,
"installs": [
{
"date": "2026-03-14",
"shop_id": "12345678",
"shop_url": "shop-a.myshopify.com",
"source": "App Store Search",
"type": "Organic Search",
"value": "color swatch",
"locale": "en",
"country": "US"
}
]
},
{
"shop_url": "shop-b.myshopify.com",
"total_installs": 0,
"installs": []
}
]
}
If a shop has no install event in your retained Google Analytics data, that shop's entry still appears
in the response with "total_installs": 0 and an empty installs array. This is
not an error — it just means the install isn't in GA (either it predates retention, or the shop
hasn't installed your app). The API always returns one entry per requested shop_url.
All errors return a JSON object with an error field describing what went wrong.
| Status Code | Meaning | Example Message |
|---|---|---|
401 | Missing or invalid API key | "Invalid API key." |
403 | App does not belong to your team, or subscription is inactive | "This app does not belong to your team." |
404 | App not found | "App not found." |
422 | Validation error (invalid dates, invalid search_type, missing shop_url, more than 50 shop URLs in one request, Google Analytics not connected, GA auth expired, or required custom dimensions not configured) | "shop_url query parameter is required." |
429 | Rate limit exceeded (60 requests per minute) | "Too many requests. Limit: 60 per minute." |
500 | Internal server error | "Failed to fetch keyword data." |
{
"error": "Invalid API key."
}