---
title: "Shopify"
description: "通过统一的商品平台结构提供 Shopify 店铺的数据：跨店铺搜索、列出单个店铺的商品目录、读取商品及其评价。"
---

## 操作

| 操作 | 端点 | 返回 | 价格 |
|---|---|---|---|
| [Search](/docs/api-reference/shopify/search) | `GET \| POST /v1/shopify/search` | `SearchResult` | $0.001 |
| [Image Search](/docs/api-reference/shopify/image-search) | `POST /v1/shopify/image-search` | `SearchResult` | $0.001 |
| [Catalog](/docs/api-reference/shopify/catalog) | `GET \| POST /v1/shopify/catalog` | `SearchResult` | $0.001 |
| [Product](/docs/api-reference/shopify/product) | `GET \| POST /v1/shopify/product` | `Product` | $0.001 |
| [Reviews](/docs/api-reference/shopify/reviews) | `GET \| POST /v1/shopify/reviews` | `ReviewPage` | $0.001–$0.007 |

**没有 `browse`。** 其他平台都可以不带关键词列出一个类目；Shopify 不行。
Shopify 搜索必须提供 `query`。而且根本没有可以*据以*浏览的类目：Shopify 是数百万家独立店铺，而不是一套统一的分类体系，因此集合 id
只在单个店铺内有意义。所以 `/v1/shopify/browse` 返回 404，而不是返回一个会被理解为"该类目已售罄"的空页面。
要列出**单个店铺**的商品——整个商品目录或其中一个集合——请使用
[`catalog`](/docs/api-reference/shopify/catalog)。

**也没有 `categories`。** 它的存在是为了给 `browse` 提供 id；没有 `browse`，这些 id 就无事可做，
也没有跨商家的类目树可以用来生成它们。

Shopify 不是一家店铺。搜索结果横跨许多独立店铺；`catalog` 列出单个店铺的商品，
`product` 与 `reviews` 指向单个店铺的商品。

**Shopify 搜索始终是实时的。**

## ID 格式

Shopify 的 id 是复合形式——`shop/handle`：

```
us.giesswein.com/wool-sneaker-women
```

搜索条目的 `id` 本身就是这种形式，因此搜索结果可以直接接入 `product` 和 `reviews`，无需查找店铺的步骤。
也接受完整的商品 URL。

## 实际会返回什么

**搜索条目**

| 字段 | 填充率 |
|---|---|
| `title` | ~99% |
| `price` `url` | ~95% |
| `imageUrl` `seller` | ~90% |
| `rating` | ~85% |

**商品**

| 字段 | 填充率 |
|---|---|
| `title` `price` `brand` | ~100% |
| `inStock` `variants` `seller` `media.images` | ~98% |
| `options` | ~60–78% |

`seller` 实际上总是存在，因为它由店铺域名推导而来。`options` 偏低，是因为单变体商品带有一个占位维度，
我们将其排除而不是报出。

在 `brand`、`inStock` 和 `variants` 上，Shopify 是这里填充最密集的平台；而在 Amazon 提供的详情页附加
信息上则是最单薄的——没有 `reviewSummary`、`reviewAspects` 或 `offers`。

## Shopify 特有之处

**变体不能单独获取。** 一种颜色是同一商品内的一个 SKU，而不是独立的商品，因此没有 `variant.productId`
——一次调用就已拿到全部信息。

**结果横跨多个商家。** 同一搜索结果中的两个条目可能来自两家毫不相关的店铺，配送、退货和货币各不相同。
`seller` 会告诉你来自哪一家。

**运费要到结账时才计价**，因此没有 `delivery.cost`。那表示"未标明"，而不是免运费。
