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,payments_info (Professional+),shipping_info (Professional+). 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 e-commerce stores (Shopify and WooCommerce) 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) |
selectionLogicNEW | object | Controls how multi-value filters (apps, technology, payments, shipsTo, contact, shopifyPlan, platformFeatures) are combined. Shape: {"mode": "include"|"exclude", "operator": "or"|"and"}. Defaults to {"mode":"include","operator":"and"}. See the Selection Logic section for full details. |
historicalConstraintsNEW | object[] | Timing filters — filter by WHEN an attribute first appeared, changed, or was active. Each constraint is an object with attribute, value, event, dateFrom, dateTo. Multiple constraints are ANDed together. See the Timing Filters section for full details. |
The endpoint supports 100+ filter parameters. Below is the complete reference with types, descriptions, and examples.
Shopify = Shopify stores onlyPro = Requires Professional plan or higher
| Filter Parameter | Type | Description | Example |
|---|---|---|---|
| 🎛️ Selection Logic — top-level body parameter (not inside filters) | |||
selectionLogicNEW | object | Controls how multi-value filters are combined for eligible keys: appstechnologypaymentsshipsTocontactshopifyPlanplatformFeaturesmode: "include" (default) — stores must match; "exclude" — stores must NOT match.operator: "and" (default) — all selected values must match; "or" — any one value must match. | {"mode":"include","operator":"and"}{"mode":"exclude","operator":"or"} |
| ⏱️ Timing Filters — historicalConstraints — top-level body parameter (not inside filters) | |||
historicalConstraintsNEW | object[] | Filter by WHEN an attribute first appeared, changed, or was active. Multiple constraints are combined with AND logic. Each object has: attribute (required): appstechnologiespayment_methodsshipping_countriesplatform_planmarkets_procheckout_extensionsvalue (required): specific value, "any_selected", or "__fixed__" for boolean attrs.event (required): first_became_truechanged_duringactive_duringremoved_during(removed_during not available for platform_plan markets_pro checkout_extensions)dateFrom / dateTo (optional): ISO date YYYY-MM-DD — at least one required. | [{
"attribute": "apps",
"value": "15",
"event": "first_became_true",
"dateFrom": "2024-01-01",
"dateTo": "2024-12-31"
}] |
| 🖥️ Platform Filters | |||
platform | string[] | Filter by ecommerce platform. Defaults to Shopify only if omitted. Values: ShopifyWooCommerce | ["Shopify", "WooCommerce"] |
| 📱 App Filters | |||
apps | number[] | string[] | Filter by installed app IDs (numeric). Use the top-level selectionLogic parameter to control include/exclude and AND/OR behaviour. Use the /api/v1/apps endpoint to look up app IDs by name. | [15, 42, 89] |
verifiedAppInstalls | string[] | Filter for verified app installations only | ["true"] |
uninstalledAppsOnly | string[] | Filter for uninstalled apps only | ["true"] |
installedDateFrom | string | App first installed on or after this date (YYYY-MM-DD) | "2024-01-01" |
installedDateTo | string | App first installed on or before this date (YYYY-MM-DD) | "2024-12-31" |
uninstalledDateFrom | string | App uninstalled on or after this date (YYYY-MM-DD) | "2025-01-01" |
uninstalledDateTo | string | App uninstalled on or before this date (YYYY-MM-DD) | "2025-06-30" |
| 🏷️ Platform Attributes — Shopify only, Pro | |||
shopifyPlanShopifyPro | string[] | Filter by Shopify subscription plan. Pass one or more values — multiple values always use OR logic (a store can only have one plan at a time). Use the top-level selectionLogic parameter to control include/exclude mode only.Accepted values: basicplus | ["basic", "plus"] |
platformFeaturesShopifyPro | string[] | Filter by Shopify checkout capabilities and store type. Use the top-level selectionLogic parameter to control include/exclude.Store Type: physical_productsdigital_productsMarkets: markets_produties_includedCheckout Features: custom_brandingcustom_fontscustom_colorscheckout_rulescheckout_extensions | ["physical_products", "checkout_extensions"] |
| 💳 Payment Filters — Shopify only, Pro | |||
paymentsShopifyPro | string[] | Filter by active payment methods. Use the top-level selectionLogic parameter to control include/exclude and AND/OR behaviour.Buy Now Pay Later: klarnaaffirmafterpaysezzlezipbread_paykatapultProcessors: shopify_paymentsstripeamazon_payglobal_eWallets: shop_paypaypalapple_paygoogle_paycash_app | ["shop_pay", "klarna"] |
| 🚚 Shipping Filters — Shopify only, Pro | |||
shippingScopeShopifyPro | string[] | Filter by geographic shipping reach. Values: domesticinternationalglobal | ["international", "global"] |
shipsToShopifyPro | string[] | Filter by specific destination countries the store ships to. Use the top-level selectionLogic parameter to control include/exclude and AND/OR behaviour. Values: uscagbaude | ["us", "ca", "gb"] |
| 📍 Location Filters | |||
country | string[] | Filter by country codes (ISO 3166-1 alpha-2) | ["US", "GB", "CA"] |
state | string[] | Filter by US state abbreviations (only applicable when country includes US) | ["CA", "NY", "TX"] |
| 📧 Communication Channel Filters | |||
contact | string[] | Filter stores that have specific contact or social media channels. Use the top-level selectionLogic parameter to control include/exclude and AND/OR behaviour.Values: emailphoneinstagramfacebooktiktoklinkedinyoutubepinterestxtwitterWhatsAppSnapchatyelpvimeo | ["email", "instagram"] |
| ⚡ Activity Signals Filters — Pro | |||
activityDeltaPro | string | Time window for growth metrics: "7" (last 7 days) or "30" (last 30 days) | "7" |
activity_events_app_installedPro | boolean | Store had an app installed in the last 7 days | true |
activity_events_app_uninstalledPro | boolean | Store had an app uninstalled in the last 7 days | true |
activity_events_tech_installedPro | boolean | Store had a technology installed in the last 7 days | true |
activity_events_tech_uninstalledPro | boolean | Store had a technology uninstalled in the last 7 days | true |
activity_events_products_changedPro | boolean | Store had product count changes in the last 7 days | true |
activity_events_emails_changedPro | boolean | Store had email changes in the last 7 days | true |
activity_events_theme_changedPro | boolean | Store changed its theme in the last 7 days | true |
activity_freshness_last_activity_atPro | object | Freshness filter for last activity date. Format: {preset: "7 days"} or {min, max} | {"preset": "7 days"} |
activity_freshness_last_app_event_atPro | object | Freshness filter for last app install/uninstall event | {"preset": "30 days"} |
activity_freshness_last_email_found_atPro | object | Freshness filter for when the last email was found | {"preset": "90 days"} |
activity_freshness_last_product_update_atPro | object | Freshness filter for last product update | {"preset": "7 days"} |
activity_freshness_last_technology_change_atPro | object | Freshness filter for last technology change | {"preset": "30 days"} |
activity_freshness_last_theme_publish_atPro | object | Freshness filter for last theme publish | {"preset": "7 days"} |
activity_growth_product_page_delta_minPro | number | string | Minimum product page count change in the selected time window | 10 |
activity_growth_product_page_delta_maxPro | number | string | Maximum product page count change in the selected time window | 100 |
activity_growth_variant_delta_minPro | number | string | Minimum variant count change | 50 |
activity_growth_variant_delta_maxPro | number | string | Maximum variant count change | 500 |
activity_growth_traffic_delta_minPro | number | string | Minimum estimated visits change | 1000 |
activity_growth_traffic_delta_maxPro | number | string | Maximum estimated visits change | 50000 |
activity_growth_app_installs_delta_minPro | number | string | Minimum number of app installs in the time window | 1 |
activity_growth_app_uninstalls_delta_minPro | number | string | Minimum number of app uninstalls in the time window | 1 |
activity_growth_email_new_delta_minPro | number | string | Minimum number of new emails found in the time window | 1 |
activity_growth_email_new_delta_maxPro | number | string | Maximum number of new emails found in the time window | 10 |
| 📋 CRM Filters — Pro | |||
crm_statusPro | string[] | Filter by CRM status | ["qualified", "contacted"] |
crm_listsPro | number[] | Filter by CRM list IDs | [1, 2, 3] |
crm_has_notePro | boolean | Filter stores that have CRM notes | true |
crm_ratingsPro | number[] | Filter by star ratings (1–5) | [4, 5] |
crm_has_reminderPro | boolean | Filter stores with active reminders | true |
| 📤 Synced & Export History Filters | |||
show_exported | boolean | Show only stores that have been synced or exported | true |
exclude_exported | boolean | Exclude stores that have been synced or exported | true |
exported_date_range | object | Filter by export date range: {enabled: true, startDate: "YYYY-MM-DD", endDate: "YYYY-MM-DD"} | {enabled:true,startDate:"2024-01-01"} |
website_following | boolean | Filter stores you are following | true |
| 💰 Financial Filters | |||
estimatedSales | string[] | Monthly revenue range as [min, max] in USD (numeric strings) | ["10000", "100000"] |
technologySpendPro | string[] | Monthly technology spend range as [min, max] in USD (numeric strings) | ["500", "5000"] |
| 📊 Traffic Filters | |||
estimatedVisits | string[] | Monthly visit range as [min, max] (numeric strings) | ["10000", "500000"] |
totalTrafficMin | number | string | Minimum total monthly traffic | 5000 |
totalTrafficMax | number | string | Maximum total monthly traffic | 500000 |
organicTrafficMin | number | string | Minimum monthly organic search traffic | 1000 |
organicTrafficMax | number | string | Maximum monthly organic search traffic | 100000 |
| 📦 Product Filters | |||
productPagesMin | number | string | Minimum number of product pages | 100 |
productPagesMax | number | string | Maximum number of product pages | 1000 |
productVariantsMin | number | string | Minimum number of product variants | 500 |
productVariantsMax | number | string | Maximum number of product variants | 5000 |
avgProductPriceMin | number | string | Minimum average product price (USD) | 50 |
avgProductPriceMax | number | string | Maximum average product price (USD) | 200 |
| 🏢 Business Filters | |||
vertical | string[] | Filter by business vertical/industry. Example values: Fashion & ApparelBeauty & Personal CareHealth & WellnessFood & BeverageElectronics & GadgetsHome & Garden and more. | ["Fashion & Apparel", "Health & Wellness"] |
language | string[] | Filter by website language (language name, e.g. English, Spanish, French) | ["English", "Spanish"] |
domainExtension | string[] | Filter by top-level domain extension (with dot) | [".com", ".co", ".io"] |
websiteCreatedAt | object | Filter by store creation date: {enabled: true, startDate: "YYYY-MM-DD", endDate: "YYYY-MM-DD"} | {enabled:true,startDate:"2020-01-01"} |
websiteUpdatedAt | object | Filter by when the store was last crawled by StoreCensus | {enabled:true,startDate:"2024-01-01"} |
| 🛍️ E-commerce Filters | |||
theme | string[] | Filter by Shopify theme name (fetched dynamically from available themes) | ["Dawn", "Debut"] |
technology | string[] | Filter by tracking/analytics technologies detected on the store. Use the top-level selectionLogic parameter to control include/exclude and AND/OR behaviour. Example values: Google AnalyticsFacebook PixelTikTok Pixel | ["Google Analytics", "Facebook Pixel"] |
currencyShopify | string[] | Filter by store currency (ISO 4217 currency code) | ["USD", "EUR", "GBP"] |
| 📣 Marketing Signal Filters — Shopify only, Pro | |||
facebookCapiShopifyPro | boolean | Filter stores that have Facebook Conversions API enabled — a strong signal the store is running paid Meta/Facebook ads | true |
Control which data sections are included in the response:
payments_info and shipping_info require a Professional plan or above. Requesting these sections on a lower-tier plan will return them as null.
⚠️ Important: The apps filter requires numeric app IDs, not app names.
To get app IDs, either:
/api/v1/apps endpoint to search for apps and get their IDsThis 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 parameterThe selectionLogic parameter controls how multi-value filters are combined when querying stores. It is a top-level body parameter (not nested inside filters).
Selection Logic applies to the following multi-value filter keys:
appstechnologypaymentsshipsTocontactshopifyPlanplatformFeatures| mode | operator | Meaning |
|---|---|---|
include | and | Store must have all selected values (default) |
include | or | Store must have at least one of the selected values |
exclude | or | Store must have none of the selected values |
exclude | and | Store must be missing all of the selected values |
The historicalConstraints parameter lets you filter stores by when an attribute changed — not just whether it exists today. It is a top-level body parameter (not nested inside filters). Multiple constraints are ANDed together.
| attribute | Tracks | value (single string) | removed_during? |
|---|---|---|---|
apps | Shopify app installs | Numeric app ID string, e.g. "12345" | ✓ Yes |
technologies | Technology stack changes | Technology name string, e.g. "Klaviyo" | ✓ Yes |
payment_methods | Payment method additions/removals | Payment key, e.g. "paypal", "apple_pay" | ✓ Yes |
shipping_countries | Shipping destination changes | ISO 3166-1 alpha-2 code, e.g. "us", "gb" | ✓ Yes |
platform_plan | Shopify plan upgrades/downgrades | Plan name, e.g. "shopify_plus", "basic" | ✗ No |
markets_pro | Shopify Markets Pro adoption | Use "__fixed__" (boolean attribute — no value selection) | ✗ No |
checkout_extensions | Checkout extension presence | Use "__fixed__" (boolean attribute — no value selection) | ✗ No |
| event | Meaning |
|---|---|
first_became_true | The attribute first appeared / was first detected within the date window |
changed_during | The attribute changed (added or removed) at any point within the date window |
active_during | The attribute was present / active at any point within the date window |
removed_during | The attribute was removed / stopped being detected within the date window. Not available for platform_plan, markets_pro, checkout_extensions. |
| URL | POST /api/v1/enrich |
| Description | Enrich lead data by retrieving contact information (emails and phone numbers) for specified lead_ids. Each email includes a deliverability score to help prioritize outreach. Credits are only deducted for leads that have contact information available. Optionally pass decision_makers: true to also unlock decision maker contacts (founders, CEOs, etc.) for each lead in the same request. |
| 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. |
decision_makers | boolean | Set to true to unlock decision maker contacts (founders, CEOs, etc.) for each lead. Results are returned in results[].decision_makers. Default: false. |
roles | array of strings | Filter decision makers by preferred role(s). Only used when decision_makers: true. Accepted values: "founder", "co-founder", "ceo", "cto", "cfo", "coo", "marketing", "sales", "operations", "product", "engineering", "design". If omitted or empty, all available roles are returned. |
max_per_store | integer | Maximum number of decision maker contacts to return per lead. Only used when decision_makers: true. Default: 1. |
include_fallback | boolean | When decision_makers: true and a roles filter is set, include the first available contact(s) (up to max_per_store) if no role match is found for a given lead. Default: true. |
Store contact info only:
With decision makers (role filter + fallback):
Store contact info only:
With decision makers (decision_makers: true):
| 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) |
summary.decision_makers_unlocked | (Only present when decision_makers: true) Number of leads for which decision maker contacts were newly persisted. Re-requesting already-unlocked leads does not increment this count. |
results[].decision_makers | (Only present when decision_makers: true) Array of decision maker contact objects for this lead, or null if none were found. Each object contains: person_id, first_name, last_name, title, email, phone, linkedin_url. |
credits.remaining | Total credits remaining after this request |
credits.subscription | Subscription credits remaining |
credits.addon | Add-on credits remaining |
credits.remaining) so you can track usage💎 Decision Maker Credits
max_per_store: 1 (default) → 2 credits per store with a decision makermax_per_store: 2 → up to 4 credits per store for decision makers| 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 |
The /api/v1/apps endpoint returns a paginated list of active Shopify apps from the shopify_apps table. This endpoint is perfect for building app directories, competitor analysis tools, or market research applications.
| URL | GET /api/v1/apps |
| Description | Returns a paginated list of active Shopify apps with category information, ratings, and metadata. |
| Authentication | Required (Bearer token) |
| Rate Limited | Yes (based on subscription plan) |
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number (1-indexed) |
pageSize | integer | 100 | Records per page (1-500, max 500) |
app_id | integer | null | Filter by specific app ID |
minRating | float | null | Minimum app rating (0-5) |
search | string | null | Search in name, description, or developer |
categoryId | integer | null | Filter by category ID |
💡 Maximum Page Size: You can retrieve up to 500 apps per request (maximum enforced by API). For optimal performance, we recommend using page sizes between 100-500 records.
| Field | Description |
|---|---|
app_id | Unique app identifier |
name | App name |
handle | URL-friendly app handle |
rating | Average rating (0-5) |
main_category | Primary category with id, name, and slug |
categories | Array of all associated categories |
pagination.total | Total number of apps matching filters |
pagination.hasMore | Boolean indicating if more pages exist |
The /api/v1/app-categories endpoint returns all Shopify app categories that have at least one active app. Use this endpoint to build category navigation, populate filter dropdowns, or discover available app categories.
| URL | GET /api/v1/app-categories |
| Description | Returns all app categories with active apps, including app counts for each category. |
| Authentication | Required (Bearer token) |
| Rate Limited | Yes (based on subscription plan) |
💡 Integration Tip: Use the category_id from this endpoint with the /apps endpoint to filter apps by category.
Combine with the /apps endpoint to build a category-filtered app directory: