Install
$ agentstack add skill-salesforcecommercecloud-b2c-developer-tooling-b2c-scapi-shopper ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Shopper Commerce APIs (SCAPI)
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](../b2c-custom-api-development/SKILL.md). This skill focuses on consuming standard Shopper APIs.
Overview
Shopper APIs are designed for frontend commerce applications:
- Client: PWA Kit, composable storefronts, mobile apps
- Authentication: SLAS (Shopper Login and API Access Service)
- Response Time: Site Development > Salesforce Commerce API Settings**
Authentication
Shopper APIs require SLAS tokens. SLAS supports guest and registered shopper flows.
Create SLAS Client
# 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](../../b2c-cli/skills/b2c-slas/SKILL.md) for full client management.
Get Guest Token
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();
Required Scopes
All Shopper API scopes must be configured on your SLAS client. See [Scopes Reference](references/SCOPES.md) 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 |
API Families
Shopper Products
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());
Shopper Search
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());
Shopper Baskets
Create and manage shopping carts. See [Checkout Flow Reference](references/CHECKOUT-FLOW.md) 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
}])
}
);
Shopper Orders
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());
> The POST does not finish the order. SCAPI creates the order in CREATED status — payment is not authorized and the order is not placed by this call. A server-side dw.ocapi.shop.order.afterPOST hook is responsible for authorizing payment and advancing the order to NEW (OrderMgr.placeOrder) or FAILED (OrderMgr.failOrder). Without that hook the order is stranded in CREATED. If your headless checkout "succeeds" but the order never appears as placed (or never fails visibly), this is almost always the missing piece — see the canonical example in [b2c-hooks › Order afterPOST](../b2c-hooks/SKILL.md#order-afterpost-headless-order-placement) and the order lifecycle in [b2c-ordering](../b2c-ordering/SKILL.md).
Shopper Customers
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());
Shopper Context API
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']
})
}
);
When to Set Context
- Initial visit/login: Immediately after obtaining SLAS token
- Token refresh: Reuse existing USID for session continuity
- Login transitions: When shopper changes from guest to registered (or vice versa)
- Logout: Clear context explicitly
Quota Limits
| Environment | Limit | |-------------|-------| | Non-production | 5,000 records | | Production | 1,000,000 records |
Strategies to manage quota:
- Use lower TTL (1-2 days for registered shoppers)
- Reuse USIDs for the same shopper
- Explicitly log out shoppers to delete context
Best Practices
- Set context immediately after obtaining SLAS token
- Use the USID from the SLAS token response
- Context TTL: 1 day (guest), 7 days (registered)
- Security: Use private SLAS clients only, call from BFF (not browser)
- Don't use Shopper Context for data that's automatically set (like geolocation)
Performance Optimization
Use select Parameter
Return 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());
Use expand Carefully
Expansions 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.
Enable Compression
Always enable HTTP compression in your client for faster responses.
See [Common Patterns Reference](references/COMMON-PATTERNS.md) for more optimization patterns.
Debugging
Correlation IDs
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})
Verbose Logging
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.
Related Skills
- [b2c-slas](../../b2c-cli/skills/b2c-slas/SKILL.md) - Create and manage SLAS clients
- [b2c-slas-auth-patterns](../b2c-slas-auth-patterns/SKILL.md) - Advanced auth: OTP, passkeys, session bridge
- [b2c-scapi-schemas](../../b2c-cli/skills/b2c-scapi-schemas/SKILL.md) - Browse OpenAPI schemas
- [b2c-custom-api-development](../b2c-custom-api-development/SKILL.md) - Create custom endpoints
- [b2c-hooks](../b2c-hooks/SKILL.md) - The
order.afterPOSThook that authorizes payment and places/fails a headless order - [b2c-ordering](../b2c-ordering/SKILL.md) - Order lifecycle, status transitions, and failure handling
Reference Documentation
- [Checkout Flow](references/CHECKOUT-FLOW.md) - Complete basket to order workflow
- [Common Patterns](references/COMMON-PATTERNS.md) - Error handling, pagination, field selection
- [Scopes Reference](references/SCOPES.md) - Complete shopper scope reference by API family
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: SalesforceCommerceCloud
- Source: SalesforceCommerceCloud/b2c-developer-tooling
- License: Apache-2.0
- Homepage: https://salesforcecommercecloud.github.io/b2c-developer-tooling/
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.