# DHL Parcel Poland Tracking API & MCP

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

Query live **DHL Parcel PL** (`dhlparcelpl`) package status and scan history in a single synchronous `GET` request or MCP tool call.

`dhlparcelpl` covers DHL Parcel Poland (mojdhl.pl). The public service reports the parcel's current step and its posting date, not a full scan list, so the result has one or two events.

**Source**: Plain `GET https://mojdhl.pl/api/dhl/public/auth/captcha/challenge`, then `POST https://mojdhl.pl/api/dhl/public/shipment/status` with the solved challenge. No key needed.

## Overview & Quick Facts

| Property | Value |
|---|---|
| **Carrier slug (`?carrier=`)** | `dhlparcelpl` |
| **Brand aliases** | DHL Parcel Poland, DHL Polska, Moj DHL, DHL24 |
| **Category** | International parcels |
| **Single-package REST endpoint** | `GET https://api.lastscanned.com/v1/track/{trackingNumber}?carrier=dhlparcelpl` |
| **Batch REST endpoint** | `GET https://api.lastscanned.com/v1/track?numbers=...,...&carrier=dhlparcelpl` |
| **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 |

Poland uses 11-digit shipment numbers (`30123456789`) and `JJD…` piece numbers, both shared with other carriers, so pass `?carrier=dhlparcelpl`.

## Synchronous `GET` Request & Normalized JSON Response

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

```json
{
  "carrier": "dhlparcelpl",
  "trackingNumber": "30123456789",
  "status": "delivered",
  "statusDescription": "Delivered",
  "service": null,
  "deliveredAt": "2026-08-05T06:42:00Z",
  "deliveredAtLocal": "2026-08-05T08:42:00",
  "signedBy": null,
  "destination": null,
  "events": [
    {
      "timestamp": "2026-08-05T06:42:00Z",
      "localTime": "2026-08-05T08:42:00",
      "status": "delivered",
      "description": "Delivered",
      "location": null,
      "code": "TT_DOR"
    },
    {
      "timestamp": null,
      "localTime": "2026-07-03",
      "status": "in_transit",
      "description": "Shipment posted",
      "location": null,
      "code": null
    }
  ]
}
```

## Notes

- **Proof of work**: the site guards its status call with an ALTCHA challenge. The lookup computes it with SHA-256 hashing (up to 100000 hashes, a fraction of a second to under a second of CPU) before asking, so a lookup takes about 1 to 2 seconds in all.
- **Detail**: the carrier's current step (delivered, ready for collection at a point or locker, out for delivery, returned to sender, and so on) sets `status`; its date is the delivery or receipt time when there is one.

## Related Resources

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