重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
b2c-scapi-shopper by salesforcecommercecloud/b2c-developer-tooling
npx skills add https://github.com/salesforcecommercecloud/b2c-developer-tooling --skill b2c-scapi-shopper本技能将指导您如何使用标准的 Shopper API 来构建无头商务体验。Shopper API 是专为面向客户的店面设计的 RESTful 端点。
注意: 关于创建自定义 API 端点,请参阅 b2c-custom-api-development。本技能重点在于使用标准的 Shopper API。
Shopper API 专为前端商务应用程序设计:
https://{shortCode}.api.commercecloud.salesforce.com/{apiFamily}/{apiName}/v1/organizations/{organizationId}/{resource}?siteId={siteId}
示例:
https://kv7kzm78.api.commercecloud.salesforce.com/product/shopper-products/v1/organizations/f_ecom_zzte_053/products/25518823M?siteId=RefArchGlobal
Shopper Baskets API 同时支持 和 版本。新功能请使用 。
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
v1v2v2| 值 | 描述 | 示例 |
|---|---|---|
shortCode | 8 位字符的 API 路由代码 | kv7kzm78 |
organizationId | 实例标识符 | f_ecom_zzte_053 |
siteId | 站点/渠道名称 | RefArchGlobal |
在 Business Manager 中查找这些值:管理 > 站点开发 > Salesforce Commerce API 设置
Shopper API 需要 SLAS 令牌。SLAS 支持访客和注册购物者流程。
# 为购物应用创建具有默认作用域的客户端
b2c slas client create \
--tenant-id zzte_053 \
--channels RefArchGlobal \
--default-scopes \
--redirect-uri http://localhost:3000/callback
完整的客户端管理请参阅 b2c-slas 技能。
const response = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/token`,
{
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': `Basic ${btoa(clientId + ':' + clientSecret)}`
},
body: new URLSearchParams({
grant_type: 'client_credentials',
channel_id: siteId
})
}
);
const { access_token, refresh_token } = await response.json();
所有 Shopper API 作用域都必须在您的 SLAS 客户端上配置。完整列表请参阅作用域参考。
| API 系列 | 作用域 |
|---|---|
| 产品 | sfcc.shopper-products |
| 搜索 | sfcc.shopper-product-search |
| 购物篮 | sfcc.shopper-baskets-orders.rw |
| 订单 | sfcc.shopper-baskets-orders |
| 客户 | sfcc.shopper-customers.login, sfcc.shopper-myaccount.rw |
检索产品详情、定价和可用性。
// 通过 ID 获取产品
const product = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/product/shopper-products/v1/organizations/${orgId}/products/${productId}?siteId=${siteId}`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
).then(r => r.json());
// 获取多个产品
const products = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/product/shopper-products/v1/organizations/${orgId}/products?ids=prod1,prod2,prod3&siteId=${siteId}`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
).then(r => r.json());
产品搜索和建议。
// 搜索产品
const results = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/search/shopper-search/v1/organizations/${orgId}/product-search?siteId=${siteId}&q=shirt&limit=25`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
).then(r => r.json());
// 获取搜索建议
const suggestions = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/search/shopper-search/v1/organizations/${orgId}/search-suggestions?siteId=${siteId}&q=shi`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
).then(r => r.json());
创建和管理购物车。完整流程请参阅结账流程参考。
// 创建购物篮
const basket = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/checkout/shopper-baskets/v1/organizations/${orgId}/baskets?siteId=${siteId}`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({})
}
).then(r => r.json());
// 向购物篮添加商品
await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/checkout/shopper-baskets/v1/organizations/${orgId}/baskets/${basketId}/items?siteId=${siteId}`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify([{
productId: '25518823M',
quantity: 1
}])
}
);
提交订单和检索订单历史。
// 从购物篮创建订单
const order = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/checkout/shopper-orders/v1/organizations/${orgId}/orders?siteId=${siteId}`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
basketId: basket.basketId
})
}
).then(r => r.json());
客户注册、登录和账户管理。
// 获取客户资料(注册购物者)
const customer = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/customer/shopper-customers/v1/organizations/${orgId}/customers/${customerId}?siteId=${siteId}`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
).then(r => r.json());
使用 Shopper Context API 在多个请求之间保持个性化状态。所有 Shopper Context 操作都必须使用 siteId 查询参数。
// 设置购物者上下文
await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/shopper/shopper-context/v1/organizations/${orgId}/shopper-context/${usid}?siteId=${siteId}`,
{
method: 'PUT',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
effectiveDateTime: new Date().toISOString(),
sourceCode: 'SUMMER2024',
customerGroupIds: ['VIP', 'Loyalty']
})
}
);
| 环境 | 限制 |
|---|---|
| 非生产环境 | 5,000 条记录 |
| 生产环境 | 1,000,000 条记录 |
管理配额的策略:
select 参数仅返回所需字段以减少响应大小:
// 仅返回特定的产品字段
const product = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/product/shopper-products/v1/organizations/${orgId}/products/${productId}?siteId=${siteId}&select=(id,name,price,images)`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
).then(r => r.json());
expand扩展会增加响应时间并降低缓存效率:
// 扩展可用性(60 秒缓存 TTL)
const product = await fetch(
`...?expand=availability,images,prices`,
{ headers: { 'Authorization': `Bearer ${accessToken}` } }
).then(r => r.json());
考虑使用单独的请求,而不是低缓存的扩展。
始终在客户端启用 HTTP 压缩以获得更快的响应。
更多优化模式请参阅常见模式参考。
包含关联 ID 以进行请求跟踪:
const response = await fetch(url, {
headers: {
'Authorization': `Bearer ${accessToken}`,
'correlation-id': crypto.randomUUID()
}
});
// 检查响应头中 SCAPI 生成的 ID
const scapiCorrelationId = response.headers.get('sfdc_correlation_id');
在日志中心搜索:externalID:({correlation-id})
启用详细日志记录以进行调试:
const response = await fetch(url, {
headers: {
'Authorization': `Bearer ${accessToken}`,
'sfdc_verbose': 'true'
}
});
在日志中心的 scapi.verbose 类别下查找日志。
每周安装次数
61
代码仓库
GitHub 星标数
34
首次出现
2026年2月21日
安全审计
安装于
github-copilot56
codex53
cursor53
opencode52
gemini-cli51
amp51
This skill guides you through consuming standard Shopper APIs for building headless commerce experiences. Shopper APIs are RESTful endpoints designed for customer-facing storefronts.
Note: For creating custom API endpoints, see b2c-custom-api-development. This skill focuses on consuming standard Shopper APIs.
Shopper APIs are designed for frontend commerce applications:
https://{shortCode}.api.commercecloud.salesforce.com/{apiFamily}/{apiName}/v1/organizations/{organizationId}/{resource}?siteId={siteId}
Example:
https://kv7kzm78.api.commercecloud.salesforce.com/product/shopper-products/v1/organizations/f_ecom_zzte_053/products/25518823M?siteId=RefArchGlobal
Note: Shopper Baskets API supports both v1 and v2. Use v2 for newer features.
| Value | Description | Example |
|---|---|---|
shortCode | 8-character API routing code | kv7kzm78 |
organizationId | Instance identifier | f_ecom_zzte_053 |
siteId | Site/channel name | RefArchGlobal |
Find these in Business Manager: Administration > Site Development > Salesforce Commerce API Settings
Shopper APIs require SLAS tokens. SLAS supports guest and registered shopper flows.
# Create client with default scopes for a shopping app
b2c slas client create \
--tenant-id zzte_053 \
--channels RefArchGlobal \
--default-scopes \
--redirect-uri http://localhost:3000/callback
See b2c-slas skill for full client management.
const response = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/${orgId}/oauth2/token`,
{
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': `Basic ${btoa(clientId + ':' + clientSecret)}`
},
body: new URLSearchParams({
grant_type: 'client_credentials',
channel_id: siteId
})
}
);
const { access_token, refresh_token } = await response.json();
All Shopper API scopes must be configured on your SLAS client. See Scopes Reference for the complete list.
| API Family | Scope |
|---|---|
| Products | sfcc.shopper-products |
| Search | sfcc.shopper-product-search |
| Baskets | sfcc.shopper-baskets-orders.rw |
| Orders | sfcc.shopper-baskets-orders |
| Customers | sfcc.shopper-customers.login, sfcc.shopper-myaccount.rw |
Retrieve product details, pricing, and availability.
// Get product by ID
const product = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/product/shopper-products/v1/organizations/${orgId}/products/${productId}?siteId=${siteId}`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
).then(r => r.json());
// Get multiple products
const products = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/product/shopper-products/v1/organizations/${orgId}/products?ids=prod1,prod2,prod3&siteId=${siteId}`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
).then(r => r.json());
Product search and suggestions.
// Search products
const results = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/search/shopper-search/v1/organizations/${orgId}/product-search?siteId=${siteId}&q=shirt&limit=25`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
).then(r => r.json());
// Get search suggestions
const suggestions = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/search/shopper-search/v1/organizations/${orgId}/search-suggestions?siteId=${siteId}&q=shi`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
).then(r => r.json());
Create and manage shopping carts. See Checkout Flow Reference for the complete flow.
// Create basket
const basket = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/checkout/shopper-baskets/v1/organizations/${orgId}/baskets?siteId=${siteId}`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({})
}
).then(r => r.json());
// Add item to basket
await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/checkout/shopper-baskets/v1/organizations/${orgId}/baskets/${basketId}/items?siteId=${siteId}`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify([{
productId: '25518823M',
quantity: 1
}])
}
);
Submit orders and retrieve order history.
// Create order from basket
const order = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/checkout/shopper-orders/v1/organizations/${orgId}/orders?siteId=${siteId}`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
basketId: basket.basketId
})
}
).then(r => r.json());
Customer registration, login, and account management.
// Get customer profile (registered shopper)
const customer = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/customer/shopper-customers/v1/organizations/${orgId}/customers/${customerId}?siteId=${siteId}`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
).then(r => r.json());
Maintain personalization state across requests using the Shopper Context API. The siteId query parameter is required for all Shopper Context operations.
// Set shopper context
await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/shopper/shopper-context/v1/organizations/${orgId}/shopper-context/${usid}?siteId=${siteId}`,
{
method: 'PUT',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
effectiveDateTime: new Date().toISOString(),
sourceCode: 'SUMMER2024',
customerGroupIds: ['VIP', 'Loyalty']
})
}
);
| Environment | Limit |
|---|---|
| Non-production | 5,000 records |
| Production | 1,000,000 records |
Strategies to manage quota:
select ParameterReturn only needed fields to reduce response size:
// Only return specific product fields
const product = await fetch(
`https://${shortCode}.api.commercecloud.salesforce.com/product/shopper-products/v1/organizations/${orgId}/products/${productId}?siteId=${siteId}&select=(id,name,price,images)`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
).then(r => r.json());
expand CarefullyExpansions increase response time and reduce cache effectiveness:
// Expand availability (60-second cache TTL)
const product = await fetch(
`...?expand=availability,images,prices`,
{ headers: { 'Authorization': `Bearer ${accessToken}` } }
).then(r => r.json());
Consider separate requests instead of low-cache expansions.
Always enable HTTP compression in your client for faster responses.
See Common Patterns Reference for more optimization patterns.
Include correlation IDs for request tracking:
const response = await fetch(url, {
headers: {
'Authorization': `Bearer ${accessToken}`,
'correlation-id': crypto.randomUUID()
}
});
// Check response header for SCAPI-generated ID
const scapiCorrelationId = response.headers.get('sfdc_correlation_id');
Search Log Center with: externalID:({correlation-id})
Enable verbose logging for debugging:
const response = await fetch(url, {
headers: {
'Authorization': `Bearer ${accessToken}`,
'sfdc_verbose': 'true'
}
});
Find logs in Log Center under scapi.verbose category.
Weekly Installs
61
Repository
GitHub Stars
34
First Seen
Feb 21, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
github-copilot56
codex53
cursor53
opencode52
gemini-cli51
amp51
lark-cli 共享规则:飞书资源操作指南与权限配置详解
41,800 周安装