DHL Sendungsverfolgung API - Tracking, Events & Change Feed avatar

DHL Sendungsverfolgung API - Tracking, Events & Change Feed

Pricing

from $14.99 / 1,000 parcel updates

Go to Apify Store
DHL Sendungsverfolgung API - Tracking, Events & Change Feed

DHL Sendungsverfolgung API - Tracking, Events & Change Feed

Extract DHL Sendungsverfolgung data by tracking number or customer reference: status, full event history, delivery progress and the delivery window. Reports what changed since your last run, not the same payload twice. No DHL contract or key. Export JSON, CSV, Excel.

Pricing

from $14.99 / 1,000 parcel updates

Rating

0.0

(0)

Developer

ClearPath

ClearPath

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

DHL Sendungsverfolgung API | Parcel Tracking, Event History & Change Feed (2026)

DHL Sendungsverfolgung as an API: 22 fields per parcel, and only what changed.

DHL Sendungsverfolgung API: parcel status, event history, delivery window and change feed as structured JSON

Copy to your AI assistant

clearpath/dhl-sendungsverfolgung-api on Apify. DHL Sendungsverfolgung by tracking number or customer reference and reports what changed since the last run. Call ApifyClient("TOKEN").actor("clearpath/dhl-sendungsverfolgung-api").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Max 1000 numbers per run; a customer reference resolves to the real number in trackingNumber. Full spec: GET https://api.apify.com/v2/acts/clearpath~dhl-sendungsverfolgung-api/builds/default (Bearer TOKEN) -> inputSchema, actorDefinition.storages.dataset, readme. Token: https://console.apify.com/account/integrations

DHL Sendungsverfolgung API: what you get per parcel

Every field below comes back on every check, in German or English. 22 fields per parcel, no DHL business contract and no developer key.

FieldWhat it is
trackingNumberThe real DHL tracking number, even when you searched by customer reference
searchedForExactly what you passed in, so rows always line up with your input
status / statusAtCurrent status and the moment it was set
progress / progressMaxStep 1 to 5 of the delivery journey
delivered / deliveredToRecipientWhether it arrived, and whether the recipient took it personally
etaDelivery window: a date early on, narrowing to roughly 90 minutes on delivery day
liveTrackingAvailabletrue while a courier is out with the parcel right now
events[]Every scan, with timestamp, description and location
flagsExpress, Päckchen, small parcel, return, retoure, international, rail, two-man handling, branch notification, pickup code
sustainabilityGoGreen sender, GoGreen Plus, CO₂-free delivery, rail parcel
deliveryOptionsAvailableWhether DHL is offering delivery options for this parcel
changed / changeType / changesThe delta since your last run
found / notFoundReasonWhether the number resolved, and why not if it did not

How to use DHL Sendungsverfolgung as an API in 4 steps

  1. Open the Input tab of the DHL Sendungsverfolgung API and paste your tracking numbers, one per line. Customer references work too.
  2. Pick a language (de or en) and leave Only return what changed on.
  3. Click Start. Each parcel becomes one row in the dataset.
  4. Download as JSON, CSV, Excel or HTML, or pull the rows straight from the Apify API. Then schedule it and every later run reports only what moved.

What data can you extract from DHL Sendungsverfolgung

One complete record, exactly as the Actor returns it. The events array is truncated below to keep the block readable; no keys are omitted.

{
"trackingNumber": "358063591162",
"searchedFor": "358063591162",
"found": true,
"status": "In Zustellung",
"statusAt": "2026-08-25T09:24:02+02:00",
"progress": 4,
"progressMax": 5,
"delivered": false,
"deliveredToRecipient": null,
"destinationCountry": "Deutschland",
"direction": "ANKOMMEND",
"productType": "PAKET",
"flags": {
"isReturn": false,
"isRetoure": false,
"isSmallParcel": false,
"isPaeckchen": false,
"isExpress": false,
"isSameDay": false,
"isRail": false,
"isInternational": false,
"twoManHandling": false,
"notifiedAtBranch": false,
"pickupCodeAvailable": false
},
"sustainability": {
"co2FreeDelivery": true,
"goGreenSender": true,
"goGreenPlusSender": false,
"goGreenPlusRecipient": false,
"climateFriendlyReceipt": false,
"railParcel": false
},
"eta": {
"from": "2026-08-25T13:30:00+02:00",
"to": "2026-08-25T15:00:00+02:00",
"source": "planned"
},
"liveTrackingAvailable": true,
"deliveryOptionsAvailable": true,
"events": [
{
"at": "2026-08-23T18:03:09+02:00",
"status": "Die Sendung wurde elektronisch angekündigt. Sobald die Sendung von uns bearbeitet wurde, erhalten Sie weitere Informationen.",
"location": null,
"isReturn": false
},
{
"at": "2026-08-24T11:08:24+02:00",
"status": "Die Sendung wurde vom Absender in der Filiale eingeliefert.",
"location": null,
"isReturn": false
},
{
"...": "4 more events"
}
],
"checkedAt": "2026-08-26T06:57:48.148358+00:00",
"changed": true,
"changeType": "new",
"changes": {
"newEvents": [
{
"...": "6 events on first sight"
}
],
"statusChanged": null,
"etaChanged": null,
"justDelivered": false
}
}

