b2c-custom-api-development
Original:🇺🇸 English
Translated
Develop Custom SCAPI endpoints for B2C Commerce. Use when creating REST APIs, defining api.json routes, writing schema.yaml (OAS 3.0), or building headless commerce integrations. Covers cartridge structure, endpoint implementation, and OAuth scope configuration.
6installs
Added on
NPX Install
npx skill4agent add salesforcecommercecloud/b2c-developer-tooling b2c-custom-api-developmentTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →Custom API Development Skill
This skill guides you through developing Custom APIs for Salesforce B2C Commerce. Custom APIs let you expose custom script code as REST endpoints under the SCAPI framework.
Tip: IfCLI is not installed globally, useb2cinstead (e.g.,npx @salesforce/b2c-cli).npx @salesforce/b2c-cli code deploy
Overview
A Custom API URL has this structure:
https://{shortCode}.api.commercecloud.salesforce.com/custom/{apiName}/{apiVersion}/organizations/{organizationId}/{endpointPath}Three components are required to create a Custom API:
- API Contract - An OAS 3.0 schema file (YAML)
- API Implementation - A script using the B2C Commerce Script API
- API Mapping - An file binding endpoints to implementations
api.json
Cartridge Structure
/my-cartridge
/cartridge
package.json
/rest-apis
/my-api-name # API name (lowercase alphanumeric and hyphens only)
api.json # Mapping file
schema.yaml # OAS 3.0 contract
script.js # ImplementationImportant: API directory names can only contain alphanumeric lowercase characters and hyphens.
Component 1: API Contract (schema.yaml)
Minimal example:
yaml
openapi: 3.0.0
info:
version: 1.0.0
title: My Custom API
components:
securitySchemes:
ShopperToken:
type: oauth2
flows:
clientCredentials:
tokenUrl: https://{shortCode}.api.commercecloud.salesforce.com/shopper/auth/v1/organizations/{organizationId}/oauth2/token
scopes:
c_my_scope: My custom scope
parameters:
siteId:
name: siteId
in: query
required: true
schema:
type: string
minLength: 1
paths:
/my-endpoint:
get:
operationId: getMyData
parameters:
- $ref: '#/components/parameters/siteId'
responses:
'200':
description: Success
security:
- ShopperToken: ['c_my_scope']Key requirements:
- Use for Shopper APIs (requires siteId),
ShopperTokenfor Admin APIsAmOAuth2 - Custom scopes must start with , max 25 chars
c_ - Custom parameters must have prefix
c_
See Contract Reference for full schema examples and Shopper vs Admin API differences.
Component 2: Implementation (script.js)
javascript
var RESTResponseMgr = require('dw/system/RESTResponseMgr');
exports.getMyData = function() {
var myParam = request.getHttpParameterMap().get('c_my_param').getStringValue();
var result = { data: 'my data', param: myParam };
RESTResponseMgr.createSuccess(result).render();
};
exports.getMyData.public = true; // RequiredKey requirements:
- Mark exported functions with
.public = true - Use for responses
RESTResponseMgr.createSuccess() - Use for error responses (RFC 9457 format)
RESTResponseMgr.createError()
See Implementation Reference for caching, remote includes, and external service calls.
Component 3: Mapping (api.json)
json
{
"endpoints": [
{
"endpoint": "getMyData",
"schema": "schema.yaml",
"implementation": "script"
}
]
}Important: Implementation name must NOT include file extension.
Development Workflow
- Create cartridge with structure
rest-apis/{api-name}/ - Define contract (schema.yaml) with endpoints and security
- Implement logic (script.js) with exported functions
- Create mapping (api.json) binding endpoints to implementation
- Deploy and activate to register endpoints
- Check registration status and test
Deployment
bash
# Deploy and activate to register endpoints
b2c code deploy ./my-cartridge --reload
# Check registration status
b2c scapi custom status --tenant-id zzpq_013
# Show failed registrations with error reasons
b2c scapi custom status --tenant-id zzpq_013 --status not_registered --columns apiName,endpointPath,errorReasonAuthentication Setup
For Shopper APIs
- Create a SLAS client with your custom scope(s):
bash
b2c slas client create --default-scopes --scopes "c_my_scope" - Obtain token via SLAS client credentials
- Include in all requests
siteId
For Admin APIs
- Configure custom scope in Account Manager
- Obtain token via Account Manager OAuth
- Omit from requests
siteId
See Testing Reference for curl examples and authentication setup.
Troubleshooting
| Error | Cause | Solution |
|---|---|---|
| 400 Bad Request | Invalid/unknown params | Define all params in schema |
| 401 Unauthorized | Invalid token | Check token validity |
| 403 Forbidden | Missing scope | Verify scope in token |
| 404 Not Found | Not registered | Check |
| 500 Internal Error | Script error | Check |
| 503 Service Unavailable | Circuit breaker open | Fix errors, wait for reset |
Registration Issues
- Endpoint not appearing: Verify cartridge is in site's cartridge path, re-activate code version
- Check logs: Use or filter Log Center with
b2c logs getCustomApiRegistry
Related Skills
- - Deploying cartridges and activating code versions
b2c-cli:b2c-code - - Checking Custom API registration status
b2c-cli:b2c-scapi-custom - - Creating SLAS clients for testing Shopper APIs
b2c-cli:b2c-slas - - Service configuration for external calls
b2c:b2c-webservices
Reference Documentation
- Contract Reference - Full schema.yaml examples, Shopper vs Admin APIs
- Implementation Reference - script.js patterns, caching, remote includes
- Testing Reference - Authentication setup, curl examples