StoreRadar API
REST API for accessing Shopify store intelligence data.
Authentication
All requests require an API token passed in the Authorization header.
Create and manage API tokens from Account Settings → API Tokens.
Note: Sign in to see your API token in the examples below.
Note: Requests without a valid token receive a
401 Unauthorized response.
Base URL
All API endpoints are relative to:
https://storeradar.io/api/v1
Authentication
Header format
Authorization: token YOUR_API_TOKEN
Example request
curl -H "Authorization: token YOUR_API_TOKEN" \
"https://storeradar.io/api/v1/stores?domain=allbirds.com"Get Store
Look up a Shopify store by domain and return its full profile including apps, technologies, contacts, and theme data.
GET
/api/v1/stores
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
domain |
string | Yes | The store domain (e.g. allbirds.com) |
account_id |
integer | No | Account to use (for multi-account users) |
Behavior
| Scenario | Status | Result |
|---|---|---|
| Store already revealed | 200 | Returns store data. No credits charged. |
| Store exists, not revealed | 200 | Reveals store (1 credit), returns data. |
| Store not in database | 202 | Starts crawl. Returns job_id. |
| Currently being crawled | 202 | Returns processing status. |
| Not a Shopify store | 404 | Store could not be analyzed. |
Request
curl -H "Authorization: token YOUR_API_TOKEN" \
"https://storeradar.io/api/v1/stores?domain=allbirds.com"Success Response (200)
{
"store": {
"id": 123,
"canonical_host": "allbirds.com",
"name": "Allbirds",
"storeradar_score": 92,
"seo_lite_score": 78,
"lead_score": 85,
"product_count": 142,
"collections_count": 12,
"has_blog": true,
"locale": "en",
"currency": "USD",
"country_codes": ["US", "CA", "GB"],
"languages": ["en"],
"industry": "Fashion & Apparel",
"pricing_plan": "Shopify Plus",
"password_protected": false,
"tags": ["sustainable", "footwear"],
"social_media": {
"instagram": "https://instagram.com/allbirds",
"twitter": "https://twitter.com/allbirds"
},
"emails": [
{
"value": "help@allbirds.com",
"verified": true,
"valid": true,
"verification_status": "valid",
"generic": true
}
],
"theme": {
"name": "Dawn",
"version": "12.0.0",
"pricing_type": "paid"
},
"apps": [
{
"id": 1,
"name": "Klaviyo",
"slug": "klaviyo",
"url": "https://apps.shopify.com/klaviyo",
"tagline": "Email, SMS & Push for eCommerce",
"primary_category": "Marketing",
"rating": 4.6,
"reviews_count": 2841,
"pricing_summary": "Free to install"
}
],
"apps_count": 1,
"technologies": [
{
"id": 1,
"name": "Google Analytics",
"slug": "google-analytics",
"categories": ["Analytics"],
"groups": ["Marketing"]
}
],
"technologies_count": 1,
"domain_expires_at": "2026-05-15",
"lead": {
"id": 456,
"revealed_at": "2024-12-15T10:30:00Z",
"stage_key": "new",
"status": "charged"
}
}
}Processing Response (202)
{
"status": "processing",
"job_id": "3b409764-0fd8-46e9-b834-9046b8ffea18",
"message": "Store is being analyzed. Poll again."
}Response Fields
The store object includes:
| Field | Type | Description |
|---|---|---|
id | integer | Unique store identifier |
canonical_host | string | Primary domain |
name | string | Store name |
storeradar_score | integer | Quality score (0-100) |
seo_lite_score | integer | SEO score (0-100) |
lead_score | integer | Lead quality score |
product_count | integer | Number of products |
collections_count | integer | Number of collections |
articles_count | integer | Number of blog articles |
pages_count | integer | Number of pages |
has_blog | boolean | Whether store has a blog |
locale | string | Primary locale |
currency | string | Store currency |
country_codes | array | Target country codes |
languages | array | Supported languages |
industry | string | Detected industry |
pricing_plan | string | Shopify pricing plan |
password_protected | boolean | Store is password protected |
password_protected_at | datetime | When protection was detected |
tags | array | Store tags/labels |
emails | array | Contact emails with verification |
phone_numbers | array | Contact phone numbers |
social_media | object | Social media links |
theme | object | Shopify theme details |
apps | array | Installed Shopify apps (id, name, slug, url, tagline, category, rating, reviews_count, pricing) |
apps_count | integer | Number of apps installed |
technologies | array | Detected technologies (with categories/groups) |
technologies_count | integer | Number of technologies |
people | array | Key contacts/employees |
pixels | array | Tracking pixels detected |
domain_created_at | datetime | Domain registration date |
domain_expires_at | datetime | Domain expiry date |
first_seen_at | datetime | First detection date |
last_detected_at | datetime | Most recent detection |
lead | object | Lead status for your account |
Polling for Results
# 1. First request - store not in DB
curl -H "Authorization: token YOUR_API_TOKEN" \
"https://storeradar.io/api/v1/stores?domain=newstore.com"
# => 202 {"status":"processing","job_id":"..."}
# 2. Wait 15-30 seconds, poll again
curl -H "Authorization: token YOUR_API_TOKEN" \
"https://storeradar.io/api/v1/stores?domain=newstore.com"
# => 200 {"store": {...}} when ready
# => 202 if still processing
# => 404 if crawl failedResponse Codes
| Code | Meaning | Description |
|---|---|---|
| 200 | OK | Store found and revealed successfully. |
| 202 | Accepted | Store is being analyzed. Poll again. |
| 401 | Unauthorized | Missing or invalid API token. |
| 402 | Payment Required | Insufficient credits. |
| 404 | Not Found | Store not found or crawl failed. |
| 422 | Unprocessable | Invalid or missing domain parameter. |
Error Handling
All errors return a JSON object with error and message fields.
Error Responses
402 - Insufficient credits
{
"error": "Insufficient credits",
"message": "Insufficient credits to reveal store"
}422 - Invalid domain
{
"error": "Invalid domain",
"message": "domain parameter is required"
}404 - Store not found
{
"error": "Store not found",
"message": "Unable to analyze this domain"
}