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.
Working with Claude, Cursor, or another AI assistant? The same data is also available through the Rankbase MCP server, which your assistant can query directly without any API client code.
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.
GET /apps to look up the appId of each of your apps.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 client (by IP address). 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) |
Lists every Shopify app in your team, including each app's id — the
{appId} required by the app-scoped endpoints (keywords and installs; popular keywords is global and takes none). Call this endpoint first
to discover your app IDs: they are Rankbase-internal and do
not match your app's Shopify Partner app ID or App Store handle.
curl -H "Authorization: Bearer rb_your_api_key" \ "https://rankbase.io/api/v1/apps"
| Field | Type | Description |
|---|---|---|
total_apps | integer | Number of apps in your team. |
apps[].id | integer | The app's Rankbase ID. Use this as {appId} in the keywords and installs endpoints. |
apps[].name | string | The app's display name. May be null. |
apps[].handle | string | The app's Shopify App Store handle, derived from its listing URL (e.g. example-product-labels). May be null. |
apps[].url | string | The app's Shopify App Store listing URL. |
apps[].shopify_app_id | string | The numeric app ID from your Shopify Partner dashboard, if set in the app's settings. Useful for joining with Shopify Partner API data. May be null. |
apps[].analytics_connected | boolean | Whether Google Analytics is connected. When false, the keywords and installs endpoints return 422 for this app. |
apps[].created_at | string | ISO 8601 timestamp of when the app was added to Rankbase. |
{
"total_apps": 2,
"apps": [
{
"id": 30,
"name": "Example Product Labels",
"handle": "example-product-labels",
"url": "https://apps.shopify.com/example-product-labels",
"shopify_app_id": "1234567890",
"analytics_connected": true,
"created_at": "2024-04-01T09:30:00+00:00"
},
{
"id": 31,
"name": "Example Bulk Editor",
"handle": "example-bulk-editor",
"url": "https://apps.shopify.com/example-bulk-editor",
"shopify_app_id": null,
"analytics_connected": false,
"created_at": "2024-05-12T14:05:00+00:00"
}
]
}
Find your app's appId with GET /apps.
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, device — "desktop", "mobile", "tablet", or "unknown"), 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",
"device": "desktop"
},
{
"position": 2,
"date": "2025-02-05",
"locale": "en",
"search_type": "search",
"country": "US",
"device": "mobile"
}
],
"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",
"device": "desktop"
}
],
"averagePosition": 2,
"latestPosition": 3,
"score": 72
}
},
"most_important_keywords": {
"variant image": 28,
"color swatch": 15
}
}
Find your app's appId with GET /apps.
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, country (ISO 2-letter code), and device ("desktop", "mobile", "tablet", or "unknown"). |
{
"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",
"device": "desktop"
}
]
},
{
"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.
Every popular search keyword on the Shopify App Store, discovered from the store's own
search autocomplete (a keyword appears there only when merchants actually search it).
This is a global dataset: it is the same for every team, is not limited
to your apps, and takes no {appId}. Use it for keyword research: finding
search phrases to target in your listing or to add to your tracked keywords.
The full list is returned in one response (no pagination). Use q to
filter by substring.
| Parameter | Type | Required | Description |
|---|---|---|---|
q | string | no | Case-insensitive substring filter, e.g. q=email matches "email marketing" and "abandoned cart email". |
curl -H "Authorization: Bearer rb_your_api_key" \ "https://rankbase.io/api/v1/popular-keywords?q=variant"
| Field | Type | Description |
|---|---|---|
total_keywords | integer | Number of keywords returned (after the q filter). |
keywords[].keyword | string | The search phrase, lowercase, exactly as merchants type it. |
keywords[].source | string | autocomplete (a real merchant search) or manual (added by the Rankbase team). |
keywords[].first_seen_at | string | ISO 8601 timestamp of when Rankbase first discovered the keyword. May be null. |
keywords[].last_seen_at | string | ISO 8601 timestamp of the latest discovery run that still returned it. May be null. |
{
"total_keywords": 2,
"keywords": [
{
"keyword": "variant image",
"source": "autocomplete",
"first_seen_at": "2026-07-11T06:12:00+00:00",
"last_seen_at": "2026-07-11T06:12:00+00:00"
},
{
"keyword": "variant images",
"source": "autocomplete",
"first_seen_at": "2026-07-11T06:12:00+00:00",
"last_seen_at": "2026-07-11T06:12:00+00:00"
}
]
}
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."), or the URL doesn't match any endpoint, e.g. a non-numeric appId ("Not found.") | "App not found." |
405 | HTTP method not supported by the endpoint (all current endpoints are GET) | "Method not allowed." |
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."
}