平台店铺API能力
Headless 模式 API 文档
为使用自定义前端(React/Vue/Next.js 等)的平台商户提供统一事件上报 API
📋 基础信息
什么是 Headless 模式?
当您将店铺前端改造为自定义 React/Vue 等框架时,Headless 模式 API 允许您通过服务端或客户端直接调用接口,将用户行为事件上报到 MambaSMS 系统,确保以下自动化流程正常触发:
- 浏览挽回(用户浏览商品后离开)
- 购物车挽回(用户加购后未结账)
- 订阅欢迎(用户通过自己弹窗等操作订阅 Email/手机号)
统一接口
所有事件通过同一个接口提交,通过 endpoint 字段区分事件类型:
POST /api/v1/headless/events
🔑 认证方式
API 服务地址
- 生产环境:
https://front-api.mambasms.com - 测试环境:
https://olapapi.mambasend.com
获取 API Token
- 登录 MambaSMS 后台
- 进入 商店设置 → 查看密钥
- 复制 密钥(格式:
shop_xxxxxxxx)
请求头
Content-Type: application/json
X-Mamba-Access-Token: shop_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
📡 统一事件 API
接口地址
POST /api/v1/headless/events
支持的事件类型
| 事件类型 | endpoint 值 | 说明 | 触发自动化 |
|---|---|---|---|
| 浏览商品 | page/viewed | 用户访问商品详情页 | ✅ 浏览挽回 |
| 加入购物车 | carts/create | 用户点击加入购物车 | ✅ 购物车挽回 |
| 更新购物车 | carts/update | 用户修改购物车 | ✅ 购物车挽回 |
| 用户订阅 | customers/create | 收集用户 Email/手机号(表单可用) | ✅ 订阅欢迎自动化 |
通用请求格式
{
"endpoint": "事件类型",
"source_id": "唯一标识符(用于去重,最大50字符)",
"data": {
// 事件具体数据
}
}
通用响应格式
成功:
{
"success": true
}
重复提交:
{
"success": false,
"code": 304,
"message": "SourceId already exist"
}
📝 事件详细说明
1. 浏览商品事件
endpoint: page/viewed
触发"浏览挽回"自动化流程,需要用户已登录(有 customerId)才能触发。
使用场景:
场景1:未登录用户浏览商品
- 只记录浏览行为,不触发自动化
- 用于统计商品热度和页面访问量
customerId留空或不传
{
"endpoint": "page/viewed",
"source_id": "view_guest_1774520000",
"data": {
"requestId": "req_view_001",
"type": "page",
"includeProduct": 1,
"page": {
"url": "https://pitaka.com/products/magsafe-case",
"title": "MagSafe 手机壳",
"productId": "product_123456"
}
// 未登录,不传 customerId
}
}
场景2:已登录用户浏览商品(触发自动化)
- 记录浏览行为 + 触发浏览挽回自动化
- 用户离开后可以发送提醒邮件/短信
- 必须传入
customerId
{
"endpoint": "page/viewed",
"source_id": "view_user_1774520000",
"data": {
"requestId": "req_view_002",
"type": "page",
"includeProduct": 1,
"page": {
"url": "https://pitaka.com/products/magsafe-case",
"title": "MagSafe 手机壳",
"productId": "product_123456"
},
"customerId": "customer_origin_id_789" // 已登录用户
}
}
场景3:用户浏览多个商品
- 记录用户兴趣偏好
- 用于个性化推荐
- 每个商品浏览都需要单独上报
// 浏览第一个商品
{
"endpoint": "page/viewed",
"source_id": "view_product1_1774520000",
"data": {
"requestId": "req_view_003",
"type": "page",
"includeProduct": 1,
"page": {
"url": "https://pitaka.com/products/magsafe-case",
"title": "MagSafe 手机壳",
"productId": "product_123456"
},
"customerId": "customer_origin_id_789"
}
}
// 浏览第二个商品
{
"endpoint": "page/viewed",
"source_id": "view_product2_1774520100",
"data": {
"requestId": "req_view_004",
"type": "page",
"includeProduct": 1,
"page": {
"url": "https://pitaka.com/products/magsafe-charger",
"title": "MagSafe 充电器",
"productId": "product_789012"
},
"customerId": "customer_origin_id_789"
}
}
场景4:浏览非商品页面
- 记录普通页面访问(如首页、分类页)
- 不触发自动化
includeProduct设为0
{
"endpoint": "page/viewed",
"source_id": "view_homepage_1774520000",
"data": {
"requestId": "req_view_005",
"type": "page",
"includeProduct": 0, // 非商品页面
"page": {
"url": "https://pitaka.com/",
"title": "PITAKA 官网首页"
},
"customerId": "customer_origin_id_789"
}
}
请求参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| endpoint | String | ✅ | 固定值:page/viewed |
| source_id | String | ✅ | 唯一标识符(最大50字符) |
| data.requestId | String | ✅ | 本次请求唯一ID,用于去重 |
| data.type | String | ✅ | 固定值:page |
| data.includeProduct | Integer | ✅ | 是否包含商品:1 是,0 否 |
| data.page.url | String | ✅ | 商品页面完整URL |
| data.page.title | String | ✅ | 商品标题 |
| data.page.productId | String | ✅ | 商品ID(触发浏览挽回必填) |
| data.customerId | String | ⚠️ | 用户在平台的 origin_id(已登录时必填,触发自动化必须) |
请求示例:
{
"endpoint": "page/viewed",
"source_id": "view_magsafe_1774513800",
"data": {
"requestId": "req_view_magsafe_001",
"type": "page",
"includeProduct": 1,
"page": {
"url": "https://pitaka.com/products/magsafe-case",
"title": "MagSafe 手机壳",
"productId": "product_123456"
},
"customerId": "customer_origin_id_789"
}
}
2. 加入购物车事件
endpoint: carts/create
触发"购物车挽回"自动化流程。
请求参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| endpoint | String | ✅ | 固定值:carts/create |
| source_id | String | ✅ | 唯一标识符(最大50字符) |
| data.token | String | ✅ | 购物车唯一 Token |
| data.checkout_url | String | ✅ | 结账页面URL |
| data.timestamp | Long | ✅ | Unix时间戳(秒) |
| data.line_items | Array | ✅ | 购物车商品列表 |
| data.line_items[].title | String | ✅ | 商品标题 |
| data.line_items[].quantity | Integer | ✅ | 商品数量 |
| data.line_items[].price | String | ✅ | 商品单价 |
| data.line_items[].product_id | String | ✅ | 商品ID |
| data.customer_id | String | ⚠️ | 用户在平台的 origin_id(已登录时必填) |
请求示例:
{
"endpoint": "carts/create",
"source_id": "cart_abc123_1774513800",
"data": {
"token": "cart_token_abc123",
"checkout_url": "https://pitaka.com/checkout",
"timestamp": 1774513800,
"customer_id": "customer_origin_id_789",
"line_items": [
{
"title": "MagSafe 手机壳",
"quantity": 1,
"price": "49.99",
"product_id": "product_123456",
"sku": "PITAKA-CASE-001"
}
]
}
}
3. 更新购物车事件
endpoint: carts/update
更新购物车内容,触发"购物车挽回"自动化流程。
⚠️ 重要说明:全量覆盖机制
carts/update 采用全量覆盖方式,而非增量更新:
- 系统会先删除该购物车的所有商品
- 然后插入新传入的商品列表
- 客户端需要传递完整的购物车商品列表
请求参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| endpoint | String | ✅ | 固定值:carts/update |
| source_id | String | ✅ | 唯一标识符(最大50字符) |
| data.token | String | ✅ | 购物车唯一 Token(与 create 时相同) |
| data.checkout_url | String | ✅ | 结账页面URL |
| data.timestamp | Long | ✅ | Unix时间戳(秒) |
| data.line_items | Array | ✅ | 购物车商品列表(完整列表) |
| data.customer_id | String | ⚠️ | 用户在平台的 origin_id(已登录时必填) |
使用场景示例:
场景1:修改商品数量
{
"endpoint": "carts/update",
"source_id": "cart_update_abc123_1774520000",
"data": {
"token": "cart_token_abc123",
"checkout_url": "https://pitaka.com/checkout",
"timestamp": 1774520000,
"customer_id": "customer_origin_id_789",
"line_items": [
{
"title": "MagSafe 手机壳",
"quantity": 3, // 从 1 改为 3
"price": "49.99",
"product_id": "product_123456"
}
]
}
}
场景2:删除某个商品
{
"endpoint": "carts/update",
"source_id": "cart_update_abc123_1774520100",
"data": {
"token": "cart_token_abc123",
"checkout_url": "https://pitaka.com/checkout",
"timestamp": 1774520100,
"customer_id": "customer_origin_id_789",
"line_items": [
// 只保留剩余的商品,删除的商品不传
{
"title": "MagSafe 充电器",
"quantity": 1,
"price": "29.99",
"product_id": "product_789012"
}
]
}
}
场景3:清空购物车
{
"endpoint": "carts/update",
"source_id": "cart_update_abc123_1774520200",
"data": {
"token": "cart_token_abc123",
"checkout_url": "https://pitaka.com/checkout",
"timestamp": 1774520200,
"customer_id": "customer_origin_id_789",
"line_items": [] // 空数组表示清空购物车
}
}
场景4:添加新商品
{
"endpoint": "carts/update",
"source_id": "cart_update_abc123_1774520300",
"data": {
"token": "cart_token_abc123",
"checkout_url": "https://pitaka.com/checkout",
"timestamp": 1774520300,
"customer_id": "customer_origin_id_789",
"line_items": [
// 必须包含原有商品
{
"title": "MagSafe 手机壳",
"quantity": 1,
"price": "49.99",
"product_id": "product_123456"
},
// 新增的商品
{
"title": "MagSafe 充电器",
"quantity": 1,
"price": "29.99",
"product_id": "product_789012"
}
]
}
}
购物车自动删除机制:
系统会在以下情况自动删除购物车:
- 用户完成订单支付时
- 用户进入结账页面(checkout)时
因此不需要单独的购物车删除接口。
4. 表单订阅事件
endpoint: customers/create
用于收集用户 Email 和/或手机号订阅,触发"订阅欢迎"自动化流程。
⚠️ 重要说明:
carts/update采用全量覆盖方式更新- 系统会先删除购物车的所有商品,再插入新的商品列表
- 客户端需要传递购物车的完整商品列表(不是增量更新)
使用场景:
| 场景 | 处理方式 |
|---|---|
| 商品数量变化 | 传递更新后数量的完整商品列表 |
| 删除某个商品 | 传递剩余商品的列表(不包含被删除的商品) |
| 清空购物车 | 传递空数组 line_items: [] |
| 添加新商品 | 传递包含新商品的完整列表 |
请求参数:与 carts/create 相同
请求示例:
// 场景1:用户删除了一个商品,只剩一个商品
{
"endpoint": "carts/update",
"source_id": "cart_abc123_update_1774513900",
"data": {
"token": "cart_token_abc123",
"checkout_url": "https://pitaka.com/checkout",
"timestamp": 1774513900,
"customer_id": "customer_origin_id_789",
"line_items": [
{
"title": "MagSafe 手机壳",
"quantity": 2,
"price": "49.99",
"product_id": "product_123456"
}
]
}
}
// 场景2:用户清空了购物车
{
"endpoint": "carts/update",
"source_id": "cart_abc123_clear_1774514000",
"data": {
"token": "cart_token_abc123",
"checkout_url": "https://pitaka.com/checkout",
"timestamp": 1774514000,
"customer_id": "customer_origin_id_789",
"line_items": []
}
}
购物车自动删除:
购物车会在以下情况自动删除,无需客户端调用删除接口:
- ✅ 用户完成支付(
orders/paid事件触发) - ✅ 用户进入结账页面(
checkouts/create事件触发)
3. 用户订阅事件
endpoint: customers/create
用于收集用户 Email 和/或手机号订阅,触发"订阅欢迎"自动化流程。
请求参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| endpoint | String | ✅ | 固定值:customers/create |
| source_id | String | ✅ | 唯一标识符(最大50字符) |
| data.id | String | ✅ | 用户在原平台的唯一ID(如 Shopify customer_id),用于去重和关联,系统会自动生成内部主键 |
| data.created_at | Long | ✅ | 创建时间(Unix时间戳,秒) |
| data.email | String | ⚠️ | 邮箱地址(与 phone 至少填一个) |
| data.phone | String | ⚠️ | 手机号含国际区号(与 email 至少填一个) |
| data.country_code | String | 否 | 手机号国家编码(如 US、CN) |
| data.first_name | String | 否 | 名 |
| data.last_name | String | 否 | 姓 |
| data.email_marketing_consent.state | String | 否 | subscribed 表示邮件已订阅 |
| data.sms_marketing_consent.state | String | 否 | subscribed 表示短信已订阅 |
请求示例:
{
"endpoint": "customers/create",
"source_id": "[email protected]_1774513800",
"data": {
"id": "shopify_customer_12345",
"email": "[email protected]",
"phone": "+1234567890",
"country_code": "US",
"first_name": "John",
"last_name": "Doe",
"created_at": 1774513800,
"email_marketing_consent": {
"state": "subscribed"
},
"sms_marketing_consent": {
"state": "subscribed"
}
}
}
字段说明:
data.id:用户在原平台(如 Shopify)的 customer_id,用于去重和关联订单数据,系统会自动生成内部主键 ID- 如果同一个
id重复提交,系统会执行更新操作而不是创建新用户
⚠️ 重要注意事项
1. source_id 去重机制
source_id 用于事件去重,相同的 source_id 只会被处理一次
2. 自动化触发条件
| 事件 | 触发自动化的前提条件 |
|---|---|
| 浏览商品 | ✅ 用户已登录(传入 customerId)✅ includeProduct=1✅ productId 在数据库中存在✅ 商品有图片( image_url 不为空)✅ requestId 不为空 |
| 加入购物车 | 无特殊要求,有 customer_id 时可关联用户 |
| 表单订阅 | 无特殊要求,自动触发订阅欢迎自动化 |
3. 错误码说明
| 错误码 | 说明 | 解决方案 |
|---|---|---|
| 200 | 成功 | - |
| 304 | source_id 已存在(重复提交) | 正常现象,无需处理 |
| 401 | Token 无效 | 检查 X-Mamba-Access-Token |
| 412 | 校验失败 | 检查参数格式 |
| 429 | 请求过于频繁 | 降低请求频率(限制每秒40次) |
🚀 快速开始
1. 获取 API Token
登录后台 → 店铺设置 → API 密钥 → 复制 Security Key
2. 测试环境信息
- 测试环境域名:
https://olapapi.mambasend.com - 生产环境域名:
https://front-api.mambasms.com
3. 完整测试流程
以下是一个完整的测试示例,演示如何触发三个自动化:
#!/bin/bash
BASE_URL="https://olapapi.mambasend.com"
TOKEN="your_shop_token_here"
TIMESTAMP=$(date +%s)
CUSTOMER_ID="test_user_${TIMESTAMP}"
EMAIL="test${TIMESTAMP}@example.com"
# 步骤1:创建用户(触发订阅欢迎自动化)
echo "1. 创建用户..."
curl -X POST "${BASE_URL}/api/v1/headless/events" \
-H "Content-Type: application/json" \
-H "X-Mamba-Access-Token: ${TOKEN}" \
-d '{
"endpoint": "customers/create",
"source_id": "sub_'${TIMESTAMP}'",
"data": {
"id": "'${CUSTOMER_ID}'",
"email": "'${EMAIL}'",
"phone": "+1234567890",
"country_code": "US",
"first_name": "Test",
"last_name": "User",
"created_at": '${TIMESTAMP}',
"email_marketing_consent": { "state": "subscribed" }
}
}'
sleep 3
# 步骤2:浏览商品(触发浏览商品挽回自动化)
# ⚠️ 注意:必须使用真实存在的商品ID
echo "2. 浏览商品..."
curl -X POST "${BASE_URL}/api/v1/headless/events" \
-H "Content-Type: application/json" \
-H "X-Mamba-Access-Token: ${TOKEN}" \
-d '{
"endpoint": "page/viewed",
"source_id": "view_'${TIMESTAMP}'",
"data": {
"requestId": "req_view_'${TIMESTAMP}'",
"type": "page",
"includeProduct": 1,
"page": {
"url": "https://example.com/products/test-product",
"title": "测试商品",
"productId": "your_real_product_id"
},
"customerId": "'${CUSTOMER_ID}'",
"currencySymbol": "$"
}
}'
sleep 2
# 步骤3:加入购物车(触发购物车挽回自动化)
echo "3. 加入购物车..."
curl -X POST "${BASE_URL}/api/v1/headless/events" \
-H "Content-Type: application/json" \
-H "X-Mamba-Access-Token: ${TOKEN}" \
-d '{
"endpoint": "carts/create",
"source_id": "cart_'${TIMESTAMP}'",
"data": {
"token": "cart_token_'${TIMESTAMP}'",
"checkout_url": "https://example.com/checkout",
"timestamp": '${TIMESTAMP}',
"customer_id": "'${CUSTOMER_ID}'",
"email": "'${EMAIL}'",
"line_items": [
{
"title": "测试商品",
"quantity": 1,
"price": "49.99",
"product_id": "your_real_product_id"
}
]
}
}'
echo "测试完成!"