DHL live tracking and the delivery window

eta.source tells you how firm the window is:

  • planned: DHL's forecast. Appears once the parcel reaches the delivery base, first as a date, then as a time window on the morning of delivery.
  • live: the window while a courier is actively on tour.

liveTrackingAvailable flips to true the moment a parcel is loaded onto a delivery vehicle. It is the cheapest possible "is it out for delivery right now" signal: poll for it, then poll harder once it turns true.

DHL Sendungsverfolgung with a change feed: only what moved

Every parcel you check is remembered, so the next run can tell you exactly what moved.

  • changeType: "new": first time you have checked this parcel. Full record.
  • changeType: "updated": something moved. Full record plus a changes block.
  • changeType: "unchanged": nothing moved. A short row, billed at the lower rate.

A parcel DHL has no data for yet (found: false) also comes back as unchanged and bills at the lower rate, on the first run as on every later one. Read found, not changeType, to tell "nothing moved" apart from "nothing to report yet".

Here is the delta from the poll where a parcel actually landed:

{
"status": "Zustellung erfolgreich",
"delivered": true,
"changed": true,
"changeType": "updated",
"changes": {
"newEvents": [
{
"at": "2026-08-25T14:46:17+02:00",
"status": "Die Sendung wurde erfolgreich zugestellt.",
"location": null,
"isReturn": false
}
],
"statusChanged": {
"from": "In Zustellung",
"to": "Zustellung erfolgreich"
},
"etaChanged": {
"from": {
"from": "2026-08-25T13:30:00+02:00",
"to": "2026-08-25T15:00:00+02:00"
},
"to": {
"from": null,
"to": null
}
},
"justDelivered": true
}
}

Leave Only return what changed on and a quiet run costs almost nothing. Turn it off to get the complete record every time regardless. Forget previous results clears the memory for the parcels in that run and returns full records for them. Your tracking history is stored on your own Apify account and is never shared.

Input

Everything is set on the Input tab. Four fields, nothing to configure beyond them.

{
"trackingNumbers": ["358063591162", "00340435072645002601"],
"language": "de",
"onlyChanges": true,
"resetState": false
}
FieldTypeDefaultNotes
trackingNumbersarrayrequiredTracking numbers or customer references, up to 1000 per run
languagestringdede or en, controls the status and event wording
onlyChangesbooleantrueShort row for parcels that have not moved, billed at the lower rate
resetStatebooleanfalseForget what was seen before and return full records for this run's parcels

Paste a whole line of numbers if that is what you have: "358063591162, 00340435072645002601" is split into two parcels automatically.

What people use DHL Sendungsverfolgung data for

  • Ecommerce order tracking: feed your order table's tracking numbers in, write status and eta back to the customer's order page.
  • Proactive delivery notifications: watch changes.statusChanged and changes.justDelivered, then email or Slack the customer the moment it matters.
  • Support deflection: answer "where is my parcel" without a human opening DHL's site.
  • Delivery-day routing: liveTrackingAvailable plus the 90-minute eta window is enough to tell someone to be home.
  • Logistics reporting: dump events[] for a month of parcels and measure real transit times per lane.
  • Returns monitoring: flags.isReturn and flags.isRetoure separate outbound from inbound.

Integrations and scheduling

