StoreCensus

StoreCensus API Documentation

v1Base URL: https://www.storecensus.com

Introduction

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.

Authentication

The StoreCensus API uses Bearer Token Authentication. You must include your API key in the Authorization header of all requests.

Authentication Method

Authorization: Bearer your.api.key

API keys can be generated on the API page of your StoreCensus account after logging in.

Authentication Errors

Status CodeErrorDescription
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

Rate Limits

The StoreCensus API implements rate limiting based on your subscription plan. Rate limits are applied on a per-API-key basis.

Rate Limit Plans

PlanRate Limit
Professional6 requests per second
Enterprise30 requests per second

Rate Limit Implementation

  • Rate limits are calculated using a 1-second sliding window
  • When rate limits are exceeded, the API returns a 429 Too Many Requests response
  • The response includes a Retry-After header indicating when you can make another request
  • Rate limit implementation uses in-memory caching for optimal performance

Rate Limit Exceeded Response:

{'error': 'Rate limit exceeded'}

Error Handling

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 CodeDescription
400 Bad RequestThe request was malformed or missing required parameters
401 UnauthorizedAuthentication failed or was not provided
429 Too Many RequestsRate limit exceeded
500 Internal Server ErrorAn error occurred on the server

Error Response Format

All errors are returned in a consistent JSON format with an error field containing a description of the error:

{'error': 'Description of the error'}

The /website Endpoint

Endpoint Details

