# Swiss Post Tracking API & MCP

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

Query live **Swiss Post** (`swisspost`, Die Post / La Poste Suisse) package status and scan history in a single synchronous `GET` request or MCP tool call. `lastscanned` auto-detects S10 numbers ending `CH` (with a valid check digit) and the 18-digit domestic parcel numbers that start with `99`.

## Overview & Quick Facts

| Property | Value |
|---|---|
| **Carrier slug (`?carrier=`)** | `swisspost` |
| **Brand & service aliases** | Swiss Post, Die Schweizerische Post, La Poste Suisse, PostPac, Meine Sendungen |
| **Category** | National post (Switzerland) |
| **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` |
| **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=990012345678901234,RR123456785CH` |
| **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

| Pass | Rule | Check Digit | Examples |
|---|---|---|---|
| **Pass 1 (`matches`)** | UPU S10 ending `CH`, or `99` + 16 digits (printed `99.00.123456.12345678`) | S10 mod 11 for the S10 form | `RR123456785CH`, `990012345678901234` |
| **Pass 2 (`mayMatch`)** | *None* | — | — |

Dots and spaces in the domestic form are ignored.

## Synchronous `GET` Request & Normalized JSON Response

### `curl`

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

### MCP `track_package` tool call

```json
{
  "tool": "track_package",
  "arguments": { "tracking_number": "990012345678901234" }
}
```

### Normalized `TrackingResult` JSON response

```json
{
  "carrier": "swisspost",
  "trackingNumber": "990012345678901234",
  "status": "in_transit",
  "statusDescription": "Arrival at the delivery point",
  "service": null,
  "deliveredAt": null,
  "deliveredAtLocal": null,
  "signedBy": null,
  "destination": null,
  "events": [
    {
      "timestamp": "2026-10-26T06:41:00Z",
      "localTime": "2026-10-26T07:41:00",
      "status": "in_transit",
      "description": "Arrival at the delivery point",
      "location": "8010 Zürich",
      "code": "1100"
    }
  ]
}
```

## Status Notes

- Swiss Post's scans are codes, not text. The adapter turns them into wording with the same public text bundle the tracking page uses, and falls back to the partner carrier's own description or the bare code.
- Scan times are Swiss local time (`Europe/Zurich`).
- The shipment-level state (delivered, missed delivery, returned) overrides the newest scan's status when Swiss Post reports one.

## Related Resources

- **Carrier hub**: [All supported carriers](/carriers)
- **Regex & check digits**: [Tracking number formats & auto-detection](/formats)
- **AI support workflows**: [WISMO AI agents & synchronous tracking](/wismo)
