Skip to content

Get Stations

API Overview

Returns a list of available parcel locker or self-collection station locations. When a postal code is provided, the response includes nearby stations sorted by distance. Use this endpoint to let customers choose a convenient collection point during checkout.

Request Information

  • Method: GET
  • Path: /openapi/station/get-stations
  • Authentication: Standard OpenAPI token (MD5-based)

Request Headers

FieldDescription
Content-Typeapplication/json
x-auth-name$API_NAME
x-auth-seed$SEED (13-digit millisecond Unix timestamp)
x-auth-token$TOKEN (MD5 hash)

Request Parameters

ParameterTypeRequiredDescription
postcodestringNoPostal code to search stations near. Omitting it returns an empty list, so send it in practice

Token Generation Example

The authentication token is computed from your credentials and seed only -- request parameters are not included.

seed  = "1746700000000"   (13-digit ms timestamp)
token = md5( strtolower(api_name) + api_key + seed )

Authentication

This endpoint uses Standard OpenAPI Authentication (MD5 token).

For complete authentication instructions and code examples, see Authentication Guide.

Response Information

The response is in JSON format.

Response Format

FieldTypeDescription
codeintegerResult code. 0 = success, 1 = failure
messagestringResult description
dataarrayArray of station objects

Success Response

  • Status Code: 200
  • Response Body:
json
{
    "code": 0,
    "message": "success",
    "data": [
        {
            "Zipcode": "544774",
            "Station_Name": "Parcel Santa - Terrasse",
            "Station_Address": "- 21 Terrasse Ln, Singapore 544774",
            "Address_Detail": "Terrasse, Arcadia Clubhouse 1, basement, outside MA office",
            "Distance": 197.977,
            "Station_Code": "PK1689"
        },
        {
            "Zipcode": "546692",
            "Station_Name": "Parcel Santa - The Waterline",
            "Station_Address": "- 167 Poh Huat Road West Singapore 546695",
            "Address_Detail": "The Waterline, B1 Carpark, beside the Ejector Pit",
            "Distance": 305.928,
            "Station_Code": "PK1655"
        },
        {
            "Zipcode": "530628",
            "Station_Name": "Pick - 628 Hougang Avenue 8",
            "Station_Address": "628 Hougang Avenue 8",
            "Address_Detail": "Near Lift A & B ",
            "Distance": 321.347,
            "Station_Code": "PK622"
        },
        {
            "Zipcode": "544604",
            "Station_Name": "Parcel Santa - Hundred Palms Residences",
            "Station_Address": "- 276 Yio Chu Kang Rd, Singapore 544604",
            "Address_Detail": "Hundred Palms Residences, Blk 276 main bicycle parking/washing area, behind management office",
            "Distance": 390.707,
            "Station_Code": "PK1691"
        },
        {
            "Zipcode": "530641",
            "Station_Name": "Pick - 641 Hougang Avenue 8",
            "Station_Address": "641 Hougang Avenue 8",
            "Address_Detail": "Near Letterbox",
            "Distance": 428.492,
            "Station_Code": "PK129"
        },
        {
            "Zipcode": "550139",
            "Station_Name": "Pick - 139 Serangoon North Avenue 2",
            "Station_Address": "139 Serangoon North Avenue 2",
            "Address_Detail": "Near Lift A & B",
            "Distance": 449.037,
            "Station_Code": "PK371"
        },
        {
            "Zipcode": "530623",
            "Station_Name": "Pick - 623 Hougang Avenue 8",
            "Station_Address": "623 Hougang Avenue 8",
            "Address_Detail": "Near Lift C",
            "Distance": 524.894,
            "Station_Code": "PK893"
        },
        {
            "Zipcode": "550512",
            "Station_Name": "Pick - 512 Serangoon North Avenue 4",
            "Station_Address": "512 Serangoon North Avenue 4",
            "Address_Detail": "Near Letterbox",
            "Distance": 614.865,
            "Station_Code": "PK327"
        },
        {
            "Zipcode": "530615",
            "Station_Name": "Pick - 615 Hougang Avenue 8",
            "Station_Address": "615 Hougang Avenue 8",
            "Address_Detail": "Near Lift A",
            "Distance": 695.57,
            "Station_Code": "PK551"
        },
        {
            "Zipcode": "546053",
            "Station_Name": "Parcel Santa - Bliss @Kovan",
            "Station_Address": "- 4 Simon Lane Singapore 546018",
            "Address_Detail": "Bliss @Kovan, Blk 6B, B1 Carpark, Outside Lift Lobby",
            "Distance": 710.982,
            "Station_Code": "PK1564"
        }
    ]
}
FieldTypeDescription
data[].ZipcodestringPostal code of the station
data[].Station_NamestringDisplay name of the station
data[].Station_AddressstringStreet address of the station
data[].Address_DetailstringAdditional location detail (floor, landmark)
data[].DistancefloatDistance from the queried postal code, in metres
data[].Station_CodestringStation identifier; pass it as locker_station.station_code when creating an order

