Shopify Scraper: Sales Channel & Product Templates Data avatar

Shopify Scraper: Sales Channel & Product Templates Data

Pricing

from $2.99 / 1,000 results

Go to Apify Store
Shopify Scraper: Sales Channel & Product Templates Data

Shopify Scraper: Sales Channel & Product Templates Data

Shopify Scraper extracts sales channel and product template data, including product details, templates, variants, pricing, inventory, collections, and channel information. Ideal for e-commerce research, catalog analysis, competitor monitoring, and store insights.

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

3 days ago

Last modified

Share

Shopify Scraper — Products, Sales-Channel Scope and Template Data

Shopify Scraper: Sales Channel & Product Templates Data reads any Shopify storefront — a homepage, a collection, or a single product URL — and returns a full product row (title, brand, description, tags, variants, prices, images, options) plus two data points Shopify records on every product but most storefront scrapers throw away: sales-channel scope (publishedScope, isWebOnlyChannel) and the merchant's own product-template assignment (templateSuffix, hasCustomTemplate, isHiddenTemplate, isBundleOrSubscriptionTemplate). Both classifications come from fields already present on the per-product fetch the actor makes anyway — no extra requests, no Admin API key, no store login. Built for catalogue exporters, omnichannel researchers, and merchandising auditors who need to see how a store segments its own listings, not just what it sells.

What is Shopify Scraper: Sales Channel & Product Templates Data?

It is a Shopify product scraper that adds channel and template intelligence on top of a standard catalogue pull. Point it at one or more store URLs, and for every product it discovers it returns the product's core commerce data plus whether that product is scoped to the Online Store only or published to every channel the merchant configured, and whether the merchant assigned it a custom template that flags it as hidden, bundled, or subscription-only. No Shopify account, Admin API token, or store login is required — every field it reads is present on the public storefront JSON the actor already fetches for pricing, variants, and images.

Key features:

  • Discovery by URL, not just by product — accepts a store homepage, a /collections/<handle> URL, or a single /products/<handle> URL, one per line
  • Sales-channel classificationpublishedScope and isWebOnlyChannel on every row, toggled with classifyChannelScope
  • Product-template classificationtemplateSuffix, hasCustomTemplate, isHiddenTemplate, isBundleOrSubscriptionTemplate, toggled with classifyTemplates
  • Editable keyword listshiddenTemplateKeywords and bundleTemplateKeywords let you tune hidden/bundle detection to a specific store's own template naming
  • Title/tag filter — the query input narrows results to products whose title or tags match a keyword, case-insensitively
  • Per-store rollups — a channelScopeSummary row per store, mirrored into a separate per-run dataset, with counts and percentages for web-only, global-scope, custom-template, hidden-template, and bundle/subscription-template products

What data can I extract with Shopify Scraper: Sales Channel & Product Templates Data?

Each run returns two row shapes: a product row per product, and a channelScopeSummary row per store once that store finishes.

FieldExample valueUse case
type"product"Row-type filter — "product" vs "channelScopeSummary"
isChildfalseAlways false on both row types in this actor
retailer"boat-lifestyle.com"Store the row came from
source.id"7845123456"Shopify's numeric product ID
source.canonicalUrl"https://boat-lifestyle.com/products/blue-sneakers"Direct link back to the listing
source.language"en"From the response's content-language header
source.currency"INR"Read off the first variant's price currency
source.createdUTC / source.updatedUTC / source.publishedUTC"2024-02-11T09:03:00Z"Shopify's own product timestamps
title"Blue Wireless Earbuds"Product name
description"<p>...</p>"Raw body_html
brand"boAt"Shopify's vendor field
categories / tags["wireless", "audio"]Comma-split product tags (both keys hold the same list)
variants[].id / .title / .sku"41234567", "Black / M", "SKU-123"Per-variant identity
variants[].options["Black", "M"]The variant's option1/option2/option3 values, non-empty only
variants[].price.current / .previous2999, 3999Price and compare-at price, in minor units (cents)
variants[].price.stockStatus"InStock""InStock" or "OutOfStock" from Shopify's available flag
medias[].url.src"https://cdn.shopify.com/.../img.jpg"Image source URL, nested under medias[].url
options[].type / .values"Color", [{"id":"Black","name":"Black"}]The product's option matrix
publishedScope"web"See below — only when classifyChannelScope is on
isWebOnlyChanneltrueSee below — only when classifyChannelScope is on
templateSuffix"hidden-product"See below — only when classifyTemplates is on
hasCustomTemplate / isHiddenTemplate / isBundleOrSubscriptionTemplatetrue, true, falseSee below — only when classifyTemplates is on