URLGET /api/v1/website/{domain}
DescriptionRetrieve comprehensive e-commerce intelligence data for a specific website domain or lead_id.✨ Supports lead_id (integer) for direct lookup
AuthenticationRequired (Bearer token)
Rate LimitedYes (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!

Path Parameters

ParameterDescription
domainrequiredThe 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.

Query Parameters

ParameterDescription
sectionsoptionalComma-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.

Request Examples

# Get all data for a domain
curl -X GET "https://www.storecensus.com/api/v1/website/example-store.com" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json"

# Get data by lead_id (direct lookup)
curl -X GET "https://www.storecensus.com/api/v1/website/12345" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json"

# Get only specific sections
curl -X GET "https://www.storecensus.com/api/v1/website/example-store.com?sections=basic_info,contact_info,crm" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json"

# Get specific sections by lead_id
curl -X GET "https://www.storecensus.com/api/v1/website/12345?sections=basic_info,crm" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json"

Response Format

The API returns comprehensive domain data organized into logical sections for enterprise-level consumption:

{
  "basic_info": {
    "domain": "string",
    "company_name": "string",
    "description": "string",
    "vertical": "string",
    "product_categories": "string",
    "employee_count": number,
    "website_created_at": "string",
    "language": "string",
    "password_protected": boolean
  },
  "contact_info": {
    "emails": [
      {
        "email": "string",
        "email_type": "string",
        "validated": boolean,
        "found_date": "string"
      }
    ],
    "phone": "string",
    "email_count": number,
    "phone_count": number,
    "contact_available": boolean
  },
  "location_info": {
    "address": "string",
    "city": "string",
    "state": "string",
    "country": "string",
    "zip_code": "string",
    "timezone": "string"
  },
  "social_media": {
    "facebook": "string",
    "twitter": "string",
    "instagram": "string",
    "linkedin": "string",
    "youtube": "string",
    "tiktok": "string",
    "pinterest": "string",
    "snapchat": "string",
    "whatsapp": "string",
    "telegram": "string",
    "discord": "string",
    "reddit": "string",
    "twitch": "string"
  },
  "ecommerce_info": {
    "platform": "string",
    "theme": "string",
    "currency": "string",
    "product_count": number,
    "variant_count": number,
    "average_product_price": number
  },
  "financial_info": {
    "estimated_monthly_revenue": number,
    "estimated_tech_spend": number,
    "estimated_app_spend": number,
    "estimated_technology_spend": number
  },
  "traffic_analytics": {
    "estimated_visits": number,
    "keywords": {
      "keyword": "string"
    },
    "sources": {
      "keyword": "string"
    },
    "bouncerate": {
      "num": number
    },
    "category": {
      "keyword": "string"
    },
    "globalrank": {
      "long": number
    },
    "pagepervisit": {
      "num": number
    },
    "screenshot": {
      "keyword": "string"
    },
    "timeonsite": {
      "num": number
    },
    "visits": {
      "long": number
    }
  },
  "technical_info": {
    "technologies": [
      {
        "technology_name": "string",
        "installed": boolean,
        "confidence": number,
        "effective_from": "string",
        "effective_to": "string",
        "observed_at": "string"
      }
    ],
    "last_crawled": "string"
  },
  "apps_integrations": {
    "shopify_apps": [
      {
        "app_id": number,
        "name": "string",
        "handle": "string",
        "installed": boolean,
        "last_detected": "string",
        "first_detected": "string"
      }
    ]
  },
  "activity_signals": {
    "freshness": {
      "last_activity_at": "string",
      "last_app_event_at": "string",
      "last_email_found_at": "string",
      "last_product_update_at": "string",
      "last_technology_change_at": "string",
      "last_theme_publish_at": "string"
    },
    "growth": {
      "product_page_count": {
        "delta_7d": number,
        "delta_30d": number,
        "current": number
      },
      "variant_count": {
        "delta_7d": number,
        "delta_30d": number,
        "current": number
      },
      "average_product_price": {
        "delta_7d": number,
        "delta_30d": number
      },
      "traffic_visits": {
        "delta_7d": number,
        "delta_30d": number
      },
      "email": {
        "new_7d": number,
        "new_30d": number
      },
      "technology": {
        "delta_7d": number,
        "delta_30d": number,
        "current": number
      },
      "spend_shopify_apps": {
        "delta_7d": number,
        "delta_30d": number
      },
      "spend_technology": {
        "delta_7d": number,
        "delta_30d": number
      },
      "app_events": {
        "installs_7d": number,
        "installs_30d": number,
        "uninstalls_7d": number,
        "uninstalls_30d": number
      }
    },
    "events": {
      "theme_changed_7d": boolean,
      "app_installed": boolean,
      "app_uninstalled": boolean,
      "tech_installed": boolean,
      "tech_uninstalled": boolean,
      "products_changed": boolean,
      "emails_changed": boolean
    },
    "changes": {
      "YYYY-MM-DD": [
        {
          "change_type": "string",
          "entity_type": "string",
          "entity_id": "string",
          "old_value": "any",
          "new_value": "any"
        }
      ]
    }
  },
  "crm": {
    "lists": ["string"],
    "note": "string",
    "note_updated_at": "string",
    "rating": number,
    "status": "string",
    "has_reminder": boolean,
    "exported": boolean,
    "exported_time": "string",
    "is_following": boolean
  },
  "data_metadata": {
    "lead_id": "string",
    "last_updated": "string",
    "data_source": "string",
    "api_version": "string"
  }
}

The /stores Endpoint

Endpoint Details

URLPOST /api/v1/stores
DescriptionRetrieve filtered lists of e-commerce stores (Shopify and WooCommerce) with comprehensive data and cursor-based pagination
AuthenticationRequired (Bearer token)
Rate LimitedYes (based on subscription plan)

Request Body Parameters

ParameterTypeDescription
filtersobjectFilter criteria (country, vertical, apps, traffic, etc.)
sortobjectSort configuration with column and direction
pageSizenumberResults per page (50-500, default: 50)
cursorstringPagination cursor from previous response
sectionsarrayData sections to include (null = all sections)
selectionLogicNEWobjectControls 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.
historicalConstraintsNEWobject[]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.

Complete Filters Reference

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 ParameterTypeDescriptionExample
🎛️ Selection Logic — top-level body parameter (not inside filters)
selectionLogicNEWobjectControls how multi-value filters are combined for eligible keys: appstechnologypaymentsshipsTocontactshopifyPlanplatformFeatures
mode: "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)
historicalConstraintsNEWobject[]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_extensions
value (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
platformstring[]Filter by ecommerce platform. Defaults to Shopify only if omitted. Values: ShopifyWooCommerce["Shopify", "WooCommerce"]
📱 App Filters
appsnumber[] | 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]
verifiedAppInstallsstring[]Filter for verified app installations only["true"]
uninstalledAppsOnlystring[]Filter for uninstalled apps only["true"]
installedDateFromstringApp first installed on or after this date (YYYY-MM-DD)"2024-01-01"
installedDateTostringApp first installed on or before this date (YYYY-MM-DD)"2024-12-31"
uninstalledDateFromstringApp uninstalled on or after this date (YYYY-MM-DD)"2025-01-01"
uninstalledDateTostringApp uninstalled on or before this date (YYYY-MM-DD)"2025-06-30"
🏷️ Platform Attributes — Shopify only, Pro
shopifyPlanShopifyProstring[]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"]
platformFeaturesShopifyProstring[]Filter by Shopify checkout capabilities and store type. Use the top-level selectionLogic parameter to control include/exclude.
Store Type: physical_productsdigital_products
Markets: markets_produties_included
Checkout Features: custom_brandingcustom_fontscustom_colorscheckout_rulescheckout_extensions
["physical_products", "checkout_extensions"]
💳 Payment Filters — Shopify only, Pro
paymentsShopifyProstring[]Filter by active payment methods. Use the top-level selectionLogic parameter to control include/exclude and AND/OR behaviour.
Buy Now Pay Later: klarnaaffirmafterpaysezzlezipbread_paykatapult
Processors: shopify_paymentsstripeamazon_payglobal_e
Wallets: shop_paypaypalapple_paygoogle_paycash_app
["shop_pay", "klarna"]
🚚 Shipping Filters — Shopify only, Pro
shippingScopeShopifyProstring[]Filter by geographic shipping reach. Values: domesticinternationalglobal["international", "global"]
shipsToShopifyProstring[]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
countrystring[]Filter by country codes (ISO 3166-1 alpha-2)["US", "GB", "CA"]
statestring[]Filter by US state abbreviations (only applicable when country includes US)["CA", "NY", "TX"]
📧 Communication Channel Filters
contactstring[]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
activityDeltaProstringTime window for growth metrics: "7" (last 7 days) or "30" (last 30 days)"7"
activity_events_app_installedProbooleanStore had an app installed in the last 7 daystrue
activity_events_app_uninstalledProbooleanStore had an app uninstalled in the last 7 daystrue
activity_events_tech_installedProbooleanStore had a technology installed in the last 7 daystrue
activity_events_tech_uninstalledProbooleanStore had a technology uninstalled in the last 7 daystrue
activity_events_products_changedProbooleanStore had product count changes in the last 7 daystrue
activity_events_emails_changedProbooleanStore had email changes in the last 7 daystrue
activity_events_theme_changedProbooleanStore changed its theme in the last 7 daystrue
activity_freshness_last_activity_atProobjectFreshness filter for last activity date. Format: {preset: "7 days"} or {min, max}{"preset": "7 days"}
activity_freshness_last_app_event_atProobjectFreshness filter for last app install/uninstall event{"preset": "30 days"}
activity_freshness_last_email_found_atProobjectFreshness filter for when the last email was found{"preset": "90 days"}
activity_freshness_last_product_update_atProobjectFreshness filter for last product update{"preset": "7 days"}
activity_freshness_last_technology_change_atProobjectFreshness filter for last technology change{"preset": "30 days"}
activity_freshness_last_theme_publish_atProobjectFreshness filter for last theme publish{"preset": "7 days"}
activity_growth_product_page_delta_minPronumber | stringMinimum product page count change in the selected time window10
activity_growth_product_page_delta_maxPronumber | stringMaximum product page count change in the selected time window100
activity_growth_variant_delta_minPronumber | stringMinimum variant count change50
activity_growth_variant_delta_maxPronumber | stringMaximum variant count change500
activity_growth_traffic_delta_minPronumber | stringMinimum estimated visits change1000
activity_growth_traffic_delta_maxPronumber | stringMaximum estimated visits change50000
activity_growth_app_installs_delta_minPronumber | stringMinimum number of app installs in the time window1
activity_growth_app_uninstalls_delta_minPronumber | stringMinimum number of app uninstalls in the time window1
activity_growth_email_new_delta_minPronumber | stringMinimum number of new emails found in the time window1
activity_growth_email_new_delta_maxPronumber | stringMaximum number of new emails found in the time window10
📋 CRM Filters — Pro
crm_statusProstring[]Filter by CRM status["qualified", "contacted"]
crm_listsPronumber[]Filter by CRM list IDs[1, 2, 3]
crm_has_noteProbooleanFilter stores that have CRM notestrue
crm_ratingsPronumber[]Filter by star ratings (1–5)[4, 5]
crm_has_reminderProbooleanFilter stores with active reminderstrue
📤 Synced & Export History Filters
show_exportedbooleanShow only stores that have been synced or exportedtrue
exclude_exportedbooleanExclude stores that have been synced or exportedtrue
exported_date_rangeobjectFilter by export date range: {enabled: true, startDate: "YYYY-MM-DD", endDate: "YYYY-MM-DD"}{enabled:true,startDate:"2024-01-01"}
website_followingbooleanFilter stores you are followingtrue
💰 Financial Filters
estimatedSalesstring[]Monthly revenue range as [min, max] in USD (numeric strings)["10000", "100000"]
technologySpendProstring[]Monthly technology spend range as [min, max] in USD (numeric strings)["500", "5000"]
📊 Traffic Filters
estimatedVisitsstring[]Monthly visit range as [min, max] (numeric strings)["10000", "500000"]
totalTrafficMinnumber | stringMinimum total monthly traffic5000
totalTrafficMaxnumber | stringMaximum total monthly traffic500000
organicTrafficMinnumber | stringMinimum monthly organic search traffic1000
organicTrafficMaxnumber | stringMaximum monthly organic search traffic100000
📦 Product Filters
productPagesMinnumber | stringMinimum number of product pages100
productPagesMaxnumber | stringMaximum number of product pages1000
productVariantsMinnumber | stringMinimum number of product variants500
productVariantsMaxnumber | stringMaximum number of product variants5000
avgProductPriceMinnumber | stringMinimum average product price (USD)50
avgProductPriceMaxnumber | stringMaximum average product price (USD)200
🏢 Business Filters
verticalstring[]Filter by business vertical/industry. Example values: Fashion & ApparelBeauty & Personal CareHealth & WellnessFood & BeverageElectronics & GadgetsHome & Garden and more.["Fashion & Apparel", "Health & Wellness"]
languagestring[]Filter by website language (language name, e.g. English, Spanish, French)["English", "Spanish"]
domainExtensionstring[]Filter by top-level domain extension (with dot)[".com", ".co", ".io"]
websiteCreatedAtobjectFilter by store creation date: {enabled: true, startDate: "YYYY-MM-DD", endDate: "YYYY-MM-DD"}{enabled:true,startDate:"2020-01-01"}
websiteUpdatedAtobjectFilter by when the store was last crawled by StoreCensus{enabled:true,startDate:"2024-01-01"}
🛍️ E-commerce Filters
themestring[]Filter by Shopify theme name (fetched dynamically from available themes)["Dawn", "Debut"]
technologystring[]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"]
currencyShopifystring[]Filter by store currency (ISO 4217 currency code)["USD", "EUR", "GBP"]
📣 Marketing Signal Filters — Shopify only, Pro
facebookCapiShopifyProbooleanFilter stores that have Facebook Conversions API enabled — a strong signal the store is running paid Meta/Facebook adstrue

Available Sections

Control which data sections are included in the response:

["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", "shipping_info"]

payments_info and shipping_info require a Professional plan or above. Requesting these sections on a lower-tier plan will return them as null.

Getting App IDs

⚠️ Important: The apps filter requires numeric app IDs, not app names.

To get app IDs, either:

  • Call the /api/v1/apps endpoint to search for apps and get their IDs
  • Click on any app in the StoreCensus UI to view its App ID in the app info modal

Request Example

Step 1: Get app IDs from the /apps endpoint

curl -X GET "https://www.storecensus.com/api/v1/apps?search=klaviyo" \
  -H "Authorization: Bearer your.api.key"

# Response shows: "app_id": 15

Step 2: Use the app_id in your stores filter

curl -X POST "https://www.storecensus.com/api/v1/stores" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": {
      "country": ["US", "GB"],
      "vertical": ["Fashion & Apparel"],
      "apps": ["15"],
      "estimatedVisits": ["10000", "999999999"]
    },
    "sort": {
      "column": "website_created_at",
      "direction": "desc"
    },
    "pageSize": 100,
    "sections": ["basic_info", "contact_info", "apps_integrations", "activity_signals"]
  }'

