# DPD Germany Tracking API & MCP

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

Query live **DPD** (`dpd`) parcel status and progress in a single synchronous `GET` request or MCP tool call. It reads DPD Germany's public tracking page, which shows a parcel's progress **without the recipient's postcode**. For DPD UK numbers use the [`dpduk`](/docs/carriers/dpduk) carrier.

## Overview & Quick Facts

| Property | Value |
|---|---|
| **Carrier slug (`?carrier=`)** | `dpd` |
| **Brand aliases** | DPD, DPD Germany, DPD Paket, DPD Group, myDPD |
| **Category** | Regional parcels (Germany and DPD Group continental) |
| **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dpd` |
| **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...&carrier=dpd` |
| **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`)** | `/^0\d{13}$/` | none | `01234567890123` |

Other carriers also issue 14-digit numbers, so DPD is only a fallback: pass `?carrier=dpd` when you know the parcel is DPD's.

## Synchronous `GET` Request & Normalized JSON Response

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

```json
{
  "carrier": "dpd",
  "trackingNumber": "01234567890123",
  "status": "delivered",
  "statusDescription": "Collected from the Pickup parcelshop by the recipient",
  "service": null,
  "deliveredAt": null,
  "deliveredAtLocal": "2026-10-07",
  "signedBy": null,
  "destination": null,
  "message": null,
  "events": [
    {
      "timestamp": null,
      "localTime": "2026-10-07",
      "status": "delivered",
      "description": "Collected from the Pickup parcelshop by the recipient",
      "location": null,
      "code": null
    },
    {
      "timestamp": null,
      "localTime": "2026-10-06",
      "status": "exception",
      "description": "Parcel dropped off at a Pickup parcelshop",
      "location": null,
      "code": null
    },
    {
      "timestamp": null,
      "localTime": "2026-10-01",
      "status": "in_transit",
      "description": "Parcel in transit",
      "location": null,
      "code": null
    }
  ]
}
```

## Notes

- **What the guest view leaves out**: DPD shows the postcode-free view as up to five stages (data received by DPD, in transit, at the depot, out for delivery, delivered), each with a **day only**: no time of day, no depot or city, no scan list, no delivery time window or driver details, and no signature. Entering the recipient's postcode on DPD's page unlocks that fuller view, which this carrier does not use. Events therefore have `localTime` as a date (`2026-10-07`), `timestamp: null` and `location: null`.
- **Year**: the page prints days as `07.10.` with no year. The year is taken from the page's headline status (which carries a full date) or, failing that, is the latest year that does not put the newest stage in the future. A parcel more than a year old may therefore show a wrong year on its earliest stages.
- **Language**: DPD's page is German-only. The five standard stage labels are translated to English; any other wording is passed through in German.
- **Pickup parcelshops**: a parcel waiting in a shop is reported as `exception` (it needs action) until it is collected.
- **Returns**: when DPD shows "Retoure an Versender" the status is `returned`.
- **Other DPD countries**: numbers from DPD Belgium, the Netherlands and other partner networks are not shown on this page. The result has `status: "unknown"`, no events, and a `message` naming the country's DPD site and its tracking link.
- **Not found**: a number DPD's page does not know returns `404 not_found`.
- **Source**: plain requests to `tracking.dpd.de`, which redirects to `my.dpd.de`. The myDPD app's `dpdgroup.com` guest API is not used because it sits behind a Cloudflare challenge.

## Related Resources

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