# SwiftX Express Tracking API & MCP

URL: https://docs.lastscanned.com/carriers/swiftx

Query live **SwiftX Express** (`swiftx`) parcel status in a single synchronous `GET` request or MCP tool call. SwiftX delivers Cainiao (AliExpress) parcels across the US, and `lastscanned` auto-detects its `SWX` numbers.

## Overview & Quick Facts

| Property | Value |
|---|---|
| **Carrier slug (`?carrier=`)** | `swiftx` |
| **Brand aliases** | SwiftX, SwiftX Express (`swiftx-express.com`) |
| **Category** | US last-mile parcel carrier (Cainiao) |
| **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` |
| **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=SWX421890000223565246,...` (up to 20 SwiftX numbers per tracker request) |
| **MCP server (`https://mcp.lastscanned.com`)** | `track_package`, `track_packages`, `list_carriers` |
| **Authentication & pricing** | `Authorization: Bearer lsk_live_...` · 1 free keyless lookup/day per IP |

## Tracking Number Formats & Auto-Detection

| Pass | Rule / Regex | Check Digit | Examples |
|---|---|---|---|
| **Pass 1 (`matches`)** | `/^SWX\d{18}$/` (`SWX` + 18 digits = 21 chars) | none | `SWX421890000223565246` |
| **Pass 2 (`mayMatch`)** | none | none | none |

`SWX` numbers are auto-detected, so `?carrier=swiftx` is optional.

## Synchronous `GET` Request & Normalized JSON Response

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

```json
{
  "carrier": "swiftx",
  "trackingNumber": "SWX421890000223565246",
  "status": "delivered",
  "statusDescription": "Delivered",
  "service": null,
  "deliveredAt": null,
  "deliveredAtLocal": "2026-11-02T15:27:45",
  "signedBy": null,
  "destination": { "city": null, "state": null, "country": "US" },
  "message": "SwiftX shows its scan history only with the last 4 digits of the recipient's phone number; this is the parcel's current step.",
  "events": [
    {
      "timestamp": null,
      "localTime": "2026-11-02T15:27:45",
      "status": "delivered",
      "description": "Delivered",
      "location": null,
      "code": "step 5"
    }
  ]
}
```

## Notes

- **Current step, not every scan**: SwiftX's tracker shows the full scan list only to someone who enters the last 4 digits of the recipient's phone number. Without them it gives the parcel's step on a five-step bar (Label created, Picked up, In transit, Out for delivery, Delivered) and when that step was last updated. `lastscanned` returns that step as one event (`code` is `step 1` to `step 5`) and says so in `message`.
- **Statuses**: Label created maps to `label_created`; Picked up and In transit to `in_transit`; Out for delivery to `out_for_delivery`; Delivered to `delivered`.
- **Time zone**: SwiftX gives the update time with no zone, so only `localTime` is set and `timestamp` is `null`.
- **Bot wall**: swiftx-express.com puts its tracker behind a Cloudflare challenge, so lookups run in a cloud browser and take about 10 to 15 seconds. A batch of up to 20 numbers shares one browser session.

## Related Resources

- **Regex & check digits**: [Tracking number formats & auto-detection](/formats)
- **Upstream consolidator**: [Cainiao](/carriers/cainiao)