Skip to content

创建单个包裹

接口概述

登记一个包裹并返回系统为其分配的 WMG 运单号。这是整个接入流程的入口:先在这里创建包裹,再用 获取面单 PDF 取面单,等到可以发运时通过 创建并关闭订单 把它纳入订单。

包裹是同步创建的,因此返回的运单号可以立即使用。

请求信息

  • Method: POST
  • Path: /api/parcel/create-order
  • Authentication: Bearer Token

请求头

字段说明
Content-Typeapplication/json
AuthorizationBearer <token>

请求参数

请求体为 JSON 格式,包含以下字段。除商品明细放在 ItemListing 数组内,其余字段都在顶层。

运输信息

参数类型必填说明
OwnerIdnumber你的公司标识,会原样回显在响应中。
ServiceCodestring使用的服务代码,由客户经理提供。不传则使用你账号配置的第一个服务代码。必须是你账号已开通的服务代码之一。
TrackingNumberstring你自己为该包裹分配的跟踪号,即打印在包裹上的单号。最长 50 个字符。在你的账号内必须唯一。
Originstring起运国家,2 位国家代码,如 SG。必须正好 2 个字符。
Destinationstring目的国家,2 位国家代码,如 TH。必须正好 2 个字符,且必须是你账号已开通的目的地。
Dep_Iatastring出发机场 IATA 代码。必须正好 3 个字符。
Arr_Iatastring到达机场 IATA 代码。必须正好 3 个字符。
Commoditystring包裹内容的简要描述。
DeclaredCurrencystring申报价值的币种,如 SGD。必须正好 3 个字符,且必须是该目的地允许的币种。
DeclaredValuenumber包裹申报价值。必须大于或等于 0。
Qtynumber该运单号下的件数。必须大于 0。
Weightnumber申报重量。必须大于或等于 0。最多保留 3 位小数。
Lengthnumber包裹长度。必须大于或等于 0。最多保留 2 位小数。
Widthnumber包裹宽度。必须大于或等于 0。最多保留 2 位小数。
Heightnumber包裹高度。必须大于或等于 0。最多保留 2 位小数。
IsDDPstring清关模式:Y = DDP,N = DDU。默认 N
MAWBNumberstring航空运单号。最长 30 个字符。
SendingAgentIDstring客户或生产商参考号。最长 50 个字符。
OrderNumberstring你系统内部的订单号。最长 50 个字符。
Remarkstring派送说明。最长 50 个字符。
ETDstring起运地预计出发时间,格式 YYYY-MM-DD HH:MM:SS
ETAstring目的地预计到达时间,格式 YYYY-MM-DD HH:MM:SS。必须晚于 ETD
PickUpDatestring上门取件时间,格式 YYYY-MM-DD HH:MM:SS
DeliveryDatestring预期派送时间,格式 YYYY-MM-DD HH:MM:SS

货到付款(COD)

参数类型必填说明
IsCODstringY = 货到付款,N = 非货到付款。
CODTypeinteger预期收款方式:0 = 未指定(默认),1 = 现金(Cash),2 = 支票(Cheque)。
CODCurrencystring收款币种。必须正好 3 个字符。
CODAmountnumber收款金额。必须大于或等于 0。

新加坡 GST —— 当 DestinationSG 时必填,其他目的地可选

参数类型必填说明
SupplierNamestring条件必填供应商名称。最长 100 个字符。
GSTRegNostring条件必填供应商 GST 注册号。最长 50 个字符。
GSTAmountnumber条件必填已缴 GST 金额。必须大于或等于 0。
GSTCurrencystring条件必填GST 金额的币种。必须正好 3 个字符。
GSTStatusstring条件必填GST 状态。最长 5 个字符。

寄件人

参数类型必填说明
SenderNamestring寄件人姓名。最长 60 个字符。
SenderCompanystring寄件人公司。最长 80 个字符。
SenderAddress1string寄件人地址第 1 行。最长 160 个字符。
SenderAddress2string寄件人地址第 2 行。最长 100 个字符。
SenderCitystring寄件人城市。最长 50 个字符。
SenderStatestring寄件人州/省。最长 50 个字符。
SenderCountrystring寄件人国家名称。最长 60 个字符。
SenderPostalCodestring寄件人邮编。最长 20 个字符。不使用邮编的国家请传空字符串。
SenderContactNostring寄件人联系电话。最长 20 个字符。
SenderEmailstring寄件人邮箱。最长 100 个字符。

收件人

