v2.returns.dispute
POST/api/v2/returns/disputeGọi qua 360: POST https://partner.quantri360.com/v1/shopee/api/v2/returns/dispute
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
Gửi khiếu nại yêu cầu trả hàng kèm lý do và các link ảnh bằng chứng theo từng nhóm yêu cầu.
- Gọi qua /v1/shopee/api/v2/returns/dispute với Authorization: Bearer <key>; dùng platform_shop_id khi có nhiều shop. 360 tự gắn partner_id, shop_id, sign và access_token.
- API GHI: thay đổi dữ liệu thật trên Shopee; cần key có quyền ghi (can_write) và gói mở module Đơn hàng. Tạo khiếu nại cho yêu cầu trả hàng.
- HTTP 200 vẫn có thể có lỗi nghiệp vụ; kiểm error trước khi dùng kết quả.
- Chỉ khiếu nại khi return_status là REQUESTED / PROCESSING / ACCEPTED.
- Lấy dispute_reason_id, module_index và requirement từ get_return_dispute_reason; image_list bắt buộc với mọi lý do trừ "không nhận được hàng trả". image_list[].image_url là link ảnh. Link ảnh tạo bằng convert_image.
Request
Địa chỉ
POST https://partner.quantri360.com/v1/shopee/api/v2/returns/dispute
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ả |
|---|---|---|---|---|---|
| return_sn | body | string | Có | 2611040DEMORT1 | Mã yêu cầu trả hàng / hoàn tiền. |
| body | string | Có | nhanvien@example.com | Email người thao tác để lưu vết xử lý. | |
| dispute_reason_id | body | int32 | Có | 50 | Mã lý do lấy từ get_return_dispute_reason. |
| image_list | body | object[] | Không | Danh sách bằng chứng; bắt buộc với mọi lý do trừ "không nhận được hàng trả". | |
| image_list[].module_index | body | int32 | Có | 1 | Chỉ số nhóm bằng chứng lấy từ get_return_dispute_reason. |
| image_list[].requirement | body | string | Có | Ảnh mở kiện hàng trả kèm vận đơn | Nội dung yêu cầu bằng chứng lấy từ get_return_dispute_reason. |
| image_list[].image_url | body | string[] | Có | ["https://example.com/bang-chung.jpg"] | Danh sách link ảnh; có thể dùng url của convert_image. |
| dispute_text_reason | body | string | Không | Hàng trả không khớp yêu cầu | Nội dung lý do khiếu nại. |
Ví dụ request
curl -s -X POST "https://partner.quantri360.com/v1/shopee/api/v2/returns/dispute" \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"return_sn":"2611040DEMORT1","email":"nhanvien@example.com","dispute_reason_id":50,"image_list":[{"module_index":1,"requirement":"Ảnh mở kiện hàng trả kèm vận đơn","image_url":["https://example.com/bang-chung.jpg"]}],"dispute_text_reason":"Hàng trả không khớp yêu cầu"}'
Python
import requests
KEY = "q360_live_..." # khóa API của brand
r = requests.post(
"https://partner.quantri360.com/v1/shopee/api/v2/returns/dispute",
params={},
json={
"return_sn": "2611040DEMORT1",
"email": "nhanvien@example.com",
"dispute_reason_id": 50,
"image_list": [
{
"module_index": 1,
"requirement": "Ảnh mở kiện hàng trả kèm vận đơn",
"image_url": [
"https://example.com/bang-chung.jpg"
]
}
],
"dispute_text_reason": "Hàng trả không khớp yêu cầu"
},
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/returns/dispute');
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({"return_sn":"2611040DEMORT1","email":"nhanvien@example.com","dispute_reason_id":50,"image_list":[{"module_index":1,"requirement":"Ảnh mở kiện hàng trả kèm vận đơn","image_url":["https://example.com/bang-chung.jpg"]}],"dispute_text_reason":"Hàng trả không khớp yêu cầu"}),
});
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/returns/dispute' . '?' . 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, '{"return_sn":"2611040DEMORT1","email":"nhanvien@example.com","dispute_reason_id":50,"image_list":[{"module_index":1,"requirement":"Ảnh mở kiện hàng trả kèm vận đơn","image_url":["https://example.com/bang-chung.jpg"]}],"dispute_text_reason":"Hàng trả không khớp yêu cầu"}');
$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)
Phản hồi minh họa thành công; kiểm error trước khi dùng kết quả.
| 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. | |
| response | object | Kết quả xử lý. | |
| return_sn | string | 2611040DEMORT1 | Mã yêu cầu trả hàng / hoàn tiền. |
| msg | string | dispute return success | Thông báo kết quả khiếu nại. |
Mẫu phản hồi
{
"request_id": "demo-request",
"error": "",
"message": "",
"response": {
"return_sn": "2611040DEMORT1",
"msg": "dispute return success"
}
}
Mã lỗi của Shopee (20)
Bấm để xem
| Mã | Ý nghĩa |
|---|---|
| err_data | Không thể chấp nhận đề xuất của chính mình. |
| error_param | Tham số sai / thiếu / sai kiểu — xem `message` để biết tham số nào. |
| error_perm | Không có quyền / tham số khiếu nại không hợp lệ. |
| 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_not_exists | Dữ liệu không tồn tại — xem `message`. |
| dispute.request.param.error | Tham số khiếu nại không hợp lệ. |
| dispute.rr.not.allow | Yêu cầu trả hàng không cho phép khiếu nại. |
| 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). |
| returnsn.illegal | Mã yêu cầu trả hàng không hợp lệ hoặc trạng thái không cho phép khiếu nại. |
| returns.dispute_is_dry_run | Kiểm tra khiếu nại hợp lệ nhưng chưa gửi vì đang chạy thử. |
| error_inner | Lỗi hệ thống Shopee — thử lại sau. |
| 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_return_status | Trạng thái yêu cầu trả không cho thao tác này (vd đã duyệt / đã đóng). |
| return.status.illegal | Trạng thái trả hàng không hợp lệ. |
| error_permission | Gian hàng không có quyền xem dữ liệu này (vd yêu cầu trả / đơn không thuộc gian hàng). |
| 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_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 Đơn hàng ở trang nền tảng
- Tạo API key (tick kênh Shopee)
- Gọi theo ví dụ ở trên