With Selection Logic (exclude stores that have Klaviyo OR Mailchimp):

curl -X POST "https://www.storecensus.com/api/v1/stores" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": {
      "country": ["US"],
      "apps": ["15", "42"]
    },
    "selectionLogic": {
      "mode": "exclude",
      "operator": "or"
    },
    "pageSize": 100
  }'

With Timing Filters (stores that first installed Klaviyo in 2024):

curl -X POST "https://www.storecensus.com/api/v1/stores" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": {
      "country": ["US"],
      "apps": ["15"]
    },
    "selectionLogic": {
      "mode": "include",
      "operator": "and"
    },
    "historicalConstraints": [
      {
        "attribute": "apps",
        "value": "15",
        "event": "first_became_true",
        "dateFrom": "2024-01-01",
        "dateTo": "2024-12-31"
      }
    ],
    "pageSize": 100
  }'

Response Format

{
  "data": [
    {
      "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+ only
      "shipping_info": { ... }    // Professional+ only
    }
  ],
  "pagination": {
    "pageSize": 100,
    "hasMore": true,
    "nextCursor": "eyJwaXRJZCI6IjQ2VG9BNUlCQ3dqRjFWX...",
    "total": 1250,
    "returned": 100
  },
  "filters": { ... },
  "sort": { ... },
  "sections": [ ... ]
}

