Shopify Store Data — Detect Stores, Products, Vendors & Pricing
Pricing
$2.00 / 1,000 product records
Shopify Store Data — Detect Stores, Products, Vendors & Pricing
Detect whether a domain runs on Shopify and pull its public catalogue. Returns store detection, product count, product titles, vendors, product types, tags, price range, variant and image counts, and publish dates.
Pricing
$2.00 / 1,000 product records
Rating
0.0
(0)
Developer
Berkan Kaplan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
18 days ago
Last modified
Categories
Share
Shopify Store Data — Detect Stores, Products, Vendors & Pricing 🛍️
foXLabs digital-footprint series: App Store publishers · Company hiring signals · Company enrichment · GitHub trending
🎉 Point it at any domain: it tells you whether the site runs Shopify, then pulls the full product catalogue — titles, vendors, product types, price range, variants, images and tags. No key, no login. Built for e-commerce sales teams, competitive pricing analysts, and anyone qualifying DTC brands.
🔍 What is this Actor — and when should you use it?
Shopify powers a large slice of direct-to-consumer commerce, and every Shopify storefront exposes its catalogue publicly. This Actor takes a domain, confirms whether it is a Shopify store, and if so returns one clean row per product: title, vendor, type, price range, variant and image counts, tags, handle and publication dates.
Use it when you need: to qualify which prospects on a list run Shopify; a competitor's catalogue and price bands; vendor/brand mix across a set of stores; or a product feed for market research.
Use something else when: the store is on another platform — this Actor tells you honestly that it is not Shopify rather than guessing. For company-level firmographics, use Company Enrichment.
🤖 Use with AI agents
Already on the Apify MCP server? Ask for this Actor by name: foxlabs/shopify-store-data.
Your agent can pay for its own runs. This Actor is pay-per-event with agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — no Apify account or API token of its own. Billing is the same either way: per delivered product row.
Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
Run the Apify actor foxlabs/shopify-store-data with{"queries":["allbirds.com","gymshark.com"],"maxResultsPerQuery":50}and compare their price ranges by product type.
📋 Overview
| Source | Shopify storefronts (public catalogue endpoint) |
| Coverage | Any Shopify-powered store, worldwide |
| Auth needed | None. No API key, no login, no proxy required |
| Row | One product (or one detection result for a non-Shopify site) |
| Measured run | 151 rows in 6.6 s for 4 domains (2026-09-20, build 0.1.8) |
| Pricing | $0.002 per delivered row — $2 per 1,000 |
✨ Features
- ✅ Shopify detection first —
isShopifytells you before anything else - 🏷️ Vendor and product type on every product — the brand mix inside a store
- 💲 Price range per product (
minPrice/maxPrice) across its variants - 🎨 Variant and image counts — catalogue depth at a glance
- 🔖 Tags array — the store's own merchandising taxonomy
- 📅 Created, published and updated dates per product
- 🚫 Honest negative — a non-Shopify domain returns a clear row saying so, not silence
🎬 Quick Start
curl -X POST "https://api.apify.com/v2/acts/foxlabs~shopify-store-data/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"queries":["allbirds.com","gymshark.com","kith.com"],"maxResultsPerQuery":50}'
🚀 Getting Started (3 steps)
- Put domains into
queries. The default run includesapple.comon purpose — to show what a non-Shopify result looks like. - Set catalogue depth.
maxResultsPerQuerycaps products per store (default 50). - Run it. Rows arrive in the dataset; export to CSV/JSON/Excel or read them over the API.
📥 Input
| Field | Type | Default | Description |
|---|---|---|---|
queries | array | ["allbirds.com","gymshark.com","kith.com","apple.com"] | Store domains |
maxResultsPerQuery | integer | 50 | Cap on products returned per store |
maxConcurrency | integer | 3 | Parallel requests |
requestDelayMs | integer | 200 | Pause between requests — this Actor stays polite by default |
includeRaw | boolean | false | Attach the untouched product record to each row |
proxyConfiguration | object | proxy off | Storefronts answer direct requests |
Example — qualify a prospect list:
{ "queries": ["brand-a.com", "brand-b.com", "brand-c.com"], "maxResultsPerQuery": 1 }
Example — deep catalogue pull:
{ "queries": ["gymshark.com"], "maxResultsPerQuery": 250 }
📤 Output
One row per product. Fill rates from the measured run (151 rows, 4 domains, 2026-09-20):
| Field | Type | Fill | Description |
|---|---|---|---|
companyName | string | 100% | Store domain |
isShopify | boolean | 100% | Whether the domain runs Shopify |
productId | string | 99% | Shopify product id |
productTitle | string | 99% | Product title |
vendor | string | 99% | Vendor/brand on the product |
productType | string | 98% | Store's product type |
minPrice / maxPrice | number | 99% | Price range across variants |
variantCount | number | 99% | Number of variants |
imageCount | number | 99% | Number of images |
available | boolean | 99% | Availability flag |
tags | array | 99% | Store's merchandising tags |
handle | string | 99% | URL handle |
description | string | 99% | Product description |
createdAt / publishedAt / updatedAt | string | 99% | Product lifecycle dates |
sourceUrl | string | 100% | Product URL |
note | string | 1% | Explanation row — present when a domain is not a Shopify store |
country / registry / query / status / scrapedAt | string | 100% | Provenance fields |
The product fields sit at 99% rather than 100% for one honest reason: apple.com in the default run is not a Shopify store, so its single row carries isShopify: false and a note instead of product data. That is the 1%. Columns a storefront cannot provide (registration or tax number, legal form, incorporation date, postal address, industry code, headcount, capital, contact details) were removed rather than shipped permanently empty.
A real row from the default run:
{"companyName": "kith.com","isShopify": true,"productTitle": "VANS GS Old Skool 36 Pearlized - Multi","vendor": "VANS","productType": "Low Top Sneakers","sourceUrl": "https://kith.com/products/vn00115wbgk"}
💼 Use cases
- Prospect qualification — which domains on your list run Shopify (set
maxResultsPerQuery: 1) - Competitive pricing — price bands by product type across rival stores
- Brand/vendor mapping — which brands a multi-brand retailer carries
- Catalogue monitoring — schedule runs and diff
updatedAtto catch new drops - Market research — product-type mix and catalogue depth across a segment
🔗 Integration
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('foxlabs/shopify-store-data').call({queries: ['allbirds.com'], maxResultsPerQuery: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("foxlabs/shopify-store-data").call(run_input={"queries": ["allbirds.com"], "maxResultsPerQuery": 50})items = client.dataset(run["defaultDatasetId"]).list_items().items
No-code: Make, n8n and Zapier reach this Actor through the Apify app — schedule it and push catalogue changes into a sheet or a database.
📊 Pricing
Pay-per-event: product-record — $0.002 per delivered row ($2 per 1,000). Compute and traffic are included; you pay for rows, not run time. A detection-only row for a non-Shopify domain is not charged as a product.
❓ FAQ
Do I need Shopify API credentials? No. This Actor reads the storefront's own public catalogue — no app, no key, no login.
What happens with a non-Shopify domain? You get one row with isShopify: false and a note explaining it, so a negative result is visible rather than silent.
Can I check many domains cheaply? Yes — set maxResultsPerQuery: 1 and you get the detection plus one sample product per store.
Does it include inventory levels? No. available reflects the storefront's availability flag; exact stock counts are not public.
Are prices in a single currency? Prices come as the storefront publishes them; a store selling in multiple currencies shows its default.
How deep can a catalogue pull go? Raise maxResultsPerQuery; large stores paginate and the Actor keeps a polite delay by default.
🐛 Troubleshooting
A store you know is Shopify returns isShopify: false. Some stores sit behind a custom domain setup or a proxy that hides the catalogue endpoint. Try the store's myshopify domain if you know it.
Fewer products than the site shows. maxResultsPerQuery caps per store — raise it.
Prices look wrong. minPrice/maxPrice span the product's variants; a single-variant product shows the same value twice.
⚠️ Trademark
Shopify is a trademark of Shopify Inc. This Actor is an independent tool, is not affiliated with or endorsed by Shopify, and reads only publicly published storefront catalogues. Brand and product names belong to their owners.
⚖️ Is it legal to scrape this data?
A storefront catalogue is published so shoppers can browse it. The rows this Actor returns are product listings — commercial information, not personal data. Respect each store's terms for how you reuse their catalogue, and note that product text and images remain the store's copyright. You remain responsible for how you use the output.
🤝 Support & contact
Questions, a field you need, or a bug: info@foxlabs.com.tr — or open an issue on the Actor's Apify page.
Changelog
0.1.8
- Removed permanently-empty columns (registration and tax number, status detail, legal form, incorporation and dissolution dates, postal address, industry, industry code, headcount, capital, website, e-mail, phone, officers) — a storefront is not a company register. Row went from 42 columns to 24, with zero permanently-empty columns left.
0.1
- Shopify detection plus full catalogue extraction per domain.
- Pay-per-event billing on delivered rows (
product-record).