# YTO Express (Yuantong) Tracking API & MCP

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

Query live **YTO Express** (`yto`, Yuantong 圆通速递) parcel status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects `YT` + 13 digit numbers in Pass 1; YTO's all-digit and other letter-prefixed numbers need `?carrier=yto`.

## Overview & Quick Facts

| Property | Value |
|---|---|
| **Carrier slug (`?carrier=`)** | `yto` |
| **Brand & service aliases** | YTO, YTO Express, Yuantong, 圆通, 圆通速递 |
| **Category** | China domestic express parcel carrier |
| **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` (add `?carrier=yto` for numbers that are not `YT` + 13 digits) |
| **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=YT...,YT...` |
| **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 (`matches` vs `?carrier=yto`)

| Pass | Rule / Regex | Check Digit | Examples |
|---|---|---|---|
| **Pass 1 (`matches`)** | `/^YT\d{13}$/` and `/^YT[DGHZ]\d{12}$/` | none | `YT2412345678901`, `YTH123456789012` |
| **Pass 2 (`mayMatch`)** | *None* | none | none |
| **Explicit (`?carrier=yto`)** | YTO's all-digit numbers (for example 18 digits starting with 6 or 8) and letter-prefixed numbers such as `G8…` or `M…` | none | `?carrier=yto` |

## Synchronous `GET` Request & Normalized JSON Response

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

```json
{
  "carrier": "yto",
  "trackingNumber": "YT2412345678901",
  "status": "delivered",
  "statusDescription": "您的快件已领取，收件人在[丰巢]取件",
  "service": null,
  "deliveredAt": "2026-10-14T03:50:57Z",
  "deliveredAtLocal": "2026-10-14T11:50:57",
  "signedBy": null,
  "destination": null,
  "events": [
    {
      "timestamp": "2026-10-14T03:50:57Z",
      "localTime": "2026-10-14T11:50:57",
      "status": "delivered",
      "description": "您的快件已领取，收件人在[丰巢]取件",
      "location": "江苏省常州市新北区龙城",
      "code": "745"
    },
    {
      "timestamp": "2026-10-13T09:17:22Z",
      "localTime": "2026-10-13T17:17:22",
      "status": "out_for_delivery",
      "description": "【江苏省常州市新北区龙城】的派件员正在为您派件",
      "location": "江苏省常州市新北区龙城",
      "code": "710"
    }
  ]
}
```

## Status Notes

- **Language**: scan descriptions and locations are in Chinese, as YTO prints them.
- **Times**: scan times are China time (`Asia/Shanghai`), so every event has both `timestamp` (UTC) and `localTime`.
- **Parcel lockers**: a scan putting the parcel in a locker or parcel station (code `751`) and a courier taking it back out (`756`) both report `exception`, since the parcel is waiting for the recipient.
- **Recycled numbers**: YTO reuses numbers, so an old number can show an earlier parcel's history.

## Related Resources

- **Carrier hub**: [All supported carriers](/carriers)
- **Regex & check digits**: [Tracking number formats & auto-detection](/formats)