Pagination

This endpoint uses cursor-based pagination for efficient traversal of large result sets:

  • First request: Omit the cursor parameter
  • Subsequent requests: Include the nextCursor from the previous response
  • When hasMore is false, you've reached the end
  • Cursors are valid for 5 minutes
// Next page request
curl -X POST "https://www.storecensus.com/api/v1/stores" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": { ... },
    "pageSize": 100,
    "cursor": "eyJwaXRJZCI6IjQ2VG9BNUlCQ3dqRjFWX..."
  }'

Best Practices

  • Use appropriate page sizes (50-100 for interactive use, up to 500 for bulk exports)
  • Request only needed sections using the sections parameter
  • Implement exponential backoff when receiving 429 rate limit responses
  • Store cursors to resume pagination if interrupted
  • Use specific filters to reduce result set size and improve performance

🎛️ Selection Logic

The selectionLogic parameter controls how multi-value filters are combined when querying stores. It is a top-level body parameter (not nested inside filters).

Shape

{
  "selectionLogic": {
    "mode": "include" | "exclude",
    "operator": "or" | "and"
  }
}

Eligible Filter Keys

Selection Logic applies to the following multi-value filter keys:

appstechnologypaymentsshipsTocontactshopifyPlanplatformFeatures

Behaviour Matrix