Error Response

  • Status Code: 200 (business logic error) or 4xx/5xx (system error)
  • Response Body:
json
{
    "code": 1,
    "message": "xxxxx error",
    "data": []
}

Common errors:

  • Authentication failure → code 1; the message depends on the cause (e.g. x-auth-token: INVALID, x-auth-seed: TIMEOUT) — see signature.md

Code Reference

CodeDescription
0Success
1Failure

Example

Bash

bash
API_NAME="your_api_name"
API_KEY="your_api_key"
SEED=$(date +%s%3N)
TOKEN=$(printf '%s' "$(echo -n "$API_NAME" | tr '[:upper:]' '[:lower:]')${API_KEY}${SEED}" | md5sum | cut -d' ' -f1)

# Query all stations
curl -G "https://api.test.wmgdelivery.com/v1/openapi/station/get-stations" \
  -H "x-auth-name: $API_NAME" \
  -H "x-auth-seed: $SEED" \
  -H "x-auth-token: $TOKEN"

# Query stations near a postal code
curl -G "https://api.test.wmgdelivery.com/v1/openapi/station/get-stations" \
  --data-urlencode "postcode=529510" \
  -H "x-auth-name: $API_NAME" \
  -H "x-auth-seed: $SEED" \
  -H "x-auth-token: $TOKEN"

Windows PowerShell

powershell
$API_NAME = "your_api_name"
$API_KEY  = "your_api_key"
$SEED     = [string]([DateTimeOffset]::UtcNow.ToUnixTimeMilliseconds())

$raw   = [System.Text.Encoding]::UTF8.GetBytes($API_NAME.ToLower() + $API_KEY + $SEED)
$md5   = [System.Security.Cryptography.MD5]::Create().ComputeHash($raw)
$TOKEN = -join ($md5 | ForEach-Object { $_.ToString("x2") })

$headers = @{
    "x-auth-name"  = $API_NAME
    "x-auth-seed"  = $SEED
    "x-auth-token" = $TOKEN
}

$response = Invoke-RestMethod `
    -Uri "https://api.test.wmgdelivery.com/v1/openapi/station/get-stations?postcode=529510" `
    -Method Get -Headers $headers
$response | ConvertTo-Json -Depth 10

Python

python
import hashlib, time
import requests

API_NAME = 'your_api_name'
API_KEY  = 'your_api_key'
SEED     = str(int(time.time() * 1000))
TOKEN    = hashlib.md5((API_NAME.lower() + API_KEY + SEED).encode()).hexdigest()

headers = {
    'x-auth-name':  API_NAME,
    'x-auth-seed':  SEED,
    'x-auth-token': TOKEN,
}

resp = requests.get(
    'https://api.test.wmgdelivery.com/v1/openapi/station/get-stations',
    params={'postcode': '529510'},
    headers=headers,
)
print(resp.json())

Node.js / TypeScript

typescript
import crypto from 'node:crypto';

const API_NAME = 'your_api_name';
const API_KEY  = 'your_api_key';
const SEED     = String(Date.now());
const TOKEN    = crypto.createHash('md5').update(API_NAME.toLowerCase() + API_KEY + SEED).digest('hex');

const url = new URL('https://api.test.wmgdelivery.com/v1/openapi/station/get-stations');
url.searchParams.set('postcode', '529510');

const resp = await fetch(url.toString(), {
    headers: {
        'x-auth-name':  API_NAME,
        'x-auth-seed':  SEED,
        'x-auth-token': TOKEN,
    },
});
console.log(JSON.stringify(await resp.json(), null, 2));

PHP

php
<?php
$API_NAME = 'your_api_name';
$API_KEY  = 'your_api_key';
$SEED     = (string)(time() * 1000);
$TOKEN    = md5(strtolower($API_NAME) . $API_KEY . $SEED);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.test.wmgdelivery.com/v1/openapi/station/get-stations?' . http_build_query(['postcode' => '529510']));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'x-auth-name: '  . $API_NAME,
    'x-auth-seed: '  . $SEED,
    'x-auth-token: ' . $TOKEN,
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
curl_close($ch);
echo json_encode(json_decode($response, true), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n";
?>

Notes

  • postcode drives the lookup: omit it and the endpoint returns an empty list, so always send the postal code you want stations near.
  • Use Station_Code as locker_station.station_code when creating orders via Create Order.
  • The authentication token does not include request parameters; only credentials and seed are used.
  • The seed must be a 13-digit millisecond Unix timestamp and within ±10 minutes of server time.
  • All parameters are case-sensitive.

Error Codes

codemessageDescription
1Authentication error messageAuthentication failed; the returned message depends on the cause — see the full list in signature.md