Shopee Affiliate Smart Link Server — tích hợp bot, n8n workflow, automation
Authorization: Bearer <JWT_TOKEN>| Tham số | Loại | Mô tả | |
|---|---|---|---|
password | string | Required | Mật khẩu đăng nhập |
curl -X POST '${BASE}/api/auth/login' \
-H 'Content-Type: application/json' \
-d '{"password":"your-password"}'
{
"ok": true,
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"mfaRequired": false
}
{
"ok": true,
"mfaRequired": true,
"tempToken": "eyJhbGci..." // dùng để verify-mfa, hết hạn sau 5 phút
}
| Tham số | Loại | Mô tả | |
|---|---|---|---|
tempToken | string | Required | Token tạm nhận từ /login (hết hạn 5 phút) |
code | string | Required | Mã 6 chữ số từ Google Authenticator / Authy |
curl -X POST '${BASE}/api/auth/verify-mfa' \
-H 'Content-Type: application/json' \
-d '{"tempToken":"eyJ...","code":"123456"}'
{ "ok": true, "token": "eyJhbGci..." }
Chỉ gọi được khi 2FA chưa bật.
curl '${BASE}/api/auth/2fa/setup' \
-H 'Authorization: Bearer <TOKEN>'
{
"ok": true,
"secret": "BASE32SECRET...", // lưu lại để enable
"qrCode": "data:image/png;base64,..."
}
| Tham số | Loại | Mô tả | |
|---|---|---|---|
secret | string | Required | Base32 secret nhận từ /2fa/setup |
code | string | Required | Mã 6 digits xác nhận |
curl -X POST '${BASE}/api/auth/2fa/enable' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{"secret":"BASE32...","code":"123456"}'
{ "ok": true, "message": "2FA enabled" }
| Tham số | Loại | Mô tả | |
|---|---|---|---|
code | string | Required | Mã 2FA hiện tại để xác nhận |
curl -X POST '${BASE}/api/auth/2fa/disable' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{"code":"123456"}'
{ "ok": true, "message": "2FA disabled" }
Cookie Shopee Affiliate được lưu trên server RAM. Server tự dùng cookie này khi convert nếu client không gửi cookie. Extension Chrome tự động sync, hoặc có thể sync thủ công qua 2 endpoint dưới đây.
| Tham số | Loại | Mô tả | |
|---|---|---|---|
cookie | string | Required | Chuỗi cookie đầy đủ (SPC_EC, SPC_F, SPC_ST, SPC_U, csrftoken...) |
accountName | string | Optional | Tên tài khoản để nhận biết |
curl -X POST '${BASE}/api/sync-cookie' \
-H 'Content-Type: application/json' \
-d '{
"cookie": "SPC_EC=abc;SPC_F=xyz;csrftoken=tok",
"accountName": "Tài khoản chính"
}'
{
"ok": true,
"accountName": "Tài khoản chính",
"syncedAt": "2025-01-01T00:00:00.000Z"
}
Giống /api/sync-cookie, dùng cho sync thủ công từ máy tính cá nhân.
curl -X POST '${BASE}/api/sync-cookie-local' \
-H 'Content-Type: application/json' \
-d '{"cookie":"SPC_EC=...","accountName":"Local"}'
{ "ok": true, "accountName": "Local", "syncedAt": "..." }
{
"ok": true,
"cookie": "SPC_EC=...;SPC_F=...",
"accountName": "Tài khoản chính",
"syncedAt": "2025-01-01T07:00:00.000Z"
}
{ "ok": false, "error": "Chưa có cookie nào được sync." }
| Tham số | Loại | Mô tả | |
|---|---|---|---|
links | string[] | Required | Mảng URL Shopee (tối đa 15 link/request) |
subIds | string[] | Optional | Sub-ID tracking — tối đa 5 giá trị |
cookie | string | Optional | Cookie Shopee Affiliate. Nếu bỏ trống → server tự dùng cookie đã sync từ extension |
curl -X POST '${BASE}/api/convert' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJhbGci...' \
-d '{
"links": [
"https://shopee.vn/product-name-i.123456.987654",
"https://s.shopee.vn/AbCdEf"
],
"subIds": ["n8n", "campaign1"]
}'
{
"ok": true,
"mapping": {
"https://shopee.vn/product-name-i.123456.987654": {
"shortLink": "https://s.shopee.vn/xXxXxX", // link affiliate của tài khoản bạn
"longLink": "https://affiliate.shopee.vn/...",
"failCode": 0,
"product": {
"name": "Tên sản phẩm đầy đủ",
"price": 299000, // VNĐ (số nguyên)
"image": "https://cf.shopee.vn/file/...",
"shopName": "Tên Shop",
"rating": "4.8",
"sales": 1500, // số lượng đã bán
"commission": 53820, // HH ước tính tổng (VNĐ)
"commissionRate": "18.0%", // % HH ước tính
"sellerCommission": 35880, // HH từ seller (VNĐ)
"shopeeCommission": 17940, // HH từ Shopee (VNĐ)
"isXtra": true, // có Xtra commission
"cap": 50000, // cap HH tối đa (VNĐ)
"productLink": "https://shopee.vn/product/..."
}
},
"https://s.shopee.vn/AbCdEf": {
"error": true,
"failCode": 10 // link không hợp lệ hoặc hết hạn
}
}
}
| failCode | Ý nghĩa |
|---|---|
0 | Thành công |
-1 | Lỗi không xác định |
10 | Link không hợp lệ |
40300 | Cookie hết hạn / không có quyền |
cookie, server tự dùng cookie đã sync từ extension.{
"ok": true,
"browserReady": true, // false = Playwright chưa khởi động xong
"timestamp": "2025-01-01T00:00:00.000Z"
}
POST /api/auth/login → lưu {{ $json.token }}POST /api/convert với header Auth + body linksmapping lấy shortLink và thông tin SPMethod: POST
URL: ${BASE}/api/auth/login
Body: { "password": "your-password" }
→ Lưu output: token = {{ $json.token }}
Node 2 — Convert:
Method: POST
URL: ${BASE}/api/convert
Headers: Authorization = Bearer {{ $('Login').item.json.token }}
Content-Type = application/json
Body (JSON):
{
"links": {{ JSON.stringify($json.links) }},
"subIds": ["n8n"]
}
Node 3 — Lấy kết quả (Code node):
const mapping = $input.item.json.mapping;
const results = [];
for (const [originalUrl, data] of Object.entries(mapping)) {
if (data.shortLink) {
results.push({
original: originalUrl,
shortLink: data.shortLink,
productName: data.product?.name,
price: data.product?.price,
commission: data.product?.commission,
commissionRate: data.product?.commissionRate,
});
}
}
return results.map(r => ({ json: r }));
Lưu ý quan trọng:
cookie nếu đã sync từ extension Chrome trước đó.| HTTP Code | Ý nghĩa | Xử lý |
|---|---|---|
400 | Request thiếu/sai tham số | Kiểm tra body request |
401 | Sai password hoặc mã 2FA | Đăng nhập lại |
403 | Token không hợp lệ hoặc hết hạn | Gọi /login lấy token mới |
502 | Playwright lỗi (Shopee API thất bại) | Kiểm tra cookie còn hạn không |
503 | Browser chưa sẵn sàng | Đợi vài giây rồi retry |
500 | Lỗi server nội bộ | Xem log server |
{ "ok": false, "error": "Mô tả lỗi chi tiết" }