modeoperatorMeaning
includeandStore must have all selected values (default)
includeorStore must have at least one of the selected values
excludeorStore must have none of the selected values
excludeandStore must be missing all of the selected values

Example — Exclude stores using Klaviyo OR Mailchimp

curl -X POST "https://www.storecensus.com/api/v1/stores" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": {
      "apps": [12345, 67890]
    },
    "selectionLogic": {
      "mode": "exclude",
      "operator": "or"
    },
    "pageSize": 50
  }'

Example — Stores using ALL of the selected payment methods

curl -X POST "https://www.storecensus.com/api/v1/stores" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": {
      "payments": ["paypal", "stripe", "apple_pay"]
    },
    "selectionLogic": {
      "mode": "include",
      "operator": "and"
    },
    "pageSize": 50
  }'

⏱️ Timing Filters (historicalConstraints)

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.

Constraint Shape

{
  "historicalConstraints": [
    {
      "attribute": string,   // Which attribute to track (see table below)
      "value": string,       // A single value to match (app ID, country code, payment key, etc.)
                             // Use "any_selected" to match any value currently in filters
                             // Use "__fixed__" for boolean attributes (markets_pro, checkout_extensions)
      "event": string,       // The timing event type (see table below)
      "dateFrom": string,    // ISO 8601 date — start of the window (optional)
      "dateTo": string       // ISO 8601 date — end of the window (optional)
    }
  ]
}

