KEX Express Thailand (Kerry Express) Tracking API & MCP
Query live KEX Express Thailand (kex) package status and scan history in a single synchronous GET request or MCP tool call. KEX numbers are not auto-detected, so pass ?carrier=kex. lastscanned returns a normalized TrackingResult JSON payload, with no KEX account or API key.
Overview & Quick Facts
| Property | Value |
|---|---|
Carrier slug (?carrier=) | kex |
| Brand & service aliases | KEX Express, KEX Express Thailand, Kerry Express Thailand, th.kex-express.com |
| Category | Thai domestic courier |
| Single-package REST endpoint | GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=kex |
| Batch REST endpoint | GET https://api.lastscanned.com/v1/track?numbers=KEX1234567890,...&carrier=kex |
MCP server (https://mcp.lastscanned.com) | track_package, track_packages, list_carriers (claude mcp add --transport http lastscanned https://mcp.lastscanned.com) |
| Authentication & pricing | Authorization: Bearer lsk_live_... · 1 free keyless lookup/day per IP · Free tier (5 unique numbers/day, $0) · Pro ($4.99/mo for 1,000 unique numbers, unlimited re-polls, $0.015/extra) · HTTP 402 Stripe MPP ($0.50 for 25-number lsk_pack_ key or $0.02/number in USDC on Tempo) |
Tracking Number Formats & Auto-Detection
| Pass | Rule | Check digit | Examples |
|---|---|---|---|
Pass 1 (matches) | None | n/a | n/a |
Pass 2 (mayMatch) | None | n/a | n/a |
Explicit (?carrier=kex) | The consignment number printed on the KEX label or in the sender's message | n/a | KEX1234567890 |
KEX numbers come in several shapes that other carriers share, so ?carrier=kex is required.
Synchronous GET Request & Normalized JSON Response
curl
curl -s "https://api.lastscanned.com/v1/track/KEX1234567890?carrier=kex" \
-H "Authorization: Bearer $LASTSCANNED_API_KEY"JavaScript / TypeScript (fetch)
const res = await fetch("https://api.lastscanned.com/v1/track/KEX1234567890?carrier=kex", {
headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` },
});
const pkg = await res.json();
console.log(pkg.status, pkg.events[0]);MCP track_package tool call
{
"tool": "track_package",
"arguments": {
"tracking_number": "KEX1234567890",
"carrier": "kex"
}
}Normalized TrackingResult JSON response
{
"carrier": "kex",
"trackingNumber": "KEX1234567890",
"status": "out_for_delivery",
"statusDescription": "Out for delivery",
"service": null,
"deliveredAt": null,
"deliveredAtLocal": null,
"signedBy": null,
"destination": {
"city": null,
"state": "Chiang Mai",
"country": "TH"
},
"events": [
{
"timestamp": "2026-10-26T02:15:00Z",
"localTime": "2026-10-26T09:15:00",
"status": "out_for_delivery",
"description": "Out for delivery",
"location": "Chiang Mai",
"code": "060.01"
},
{
"timestamp": "2026-10-25T15:40:00Z",
"localTime": "2026-10-25T22:40:00",
"status": "in_transit",
"description": "Arrived at hub",
"location": "Bangkok",
"code": "105"
}
]
}Notes
- Scan times are Thailand time, returned with a UTC
timestampand the scan'slocalTime. deliveredis set from KEX's own codes (PODand400),returnedfrom401, andout_for_deliveryfrom the060family.- When KEX gives a due date it is returned as
estimatedDelivery. - Some KEX proofs of delivery (signature, photo) are only shown in the KEX app and are not returned.
Related Resources
- Carrier hub: All supported carriers
- Regex & check digits: Tracking number formats & auto-detection
- AI support workflows: WISMO AI agents & synchronous tracking
SPL Saudi Post Tracking API & MCP
Track Saudi Post (SPL) parcels and registered mail in Saudi Arabia via one synchronous REST GET or MCP call. Normalized JSON status and scan history, no carrier credentials required.
Pos Malaysia (Pos Laju) Tracking API & MCP
Track Pos Malaysia and Pos Laju parcels and S10 numbers ending MY via synchronous REST GET or MCP. Normalized JSON status and scan history, no carrier credentials required.