Carriers

SpeedX Tracking API & MCP

Query live SpeedX (speedx) last-mile package status and scan history across the US and Australia in a single synchronous GET request or MCP tool call. lastscanned auto-detects 18- and 24-character SPX… barcodes in Pass 1 and returns a normalized TrackingResult JSON payload—without requiring a SpeedX shipper account or webhook registration.

Overview & Quick Facts

PropertyValue
Carrier slug (?carrier=)speedx
Brand & service aliasesSpeedX, Speed X, SPX US, SPX Australia, tracking.speedx.io
CategoryUS & Australian e-commerce last-mile carrier (Detection precedence #19 of 31)
Single-package REST endpointGET https://api.lastscanned.com/v1/track/{trackingNumber}
Batch REST endpointGET https://api.lastscanned.com/v1/track?numbers=SPX...,SPX... (up to 35 numbers per carrier in a 100-number call)
MCP server (https://mcp.lastscanned.com)track_package, track_packages, list_carriers (claude mcp add --transport http lastscanned https://mcp.lastscanned.com)
Authentication & pricingAuthorization: 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 SpeedX instead of direct requests

  • No public developer API or self-serve credentials: SpeedX powers high-volume last-mile deliveries for Temu, Shein, TikTok Shop, and AliExpress across major US metros (SPXLAX…, SPXJFK…, SPXORD…, SPXCLT…) and Australia (SPXSYD…), but does not offer a public self-serve REST API for merchants or post-purchase tools.
  • Full scan history instead of latest-event-only summaries: SpeedX's summary endpoints only return the single latest scan. lastscanned returns the complete chronological scan history (events), recipient city/state (destination), estimated delivery date (estimatedDelivery), and normalized status codes in one GET request.
  • Cross-border handoff target: Cross-border parcels from Cainiao, YunExpress, Yanwen, and SunYou frequently hand over to SpeedX for final-mile delivery under an SPX… tracking number.

Tracking Number Formats & Auto-Detection (matches vs mayMatch)

SpeedX is evaluated nineteenth (#19) in lastscanned's two-pass detector:

PassRule / RegexCheck DigitExamples
Pass 1 (matches) — Standard 18-char SPX/^SPX[0-9A-Z]{15}$/i (SPX + 15 letters and digits = 18 chars, typically SPX + 3-letter airport/hub code + 12 digits)—SPXLAX204518736092, SPXCLT138701431240, SPXSYD104600343237
Pass 1 (matches) — Extended 24-char SPX/^SPX[0-9A-Z]{21}$/i (SPX + 21 letters and digits = 24 chars on cross-border labels)—SPXWCA003022610150019140
Pass 2 (mayMatch)None——

Disambiguating SpeedX (SPX…) vs Spee-Dee (SP…)

  • Zero collision with Spee-Dee Delivery: Spee-Dee tracking numbers start with SP followed strictly by 16 or 18 digits (/^SP(\d{16}|\d{18})$/i), whereas SpeedX tracking numbers always start with SPX followed by 15 or 21 alphanumeric characters (/^SPX([0-9A-Z]{15}|[0-9A-Z]{21})$/i). Both auto-detect in Pass 1 without ?carrier=.

Synchronous GET Request & Normalized JSON Response

curl

curl -s "https://api.lastscanned.com/v1/track/SPXLAX204518736092" \
  -H "Authorization: Bearer $LASTSCANNED_API_KEY"

JavaScript / TypeScript (fetch)

const res = await fetch("https://api.lastscanned.com/v1/track/SPXLAX204518736092", {
  headers: { Authorization: `Bearer ${process.env.LASTSCANNED_API_KEY}` },
});
const pkg = await res.json();
console.log(pkg.status, pkg.destination, pkg.events[0]);

MCP track_package tool call

{
  "tool": "track_package",
  "arguments": {
    "tracking_number": "SPXLAX204518736092"
  }
}

Normalized TrackingResult JSON response

{
  "carrier": "speedx",
  "trackingNumber": "SPXLAX204518736092",
  "status": "delivered",
  "statusDescription": "Delivered",
  "service": null,
  "deliveredAt": "2026-10-25T18:14:22Z",
  "deliveredAtLocal": "2026-10-25T14:14:22",
  "signedBy": null,
  "destination": {
    "city": "Bronx",
    "state": "NY",
    "country": "US"
  },
  "estimatedDelivery": null,
  "events": [
    {
      "timestamp": "2026-10-25T18:14:22Z",
      "localTime": "2026-10-25T14:14:22",
      "status": "delivered",
      "description": "Delivered",
      "location": "Bronx, NY",
      "code": "57201"
    },
    {
      "timestamp": "2026-10-25T12:47:01Z",
      "localTime": "2026-10-25T08:47:01",
      "status": "out_for_delivery",
      "description": "Out for delivery",
      "location": "Jamaica, NY",
      "code": "57104"
    },
    {
      "timestamp": "2026-10-25T07:19:40Z",
      "localTime": "2026-10-25T03:19:40",
      "status": "in_transit",
      "description": "Arrived at last-mile facility",
      "location": "Jamaica, NY",
      "code": "57101"
    },
    {
      "timestamp": "2026-10-23T04:10:00Z",
      "localTime": "2026-10-23T00:10:00",
      "status": "label_created",
      "description": "Shipping label created",
      "location": null,
      "code": "50001"
    }
  ]
}

Raw status & event codes: events[].code preserves SpeedX's 5-digit event code ("50001" label created, "51005" picked up, "52001"/"52002" origin facility, "57101"/"57102"/"57112" last-mile facility, "57104" out for delivery, "57201"–"57203" delivered, "57411" weather exception) alongside SpeedX's milestone category (PICKUP, ORIGIN_HANDLING, MIDDLE_MILE, LAST_MILE_ENROUTE, LAST_MILE_DELIVERED, LAST_MILE_ATTEMPTED, LAST_MILE_UNDELIVERED, LAST_MILE_INTERCEPT, LAST_MILE_RETURNS).

Carrier-Specific Status & Integration Notes

  • Dual UTC and local timestamps (timestamp + localTime): SpeedX provides both UTC timestamps (ts) and offset-qualified local timestamps (localTs), so both timestamp and localTime (plus deliveredAt and deliveredAtLocal) are populated on every scan.
  • Estimated delivery (estimatedDelivery): While a parcel is in transit, estimatedDelivery holds SpeedX's expected delivery date (YYYY-MM-DD). Once delivered, estimatedDelivery is cleared to null.

On this page