Supported Attributes

attributeTracksvalue (single string)removed_during?
appsShopify app installsNumeric app ID string, e.g. "12345"✓ Yes
technologiesTechnology stack changesTechnology name string, e.g. "Klaviyo"✓ Yes
payment_methodsPayment method additions/removalsPayment key, e.g. "paypal", "apple_pay"✓ Yes
shipping_countriesShipping destination changesISO 3166-1 alpha-2 code, e.g. "us", "gb"✓ Yes
platform_planShopify plan upgrades/downgradesPlan name, e.g. "shopify_plus", "basic"✗ No
markets_proShopify Markets Pro adoptionUse "__fixed__" (boolean attribute — no value selection)✗ No
checkout_extensionsCheckout extension presenceUse "__fixed__" (boolean attribute — no value selection)✗ No

Supported Events

eventMeaning
first_became_trueThe attribute first appeared / was first detected within the date window
changed_duringThe attribute changed (added or removed) at any point within the date window
active_duringThe attribute was present / active at any point within the date window
removed_duringThe attribute was removed / stopped being detected within the date window. Not available for platform_plan, markets_pro, checkout_extensions.

Example — Stores that first installed a specific app in Q1 2024

curl -X POST "https://www.storecensus.com/api/v1/stores" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": {
      "apps": ["12345"]
    },
    "historicalConstraints": [
      {
        "attribute": "apps",
        "value": "12345",
        "event": "first_became_true",
        "dateFrom": "2024-01-01",
        "dateTo": "2024-03-31"
      }
    ],
    "pageSize": 50
  }'

Example — Stores that removed PayPal in the last 6 months

curl -X POST "https://www.storecensus.com/api/v1/stores" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json" \
  -d '{
    "historicalConstraints": [
      {
        "attribute": "payment_methods",
        "value": "paypal",
        "event": "removed_during",
        "dateFrom": "2024-07-01",
        "dateTo": "2025-01-01"
      }
    ],
    "pageSize": 50
  }'

Example — Combined: app installed AND plan upgraded in same window

curl -X POST "https://www.storecensus.com/api/v1/stores" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json" \
  -d '{
    "historicalConstraints": [
      {
        "attribute": "apps",
        "value": "12345",
        "event": "first_became_true",
        "dateFrom": "2024-01-01",
        "dateTo": "2024-12-31"
      },
      {
        "attribute": "platform_plan",
        "value": "shopify_plus",
        "event": "changed_during",
        "dateFrom": "2024-01-01",
        "dateTo": "2024-12-31"
      }
    ],
    "pageSize": 50
  }'

The /enrich Endpoint

Endpoint Details

URLPOST /api/v1/enrich
DescriptionEnrich 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.
AuthenticationRequired (Bearer token)
Rate LimitedYes (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.

Request Body Parameters

ParameterTypeDescription
lead_idsrequiredarray of integersArray of lead_ids to enrich. Maximum 1000 lead_ids per request. Each lead_id must be a positive integer.
decision_makersoptionalbooleanSet to true to unlock decision maker contacts (founders, CEOs, etc.) for each lead. Results are returned in results[].decision_makers. Default: false.
rolesoptionalarray of stringsFilter 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_storeoptionalintegerMaximum number of decision maker contacts to return per lead. Only used when decision_makers: true. Default: 1.
include_fallbackoptionalbooleanWhen 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.

Request Examples

Store contact info only:

curl -X POST "https://www.storecensus.com/api/v1/enrich" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json" \
  -d '{
    "lead_ids": [12345, 67890, 11223, 44556]
  }'

With decision makers (role filter + fallback):

curl -X POST "https://www.storecensus.com/api/v1/enrich" \
  -H "Authorization: Bearer your.api.key" \
  -H "Content-Type: application/json" \
  -d '{
    "lead_ids": [12345, 67890, 11223, 44556],
    "decision_makers": true,
    "roles": ["founder", "ceo", "cto"],
    "include_fallback": true
  }'

