How to Track a Shipment
Follow every parcel from label to doorstep. Easyship turns each courier's events into one set of statuses, which you can pull through the API or receive by webhook.
track · track_3p (advanced)Which tracking do I need?
Nothing to set up. The shipment is tracked automatically.
Scope: public.track:read
Register the tracking number once. Easyship then tracks it for you.
Scope: public.track_3p:read / :write (advanced; ask your account manager)
https://public-api.easyship.com/2024-09Track Easyship shipments
| Query parameter | Use it to |
|---|---|
easyship_shipment_id | Get one shipment |
platform_order_number | Look up by your order number |
include_checkpoints=true | Include the full event history |
Track shipments from other providers
- Check that the courier is supported
You can filter by
umbrella_name(e.g.DHL) andorigin_country_alpha2.cURLcurl "https://public-api.easyship.com/2024-09/trackings/supported_couriers?umbrella_name=DHL&origin_country_alpha2=US" \ -H "Authorization: Bearer $EASYSHIP_TOKEN"Response{ "courier_services": [ { "id": "137a79e8-ae1c-4369-9855-44cf8ff784c4", "name": "DHL Express", "umbrella_name": "DHL", "origin_country_alpha2": "US" } ] }Pass the
idyou get back ascourier_service_idin the next step.Courier not in that list? If Easyship doesn't generate labels for the courier, sendcourier_service_nameinstead ofcourier_service_id. Get the exact name fromGET /trackings/external_courier_services. - Register the tracking numbercURLcurl -X POST https://public-api.easyship.com/2024-09/trackings \ -H "Authorization: Bearer $EASYSHIP_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "tracking_number": "0114827", "courier_service_id": "137a79e8-ae1c-4369-9855-44cf8ff784c4", "platform_order_number": "ORDER-1001", "origin_address_id": "01563646-58c1-4607-8fe0-cae3e33c0001", "destination_address": { "line_1": "123 Test Street", "city": "Singapore", "state": "Singapore", "postal_code": "247964", "country_alpha2": "SG", "contact_name": "Foo Bar", "contact_phone": "+65 6910 1185", "contact_email": "[email protected]" }, "items": [{ "description": "iPhone", "quantity": 1 }] }'
Field Notes tracking_numberRequired. The courier's tracking number courier_service_idorcourier_service_nameOne is required: the ID from step 1, or the name from /trackings/external_courier_servicesplatform_order_numberYour order number. It makes it easy to match webhooks to orders origin_address_idororigin_addressA saved address ID, or the full address destination_addressThe full delivery address itemsdescriptionandquantity - Check statuscURL# One tracking curl https://public-api.easyship.com/2024-09/trackings/{tracking_id} \ -H "Authorization: Bearer $EASYSHIP_TOKEN" # Many, filtered (origin_country_alpha2, destination_country_alpha2, source=easyship|external, tracking_state) curl "https://public-api.easyship.com/2024-09/trackings?tracking_state=active" \ -H "Authorization: Bearer $EASYSHIP_TOKEN"
Each tracking in the response has two status fields:
status: the latest courier status in plain words, e.g. In Transit or Delivered. Show this to your users.tracking_state: the state of Easyship's tracking for this number. Use it to filter, e.g.?tracking_state=active.
Each tracking also includes
eta_dateand atracking_page_url.tracking_stateMeaning active Easyship is tracking the number and recording courier updates. Trackings created with POST /trackingsstart here.completed The courier reported a final event (e.g. delivered). No more updates. pending Multi-leg shipments only: a later leg that is waiting for the previous leg to complete. It becomes activeautomatically.created Registered but tracking hasn't started yet. Rarely seen through the API. overwritten_by_admin Replaced or switched off by Easyship, e.g. after a tracking number correction. No longer updated.
Get updates by webhook
Every poll counts against your API rate limits. In production, subscribe to these events with the Webhooks API instead:
| Event | Fires when |
|---|---|
shipment_tracking_status_changed | The overall status changes, e.g. in transit → delivered |
shipment_tracking_checkpoints_created | The courier reports a new event |
FAQ and testing
status changed when my tracking is active?POST /trackings return an error about the courier?courier_service_id from step 1 or an exact courier_service_name from /trackings/external_courier_services.Updated 9 days ago