The output is a normal Apify dataset, so it drops straight into Google Sheets, Make, Zapier, Airtable, Slack, or your own endpoint via webhooks. A webhook on ACTOR.RUN.SUCCEEDED gives you a push feed of parcel changes without polling anything yourself.

New to scheduling on Apify? This official walkthrough covers it in three minutes:

Recommended frequency:

Parcel stateHow often
In transit (progress 1 to 3)Twice a day
At the delivery base (progress 3 to 4)Every 2 hours
liveTrackingAvailable: trueEvery 15 to 30 minutes
delivered: trueStop. Nothing changes after this

With Only return what changed on, checking often stays cheap: only the runs that actually find something bill at the update rate.

How much does DHL Sendungsverfolgung cost via this API?

Pay per event, so you pay for answers rather than for runtime.

EventWhenPrice
Parcel updateThe parcel is new to you, or something changed$0.0199
Parcel checked, no changeThe parcel had not moved, or no data is available for that number$0.0049
Run startOnce per run, whether it checks 1 parcel or 1,000$0.009

Tracking one parcel from label to doorstep at three checks a day works out at roughly $0.20. Two things keep that low as you scale: an unchanged check costs a quarter of an update, and the run start is charged once per run, so checking 100 parcels in one run costs the same start as checking one.

Free tier: check one parcel per run, up to 50 checks in total. Upgrade your Apify plan to lift the limit.

Yes, with the usual caveats. This Actor reads the same publicly available tracking information that anyone can look up on DHL's own tracking page with a tracking number, and nothing more. It returns no personal data: no sender name, no recipient name, no address. DHL reveals those only to someone who can supply the recipient's postal code, and this Actor never asks you for one, so there is no personal data in the output to fall under GDPR.

Tracking numbers you feed in may themselves be linked to a customer in your own systems. Treat that input, and any dataset you build from it, under your own GDPR obligations: have a lawful basis, keep it only as long as you need it, and do not publish it. If you are unsure how the rules apply to your case, take legal advice.

FAQ

Is there a DHL tracking API I can use without an account? This one. You do not need a DHL business contract, a developer key, or API credentials. Pass a tracking number and get structured JSON back.

Does DHL have an official API, and why use this instead? DHL does publish developer APIs, but they are gated behind a business account and an approval process, are scoped per product line, and rate-limit by contract. This Actor needs no contract, no approval and no key, covers ordinary consumer parcels, and adds the change feed that the official endpoints do not provide.

How do I track multiple parcels at once? Put up to 1000 tracking numbers in trackingNumbers. They are resolved in parallel and each one gets its own row.

Does it work with customer references? Yes. Pass the reference and the real tracking number comes back in trackingNumber, with your input echoed in searchedFor.

Which parcels are covered? Parcels handled by DHL in Germany, inbound and outbound, including Päckchen, returns, express and rail parcels.

Why does a number come back with found: false? Either the number is not a DHL parcel number at all (notFoundReason: "notADhlParcel") or DHL has no data for it yet (noDataYet). A freshly created label often takes a few hours to appear. Either way the row is billed at the lower shipment-checked rate, so polling a label that has not been scanned yet stays cheap.

Does it include the sender's or recipient's name? No. DHL only reveals those to someone who can supply the recipient's postal code, and this Actor does not ask you for one.

Wie funktioniert die Sendungsverfolgung hier? Genau wie auf dhl.de, nur als JSON: Sendungsnummer rein, Status, Verlauf, Fortschritt und Zustellzeitfenster raus, plus die Angabe, was sich seit dem letzten Lauf geändert hat.

How long is tracking history kept? Your per-parcel history is kept for 30 days on your own account, then pruned automatically.

How do I get the data out? Download the dataset as JSON, CSV, Excel or HTML from the Storage tab, pull it from the Apify API, or push it anywhere with an integration.

Something looks wrong. Where do I report it? Open the Issues tab on this Actor's page. Bug reports with the tracking number and the run ID get fixed fastest.

Can I get a custom version? Yes. Use the Issues tab to describe what you need, whether that is another carrier, a different output shape, or a push integration into your own stack.

More clearpath Actors

🛒 Ecommerce & product data

📬 Reaching the customer about a delivery

🇩🇪 More German market data


DHL Sendungsverfolgung as an API: track German DHL parcels by tracking number or customer reference and get status, full event history, delivery progress, delivery window and a change feed as structured JSON, CSV or Excel.