Carriers

DPD Germany Tracking API & MCP

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 carrier.

Overview & Quick Facts

PropertyValue
Carrier slug (?carrier=)dpd
Brand aliasesDPD, DPD Germany, DPD Paket, DPD Group, myDPD
CategoryRegional parcels (Germany and DPD Group continental)
Single-package REST endpointGET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dpd
Batch REST endpointGET https://api.lastscanned.com/v1/track?numbers=...&carrier=dpd
MCP server (https://mcp.lastscanned.com)track_package, track_packages, list_carriers
Authentication & pricingAuthorization: Bearer lsk_live_... · 1 free keyless lookup/day per IP

Tracking Number Formats & Auto-Detection

PassRule / RegexCheck DigitExamples
Pass 1 (matches)nonenonenone
Pass 2 (mayMatch)/^0\d{13}$/none01234567890123

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

curl -s "https://api.lastscanned.com/v1/track/01234567890123?carrier=dpd" \
  -H "Authorization: Bearer $LASTSCANNED_API_KEY"
{
  "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.

On this page