参数类型必填说明
RecipientNamestring收件人姓名。最长 60 个字符。
RecipientCompanystring收件人公司。最长 80 个字符。
RecipientAddress1string收件人地址第 1 行。最长 160 个字符。
RecipientAddress2string收件人地址第 2 行。最长 160 个字符。
RecipientAddress3string收件人地址第 3 行。最长 100 个字符。
RecipientCitystring收件人城市。最长 50 个字符。
RecipientStatestring收件人州/省。最长 50 个字符。
RecipientCountrystring收件人国家名称。最长 60 个字符。
RecipientPostalCodestring收件人邮编。最长 20 个字符。对有邮编格式要求的目的地会按其格式校验。
RecipientContactNostring收件人联系电话。最长 20 个字符。
RecipientEmailstring收件人邮箱。最长 100 个字符。

ItemListing —— 数组,至少一条

参数类型必填说明
ItemListing[].SKUstring你的商品 SKU。最长 60 个字符。
ItemListing[].ItemDescriptionstring商品描述。最长 300 个字符。
ItemListing[].ItemWeightnumber商品重量。必须大于或等于 0。
ItemListing[].NoOfPcsnumber该商品的件数。必须大于或等于 0。
ItemListing[].ItemValuenumber商品价值。必须大于或等于 0。
ItemListing[].ItemCurrencystring商品价值币种。最长 3 个字符,且必须是该目的地允许的币种。
ItemListing[].ItemOriginstring商品原产国,2 位国家代码。最长 2 个字符。
ItemListing[].ItemDestinationstring商品目的国,2 位国家代码。最长 2 个字符。
ItemListing[].HSCodestring商品 HS 编码。最长 50 个字符。

请求体示例

json
{
  "OwnerId": 111,
  "ServiceCode": "A0000",
  "TrackingNumber": "CUST0001234567",
  "Origin": "SG",
  "Destination": "TH",
  "Dep_Iata": "SIN",
  "Arr_Iata": "BKK",
  "Commodity": "Cotton T-shirts",
  "DeclaredCurrency": "SGD",
  "DeclaredValue": 45.50,
  "Qty": 1,
  "Weight": 1.250,
  "Length": 30.00,
  "Width": 20.00,
  "Height": 10.00,
  "IsDDP": "N",
  "OrderNumber": "SO-2026-000123",
  "ETD": "2026-07-30 14:25:00",
  "ETA": "2026-07-31 09:15:00",
  "SenderName": "Jane Tan",
  "SenderCompany": "Example Trading Pte Ltd",
  "SenderAddress1": "10 Anson Road #12-01",
  "SenderCity": "Singapore",
  "SenderCountry": "Singapore",
  "SenderPostalCode": "079903",
  "SenderContactNo": "+6561234567",
  "SenderEmail": "jane.tan@example.com",
  "RecipientName": "Somchai Preecha",
  "RecipientAddress1": "99 Sukhumvit Road",
  "RecipientAddress2": "Khlong Toei",
  "RecipientCity": "Bangkok",
  "RecipientState": "Bangkok",
  "RecipientCountry": "Thailand",
  "RecipientPostalCode": "10110",
  "RecipientContactNo": "+66812345678",
  "RecipientEmail": "somchai@example.com",
  "ItemListing": [
    {
      "SKU": "TS-BLK-M",
      "ItemDescription": "Cotton T-shirt, black, size M",
      "ItemWeight": 0.250,
      "NoOfPcs": 2,
      "ItemValue": 15.00,
      "ItemCurrency": "SGD",
      "ItemOrigin": "SG",
      "ItemDestination": "TH",
      "HSCode": "610910"
    },
    {
      "SKU": "TS-WHT-L",
      "ItemDescription": "Cotton T-shirt, white, size L",
      "ItemWeight": 0.750,
      "NoOfPcs": 1,
      "ItemValue": 15.50,
      "ItemCurrency": "SGD",
      "ItemOrigin": "SG",
      "ItemDestination": "TH",
      "HSCode": "610910"
    }
  ]
}

认证方式

本接口使用 Bearer Token 认证。

请先通过 获取 Token 取得 Token,并以 Authorization: Bearer <Token> 形式发送。

响应信息

响应为 JSON 格式。

响应格式

字段类型说明
Codeinteger0 表示成功;非 0 表示失败
Messagestring可读的结果说明
Dataobject业务数据;失败时为空数组 []

成功响应

  • Status Code: 200