channelScopeSummary rows carry type, retailer, productsScanned, scrapedAt, and — depending on which toggles were on — webOnlyProductCount, globalScopeProductCount, webOnlyPct, customTemplateCount, customTemplatePct, distinctTemplateCount, hiddenTemplateProductCount, bundleOrSubscriptionTemplateCount.

Sales-channel and template classification

publishedScope reflects Shopify's own channel configuration for that product: "web" means the product is scoped to the Online Store channel only, "global" means it is published to every channel the merchant has configured; isWebOnlyChannel is true only for "web". templateSuffix is the merchant's own custom Liquid template name, or null when the product uses the theme's default template — hasCustomTemplate flags whether one is assigned at all. isHiddenTemplate and isBundleOrSubscriptionTemplate are keyword matches against that template name, using the lists in hiddenTemplateKeywords and bundleTemplateKeywords — extend either list to match a specific store's own naming convention (e.g. a store that names its bundle template recharge-bundle instead of the default keyword bundle). A merchandising audit can filter for isHiddenTemplate: true to surface listings a merchant deliberately kept out of normal browsing.

Targeting data

query narrows collection by matching a keyword against product title or tags (case-insensitive substring match on either). startUrls controls scope directly — a homepage or collection URL walks that store's catalogue up to maxResults products, a single product URL returns exactly that product. maxResults caps how many products are read per start URL (0 = no cap), so a large multi-store run can be capped per store without limiting the whole run.

How does Shopify Scraper: Sales Channel & Product Templates Data differ from the official Shopify API?

Shopify's Admin API does expose both fields this actor surfaces — published_scope and template_suffix are documented Product resource properties (shopify.dev, checked 2026-08-15). The gap isn't the data model; it's access. Every Admin API request requires a Shopify access token issued by that specific store — X-Shopify-Access-Token, scoped to {store}.myshopify.com (shopify.dev, checked 2026-08-15). A merchant can read their own catalogue this way. There is no path to reading a competitor's, a supplier's, or a prospect's store through the Admin API without that store owner installing your app and granting access — which makes it unusable for bulk, cross-store research.

FeatureShopify Admin APIShopify Scraper: Sales Channel & Product Templates Data
Access requirementAccess token issued by each individual storeNone — public storefront URLs only
Reads a store you don't own❌ requires that store's own app install✅ any public Shopify storefront
Sales-channel scope fieldpublished_scopepublishedScope
Template assignment fieldtemplate_suffixtemplateSuffix
Multi-store batch run❌ one token per store, no cross-store batching✅ one run, multiple startUrls
Hidden/bundle template flags❌ not provided — raw string onlyisHiddenTemplate, isBundleOrSubscriptionTemplate from keyword lists
SetupDeveloper app + per-store install/approvalPaste store URLs, run

Why can't I just pull this from the Admin API for stores I don't own?

The Admin API is designed for a merchant to manage their own store, or for an app the merchant explicitly installed. Every request is scoped to one {store}.myshopify.com and authenticated with a token that store issued (shopify.dev, checked 2026-08-15) — there is no endpoint for querying another merchant's catalogue, channel scope, or templates without their cooperation. For competitor research, supplier monitoring, or any multi-store use case, that access model is a hard stop. This actor reads the same underlying fields from the storefront JSON the actor already fetches per product, which is publicly reachable without a token, so the same publishedScope/templateSuffix classification works across any number of stores you don't operate.

Use the Admin API when you manage the store yourself and want a fully authenticated, real-time integration. Use this actor when you need the same channel and template signal across stores you don't control — your own catalogue plus competitors, suppliers, or a market segment — in one run.

How to use data extracted from Shopify Scraper: Sales Channel & Product Templates Data?

Merchandising and catalogue auditors

