The e-commerce store data API you don't have to maintain
Shopify has no merchant directory endpoint. So teams build a scraper - and spend the next quarter fixing it. We run the pipeline; you consume a stable REST API of store records.
What happens without a clean feed
It always starts the same way. A quick Python script hits
/products.json on a list of known domains - that's the public,
canonical Shopify signature, and it works. Then you want the secondary
stack, and the maintenance treadmill begins.
- Stores on Hydrogen or a decoupled proxy don't return the HTML you expect - cascading false negatives.
- Anti-bot blocks you after a few thousand requests an hour; you start renting residential proxies and the cost climbs.
- A renamed CSS class flips a detector to false positives on thousands of stores for a week.
- A junior dev spends three days working out why a signal "dropped 40%" when no merchant actually migrated.
That's pure technical debt. A home-grown store crawler isn't your product's edge - it's a distraction from it.
The flow: fetch, subscribe, integrate
1. Fetch a batch with filters
Call /v1/stores with the filters that fit your case. Cursor pagination, 100 results per page.
curl -H "Authorization: Bearer $API_KEY" \
"https://api.ecom-lead-database.com/v1/stores?platform=Shopify&country=US&limit=100&cursor=eyJp..." Response:
{
"data": [
{
"id": "str_a8f3c2",
"domain": "example-merchant.com",
"name": "Example Merchant",
"platform": "Shopify",
"country": "US",
"theme": "Impact",
"first_seen": "2025-02-12",
"last_verified": "2026-06-18"
}
],
"next_cursor": "eyJp...",
"remaining_quota": 19842
} Honest note: secondary tech booleans (Klaviyo, Shopify Plus, Recharge, Judge.me as filters) and fine sector classification are not fully populated across the base yet - they're being rolled out. Today, platform, country and theme are the reliable filters. When the rest is computed, you get it through the same endpoint with no code change.
2. Subscribe to new stores via signed webhooks
Register a receiver in the dashboard. When a new store is added to the base, a POST signed with HMAC-SHA256 is sent to your endpoint.
# Verify the webhook signature server-side
import hmac, hashlib
def verify_webhook(body: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature) 3. Integrate into your stack
Write the payload to Postgres / Mongo / BigQuery - a stores table indexed on domain and last_verified is the usual pattern. In n8n, Make or Zapier it's a four-step flow: webhook receiver → filter → upsert → notify.
API access starts on Scale
REST API access is bundled into the Scale plan; portals below it are dashboard-and-export only. If you need volume or limits beyond Scale, that's an Enterprise conversation, not a hidden overage bill.
| Plan | Price | API | Verdict for a developer |
|---|---|---|---|
| Starter / Pro | $49–149/mo | portal only | Dashboard + manual exports. Not your flow. |
| Scale | $449/mo | REST + exports | The right tier to build on. |
| Enterprise | custom | higher limits + SLA | Beyond Scale volume, custom filters, SLA. |
Scale: 150,000 records / mo · 20,000 searches / mo · All platforms unlocked · REST API + exports
Technical limits, stated up front
Transparency first - we don't sell what we don't have.
Secondary tech filters
Klaviyo / Plus / Recharge / Yotpo as booleans aren't fully in the base yet. Theme is the available maturity proxy today.
No official SDK
REST + JSON only. Any HTTP client works. We'd rather stabilise the endpoint contract before freezing an SDK.
Hard quotas, no silent overage
Past your monthly quota you get a clear 429, not a surprise invoice. Cross it two months running and we move you to a custom plan.
Geography of the data
The store catalog is .fr today; global English-market coverage is being expanded. Ask what's live for your target country before you build on it.