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. 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 Shopify stores 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:

Filter ParameterTypeDescriptionExample
🎛️ Selection Logic — top-level body parameter (not inside filters)
selectionLogicNEWobjectControls how multi-value filters are combined for eligible keys: apps, technology, payments, shipsTo, contact, shopifyPlan, platformFeatures.
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): apps | technologies | payment_methods | shipping_countries | platform_plan | markets_pro | checkout_extensions
value (required): specific value, "any_selected", or "__fixed__" for boolean attrs.
event (required): first_became_true | changed_during | active_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"
}]
📍 Location Filters
countrystring[]Filter by country codes (ISO 3166-1 alpha-2)["US", "GB", "CA"]
statestring[]Filter by state abbreviations["CA", "NY", "TX"]
🏢 Business Filters
verticalstring[]Filter by business vertical/industry["Fashion", "Electronics"]
languagestring[]Filter by website language["English", "Spanish"]
employees(number | string)[]Employee count range [min, max][10, 100]
websiteCreatedAtobjectDate range: {enabled, startDate, endDate}{enabled:true,startDate:"2023-01-01"}
websiteUpdatedAtobjectLast crawled date range{enabled:true,startDate:"2024-01-01"}
domainExtensionstring[]Filter by domain extension[".com", ".co"]
📧 Contact Filters
email_typestring[]Filter by email type["founder_personal"]
🛍️ E-commerce Filters
themestring[]Filter by Shopify theme name["Dawn", "Debut"]
currencystring[]Filter by store currency["USD", "EUR"]
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 price50
avgProductPriceMaxnumber | stringMaximum average product price200
💰 Financial Filters
estimatedSales(number | string)[]Estimated monthly sales range [min, max][5000, 10000]
technologySpend(number | string)[]Technology spend range [min, max][1000, 5000]
📊 Traffic Filters
estimatedVisits(number | string)[]Estimated monthly visits range [min, max][10000, 100000]
totalTrafficMinnumber | stringMinimum total monthly traffic5000
totalTrafficMaxnumber | stringMaximum total monthly traffic500000
organicTrafficMinnumber | stringMinimum organic monthly traffic1000
organicTrafficMaxnumber | stringMaximum organic monthly traffic100000
paidTrafficMinnumber | stringMinimum paid monthly traffic500
paidTrafficMaxnumber | stringMaximum paid monthly traffic50000
📱 App Filters
appsnumber[] | string[]Filter by installed app IDs. Use the top-level selectionLogic parameter to control include/exclude and AND/OR behaviour across all selected apps.[12345, 67890]
verifiedAppInstallsstring[]Filter for verified app installations only (use ["true"])["true"]
uninstalledAppsOnlystring[]Filter for uninstalled apps only (use ["true"])["true"]
installedDateFromstringApp installed start date (YYYY-MM-DD)"2024-01-01"
installedDateTostringApp installed end date (YYYY-MM-DD)"2024-12-31"
uninstalledDateFromstringApp uninstalled start date (YYYY-MM-DD)"2025-12-10"
uninstalledDateTostringApp uninstalled end date (YYYY-MM-DD)"2024-06-30"
⚙️ Technology Filters
trackingAnalyticsstring[]Filter by tracking/analytics technologies. Use the top-level selectionLogic parameter to control include/exclude and AND/OR behaviour.["Google Analytics", "Facebook Pixel"]
trackingAnalyticsToggleobjectPer-technology include/exclude override: {tech: boolean}{"Google Analytics": true}
💳 Payment & Shipping Filters
paymentsstring[]Filter by payment methods. Use the top-level selectionLogic parameter to control include/exclude and AND/OR behaviour. Accepted values: shop_paypaypalapple_paygoogle_paycash_appklarnaaffirmafterpaysezzlezipbread_paykatapultshopify_paymentsstripeamazon_payglobal_e["shop_pay", "klarna"]
shipsTostring[]Filter by shipping destination country codes. Use the top-level selectionLogic parameter to control include/exclude and AND/OR behaviour. Accepted values: uscagbaude["us", "ca", "gb"]
shopifyPlanstring[]Filter by Shopify subscription plan. Use the top-level selectionLogic parameter to control include/exclude.["shopify_plus", "advanced"]
platformFeaturesstring[]Filter by platform features. Use the top-level selectionLogic parameter to control include/exclude. Accepted values: markets_procheckout_extensions["markets_pro"]
Activity Signals Filters
activityDeltastringTime period: "7", "30", or "90" days"7"
activity_events_*booleanEvent filters (any, app_installed, app_uninstalled, tech_installed, tech_uninstalled, products_changed, emails_changed, theme_changed)true
activity_freshness_*objectDate filters: {preset: "last_7_days"} or {min, max}{preset: "last_7_days"}
activity_growth_*_delta_minnumber | stringMinimum growth delta (product_page, variant, tech, average_price, shopify_app_spend, tech_spend, traffic, app_installs, app_uninstalls, email_new)10
activity_growth_*_delta_maxnumber | stringMaximum growth delta (product_page, variant, tech, average_price, shopify_app_spend, tech_spend, traffic, app_installs, app_uninstalls, email_new)100
📋 CRM & Export Filters
crm_statusstring[]Filter by CRM status["qualified", "contacted"]
crm_listsstring[]Filter by CRM list membership["Hot Leads", "Follow Up"]
crm_has_notebooleanFilter stores with notestrue
crm_ratingsnumber[]Filter by star ratings (1-5)[4, 5]
crm_has_reminderbooleanFilter stores with active reminderstrue
website_followingbooleanFilter followed storestrue
show_exportedbooleanShow only exported storestrue
exclude_exportedbooleanExclude exported storestrue
exported_date_rangeobjectFilter by export date: {enabled, startDate, endDate}{enabled:true,startDate:"2024-01-01"}

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"]

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": { ... }
    }
  ],
  "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