Response Format

Store contact info only:

{
  "success": true,
  "results": [
    {
      "lead_id": 12345,
      "domain": "example-store.com",
      "emails": [
        {
          "email": "contact@example-store.com",
          "email_type": "general",
          "validated": true,
          "found_date": "2024-01-15",
          "email_deliverability": "good"
        }
      ],
      "phone": "+1-555-123-4567; +1-555-987-6543",
      "has_contact_info": true
    },
    {
      "lead_id": 67890,
      "domain": "another-store.com",
      "emails": null,
      "phone": null,
      "has_contact_info": false
    }
  ],
  "summary": {
    "total_requested": 4,
    "stores_with_contact_info": 2,
    "stores_without_contact_info": 2,
    "credits_deducted": 2
  }
}

With decision makers (decision_makers: true):

{
  "success": true,
  "results": [
    {
      "lead_id": 12345,
      "domain": "example-store.com",
      "emails": [...],
      "phone": "+1-555-123-4567",
      "has_contact_info": true,
      "decision_makers": [
        {
          "person_id": "storecensus_9871",
          "first_name": "Jane",
          "last_name": "Smith",
          "title": "CEO",
          "email": "jane@example-store.com",
          "phone": "+1-555-000-1234",
          "linkedin_url": "https://linkedin.com/in/janesmith"
        }
      ]
    },
    {
      "lead_id": 67890,
      "domain": "another-store.com",
      "emails": null,
      "phone": null,
      "has_contact_info": false,
      "decision_makers": null
    }
  ],
  "summary": {
    "total_requested": 4,
    "stores_with_contact_info": 2,
    "stores_without_contact_info": 2,
    "credits_deducted": 2,
    "decision_makers_unlocked": 1
  }
}

Response Fields

FieldDescription
successBoolean indicating if the request was successful
resultsArray of enrichment results for each lead_id found
results[].lead_idThe lead ID
results[].domainThe store's domain name
results[].emailsArray of email objects or null if no emails found
results[].phonePhone number(s) as semicolon-separated string, or null if no phones found
results[].has_contact_infoBoolean indicating if this lead has any contact information
summary.total_requestedTotal number of lead_ids requested
summary.stores_with_contact_infoNumber of stores that had contact information
summary.stores_without_contact_infoNumber of stores without contact information
summary.already_unlockedNumber of stores that were already unlocked (no credit charged)
summary.newly_unlockedNumber of stores newly unlocked in this request
summary.credits_deductedNumber 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.remainingTotal credits remaining after this request
credits.subscriptionSubscription credits remaining
credits.addonAdd-on credits remaining

Credit Deduction Logic

  • 1 credit per lead is deducted only if the lead has at least one email OR one phone number
  • Already unlocked leads are FREE - if you've previously unlocked a lead, you can access it again without using credits
  • Leads without any contact information are returned but do not consume credits
  • The response includes your remaining credit balance (credits.remaining) so you can track usage
  • If you don't have enough credits, the request will fail with a 402 status code before any data is returned

💎 Decision Maker Credits

  • 2 credits per decision maker unlocked — charged in addition to the 1 credit for store contact info
  • With max_per_store: 1 (default) → 2 credits per store with a decision maker
  • With max_per_store: 2 → up to 4 credits per store for decision makers
  • Already-unlocked leads are FREE — if decision makers were previously unlocked for a lead, they are returned at no charge
  • Unlimited plan users are not charged credits for decision maker unlocks

Error Responses

Status CodeErrorDescription
400lead_ids must be a non-empty arrayThe lead_ids parameter is missing or invalid
400Maximum 1000 lead_ids per requestToo many lead_ids provided in a single request
402Insufficient credits availableNot enough credits to complete the enrichment

The /apps Endpoint

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.

Endpoint Details

URLGET /api/v1/apps
DescriptionReturns a paginated list of active Shopify apps with category information, ratings, and metadata.
AuthenticationRequired (Bearer token)
Rate LimitedYes (based on subscription plan)

Query Parameters

