将公开的 Shopify 店铺 JSON 和站点地图接口转换为结构化数据,用于目录监控、选品研究、产品发现和店铺情报工作流。
Structured output
使用 Crawlora 的 Shopify 店铺数据抓取 API,无需维护 Shopify 专属的请求处理、URL 规范化、解析器、计费或开发者文档,即可采集支持范围内的公开店铺 JSON、商品、系列、页面、推荐、预测搜索和站点地图记录。
电商工作流
当团队需要可重现的结构化记录而非手动浏览店铺时,Shopify 店铺数据可以支撑公开目录发现、商品监控、系列研究、搜索建议分析、页面发现和站点地图审计。
Shopify 店铺情报Request schema
These parameters come from the active Get Shopify store metadata catalog entry.
| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
| url | string | Yes | Shopify storefront URL | https://www.allbirds.com |
Example JSON
This example is rendered from the active endpoint catalog so the page stays aligned with Docs and Playground.
{
"code": 200,
"msg": "OK",
"data": {
"requested_url": "https://www.allbirds.com",
"source_url": "https://www.allbirds.com",
"domain": "www.allbirds.com",
"source_domain": "www.allbirds.com",
"name": "Allbirds",
"currency": "USD",
"country": "US",
"published_products_count": 638
}
}Endpoint catalog
/shopify/storeResolves a public Shopify storefront and returns its metadata.
Response notes
- Returns the requested storefront URL plus the resolved source URL used for JSON requests. - Includes `myshopify_domain`, store name, currency, country, and published product/collection counts when `/meta.json` exposes them. - Blocked pages, malformed JSON, missing Shopify roots, and unavailable fallback domains return upstream errors. - For some storefronts, `transport_mode` is `ssr_embedded`; it is omitted entirely for other stores. Responses for these stores may have fewer populated fields (for example `myshopify_domain` and the store-metadata fields are typically unavailable). `transport_mode` allowed values: `ssr_embedded` (only ever present, never any other value; omitted for the classic transport).
MCP tool shopify_store
/shopify/productsReturns products from a public Shopify storefront. Valid empty result pages return `200` with an empty products array. `sortBy` and dynamic facet-filter query params (e.g. `fit`, `canonicalColour`) only take effect for headless storefronts (`transport_mode: "ssr_embedded"`) and return an invalid-param error if supplied against a classic store, since classic Shopify storefronts have no server-side sort or filter support. `sort_by`, `min_price`, `max_price`, `product_type`, `in_stock_only`, and `option_`-prefixed params (e.g. `option_size=Small,Medium`) drive a separate, independent mechanism -- Shopify's own native Storefront Filtering collection-page feature (`transport_mode: "storefront_filtered"`) -- which works for both classic and headless stores; supplying any of these takes precedence over sortBy/dynamic facet filters.
Response notes
- Valid empty result pages return `200` with an empty `products` array. - Product prices are normalized to decimal currency units. - Blocked pages, malformed JSON, and missing `products` roots return upstream errors. - For some storefronts, the response includes `transport_mode: "ssr_embedded"`, `total_items`, and `total_pages` (the storefront's own result-count/page-count metadata), and each product may include additive fields only available from this source: `colour`, `canonical_colour`, `discount_percentage`, `rating`, `rating_count`, `collection_tags`, `labels`, and per-variant `inventory_quantity`. `limit` is still honored as an upper bound on returned items, but the underlying page size is fixed by the storefront (commonly 60) and cannot be requested larger than that. `transport_mode`, `total_items`, and `total_pages` are omitted entirely for other stores. - When `transport_mode` is `ssr_embedded`, the response may also include `facets` and `facets_stats`, mirroring the storefront's own filter sidebar for that listing: `facets` maps a facet field name exactly as the storefront names it (for example `fit`, `activities`, `canonicalColour`, `sizeInStock`) to its value-to-count buckets, and `facets_stats` gives `min`/`max`/`avg` for numeric-range fields such as `price` and `discountPercentage`. Both are omitted when the storefront's payload did not include facet data, and always omitted for other stores. - **`sortBy` and facet filters apply to `ssr_embedded` stores only.** Rather than silently accepting and ignoring `sortBy` or a facet filter against other stores (which would look like it worked but wouldn't), this endpoint rejects the request with a `400` invalid-param error whenever `sortBy` or any facet-filter query param is supplied and the resolved store is not `transport_mode: "ssr_embedded"`. - When a sort and/or filters were applied to an `ssr_embedded` store, the response echoes back what was actually honored: `sort` (one of the enum values below) and `filters` (a map of facet field name to the array of values that were requested for it, after comma-splitting). Both are omitted when no sort/filter was supplied. - `hitsPerPage` (the storefront's own listing page size, commonly 60) is unaffected by sort/filters; `limit` continues to apply as an upper bound on the returned page. - **Storefront Filtering** (`sort_by`/`min_price`/`max_price`/`product_type`/`in_stock_only`/`option_*`) is Shopify's own native collection-page filtering/sorting feature, distinct from the `sortBy`/dynamic-facet-filter pair above. It works for all stores. When any of these params is supplied, the response has `transport_mode: "storefront_filtered"` and echoes back the effective `sort_by`, `min_price`, `max_price`, `product_type`, `in_stock_only`, and `variant_options` that were applied. `facets`/`facets_stats` are populated from the storefront's own filter sidebar when present: `facets` maps a lowercased variant option name (e.g. `size`, `color`) or `product_type` to its value-to-count buckets, and `facets_stats.price` gives the Price slider's own `min`/`max` bounds. `total_pages` is populated only when the collection page itself renders numbered pagination links; a single-page result leaves it unset. Not every Shopify store has this feature enabled — a store without it returns the unfiltered/unsorted collection page, which this endpoint cannot distinguish from "the filter matched everything" without upstream signal. `sortBy` allowed values: `sortLTH`, `sortHTL`, `newest`. `sort_by` allowed values: `manual`, `best-selling`, `title-ascending`, `title-descending`, `price-ascending`, `price-descending`, `created-ascending`, `created-descending`. `transport_mode` allowed values: `ssr_embedded`, `storefront_filtered` (omitted entirely for the classic transport).
MCP tool shopify_products
/shopify/products/{handle}Returns one product from any Shopify storefront, given the store URL and the product handle: title, description, product type, tags, price and compare-at price, availability, options, images, and each variant with its own price, availability and barcode. Prices are in decimal currency units; an unknown handle returns `404`.
Response notes
- Product prices are returned in decimal currency units rather than cent values. - Missing product handles return `404` when Shopify returns not found. - Blocked pages, malformed JSON, and missing product fields return upstream errors. - For some storefronts, the response includes `transport_mode: "ssr_embedded"`, and the product may include additive fields only available from this source: `colour`, `canonical_colour`, `discount_percentage`, `rating`, `rating_count`, `collection_tags`, `labels`, and per-variant `inventory_quantity`. `transport_mode` is omitted entirely for other stores. A product for which no detail data is available returns an upstream error. `transport_mode` allowed values: `ssr_embedded` (only ever present, never any other value; omitted for the classic transport).
MCP tool shopify_product
/shopify/products/{handle}/recommendationsReturns recommended products from Shopify's product recommendations.
Response notes
- Missing product handles return `404` when Shopify returns not found while resolving the seed product. - Valid empty recommendation arrays return `200` with an empty `products` array. - Blocked pages, malformed JSON, and missing Shopify roots return upstream errors. - For some storefronts, the response includes `transport_mode: "ssr_embedded"`, and each product may include the same additive fields documented for `/shopify/products`: `colour`, `canonical_colour`, `discount_percentage`, `rating`, `rating_count`, `collection_tags`, `labels`, and per-variant `inventory_quantity`. `transport_mode` is omitted entirely for other stores. `transport_mode` allowed values: `ssr_embedded` (only ever present, never any other value; omitted for the classic transport).
MCP tool shopify_product_recommendations
/shopify/collectionsReturns collections from a public Shopify storefront. Valid empty result pages return `200` with an empty collections array.
Response notes
- Valid empty result pages return `200` with an empty `collections` array. - Blocked pages, malformed JSON, and missing `collections` roots return upstream errors. - For some storefronts, the response includes `transport_mode: "ssr_embedded"`, and `title` is a best-effort derivation from the handle (hyphens become spaces, each word title-cased) — **not** the storefront's real display name. `products_count` and other fields not available for these storefronts are omitted, never fabricated. `transport_mode` is omitted entirely for other stores. - In this fallback mode, `handle` is derived from the last path segment of the collection URL and is not guaranteed unique: some storefronts nest gender/audience-scoped sub-collections under the same final segment (for example `/collections/all-products/womens` and `/collections/legacy/womens` both derive `handle: "womens"`). Use the item's own `url` to identify a specific nested collection rather than assuming `handle` alone round-trips through `GET /shopify/collections/{handle}/products`. `transport_mode` allowed values: `ssr_embedded` (only ever present, never any other value; omitted for the classic transport).
MCP tool shopify_collections
/shopify/collections/{handle}/productsReturns products from a Shopify collection. `sortBy` and dynamic facet-filter query params (e.g. `fit`, `canonicalColour`) only take effect for headless storefronts (`transport_mode: "ssr_embedded"`) and return an invalid-param error if supplied against a classic store, since classic Shopify storefronts have no server-side sort or filter support. `sort_by`, `min_price`, `max_price`, `product_type`, `in_stock_only`, and `option_`-prefixed params (e.g. `option_size=Small,Medium`) drive a separate, independent mechanism -- Shopify's own native Storefront Filtering collection-page feature (`transport_mode: "storefront_filtered"`) -- which works for both classic and headless stores; supplying any of these takes precedence over sortBy/dynamic facet filters.
Response notes
- Valid empty result pages return `200` with an empty `products` array. - Missing collections return `404` when Shopify returns not found. - Blocked pages, malformed JSON, and missing `products` roots return upstream errors. - For some storefronts, the response includes `transport_mode: "ssr_embedded"`, `total_items`, and `total_pages` (the storefront's own result-count/page-count metadata), and each product may include additive fields only available from this source: `colour`, `canonical_colour`, `discount_percentage`, `rating`, `rating_count`, `collection_tags`, `labels`, and per-variant `inventory_quantity`. `limit` is still honored as an upper bound on returned items, but the underlying page size is fixed by the storefront (commonly 60) and cannot be requested larger than that. `transport_mode`, `total_items`, and `total_pages` are omitted entirely for other stores. - When `transport_mode` is `ssr_embedded`, the response may also include `facets` and `facets_stats`, mirroring the collection page's own filter sidebar: `facets` maps a facet field name exactly as the storefront names it (for example `fit`, `activities`, `canonicalColour`, `sizeInStock`) to its value-to-count buckets, and `facets_stats` gives `min`/`max`/`avg` for numeric-range fields such as `price` and `discountPercentage`. Both are omitted when the storefront's payload did not include facet data, and always omitted for other stores. - **`sortBy` and facet filters apply to `ssr_embedded` stores only.** Rather than silently accepting and ignoring `sortBy` or a facet filter against other stores (which would look like it worked but wouldn't), this endpoint rejects the request with a `400` invalid-param error whenever `sortBy` or any facet-filter query param is supplied and the resolved store is not `transport_mode: "ssr_embedded"`. - When a sort and/or filters were applied to an `ssr_embedded` store, the response echoes back what was actually honored: `sort` (one of the enum values below) and `filters` (a map of facet field name to the array of values that were requested for it, after comma-splitting). Both are omitted when no sort/filter was supplied. - `hitsPerPage` (the storefront's own listing page size, commonly 60) is unaffected by sort/filters; `limit` continues to apply as an upper bound on the returned page. - **Storefront Filtering** (`sort_by`/`min_price`/`max_price`/`product_type`/`in_stock_only`/`option_*`) is Shopify's own native collection-page filtering/sorting feature, distinct from the `sortBy`/dynamic-facet-filter pair above. It works for all stores. When any of these params is supplied, the response has `transport_mode: "storefront_filtered"` and echoes back the effective `sort_by`, `min_price`, `max_price`, `product_type`, `in_stock_only`, and `variant_options` that were applied. `facets`/`facets_stats` are populated from the collection page's own filter sidebar when present: `facets` maps a lowercased variant option name (e.g. `size`, `color`) or `product_type` to its value-to-count buckets, and `facets_stats.price` gives the Price slider's own `min`/`max` bounds. `total_pages` is populated only when the collection page itself renders numbered pagination links; a single-page result leaves it unset. Not every Shopify store has this feature enabled — a store without it returns the unfiltered/unsorted collection page, which this endpoint cannot distinguish from "the filter matched everything" without upstream signal. `sortBy` allowed values: `sortLTH`, `sortHTL`, `newest`. `sort_by` allowed values: `manual`, `best-selling`, `title-ascending`, `title-descending`, `price-ascending`, `price-descending`, `created-ascending`, `created-descending`. `transport_mode` allowed values: `ssr_embedded`, `storefront_filtered` (omitted entirely for the classic transport).
MCP tool shopify_collection_products
/shopify/search/suggestReturns predictive search suggestions from any Shopify storefront for a query: matching products, collections and suggested queries. Choose which with `types` (default all three) and cap results per type with `limit` (default 10, max 20). Products carry price, availability, images and options; collections carry title, handle, description and product count.
Response notes
- Products and collections use the same shapes as the Shopify product and collection endpoints. - Query suggestions include text and a storefront search URL when Shopify provides one. - Valid empty suggestion arrays return `200` with empty arrays. - Blocked pages, malformed JSON, and missing Shopify roots return upstream errors.
MCP tool shopify_search_suggest
/shopify/pagesLists static pages from a Shopify storefront given by the required `url`, paged with `page` (from 1) and `limit` (default 50, max 250). Each has `handle`, `title`, `url`, plain-text `content` and dates. If `transport_mode` is `ssr_embedded`, items hold only `handle`, `url` and `updated_at`.
Response notes
- Page content is cleaned text from Shopify `body_html`; raw HTML is not returned. - Valid empty page arrays return `200` with an empty `pages` array. - Blocked pages, malformed JSON, and missing Shopify roots return upstream errors. - For some storefronts, the response includes `transport_mode: "ssr_embedded"`, and each item only carries `handle`, `url`, and `updated_at` — no `title`, `id`, or `content`. Call `GET /shopify/pages/{handle}` per handle to get full content. `transport_mode` is omitted entirely for other stores. `transport_mode` allowed values: `ssr_embedded` (only ever present, never any other value; omitted for the classic transport).
MCP tool shopify_pages
/shopify/pages/{handle}Returns one static page from any public Shopify storefront, by path `handle` and the required `url` of the store. The response has the page's title, URL, times and its `content` as plain text. Unknown handles return 404. Localhost, private-network and credentialed URLs are rejected.
Response notes
- Page content is cleaned text from Shopify `body_html`; raw HTML is not returned. - Missing page handles return `404` when Shopify returns not found. - Blocked pages, malformed JSON, and missing Shopify roots return upstream errors. - For some storefronts, the response includes `transport_mode: "ssr_embedded"`; `content` is plain text rendered from the page's rich-text blocks (marks/formatting are dropped, non-rich-text blocks such as banners are skipped), and `id` is omitted because it is not a Shopify numeric id. `transport_mode` is omitted entirely for other stores. `transport_mode` allowed values: `ssr_embedded` (only ever present, never any other value; omitted for the classic transport).
MCP tool shopify_page
/shopify/sitemapsLists the child sitemaps in a Shopify storefront's sitemap index, for the required `url`. Each has a `loc` and a `type` (`products`, `collections`, `pages`, `blogs`, `agentic_discovery` or `other`) inferred from its URL. Localhost, private-network and credentialed URLs are rejected.
Response notes
- Sitemap `type` is inferred from the child sitemap URL. - Inferred sitemap types are `products`, `collections`, `pages`, `blogs`, `agentic_discovery`, and `other`. - Blocked pages, malformed XML, and missing sitemap entries return upstream errors.
MCP tool shopify_sitemaps
/shopify/sitemap/urlsLists URL entries from a Shopify storefront's sitemaps, for the required `url`. `type` filters (`all` by default, `products`, `collections`, `pages`, `blogs`, `agentic_discovery`, `other`) and `limit` caps entries (default 50, max 250). Each has `loc`, `type`, `handle`, `lastmod`, `changefreq` and optional `images`.
Response notes
- The service fetches matching child sitemaps from `/sitemap.xml` until `limit` URL entries is reached. - URL entries include `loc`, inferred `type`, `handle`, `lastmod`, `changefreq`, and optional `images`. - Blocked pages, malformed XML, and missing sitemap entries return upstream errors.
MCP tool shopify_sitemap_urls
Managed execution
Crawlora 将支持的公开 Shopify 店铺 JSON 和站点地图流程封装为受 API 密钥保护的端点,提供规范化响应、文档化错误、Playground 示例以及基于额度的用量计费。
针对店铺、商品、系列、页面、推荐、搜索建议和站点地图流程的端点专属请求处理
拒绝 localhost、私有网络、link-local 及带凭证 URL 的 URL 校验
在可获取的范围内提供规范化的商品、系列、页面、推荐和站点地图字段
针对在发现的 myshopify.com 域名上暴露公开数据的店铺进行源 URL 解析
针对被拦截、格式错误、未找到或缺失根路径的响应提供文档化的上游故障行为
Docs 和 Playground 页面均由当前活跃的端点目录生成
Build or buy
Use this comparison to decide whether to maintain scraping infrastructure internally or call a managed endpoint.
| Requirement | Building internally | Crawlora |
|---|---|---|
| 端点覆盖范围 | 需要为店铺元数据、商品、系列、页面、推荐和搜索建议分别维护采集器。 | 通过一个 Crawlora API 界面使用文档化的 Shopify 店铺端点系列。 |
| URL 与来源处理 | 需要自行校验不可信的店铺 URL,并自行实现公开源域名的回退逻辑。 | 使用 Crawlora 的校验和端点专属的源 URL 处理。 |
| 架构规范化 | 需要自行设计商品、系列、页面和推荐模型。 | 在 Docs 和 Playground 中获取规范化的 JSON 示例和架构。 |
| 用量计费 | 需要自建计量和按流程定价模型。 | 使用基于额度的端点权重和 API 密钥用量跟踪。 |
Crawlora 并非 Shopify 官方的 Admin API、Storefront API、Checkout API 或 Partner API。Crawlora 为支持的公开 Shopify 店铺页面、JSON 和站点地图流程提供结构化网络公开数据提取端点。如果你的用例需要账号维度的商务数据、订单、结账、客户记录、库存管理、商户管理或官方应用集成,请使用 Shopify 官方 API。客户需自行确保其使用符合适用法律、第三方权利、平台条款、商户条款及 Crawlora 条款。
Related APIs
Connect this endpoint with adjacent Crawlora search, monitoring, docs, and pricing pages.
How to scrape Shopify
Crawlora 的 Shopify 端点是 GET 请求,接受任意公开店铺的 url,读取 Shopify 无需凭证的公开接口:/shopify/store 解析店铺并返回元数据,/shopify/products 和 /shopify/collections 读取公开的 products.json 和 collections.json 接口(支持 page 和 limit),/shopify/collections/{handle}/products 遍历某个系列,/shopify/products/{handle} 通过 handle 的 .js 端点返回商品详情,/shopify/products/{handle}/recommendations 读取推荐 Ajax 接口(intent 为 related 或 complementary),/shopify/search/suggest 读取预测搜索,/shopify/pages 和 /shopify/pages/{handle} 将静态页面读取为清洗后的文本,/shopify/sitemaps 和 /shopify/sitemap/urls 遍历站点地图索引。对于没有经典接口的无头店铺,会回退读取店铺自身内嵌的搜索数据,从而额外提供 facets、sortBy 和分面筛选参数。
GET /shopify/store?url=<店铺 URL> 从无需凭证的店铺 JSON 中返回规范化的店铺元数据。如果自定义域名拦截了 products.json,服务可能会回退到店铺公开的 myshopify.com 域名。
GET /shopify/products?url=<店铺>&page=1&limit=<n> 获取公开商品信息流,/shopify/collections 获取系列列表,/shopify/collections/{handle}/products 获取某个系列的商品。空页面会返回 200 状态码及空数组,这就是判断是否已到末尾的方式。
GET /shopify/products/{handle}?url=<店铺> 获取完整商品详情,GET /shopify/products/{handle}/recommendations(intent=related 或 complementary)获取该店铺的关联推荐;handle 会自动为你解析为 Shopify 的商品 id。
GET /shopify/sitemaps?url=<店铺> 列出子站点地图及其推断出的类型,/shopify/sitemap/urls?type=products 遍历其条目,/shopify/search/suggest?q=<term> 读取预测搜索,/shopify/pages 及 /shopify/pages/{handle} 将静态页面返回为清洗后的文本。
FAQ
Answers for developers evaluating Crawlora for supported public search result pages.
是的。Crawlora 为支持的公开店铺元数据、商品、商品详情、推荐、系列、系列商品、页面、预测搜索建议、站点地图及站点地图 URL 提供 Shopify 端点。
不是。Crawlora 并非 Shopify 官方的 Admin API、Storefront API、Checkout API、Partner API,也不是商户应用集成。它为支持的 Shopify 店铺页面提供公开网络数据提取。
当前目录包括店铺元数据、公开商品、商品详情、推荐、系列、系列商品、公开页面、预测搜索建议、子站点地图,以及在支持范围内有条数上限的站点地图 URL 条目。
不能。Crawlora 的 Shopify 端点仅面向支持范围内的公开店铺数据。如需账号维度的商务、订单、结账、客户或库存管理工作流,请使用 Shopify 官方 API。
可以。在公开店铺数据可获取的情况下,Shopify 的商品、商品详情、系列和系列商品端点可以支撑负责任的目录监控。
可以。在可获取的情况下,Shopify 站点地图端点可以列出子站点地图条目,以及针对商品、系列、页面、博客、智能体可发现性等推断出的站点地图类型的、有条数上限的 URL 行。
将店铺 url 传给 Crawlora 的 /shopify/store 端点进行解析,然后调用 GET /shopify/products、/shopify/collections 和 /shopify/collections/{handle}/products 遍历目录,用 /shopify/products/{handle} 获取详情。无需 Shopify 凭证;这些端点读取的是 Shopify 公开的店铺 JSON。
通常适用。如果自定义域名拦截了该接口,服务可能会回退到公开的 myshopify.com 域名;对于完全没有该接口的无头店铺,会解析店铺自身内嵌的搜索数据,这同时也会暴露 facets、sortBy 和分面筛选参数。
只有在通过内嵌搜索回退机制提供服务的无头店铺上才可以,此时 sortBy 和分面筛选查询参数会被转发到店铺自身的搜索索引。经典店铺公开的 products.json 没有服务端排序或筛选功能,此时 /shopify/collections/{handle}/products 端点会返回一个类型化的 400 错误,而不是静默忽略这些参数。
对 /shopify/products/{handle}/recommendations 端点传入店铺 url 及 intent=related 或 intent=complementary。它会在将 handle 解析为商品 id 后,读取 Shopify 无需凭证的推荐 Ajax 接口。
这些端点读取的是 Shopify 无需凭证即可公开访问的店铺 JSON 和站点地图。在遵守店铺条款、速率限制和适用法律的前提下,为研究、监控和选品分析目的采集这些数据通常是被允许的。
对普通开发者而言没有。Shopify 自家的 Admin API 只返回签发该访问令牌的店铺自身数据,无法读取其他商家的目录。Shopify 较新的跨店铺 Catalog API 可以汇总多个店铺的商品和价格信息流,但它是邀请制、按合作伙伴逐一审核的(Perplexity 是其首个接入方),没有自助注册入口。Crawlora 的端点则直接读取每个店铺自身公开的 products.json、collections.json 及搜索接口,因此任何公开的 Shopify 店铺都无需合作伙伴审核即可查询。
Company coverage
Shopify Inc. · SHOP
Shopify is operated by Shopify Inc. (SHOP). Crawlora's SEC endpoints take the same company's CIK, so filings, financials, insider transactions and 13F holdings come from the same API key as the Shopify endpoints above.
Other Shopify Inc. platforms in the catalog
Guides
Read Crawlora guides and comparisons that use the Shopify API.
在 Playground 中测试 Shopify 店铺元数据,在 Docs 中查看当前的响应架构,并在价格页面比较基于额度的用量。