Sendle Tracking API & MCP
Query live Sendle (sendle) package status and scan history across Australia in a single synchronous GET request or MCP tool call. lastscanned auto-detects both 12-character QSS… tracking numbers and 8-character QS… order numbers in Pass 1 and returns a normalized TrackingResult JSON payload—without requiring a Sendle merchant ID or API key.
Overview & Quick Facts
| Property | Value |
|---|---|
Carrier slug (?carrier=) | sendle |
| Brand & service aliases | Sendle (sendle.com), QSS…, QS… |
| Category | Australian small-business & e-commerce parcel courier (Detection precedence #30 of 31) |
| Single-package REST endpoint | GET https://api.lastscanned.com/v1/track/{trackingNumber} |
| Batch REST endpoint | GET https://api.lastscanned.com/v1/track?numbers=QSS...,QS... |
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) |
Why developers use lastscanned for Sendle instead of direct requests
- Works with Sendle's relaunched 2026 platform & SHA-256 proof-of-work gate: Following Sendle's 2026 platform relaunch, legacy
api.sendle.com/track.sendle.comendpoints and oldS-prefixed references were retired, and public lookups now require solving a cryptographic SHA-256 proof-of-work challenge (salt:noncezero-bit difficulty check) before returning parcel data. CallingGET https://api.lastscanned.com/v1/track/:numberhandles the entire lookup and returns normalized JSON in onefetch(). - Tracks both
QSStracking numbers andQSorder numbers: Whether your customer pastes the 12-characterQSS000123456parcel tracking number or the 8-characterQS416938order reference,lastscannedauto-detects and tracks both in Pass 1.
Tracking Number Formats & Auto-Detection (matches vs mayMatch)
Sendle is evaluated thirtieth (#30) in lastscanned's two-pass detector:
| Pass | Rule / Regex | Check Digit | Examples |
|---|---|---|---|
Pass 1 (matches) — Tracking number (QSS) | /^QSS\d{9}$/i (QSS + 9 digits = 12 chars) | — | QSS000123456, QSS000284255 |
Pass 1 (matches) — Order number (QS) | /^QS\d{6}$/i (QS + 6 digits = 8 chars) | — | QS416938, QS123456 |
Pass 2 (mayMatch) | None | — | — |
Disambiguating Sendle (QSS + 9 digits) vs Purolator (3 letters + 9 digits)
- Zero collision with Purolator: Even though
QSS+ 9 digits has the shape3 letters + 9 digits, Sendle'smatches()runs in Pass 1, whereas Purolator's/^[A-Z]{3}\d{9}$/irule only runs in Pass 2 (mayMatch). Therefore,QSS000123456always routes tosendleautomatically.
Synchronous GET Request & Normalized JSON Response
curl
curl -s "https://api.lastscanned.com/v1/track/QSS000123456" \
-H "Authorization: Bearer $LASTSCANNED_API_KEY"JavaScript / TypeScript (fetch)
const res = await fetch("https://api.lastscanned.com/v1/track/QSS000123456", {
headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` },
});
const pkg = await res.json();
console.log(pkg.status, pkg.statusDescription, pkg.events[0]);MCP track_package tool call
{
"tool": "track_package",
"arguments": {
"tracking_number": "QSS000123456"
}
}Normalized TrackingResult JSON response
{
"carrier": "sendle",
"trackingNumber": "QSS000123456",
"status": "delivered",
"statusDescription": "Delivered",
"service": null,
"deliveredAt": "2026-10-25T03:16:56Z",
"deliveredAtLocal": "2026-10-25T14:16:56",
"signedBy": null,
"destination": null,
"events": [
{
"timestamp": "2026-10-25T03:16:56Z",
"localTime": "2026-10-25T14:16:56",
"status": "delivered",
"description": "Delivered: Parcel left in a safe place at front door",
"location": null,
"code": null
},
{
"timestamp": "2026-10-24T21:40:12Z",
"localTime": "2026-10-25T08:40:12",
"status": "out_for_delivery",
"description": "Out for Delivery: With local courier for delivery today",
"location": null,
"code": null
},
{
"timestamp": "2026-10-23T06:15:00Z",
"localTime": "2026-10-23T17:15:00",
"status": "in_transit",
"description": "Picked Up: Parcel collected from sender",
"location": null,
"code": null
},
{
"timestamp": "2026-10-22T23:05:10Z",
"localTime": "2026-10-23T10:05:10",
"status": "label_created",
"description": "Order Created: Ready for pickup",
"location": null,
"code": null
}
]
}Carrier-Specific Status & Integration Notes
- Australian Eastern (
Australia/Sydney) timezone normalization: Sendle timestamps are recorded inAustralia/Sydneytime without an explicit offset string.lastscannedpreserves the local clock inlocalTime(deliveredAtLocal) and converts it to UTC intimestamp(deliveredAt). - Status category mapping: Sendle's
statusCategoryvalues map deterministically to normalized statuses (received/label→label_created,transit→in_transitorout_for_delivery,delivered→delivered,returned→returned,cancelled→exception).
Related Resources
- Live browser lookup tool: Track a Sendle package live on lastscanned.com/lookup/sendle
- Carrier hub: All 31 supported carriers
- Regex & check digits: Tracking number formats & auto-detection
- AI support workflows: WISMO AI agents & synchronous tracking
UBI Smart Parcel Tracking API & MCP
Track UBI Smart Parcel (AU 15-character China-to-Australia e-commerce parcels) and Australia Post / Aramex handoffs via synchronous REST GET or MCP. Normalized JSON status, scan history, and format rules—no carrier credentials required.
Asendia USA (Pirate Ship Simple Export Rate) Tracking API & MCP
Track Asendia USA (Pirate Ship AHOY 12-character labels, AS...US numbers, and USPS outbound international labels) and destination postal handoffs via synchronous REST GET or MCP. Normalized JSON status and scan history—no carrier credentials required.