ParameterTypeDefaultDescription
pageinteger1Page number (1-indexed)
pageSizeinteger100Records per page (1-500, max 500)
app_idintegernullFilter by specific app ID
minRatingfloatnullMinimum app rating (0-5)
searchstringnullSearch in name, description, or developer
categoryIdintegernullFilter 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.

Request Examples

Basic request - Get first 100 apps:

curl -X GET "https://www.storecensus.com/api/v1/apps?page=1&pageSize=100" \
  -H "Authorization: Bearer your.api.key"

Get specific app by ID:

curl -X GET "https://www.storecensus.com/api/v1/apps?app_id=12345" \
  -H "Authorization: Bearer your.api.key"

Filter by minimum rating:

curl -X GET "https://www.storecensus.com/api/v1/apps?minRating=4.0&pageSize=200" \
  -H "Authorization: Bearer your.api.key"

Search apps:

curl -X GET "https://www.storecensus.com/api/v1/apps?search=email&page=1" \
  -H "Authorization: Bearer your.api.key"

Get maximum records (500 per page):

curl -X GET "https://www.storecensus.com/api/v1/apps?pageSize=500" \
  -H "Authorization: Bearer your.api.key"

Response Format

{
  "data": [
    {
      "app_id": 1,
      "name": "Point of Sale",
      "handle": "shopify-pos",
      "description": "Shopify POS is the only point of sale...",
      "icon_url": "https://cdn.shopify.com/.../icon.png",
      "rating": 2.9,
      "developer": "apps.shopify.com",
      "active": true,
      "check_status": "done",
      "last_updated": "2026-02-02T13:42:04.000Z",
      "main_category": {
        "category_id": 12,
        "name": "Point of Sale",
        "slug": "point-of-sale"
      },
      "categories": [
        {
          "category_id": 12,
          "name": "Point of Sale",
          "slug": "point-of-sale",
          "is_main": true
        }
      ]
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 100,
    "total": 11000,
    "totalPages": 110,
    "hasMore": true
  },
  "filters": {
    "categoryId": null,
    "minRating": null,
    "search": null
  }
}

Response Fields

FieldDescription
app_idUnique app identifier
nameApp name
handleURL-friendly app handle
ratingAverage rating (0-5)
main_categoryPrimary category with id, name, and slug
categoriesArray of all associated categories
pagination.totalTotal number of apps matching filters
pagination.hasMoreBoolean indicating if more pages exist

Use Cases

  • App Directory: Build a searchable directory of Shopify apps with filtering and sorting
  • Competitor Analysis: Track competitor apps and their ratings over time
  • Market Research: Analyze app categories, pricing, and market trends
  • Integration Discovery: Help merchants find apps that integrate with your service
  • Data Enrichment: Enrich your database with comprehensive Shopify app information

The /app-categories Endpoint

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.

Endpoint Details

URLGET /api/v1/app-categories
DescriptionReturns all app categories with active apps, including app counts for each category.
AuthenticationRequired (Bearer token)
Rate LimitedYes (based on subscription plan)

💡 Integration Tip: Use the category_id from this endpoint with the /apps endpoint to filter apps by category.

Request Example

curl -X GET "https://www.storecensus.com/api/v1/app-categories" \
  -H "Authorization: Bearer your.api.key"

Response Format

{
  "data": [
    {
      "category_id": 1,
      "name": "Marketing",
      "slug": "marketing",
      "app_count": 150
    },
    {
      "category_id": 2,
      "name": "Sales & Conversion",
      "slug": "sales-conversion",
      "app_count": 89
    }
  ],
  "total": 45
}

Integration Example

Combine with the /apps endpoint to build a category-filtered app directory:

# Step 1: Get all categories
curl -H "Authorization: Bearer your.api.key" \
  "https://www.storecensus.com/api/v1/app-categories"

# Step 2: Use category_id to filter apps
curl -H "Authorization: Bearer your.api.key" \
  "https://www.storecensus.com/api/v1/apps?categoryId=1&pageSize=100"

Use Cases

  • Category Navigation: Build a category menu for your app directory
  • Filter Dropdowns: Populate category filter options dynamically
  • Analytics: Track which categories have the most apps
  • Discovery: Help users discover apps by browsing categories