json
{
  "Code": 0,
  "Message": "Success",
  "Data": {
    "OwnerId": 111,
    "TrackingNo": "CUST0001234567",
    "WmgTrackingNo": "CY180000999SG",
    "DeliveryId": "",
    "DateTime": "2026-07-30 15:43:48",
    "Status": "",
    "Error": []
  }
}
字段类型说明
Data.OwnerIdnumber原样回显你传入的 OwnerId。未传时为空字符串。
Data.TrackingNostring你传入的跟踪号,保持原样大小写。
Data.WmgTrackingNostring系统为该包裹分配的 WMG 运单号。后续出面单、查轨迹、下订单都用它。
Data.DeliveryIdstring预留字段,始终返回空字符串。
Data.DateTimestring包裹创建时的服务器时间,格式 YYYY-MM-DD HH:MM:SS
Data.Statusstring预留字段,始终返回空字符串。
Data.Errorarray预留字段,始终返回空数组——失败时会以 Code: 1 返回。

错误响应

  • Status Code: 200(业务逻辑错误)或 4xx/5xx(系统错误)
json
{
    "Code": 1,
    "Message": "Tracking Number already exist",
    "Data": []
}

结果码

Code说明
0成功
1失败

示例

Bash

bash
BASE_URL="https://api.postal.test.wmgdelivery.com"
TOKEN="your_access_token"

curl -X POST "$BASE_URL/api/parcel/create-order" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d @parcel.json

Windows PowerShell

powershell
$BASE_URL = "https://api.postal.test.wmgdelivery.com"
$TOKEN    = "your_access_token"

$body = @{
    ServiceCode         = "A0000"
    TrackingNumber      = "CUST0001234567"
    Origin              = "SG"
    Destination         = "TH"
    Dep_Iata            = "SIN"
    Arr_Iata            = "BKK"
    Commodity           = "Cotton T-shirts"
    DeclaredCurrency    = "SGD"
    DeclaredValue       = 45.50
    Qty                 = 1
    Weight              = 1.250
    SenderName          = "Jane Tan"
    SenderAddress1      = "10 Anson Road #12-01"
    SenderCountry       = "Singapore"
    SenderPostalCode    = "079903"
    RecipientName       = "Somchai Preecha"
    RecipientAddress1   = "99 Sukhumvit Road"
    RecipientCity       = "Bangkok"
    RecipientState      = "Bangkok"
    RecipientCountry    = "Thailand"
    RecipientPostalCode = "10110"
    RecipientContactNo  = "+66812345678"
    ItemListing         = @(
        @{
            ItemDescription = "Cotton T-shirt, black, size M"
            ItemWeight      = 0.250
            NoOfPcs         = 2
            ItemValue       = 15.00
            ItemCurrency    = "SGD"
            ItemOrigin      = "SG"
            ItemDestination = "TH"
            HSCode          = "610910"
        }
    )
} | ConvertTo-Json -Depth 5

