# CNE Express Tracking API & MCP

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

Query live **CNE Express** (`cne`, 递一国际物流) cross-border package status, scan history, and **destination last-mile handoff numbers** in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects 13-character `3A5V…` waybills in Pass 1 and returns a normalized `TrackingResult` JSON payload—without requiring a CNE merchant account or API signature secret.

## Overview & Quick Facts

| Property | Value |
|---|---|
| **Carrier slug (`?carrier=`)** | `cne` |
| **Brand & service aliases** | CNE Express (递一国际物流), CNE Global, `cne.com`, `3A5V…` |
| **Category** | Chinese cross-border e-commerce logistics carrier (Detection precedence **#27 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=3A5V...,3A5V...` (up to 10 CNE numbers per batch; up to 100 total numbers) |
| **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 CNE Express instead of direct requests

- **Avoid CNE WebAssembly MD5 request signing & `ReturnValue: -5555` IP blocks**: Direct requests from serverless functions (Cloudflare Workers, Vercel, AWS Lambda) to `wapi.cne.com` require computing custom MD5 request signatures (`signature` header and `md5` body digest) and get blocked for hours with `ReturnValue: -5555` after just 15–20 lookups from a shared datacenter IP. Calling `GET https://api.lastscanned.com/v1/track/:number` returns clean JSON in one `fetch()`.
- **Automatic last-mile carrier & exchange number extraction**: Once a CNE parcel clears customs and is handed to a local carrier (such as [USPS](/carriers/usps), Royal Mail, [UniUni](/carriers/uniuni), Evri, or [DHL](/carriers/dhl)), `lastscanned` extracts both `lastMileSupplier.enName` and `Response_Info.transNbr` into top-level `message` (e.g. `"Handed to Royal Mail as WG123456789GB"` or `"Handed to USPS as 9261290312839104827163"`).

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

CNE Express is evaluated **twenty-seventh (#27)** in `lastscanned`'s two-pass detector:

| Pass | Rule / Regex | Check Digit | Examples |
|---|---|---|---|
| **Pass 1 (`matches`)** | `/^3A5V\d{9}$/i` (`3A5V` + 9 digits = 13 chars) | — | `3A5V700123456`, `3A5V735000001` |
| **Pass 2 (`mayMatch`)** | *None* | — | — |

### When is `?carrier=cne` optional vs required?

- **Optional (auto-detected)**: All 13-character `3A5V` + 9-digit CNE waybill numbers auto-detect in Pass 1.
- **Required (`?carrier=cne`)**: Destination carrier tracking numbers (`transNbr`) or merchant reference numbers that you want to query inside CNE's tracking system rather than the destination carrier.

## Synchronous `GET` Request & Normalized JSON Response

### `curl`

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

### JavaScript / TypeScript (`fetch`)

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

### MCP `track_package` tool call

```json
{
  "tool": "track_package",
  "arguments": {
    "tracking_number": "3A5V700123456"
  }
}
```

### Normalized `TrackingResult` JSON response

```json
{
  "carrier": "cne",
  "trackingNumber": "3A5V700123456",
  "status": "delivered",
  "statusDescription": "Delivered",
  "service": null,
  "deliveredAt": "2026-10-24T13:58:00Z",
  "deliveredAtLocal": "2026-10-24T14:58:00",
  "signedBy": null,
  "destination": {
    "city": null,
    "state": null,
    "country": "GB"
  },
  "message": "Handed to Royal Mail as WG849201736GB",
  "events": [
    {
      "timestamp": null,
      "localTime": "2026-10-24T14:58:00",
      "status": "delivered",
      "description": "Delivered",
      "location": "London",
      "code": "3"
    },
    {
      "timestamp": null,
      "localTime": "2026-10-22T09:30:00",
      "status": "in_transit",
      "description": "Custom clearance completed",
      "location": "London",
      "code": "1"
    },
    {
      "timestamp": "2026-10-19T14:29:14Z",
      "localTime": "2026-10-19T22:29:14",
      "status": "in_transit",
      "description": "Departed from sorting center",
      "location": "Shanghai",
      "code": "1"
    },
    {
      "timestamp": "2026-10-18T07:10:00Z",
      "localTime": "2026-10-18T15:10:00",
      "status": "label_created",
      "description": "Parcel Information Received",
      "location": null,
      "code": "0"
    }
  ]
}
```

## Chaining Last-Mile Handoffs (`message`) & Status Notes

- **Handoff number in `message`**: When CNE assigns a destination carrier number (`transNbr`), `message` formats it as `"Handed to <Carrier> as <TrackingNumber>"`. If the destination carrier is one of the 31 supported carriers (such as [USPS](/carriers/usps), [Canada Post](/carriers/canadapost), [UniUni](/carriers/uniuni), or [DHL](/carriers/dhl)), you can pass that secondary number straight to `GET /v1/track/:number`.
- **Timestamps & status codes**: Origin scans in China (`CN.<city>`) and top-level `deliveryDate` are converted from `Asia/Shanghai` (`UTC+8`) into UTC (`timestamp` / `deliveredAt`), while overseas scan rows retain their local facility wall clock in `localTime`. CNE numeric state codes (`0` not delivered, `1`/`2` shipping, `3` delivered, `4` timeout, `5` customs inspection, `6` invalid address, `7` lost, `8` returned, `9` exception, `10` destroyed) are preserved in `events[].code`.

## Related Resources

- **Live browser lookup tool**: [Track a CNE Express package live on lastscanned.com/lookup/cne](https://lastscanned.com/lookup/cne)
- **Carrier hub**: [All 31 supported carriers](/carriers)
- **Regex & check digits**: [Tracking number formats & auto-detection](/formats)
- **AI support workflows**: [WISMO AI agents & synchronous tracking](/wismo)
