VI | EN
Nhắn Messenger
Dành cho developer

Use this api to initiate logistics including arrange pickup, dropoff or shipment for non-integrated logistic channels — API Shopee

v2.logistics.mass_ship_order · gọi qua Quantri360 bằng một API key cho chính tài khoản / tài sản bạn đã kết nối và ủy quyền — 360 lo việc ký request và làm mới phiên đăng nhập bạn đã cấp.

v2.logistics.mass_ship_order

POST/api/v2/logistics/mass_ship_orderGọi qua 360: POST https://partner.quantri360.com/v1/shopee/api/v2/logistics/mass_ship_order
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

Xác nhận gửi theo lô 1–50 kiện cùng vị trí hàng và kênh vận chuyển; đọc get_mass_shipping_parameter trước khi sắp xếp giao.

  • Gọi qua /v1/shopee/api/v2/logistics/mass_ship_order 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. Khởi tạo vận chuyển cho nhiều kiện trong một lần gọi.
  • HTTP 200 vẫn có thể có lỗi nghiệp vụ; kiểm error trước khi dùng kết quả. Kiểm từng phần tử trong fail_list / result_list / fail_error.
  • Gọi get_mass_shipping_parameter trước; 1–50 kiện phải CÙNG product_location_id và CÙNG logistics_channel_id. Không truyền hai trường này thì lấy theo kiện đầu. Kiểm cả success_list và fail_list.
  • Chỉ chọn một cách giao pickup / dropoff / non_integrated; khối pickup hoặc dropoff được info_needed yêu cầu vẫn phải gửi dù rỗng.

Request

Địa chỉ

POST https://partner.quantri360.com/v1/shopee/api/v2/logistics/mass_ship_order

Xác thực & gian hàng

TênVị tríKiểuMẫuMô tả
AuthorizationheaderheaderBearer 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_idquerystring100001Gian 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ênVị tríKiểuBắt buộcMẫuMô tả
logistics_channel_idbodyint64Không50018Kênh vận chuyển chung cho cả lô; bỏ trường thì lấy theo kiện đầu.
product_location_idbodystringKhôngdemo-locationMã vị trí hàng; phải cùng vị trí cho cả lô, bỏ trường thì lấy theo kiện đầu.
package_listbodyobject[]Có[{"package_number": "OFG000000000000001"}]Danh sách 1–50 kiện cùng product_location_id và logistics_channel_id.
package_list[].package_numberbodystringCóOFG000000000000001Mã kiện; không gửi chuỗi rỗng.
pickupbodyobjectKhông{"address_id": 100001, "pickup_time_id": "demo-slot-1"}Bắt buộc nếu info_needed của get_mass_shipping_parameter yêu cầu pickup; vẫn gửi khối dù rỗng.
pickup.address_idbodyint64Không100001Mã địa chỉ lấy từ get_mass_shipping_parameter.
pickup.pickup_time_idbodystringKhôngdemo-slot-1Chọn một khung giờ trong time_slot_list; nếu kênh không trả khung giờ thì có thể bỏ, Shopee sẽ sắp xếp thời gian. Lấy từ get_mass_shipping_parameter.
dropoffbodyobjectKhông{"branch_id": 100001, "tracking_number": "SPXVN000000000001"}Bắt buộc nếu info_needed yêu cầu dropoff; vẫn gửi khối dù rỗng. Kênh 80003 / 80004 hỗ trợ Regular và JOB: chọn mã vận đơn cho Regular hoặc sender_real_name cho JOB, không gửi cả hai.
dropoff.branch_idbodyint64Không100001Mã bưu cục.
dropoff.sender_real_namebodystringKhôngNgười gửi mẫuHọ tên thật của người gửi.
dropoff.tracking_numberbodystringKhôngSPXVN000000000001Mã vận đơn do đơn vị vận chuyển cấp; cần gửi khi info_needed yêu cầu tracking_number.
non_integratedbodyobjectKhông{"tracking_number": [{"package_number": "OFG000000000000001", "tracking_number": "SPXVN000000000001"}]}Khối tùy chọn khi info_needed trả non-integrated từ get_mass_shipping_parameter.
non_integrated.tracking_numberbodyobject[]Không[{"package_number": "OFG000000000000001", "tracking_number": "SPXVN000000000001"}]Mã vận đơn do đơn vị vận chuyển cấp; tùy chọn với non_integrated.
non_integrated.tracking_number[].package_numberbodystringCóOFG000000000000001Mã kiện; không gửi chuỗi rỗng.
non_integrated.tracking_number[].tracking_numberbodystringCóSPXVN000000000001Mã vận đơn do đơn vị vận chuyển cấp cho kiện.

