v2.product.update_stock
POST/api/v2/product/update_stockGọi qua 360: POST https://partner.quantri360.com/v1/shopee/api/v2/product/update_stock
Endpoint ghi — thay đổi dữ liệu trên Shopee. Key phải được tạo với tick "Cho phép gọi API ghi", nếu không sẽ nhận 403 write_not_allowed. Mỗi lần gọi được ghi nhật ký.
Mô tả API
CẬP NHẬT TỒN KHO người bán cho các phân loại của MỘT sản phẩm (tối đa 50 phân loại một lần), theo từng kho. Dùng để đẩy tồn từ hệ thống kho / POS lên Shopee.
- Là API GHI — thay đổi dữ liệu thật trên Shopee; key cần quyền ghi. Gọi bằng POST, body JSON.
- Chỉ đổi tồn người bán (seller_stock), không đổi tồn ở kho Shopee.
- Khi sản phẩm đang / sắp có khuyến mãi, tồn mới phải ≥ tồn đang giữ cho khuyến mãi (
total_reserved_stock, xem get_item_promotion / get_model_list) — không đủ thì phân loại đó vàofailure_list. - Kết quả theo từng phân loại: kiểm cả
failure_listdùerrorrỗng. Sản phẩm đã xóa không sửa được tồn. - Nhiều sản phẩm: gọi lần lượt từng sản phẩm, giãn khoảng 200 ms giữa các lần.
Request
Địa chỉ
POST https://partner.quantri360.com/v1/shopee/api/v2/product/update_stock
Xác thực & gian hàng
| Tên | Vị trí | Kiểu | Mẫu | Mô tả |
|---|---|---|---|---|
| Authorization | header | header | Bearer q360_live_ab12cd34_… | Khóa API của brand (tạo ở mục API key). Bắt buộc với mọi request. Brand suy từ key — không truyền mã brand. |
| platform_shop_id | query | string | 100001 | Gian hàng (lấy ở GET /v1/platforms → shops[].platform_shop_id). BẮT BUỘC khi brand có > 1 gian hàng trên nền tảng; 360 bỏ tham số này trước khi chuyển tiếp. |
Tham số request
| Tên | Vị trí | Kiểu | Bắt buộc | Mẫu | Mô tả |
|---|---|---|---|---|---|
| item_id | body | int | Có | 10000000081 | Mã sản phẩm (một sản phẩm mỗi lần gọi). |
| stock_list | body | object[] | Có | [{"model_id":10000000090,"seller_stock":[{"location_id":"VNZ","stock":5}]}] | 1–50 phần tử. |
| stock_list[].model_id | body | int | Không | 10000000090 | Mã phân loại (get_model_list); sản phẩm không phân loại gửi 0. |
| stock_list[].seller_stock | body | object[] | Có | [{"location_id":"VNZ","stock":5}] | Tồn mới theo kho. |
| stock_list[].seller_stock[].location_id | body | string | Không | VNZ | Mã kho (get_warehouse_detail). Gian hàng một kho không cần gửi. |
| stock_list[].seller_stock[].stock | body | int | Có | 5 | Số tồn MỚI (ghi đè, không cộng dồn). |
Ví dụ request
curl -s -X POST "https://partner.quantri360.com/v1/shopee/api/v2/product/update_stock" \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"item_id":10000000081,"stock_list":[{"model_id":10000000090,"seller_stock":[{"location_id":"VNZ","stock":5}]},{"model_id":10000000091,"seller_stock":[{"location_id":"VNZ","stock":1}]}]}'
Python
import requests
KEY = "q360_live_..." # khóa API của brand
r = requests.post(
"https://partner.quantri360.com/v1/shopee/api/v2/product/update_stock",
params={},
json={
"item_id": 10000000081,
"stock_list": [
{
"model_id": 10000000090,
"seller_stock": [
{
"location_id": "VNZ",
"stock": 5
}
]
},
{
"model_id": 10000000091,
"seller_stock": [
{
"location_id": "VNZ",
"stock": 1
}
]
}
]
},
headers={"Authorization": f"Bearer {KEY}"},
timeout=60,
)
print(r.status_code)
print(r.json())Node.js
const KEY = 'q360_live_...'; // khóa API của brand
const url = new URL('https://partner.quantri360.com/v1/shopee/api/v2/product/update_stock');
for (const [k, v] of Object.entries({})) url.searchParams.set(k, typeof v === 'object' ? JSON.stringify(v) : String(v));
const r = await fetch(url, {
method: 'POST',
headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({"item_id":10000000081,"stock_list":[{"model_id":10000000090,"seller_stock":[{"location_id":"VNZ","stock":5}]},{"model_id":10000000091,"seller_stock":[{"location_id":"VNZ","stock":1}]}]}),
});
console.log(r.status, await r.json());PHP
<?php
$key = 'q360_live_...'; // khóa API của brand
$url = 'https://partner.quantri360.com/v1/shopee/api/v2/product/update_stock' . '?' . http_build_query([]);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . $key, 'Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"item_id":10000000081,"stock_list":[{"model_id":10000000090,"seller_stock":[{"location_id":"VNZ","stock":5}]},{"model_id":10000000091,"seller_stock":[{"location_id":"VNZ","stock":1}]}]}');
$res = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, "\n", $res;Response
Tham số phản hồi (nguyên của Shopee)
| Tên | Kiểu | Mẫu | Mô tả |
|---|---|---|---|
| request_id | string | d52ca43b277a4f9292fb8be658bfd33d | Mã request của Shopee để tra lỗi. |
| error | string | Mã lỗi Shopee; rỗng = thành công. | |
| message | string | Mô tả lỗi. | |
| warning | string | ||
| response | object | ||
| success_list | object[] | ||
| model_id | int | 10000000090 | |
| location_id | string | VNZ | |
| stock | int | 5 | Tồn đã lưu. |
| failure_list | object[] | ||
| model_id | int | ||
| failed_reason | string | Lý do. |
Mẫu phản hồi
{
"error": "",
"message": "",
"warning": "",
"request_id": "b7e0c3d2a91f4c55…",
"response": {
"failure_list": [],
"success_list": [
{
"model_id": 10000000090,
"location_id": "VNZ",
"stock": 5
},
{
"model_id": 10000000091,
"location_id": "VNZ",
"stock": 1
}
]
}
}
Mã lỗi của Shopee (29)
Bấm để xem
| Mã | Ý nghĩa |
|---|---|
| error_data | Dữ liệu không tồn tại hoặc không hợp lệ cho thao tác (vd mã không có, loại yêu cầu không cho phép). |
| error_param | Tham số sai / thiếu / sai kiểu — xem `message` để biết tham số nào. |
| error_server | Lỗi hệ thống Shopee — thử lại sau ít phút. |
| error_shop | Gian hàng không hợp lệ — kiểm tra platform_shop_id. |
| error_item_not_belong_shop | Item not belong to shop. |
| error_wms_shop_block_upate_stock | Warehouse shop can't update stock. |
| error_auth | Ủy quyền gian hàng cho 360 đã hết hạn hoặc bị thu hồi (360 đã tự làm mới token một lần) — chủ gian hàng kết nối lại Shopee trong Partner. |
| error_item_not_found | Không tìm thấy item_id. |
| error_param_shop_id_not_found | Shop_id is not found. |
| error_busi_update_stock_failed | Update stock failed, please check failure_list for detailed reason |
| error_inner | Lỗi hệ thống Shopee — thử lại sau. |
| error_busi_cannot_edit_vsku | Can not use OpenAPI to edit/create VSKU, please connect with your manager |
| error.param | Can not update item with stock less than reserved stock |
| error_busi | Merchant/gian hàng có nhiều kho; cần gửi location_id. |
| error_system_busy | Hệ thống đang bận; thử lại sau. |
| error_seller_under_penalty | The shop is under penalty. |
| error_nil_shopid_or_itemid | Query information failed. |
| error_item_uneditable | Can't edit this item. item status can not support editing. |
| error_perm_non_admin | Don't have permission. |
| error_cannt_edit_stock_in_promotion | Normal_stock cannot be edited when item is under promotion. |
| error_holiday_mode_change_stock | Cannot change stock in holiday mode. |
| error_promotion_cantnot_update_stock | Cannot change stock when item is under promotion. |
| error_in_item_promotion_nomodel_to_models | Can't to edit item stock directly while item has models. |
| error_model_update_stock_model_in_promotion | Model stock cannot be editted when item/model is promotion. |
| error_edit_item_stock_for_item_has_model | Can't to edit item stock directly while item has models. |
| error_limit | Chạm hạn mức gọi Shopee trong ngày của kết nối — 360 trả kèm thời điểm thử lại; giảm tần suất gọi. |
| error_rate_limit | Gọi quá nhanh — chờ vài giây rồi gọi lại (360 cũng giới hạn theo key: 429 + Retry-After). |
| shop_banned | Gian hàng đang bị Shopee khóa — mọi API tạm ngưng tới khi gỡ khóa. |
| error_kyc_auth | Gian hàng chưa hoàn tất đăng ký người bán trên Kênh Người Bán. |
Bắt đầu dùng
- Đăng ký tài khoản Partner
- Mở loại dữ liệu thuộc nhóm Tồn kho ở trang nền tảng
- Tạo API key (tick kênh Shopee)
- Gọi theo ví dụ ở trên