Run the actor against your own store's collections with classifyTemplates on, then filter the dataset for isHiddenTemplate: true or isBundleOrSubscriptionTemplate: true to get a list of every listing your theme or subscription app tagged outside normal browsing. Extend hiddenTemplateKeywords with your store's actual template names first — the default list (hidden, no-index, internal) is a starting point, not a guarantee of coverage.

Agencies and service providers

Point the actor at a client roster of store URLs in one run, with classifyChannelScope on, and use the channelScopeSummary row per store to report webOnlyPct — the share of a client's catalogue that hasn't been extended to other sales channels. Repeat the same run monthly to track whether that share is closing.

Market research and competitive intelligence

Feed a set of competitor storefront URLs into startUrls and compare globalScopeProductCount against productsScanned per store from the channelScopeSummary rows to see which competitors are running an omnichannel catalogue versus a web-only one — a signal a plain product export never surfaces.

AI agents and automated pipelines

Because both classifications are inline on the same product row already returned by a standard catalogue scrape, an agent pipeline can enrich a Shopify product feed with channel and template signal in the same call it uses for price and stock monitoring — no separate lookup, no extra request budget.

⬇️ Input sample

startUrls is the only required field.

ParameterRequiredTypeDescriptionExample value
startUrlsYesarrayPaste Shopify store URLs, one per line. Store homepage (https://store.com/), collection (https://store.com/collections/shoes), or single product (https://store.com/products/blue-sneakers).["https://boat-lifestyle.com"]
queryNostringOptional keyword. When set, only products whose title or tags contain this text (case-insensitive) are collected. Leave empty to collect every product the run finds. Default: """earbuds"
maxResultsNointegerMaximum products to scrape per start URL. Set to 0 for no limit (unlimited). Minimum: 0. Default: 100100
maxRecommendationsPerProductNointegerKept for input compatibility with the base Shopify Scraper only — this variant does not fetch related products with this input. For a related-products feature with price comparison, use the companion actor "Shopify Scraper: Related Products & Price Comparison". Minimum: 0. Maximum: 20. Default: 00
classifyChannelScopeNobooleanWhen on, each product row gets publishedScope ("web" = Online Store channel only, "global" = published to every configured channel) and isWebOnlyChannel, plus a per-store channel-scope summary row. Default: truetrue
classifyTemplatesNobooleanWhen on, each product row gets templateSuffix (the merchant's own custom Liquid template, if assigned), hasCustomTemplate, isHiddenTemplate, and isBundleOrSubscriptionTemplate, plus a per-store template summary. Default: truetrue
hiddenTemplateKeywordsNoarrayTemplate-name keywords (case-insensitive substring match) that flag a product as hidden from normal browsing, e.g. a merchant's own "hidden-product" template. Extend this list for a specific store's own naming.["hidden", "no-index", "internal"]
bundleTemplateKeywordsNoarrayTemplate-name keywords (case-insensitive substring match) that flag a product as a bundle or subscription-app template, e.g. "recharge-bundle". Extend this list for a specific store's own naming.["bundle", "subscription", "recharge"]
proxyConfigurationNoobjectLeave empty to start with no proxy. The actor automatically escalates its connection method per store if requests are refused.{"useApifyProxy": false}

⚠️ Important: maxRecommendationsPerProduct is declared for input compatibility only — this variant never uses it. If you need related-product recommendations, use the companion actor described in that field's own description; setting a value here on this actor has no effect.

JSON input example:

{
"startUrls": ["https://boat-lifestyle.com"],
"query": "",
"maxResults": 100,
"classifyChannelScope": true,
"classifyTemplates": true,
"hiddenTemplateKeywords": ["hidden", "no-index", "internal"],
"bundleTemplateKeywords": ["bundle", "subscription", "recharge"],
"proxyConfiguration": { "useApifyProxy": false }
}

Common pitfall: a collection or homepage URL walks that store's catalogue up to maxResults products per URL — maxResults is not a total across all startUrls. A run with five store URLs and maxResults: 100 can return up to 500 products, one batch of up to 100 per store.

⬆️ Output sample

Every product is pushed to the dataset as its own row the moment it is scraped, with a typed, consistent schema across every store in the run. Once a store finishes, one channelScopeSummary row is pushed for that store, mirrored into a separate per-run dataset named <runId>-channel-templates. Results are available in the Apify Console in JSON, CSV, Excel, and the other export formats the platform provides for any dataset.

Billing note: this actor charges per pay-per-event row_result — only type: "product" rows are charged. The per-store channelScopeSummary rows are pushed without a charged event and are free. If you're reconciling row counts against usage, filter with item.type === "product" (or exclude item.type === "channelScopeSummary") to match only the charged rows.

{
"type": "product",
"isChild": false,
"retailer": "boat-lifestyle.com",
"source": {
"id": "7845123456",
"canonicalUrl": "https://boat-lifestyle.com/products/blue-wireless-earbuds",
"retailer": "boat-lifestyle.com",
"language": "en",
"currency": "INR",
"createdUTC": "2024-02-11T09:03:00Z",
"updatedUTC": "2026-06-02T14:20:11Z",
"publishedUTC": "2024-02-12T06:00:00Z"
},
"title": "Blue Wireless Earbuds",
"description": "<p>True wireless earbuds with active noise cancellation.</p>",
"brand": "boAt",
"categories": ["wireless", "audio", "bestseller"],
"tags": ["wireless", "audio", "bestseller"],
"variants": [
{
"id": "41234567890",
"title": "Black",
"sku": "BOAT-EAR-BLK",
"options": ["Black"],
"price": {
"current": 2999,
"previous": 3999,
"stockStatus": "InStock"
}
}
],
"medias": [
{
"id": "0",
"type": "Image",
"url": {
"id": 33456789,
"product_id": 7845123456,
"position": 1,
"created_at": "2024-02-11T09:03:01Z",
"updated_at": "2024-02-11T09:03:01Z",
"alt": "",
"width": 1200,
"height": 1200,
"src": "https://cdn.shopify.com/s/files/1/example/earbuds.jpg",
"variant_ids": []
},
"variantIds": [],
"alt": ""
}
],
"options": [
{ "type": "Color", "values": [{ "id": "Black", "name": "Black" }] }
],
"publishedScope": "global",
"isWebOnlyChannel": false,
"templateSuffix": null,
"hasCustomTemplate": false,
"isHiddenTemplate": false,
"isBundleOrSubscriptionTemplate": false
}

How do you filter and target specific products?

Category vs free-text query. startUrls is the coarse targeting axis — a specific /collections/<handle> URL scopes the run to that collection's products, while a homepage or /collections/all URL scopes it to the whole catalogue. query is the fine axis inside that scope: it matches title and tags, so "leather" on a full-catalogue run returns only products whose title or tag text contains it, without needing to know the exact collection a merchant filed them under.

Scope precision. Combine a collection URL with maxResults to bound how deep the run goes into a specific section of a catalogue, or use a single product URL when you already know the exact listing and want just its channel/template classification without a wider scan.

Quality thresholds. This variant doesn't expose a rating or review threshold — its thresholds are the two classification toggles. classifyChannelScope and classifyTemplates can each be turned off independently to skip the fields (and the matching summary counters) you don't need, which also skips the per-store rollup work for that dimension.

Volume controls. maxResults is per start URL, not per run — 0 removes the cap entirely for that URL. Collection pages are read in pages of 250 products at a time internally; a low maxResults value stops paging as soon as the cap is hit.

Three real input examples:

{ "startUrls": ["https://store.com/collections/shoes"], "query": "running", "maxResults": 50 }

Narrow a single collection to just the products matching a keyword, capped at 50.

{ "startUrls": ["https://store.com/products/blue-sneakers"], "classifyChannelScope": true, "classifyTemplates": false }

Classify one known product's channel scope only, skipping template classification entirely.

{ "startUrls": ["https://store-a.com", "https://store-b.com"], "maxResults": 0, "bundleTemplateKeywords": ["bundle", "subscription", "recharge", "recharge-bundle-v2"] }

Walk two full catalogues with no cap, extended to catch a specific subscription app's own template naming.

▶️ Want to try other Shopify scrapers?

Scraper nameWhat it extracts
Shopify Products Scraper With Variant & SKU RowsOne row per variant/SKU with option matrix, stock, and price roll-ups per product
Shopify Store Scraper — Markets, Currencies & CatalogsWhich markets a store sells in, per-market currency, and catalogue/price differences across markets
Shopify Merchant Scraper: Niche & Keyword Store SearchDiscovers Shopify stores by niche/keyword and returns merchant contact, social, and lead-quality data
Amazon Product Details Scraper (Bestsellers & New Releases)Amazon product listings, bestseller ranks, and new-release data
eBay Product Listing Scraper With Sold Price DataeBay listings with sold-price history

How to extract Shopify data programmatically

This actor runs as a standard Apify Actor: one API call starts the run, and results land in a dataset as structured JSON — no separate signup or API key beyond your Apify account.

Python example

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_API_TOKEN>")
run_input = {
"startUrls": ["https://boat-lifestyle.com"],
"maxResults": 100,
"classifyChannelScope": True,
"classifyTemplates": True,
}
run = client.actor("<ACTOR_ID>").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item.get("type") == "product":
print(item["title"], item.get("publishedScope"), item.get("templateSuffix"))

Export to spreadsheets or CRM

The Apify Console's dataset view exports directly to CSV or Excel — map title, brand, variants[].price.current, publishedScope, and templateSuffix to spreadsheet columns, or retailer, webOnlyPct, and customTemplatePct from the channelScopeSummary rows for a per-store rollup sheet.

Yes — this actor reads only publicly available Shopify storefront pages, the same product data any visitor's browser loads when they view a listing. Product catalogues, prices, and template assignments are business/product data, not personal data, so this falls under each store's terms of service and general database-rights considerations rather than GDPR or CCPA, which govern personal data about identifiable individuals. Consult legal counsel for commercial applications involving bulk storage of personal data, and review the terms of service of any store you scrape at scale.

❓ FAQ

What happens to a product that's removed or unpublished from a store?

The actor returns products exactly as they exist on the storefront at request time — a removed or unpublished product simply won't appear in that run's results, since it's no longer reachable at its collection or product URL.

Can I get sales-channel and template data along with the main product fields?

Yes, by default — classifyChannelScope and classifyTemplates are both true unless you turn them off, and both classifications are added to the same product row returned for every product, with no separate request or extra dataset needed.

How accurate is the channel-scope and template data?

The actor returns publishedScope and templateSuffix exactly as Shopify reports them on the product at request time. Accuracy depends on the merchant keeping their own channel and template configuration current — the actor doesn't infer or estimate either value.

How many products can I get per run?

maxResults caps products per start URL, with a minimum of 0 (unlimited) and a default of 100. There is no run-wide cap declared in the input schema — a multi-URL run's total is the sum of each URL's own cap.

What's the actor's most distinctive filter?

The keyword-extendable hiddenTemplateKeywords and bundleTemplateKeywords inputs — since Shopify's template_suffix is free-text set by the merchant, no fixed keyword list catches every store's naming. Extending these lists to match a specific store's own template names (e.g. recharge-bundle-v2) is how you keep isHiddenTemplate/isBundleOrSubscriptionTemplate accurate for that store.

Does Shopify Scraper: Sales Channel & Product Templates Data work with Claude, ChatGPT, and AI agent frameworks?

It's callable as a standard HTTP endpoint through the Apify API by any agent framework capable of making a REST call — start a run, poll or wait for completion, then read the dataset. No MCP server is documented for this actor.

How does this compare to other Shopify scrapers?

Compared against the other Shopify actors in this account, its distinguishing feature is that channel and template classification is inline on the same product row a standard catalogue pull already returns, rather than a separate lookup — the Variant & SKU Rows scraper focuses on per-variant detail, and the Markets/Currencies scraper focuses on cross-market pricing, neither of which surface publishedScope or templateSuffix.

Can I use this without a Shopify Admin API key or developer account?

Yes. It reads only publicly reachable storefront URLs — no Admin API key, Storefront API token, app install, or store login is required.

Conclusion

Shopify Scraper: Sales Channel & Product Templates Data turns a standard product catalogue pull into a channel- and template-aware export — every row carries the same title/price/variant data a plain scraper returns, plus publishedScope and templateSuffix classification the Admin API can only give a store's own owner. It's built for anyone who needs that signal across stores they don't operate: catalogue exporters, omnichannel researchers, agencies auditing client stores, and merchandising teams tracking their own hidden or bundled listings. Paste in a list of store URLs and start a run from the Apify Console to see it on your own catalogue or a competitor's.