The StoreCensus API provides programmatic access to comprehensive e-commerce intelligence data. Our RESTful API delivers structured, reliable data about online stores and businesses to power your applications, integrations, and workflows.
Whether you're building lead generation tools, enriching CRM data, conducting market research, or developing competitive analysis platforms, our API provides the foundation for data-driven e-commerce insights.
All API responses are returned in JSON format with consistent structure, comprehensive error handling, and enterprise-grade reliability. Authentication is handled via Bearer tokens with built-in rate limiting to ensure optimal performance for all users.
The StoreCensus API uses Bearer Token Authentication. You must include your API key in the Authorization header of all requests.
API keys can be generated on the API page of your StoreCensus account after logging in.
| Status Code | Error | Description |
|---|---|---|
| 401 | {'error': 'Missing API key'} | No API key was provided in the request |
| 401 | {'error': 'Invalid Authorization header format. Expected: Bearer your.api.key'} | The Authorization header format is incorrect |
| 401 | {'error': 'API key cannot be empty'} | An empty API key was provided |
| 401 | {'error': 'Invalid API key or inactive subscription'} | The API key is invalid or the subscription is not active |
The StoreCensus API implements rate limiting based on your subscription plan. Rate limits are applied on a per-API-key basis.
| Plan | Rate Limit |
|---|---|
| Professional | 6 requests per second |
| Enterprise | 30 requests per second |
The StoreCensus API uses standard HTTP status codes to indicate the success or failure of requests. All errors are returned in a consistent JSON format.
| Status Code | Description |
|---|---|
| 400 Bad Request | The request was malformed or missing required parameters |
| 401 Unauthorized | Authentication failed or was not provided |
| 429 Too Many Requests | Rate limit exceeded |
| 500 Internal Server Error | An error occurred on the server |
All errors are returned in a consistent JSON format with an error field containing a description of the error:
| URL | GET /api/v1/website/{domain} |
| Description | Retrieve comprehensive e-commerce intelligence data for a specific website domain or lead_id.✨ Supports lead_id (integer) for direct lookup |
| Authentication | Required (Bearer token) |
| Rate Limited | Yes (based on subscription plan) |
💡 Flexible Lookup: This endpoint intelligently detects the input type. Pass a domain name (e.g., "example-store.com") for domain-based search, or pass an integer (e.g., "12345") for direct lead_id lookup. No need for separate endpoints!
| Parameter | Description |
|---|---|
domainrequired | The domain name to analyze (e.g., "example-store.com") or lead_id (e.g., "12345"). If the parameter is numeric, it will be treated as a lead_id for direct lookup. |
| Parameter | Description |
|---|---|
sectionsoptional | Comma-separated list of sections to include in the response. Available sections:basic_info,contact_info,location_info,social_media,ecommerce_info,financial_info,traffic_analytics,technical_info,apps_integrations,activity_signals,crm,data_metadata. If omitted, all sections are returned. |
The API returns comprehensive domain data organized into logical sections for enterprise-level consumption:
| URL | POST /api/v1/stores |
| Description | Retrieve filtered lists of Shopify stores with comprehensive data and cursor-based pagination |
| Authentication | Required (Bearer token) |
| Rate Limited | Yes (based on subscription plan) |
| Parameter | Type | Description |
|---|---|---|
filters | object | Filter criteria (country, vertical, apps, traffic, etc.) |
sort | object | Sort configuration with column and direction |
pageSize | number | Results per page (50-500, default: 50) |
cursor | string | Pagination cursor from previous response |
sections | array | Data sections to include (null = all sections) |
The endpoint supports 100+ filter parameters. Below is the complete reference with types, descriptions, and examples:
| Filter Parameter | Type | Description | Example |
|---|---|---|---|
| 📍 Location Filters | |||
country | string[] | Filter by country codes (ISO 3166-1 alpha-2) | ["US", "GB", "CA"] |
state | string[] | Filter by state abbreviations | ["CA", "NY", "TX"] |
| 🏢 Business Filters | |||
vertical | string[] | Filter by business vertical/industry | ["Fashion", "Electronics"] |
language | string[] | Filter by website language | ["English", "Spanish"] |
employees | (number | string)[] | Employee count range [min, max] | [10, 100] or ["10", "100"] |
websiteCreatedAt | object | Date range: {enabled, startDate, endDate} | {enabled: true, startDate: "2023-01-01", endDate: "2024-01-01"} |
websiteUpdatedAt | object | Last crawled date range | {enabled: true, startDate: "2024-01-01"} |
domainExtension | string[] | Filter by domain extension | [".com", ".co"] |
| 📧 Contact Filters | |||
contact | string[] | Filter by contact availability (email, phone) | ["email"] |
email_type | string[] | Filter by email type | ["founder_personal"] |
| 🛍️ E-commerce Filters | |||
theme | string[] | Filter by Shopify theme name | ["Dawn", "Debut"] |
currency | string[] | Filter by store currency | ["USD", "EUR"] |
productPagesMin | number | string | Minimum number of product pages | 100 or "100" |
productPagesMax | number | string | Maximum number of product pages | 1000 or "1000" |
productVariantsMin | number | string | Minimum number of product variants | 500 or "500" |
productVariantsMax | number | string | Maximum number of product variants | 5000 or "5000" |
avgProductPriceMin | number | string | Minimum average product price | 50 or "50" |
avgProductPriceMax | number | string | Maximum average product price | 200 or "200" |
| 💰 Financial Filters | |||
estimatedSales | (number | string)[] | Estimated monthly sales range [min, max] | [5000, 10000] or ["5000", "10000"] |
technologySpend | (number | string)[] | Technology spend range [min, max] | [1000, 5000] or ["1000", "5000"] |
estimatedVisits | (number | string)[] | Estimated monthly visits range [min, max] | [5000, 100000] or ["5000", "100000"] |
| 📊 Traffic Filters | |||
totalTrafficMin | number | string | Minimum total monthly traffic | 10000 or "10000" |
totalTrafficMax | number | string | Maximum total monthly traffic | 100000 or "100000" |
organicTrafficMin | number | string | Minimum organic traffic | 5000 or "5000" |
organicTrafficMax | number | string | Maximum organic traffic | 50000 or "50000" |
paidTrafficMin | number | string | Minimum paid traffic | 1000 or "1000" |
paidTrafficMax | number | string | Maximum paid traffic | 10000 or "10000" |
| 📱 App Filters | |||
apps | number[] | string[] | Filter by installed app IDs (integers or strings, converted to strings internally) | [12345, 67890] |
appSelectionMode | object | Control app filter behavior per app ID: {"appId": "yes"|"no"}. "yes" = has app installed (default), "no" = does NOT have app installed | {"12345": "yes", "67890": "no"} |
verifiedAppInstalls | string[] | Filter for verified app installations only (use ["true"]) | ["true"] |
uninstalledAppsOnly | string[] | Filter for uninstalled apps only (use ["true"]) | ["true"] |
installedDateFrom | string | App installed start date (YYYY-MM-DD) | "2024-01-01" |
installedDateTo | string | App installed end date (YYYY-MM-DD) | "2024-12-31" |
uninstalledDateFrom | string | App uninstalled start date (YYYY-MM-DD) | "2025-12-10" |
uninstalledDateTo | string | App uninstalled end date (YYYY-MM-DD) | "2024-06-30" |
| ⚙️ Technology Filters | |||
trackingAnalytics | string[] | Filter by tracking/analytics technologies | ["Google Analytics", "Facebook Pixel"] |
trackingAnalyticsToggle | object | Include/exclude: {tech: boolean} | {"Google Analytics": true} |
| ♿ Accessibility Filters | |||
accessibility | string[] | Accessibility metrics to filter by | ["performance", "seo"] |
accessibilityToggle | object | Enable metrics: {metric: boolean} | {"performance": true} |
accessibilityValues | object | Threshold values: {metric: number} | {"performance": 90} |
accessibilityOperators | object | Operators: {metric: "gte"|"lte"|"eq"} | {"performance": "gte"} |
| ⚡ Activity Signals Filters | |||
activityDelta | string | Time period: "7", "30", or "90" days | "7" |
activity_events_* | boolean | Event filters (any, app_installed, app_uninstalled, tech_installed, tech_uninstalled, products_changed, emails_changed, theme_changed) | true |
activity_freshness_* | object | Date filters: {preset: "last_7_days"} or {min, max} | {preset: "last_7_days"} |
activity_growth_*_delta_min | number | string | Minimum growth delta (product_page, variant, tech, average_price, shopify_app_spend, tech_spend, traffic, app_installs, app_uninstalls, email_new) | 10 or "10" |
activity_growth_*_delta_max | number | string | Maximum growth delta (product_page, variant, tech, average_price, shopify_app_spend, tech_spend, traffic, app_installs, app_uninstalls, email_new) | 100 or "100" |
| 📋 CRM & Export Filters | |||
crm_status | string[] | Filter by CRM status | ["qualified", "contacted"] |
crm_lists | string[] | Filter by CRM list membership | ["Hot Leads", "Follow Up"] |
crm_has_note | boolean | Filter stores with notes | true |
crm_ratings | number[] | Filter by star ratings (1-5) | [4, 5] |
crm_has_reminder | boolean | Filter stores with active reminders | true |
website_following | boolean | Filter followed stores | true |
show_exported | boolean | Show only exported stores | true |
exclude_exported | boolean | Exclude exported stores | true |
exported_date_range | object | Filter by export date: {enabled, startDate, endDate} | {enabled: true, startDate: "2024-01-01"} |
Control which data sections are included in the response:
This endpoint uses cursor-based pagination for efficient traversal of large result sets:
cursor parameternextCursor from the previous responsehasMore is false, you've reached the endsections parameter| URL | POST /api/v1/enrich |
| Description | Enrich lead data by retrieving contact information (emails and phone numbers) for specified lead_ids. Credits are only deducted for leads that have contact information available. |
| Authentication | Required (Bearer token) |
| Rate Limited | Yes (based on subscription plan) |
💡 Smart Credit Usage: This endpoint only deducts credits for leads that contain contact information (at least one email or phone number). Leads without contact info are returned but don't consume credits, making this endpoint cost-effective for bulk enrichment.
| Parameter | Type | Description |
|---|---|---|
lead_idsrequired | array of integers | Array of lead_ids to enrich. Maximum 1000 lead_ids per request. Each lead_id must be a positive integer. |
| Field | Description |
|---|---|
success | Boolean indicating if the request was successful |
results | Array of enrichment results for each lead_id found |
results[].lead_id | The lead ID |
results[].domain | The store's domain name |
results[].emails | Array of email objects or null if no emails found |
results[].phone | Phone number(s) as semicolon-separated string, or null if no phones found |
results[].has_contact_info | Boolean indicating if this lead has any contact information |
summary.total_requested | Total number of lead_ids requested |
summary.stores_with_contact_info | Number of stores that had contact information |
summary.stores_without_contact_info | Number of stores without contact information |
summary.already_unlocked | Number of stores that were already unlocked (no credit charged) |
summary.newly_unlocked | Number of stores newly unlocked in this request |
summary.credits_deducted | Number of credits deducted (1 per newly unlocked store only) |
credits.remaining | Total credits remaining after this request |
credits.subscription | Subscription credits remaining |
credits.addon | Add-on credits remaining |
unlocked_contact_info table when contact info is retrieved for the first timecredits.remaining) so you can track usage| Status Code | Error | Description |
|---|---|---|
| 400 | lead_ids must be a non-empty array | The lead_ids parameter is missing or invalid |
| 400 | Maximum 1000 lead_ids per request | Too many lead_ids provided in a single request |
| 402 | Insufficient credits available | Not enough credits to complete the enrichment |