Ví dụ request

curl -s -X POST "https://partner.quantri360.com/v1/shopee/api/v2/logistics/mass_ship_order" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"logistics_channel_id":50018,"product_location_id":"demo-location","package_list":[{"package_number":"OFG000000000000001"}],"pickup":{"address_id":100001,"pickup_time_id":"demo-slot-1"}}'
Python
import requests

KEY = "q360_live_..."  # khóa API của brand
r = requests.post(
    "https://partner.quantri360.com/v1/shopee/api/v2/logistics/mass_ship_order",
    params={},
    json={
        "logistics_channel_id": 50018,
        "product_location_id": "demo-location",
        "package_list": [
            {
                "package_number": "OFG000000000000001"
            }
        ],
        "pickup": {
            "address_id": 100001,
            "pickup_time_id": "demo-slot-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/logistics/mass_ship_order');
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({"logistics_channel_id":50018,"product_location_id":"demo-location","package_list":[{"package_number":"OFG000000000000001"}],"pickup":{"address_id":100001,"pickup_time_id":"demo-slot-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/logistics/mass_ship_order' . '?' . 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, '{"logistics_channel_id":50018,"product_location_id":"demo-location","package_list":[{"package_number":"OFG000000000000001"}],"pickup":{"address_id":100001,"pickup_time_id":"demo-slot-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)

Kiểm cả success_list và fail_list: một lần gọi có thể vừa có kiện thành công vừa có kiện lỗi. Hai danh sách có thể nằm ở gốc hoặc trong response; đọc theo cả hai vị trí.

TênKiểuMẫuMô tả
request_idstringd52ca43b277a4f9292fb8be658bfd33dMã request của Shopee để tra lỗi.
errorstringMã lỗi Shopee; rỗng = thành công.
messagestringMô tả lỗi.
success_listobject[]Danh sách cập nhật thành công.
package_numberstringOFG000000000000001Mã kiện; không gửi chuỗi rỗng.
fail_listobject[]Danh sách thất bại; kiểm lỗi của từng phần tử.
package_numberstringOFG000000000000001Mã kiện; không gửi chuỗi rỗng.
fail_reasonstringLý do thất bại.

Mẫu phản hồi

{
  "error": "",
  "message": "",
  "request_id": "demo-request",
  "response": {
    "fail_list": [
      {
        "fail_reason": "Kiện không thuộc kênh giao được chỉ định.",
        "package_number": "OFG000000000000001"
      }
    ],
    "success_list": [
      {
        "package_number": "OFG000000000000001"
      }
    ]
  }
}

Mã lỗi của Shopee (15)

Bấm để xem
MãÝ nghĩa
logistics.error_paramTham số vận chuyển không hợp lệ (vd đơn đang được phân bổ ĐVVC, mã gói trùng) — xem `message`.
logistics.lack_of_invoice_dataThiếu / sai chứng từ hóa đơn của đơn.
error_paramTham số sai / thiếu / sai kiểu — xem `message` để biết tham số nào.
logistics.invalid_address_versionĐịa chỉ theo địa giới cũ không còn được hỗ trợ — cập nhật địa chỉ gian hàng trên Kênh Người Bán.
logistics.package_already_shippedKiện đã sắp xếp gửi, không gọi lại API này.
error_dataDữ 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_serverLỗi hệ thống Shopee — thử lại sau ít phút.
error_shopGian hàng không hợp lệ — kiểm tra platform_shop_id.
error_otherLỗi hệ thống hoặc lỗi đổi lịch từ dịch vụ liên quan — thử lại sau, xem `message`.
logistics.warehouse_stock_insufficientKhông phân bổ được kho đủ tồn 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_limitChạ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_limitGọ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_bannedGian hàng đang bị Shopee khóa — mọi API tạm ngưng tới khi gỡ khóa.
error_kyc_authGian 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

  1. Đăng ký tài khoản Partner
  2. Mở loại dữ liệu thuộc nhóm Đơn hàng ở trang nền tảng
  3. Tạo API key (tick kênh Shopee)
  4. Gọi theo ví dụ ở trên