# Correos Express Tracking API & MCP

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

Query live **Correos Express** (`correosexpress`) package status and scan history in a single synchronous `GET` request or MCP tool call.

## Overview & Quick Facts

| Property | Value |
|---|---|
| **Carrier slug (`?carrier=`)** | `correosexpress` |
| **Brand aliases** | Correos Express Paquetería, CEX |
| **Category** | Express parcels (Spain) |
| **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}` |
| **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...` |
| **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`)** | none | none | none |
| **Pass 2 (`mayMatch`)** | none | none | none |

`matches` and `mayMatch` are both empty: Correos Express numbers are 16 digits, a shape Canada Post and others also use, so pass `?carrier=correosexpress`. This is the parcel company, not the postal service (`correos`).

## Synchronous `GET` Request & Normalized JSON Response

```bash
curl -s "https://api.lastscanned.com/v1/track/3230001234567890?carrier=correosexpress" \
  -H "Authorization: Bearer $LASTSCANNED_API_KEY"
```

```json
{
  "carrier": "correosexpress",
  "trackingNumber": "3230001234567890",
  "status": "exception",
  "statusDescription": "En Gestión",
  "service": null,
  "deliveredAt": null,
  "deliveredAtLocal": null,
  "signedBy": null,
  "destination": null,
  "message": "Linked shipment 32300012345678901230001: NO LOCALIZADO",
  "events": [
    {
      "timestamp": "2026-08-19T09:37:00Z",
      "localTime": "2026-08-19T11:37:00",
      "status": "exception",
      "description": "En Gestión",
      "location": null,
      "code": "X130000R"
    },
    {
      "timestamp": "2026-08-06T20:01:00Z",
      "localTime": "2026-08-06T22:01:00",
      "status": "delivered",
      "description": "Entregado",
      "location": null,
      "code": "X120000V"
    },
    {
      "timestamp": "2026-08-04T05:41:32Z",
      "localTime": "2026-08-04T07:41:32",
      "status": "out_for_delivery",
      "description": "En reparto",
      "location": null,
      "code": "X080000V"
    },
    {
      "timestamp": "2026-08-03T23:44:30Z",
      "localTime": "2026-08-04T01:44:30",
      "status": "in_transit",
      "description": "En destino",
      "location": null,
      "code": "X060000V"
    },
    {
      "timestamp": "2026-08-01T15:39:41Z",
      "localTime": "2026-08-01T17:39:41",
      "status": "label_created",
      "description": "Informado",
      "location": null,
      "code": "X010000V"
    }
  ]
}
```

## Notes

- **Source**: the JSON service `localizador.correos.es/canonico/eventos_envio_servicio/{number}` that the Correos Express tracking page uses. No account is needed.
- **Status codes**: the event code is `X<nn>0000<V|R>`, and `nn` decides the status (01 label created, 02 and 06 in transit, 08 out for delivery, 12 delivered, 13 under customer-service management, which is `exception`). Other codes fall back to the Spanish wording.
- **Newest scan wins**: a parcel can be delivered and then reopened by customer service, as in the sample, in which case the status follows the newest scan.
- **Linked shipment**: when Correos Express lists an associated shipment, `message` names it with its state.
- **Time zone**: scan clocks are converted from `Europe/Madrid`. Scans on the Canary Islands are an hour out.

## Related Resources

- **Regex & check digits**: [Tracking number formats & auto-detection](/formats)