$response = Invoke-RestMethod -Uri "$BASE_URL/api/parcel/create-order" -Method Post `
    -ContentType "application/json" -Body $body -Headers @{Authorization = "Bearer $TOKEN"}
$response.Data.WmgTrackingNo

Python

python
import requests

BASE_URL = "https://api.postal.test.wmgdelivery.com"
TOKEN    = "your_access_token"

parcel = {
    "ServiceCode": "A0000",
    "TrackingNumber": "CUST0001234567",
    "Origin": "SG",
    "Destination": "TH",
    "Dep_Iata": "SIN",
    "Arr_Iata": "BKK",
    "Commodity": "Cotton T-shirts",
    "DeclaredCurrency": "SGD",
    "DeclaredValue": 45.50,
    "Qty": 1,
    "Weight": 1.250,
    "SenderName": "Jane Tan",
    "SenderAddress1": "10 Anson Road #12-01",
    "SenderCountry": "Singapore",
    "SenderPostalCode": "079903",
    "RecipientName": "Somchai Preecha",
    "RecipientAddress1": "99 Sukhumvit Road",
    "RecipientCity": "Bangkok",
    "RecipientState": "Bangkok",
    "RecipientCountry": "Thailand",
    "RecipientPostalCode": "10110",
    "RecipientContactNo": "+66812345678",
    "ItemListing": [
        {
            "ItemDescription": "Cotton T-shirt, black, size M",
            "ItemWeight": 0.250,
            "NoOfPcs": 2,
            "ItemValue": 15.00,
            "ItemCurrency": "SGD",
            "ItemOrigin": "SG",
            "ItemDestination": "TH",
            "HSCode": "610910",
        },
    ],
}

resp = requests.post(f"{BASE_URL}/api/parcel/create-order", json=parcel,
                     headers={"Authorization": f"Bearer {TOKEN}"}, timeout=30)
payload = resp.json()
print(payload["Data"]["WmgTrackingNo"])

Node.js / TypeScript

typescript
const BASE_URL = "https://api.postal.test.wmgdelivery.com";
const TOKEN = "your_access_token";

const parcel = {
  ServiceCode: "A0000",
  TrackingNumber: "CUST0001234567",
  Origin: "SG",
  Destination: "TH",
  Dep_Iata: "SIN",
  Arr_Iata: "BKK",
  Commodity: "Cotton T-shirts",
  DeclaredCurrency: "SGD",
  DeclaredValue: 45.50,
  Qty: 1,
  Weight: 1.250,
  SenderName: "Jane Tan",
  SenderAddress1: "10 Anson Road #12-01",
  SenderCountry: "Singapore",
  SenderPostalCode: "079903",
  RecipientName: "Somchai Preecha",
  RecipientAddress1: "99 Sukhumvit Road",
  RecipientCity: "Bangkok",
  RecipientState: "Bangkok",
  RecipientCountry: "Thailand",
  RecipientPostalCode: "10110",
  RecipientContactNo: "+66812345678",
  ItemListing: [
    {
      ItemDescription: "Cotton T-shirt, black, size M",
      ItemWeight: 0.250,
      NoOfPcs: 2,
      ItemValue: 15.00,
      ItemCurrency: "SGD",
      ItemOrigin: "SG",
      ItemDestination: "TH",
      HSCode: "610910",
    },
  ],
};

const res = await fetch(`${BASE_URL}/api/parcel/create-order`, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Authorization": `Bearer ${TOKEN}`,
  },
  body: JSON.stringify(parcel),
});
const payload = await res.json();
console.log(payload.Data.WmgTrackingNo);

PHP

php
<?php
$BASE_URL = 'https://api.postal.test.wmgdelivery.com';
$TOKEN    = 'your_access_token';

$parcel = [
    'ServiceCode'         => 'A0000',
    'TrackingNumber'      => 'CUST0001234567',
    'Origin'              => 'SG',
    'Destination'         => 'TH',
    'Dep_Iata'            => 'SIN',
    'Arr_Iata'            => 'BKK',
    'Commodity'           => 'Cotton T-shirts',
    'DeclaredCurrency'    => 'SGD',
    'DeclaredValue'       => 45.50,
    'Qty'                 => 1,
    'Weight'              => 1.250,
    'SenderName'          => 'Jane Tan',
    'SenderAddress1'      => '10 Anson Road #12-01',
    'SenderCountry'       => 'Singapore',
    'SenderPostalCode'    => '079903',
    'RecipientName'       => 'Somchai Preecha',
    'RecipientAddress1'   => '99 Sukhumvit Road',
    'RecipientCity'       => 'Bangkok',
    'RecipientState'      => 'Bangkok',
    'RecipientCountry'    => 'Thailand',
    'RecipientPostalCode' => '10110',
    'RecipientContactNo'  => '+66812345678',
    'ItemListing'         => [
        [
            'ItemDescription' => 'Cotton T-shirt, black, size M',
            'ItemWeight'      => 0.250,
            'NoOfPcs'         => 2,
            'ItemValue'       => 15.00,
            'ItemCurrency'    => 'SGD',
            'ItemOrigin'      => 'SG',
            'ItemDestination' => 'TH',
            'HSCode'          => '610910',
        ],
    ],
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $BASE_URL . '/api/parcel/create-order');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Authorization: Bearer ' . $TOKEN,
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($parcel));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$response = curl_exec($ch);
curl_close($ch);

$payload = json_decode($response, true);
echo $payload['Data']['WmgTrackingNo'] . "\n";
?>

注意事项

  • TrackingNumber 在你的账号内必须唯一。重复提交已存在的单号会返回 Tracking Number already exist——本接口不是幂等的,也不会返回之前那个包裹。
  • TrackingNumberDestination 在处理前会转为大写,因此后续匹配用的是大写形式;而 Data.TrackingNo 会原样回显你传入的大小写。
  • 允许不传 ServiceCode:此时使用你账号配置的第一个服务代码。如果账号完全没有配置服务代码,调用会失败并返回 User Service Codes is Empty
  • RecipientAddress1RecipientAddress2RecipientAddress3 会拼接后打在面单上。三者合计长度不得超过 320 个字符,这与每个字段各自的长度上限是两回事。
  • DeclaredCurrency 和每条 ItemCurrency 都必须是该目的地允许的币种,否则包裹被拒收。商品币种错误的消息里会给出从 1 开始的商品序号。
  • 目的地为 MY 时,Commodity 和每条 ItemDescription 会被检查是否含医疗、药品相关词汇,命中则返回 Prohibited Item, Do Not Import!
  • 日期字段(ETDETAPickUpDateDeliveryDate)使用 YYYY-MM-DD HH:MM:SS 格式。带 T 分隔符或时区偏移的 ISO 8601 字符串会被拒绝。
  • 同时传了 ETDETA 时,ETA 必须晚于 ETD
  • 新加坡 GST 相关字段只在 DestinationSG 时才必填。
  • Data.DeliveryIdData.StatusData.Error 都是预留字段,始终为空。请用 Code 而不是 Error 判断调用是否成功。
  • 校验在第一个失败处即中断,因此改好一个字段后可能暴露下一个。接入调试阶段请预期多次往返。
  • 所有参数区分大小写。

错误码

codemessage说明
1Tracking Number cannot be emptyTrackingNumber 缺失或为空白。
1Tracking Number already exist你的账号下已存在该 TrackingNumber 的包裹。
1User Service Codes is Empty未传 ServiceCode,且你的账号没有配置任何服务代码。
1ServiceCode invalidServiceCode 不在你账号已开通的服务代码范围内。
1The account you are using does not support destination "XX" for the time being, please contact your business manager to confirm.该目的地没有对应的包裹尺寸配置。
1Destination not allow该目的地已配置,但不允许你的账号与服务使用。
1DeclaredCurrency not allowDeclaredCurrency 不是该目的地允许的币种。
1Item 1 ItemCurrency(SGD) not allow该条商品的 ItemCurrency 不是目的地允许的币种,数字是从 1 开始的商品序号。
1ItemListing requiredItemListing 缺失或为空。
1Prohibited Item, Do Not Import!目的地为 MY 时,Commodity 或某条 ItemDescription 含医疗、药品相关词汇。
1The total length of addresses 1, 2, and 3 exceeds the maximum limit of 320 characters收件人三行地址拼接后超过 320 个字符。
1TrackingNumber requireTrackingNumber 缺失或为空。
1max size of TrackingNumber must be 50TrackingNumber 超过 50 个字符。
1Destination requireDestination 缺失或为空。
1size of Destination must be 2Destination 不是正好 2 个字符。
1Origin requireOrigin 缺失或为空。
1size of Origin must be 2Origin 不是正好 2 个字符。
1Commodity requireCommodity 缺失或为空。
1DeclaredCurrency requireDeclaredCurrency 缺失或为空。
1size of DeclaredCurrency must be 3DeclaredCurrency 不是正好 3 个字符。
1DeclaredValue requireDeclaredValue 缺失或为空。
1Qty requireQty 缺失或为空。
1Weight requireWeight 缺失或为空。
1IsDDP must be in Y,NIsDDP 既不是 Y 也不是 N
1IsCOD must be in Y,NIsCOD 既不是 Y 也不是 N
1CODType must be in 0,1,2CODType 不是 012
1Dep_Iata requireDep_Iata 缺失或为空。
1size of Dep_Iata must be 3Dep_Iata 不是正好 3 个字符。
1Arr_Iata requireArr_Iata 缺失或为空。
1size of Arr_Iata must be 3Arr_Iata 不是正好 3 个字符。
1ETA range is incorrectETA 不晚于 ETD
1SupplierName requireDestinationSG 但缺少 SupplierNameGSTRegNoGSTAmountGSTCurrencyGSTStatus 同理。
1SenderName requireSenderName 缺失或为空。其余寄件人、收件人和商品必填字段同理。
1max size of SenderName must be 60该字段超过其长度上限。其余有长度限制的字段同理。
1Error encountered, please contact tech@wmg-group.com with screenshot of error page for resolution.未预期的服务端错误。
1003Token errorToken 缺失、已过期或被新登录顶替。请重新调用 获取 Token

字段级校验消息的规律是:缺失用 <字段名> require,长度问题用 max size of <字段名> must be <n>size of <字段名> must be <n>,字段名与上面各表中的名称完全一致。