Skip to content

Public Tracking

Use Public Tracking when a customer-facing service needs the current, customer-safe status for one shipment. The endpoint is anonymous, but accepts only the shipment tracking_number; package scan codes and internal IDs are not substitutes.

Request contract

MethodURLUse it when
GEThttps://mexpress.nz/api/v1/public/tracking/{tracking_number}/You need the status projection.
HEADhttps://mexpress.nz/api/v1/public/tracking/{tracking_number}/You need only the status and headers.

HEAD has the same existence and rate-limit behaviour as GET, but does not return a response body. Use it only when the body would not be consumed.

Before you call it

Use the production API host above—not docs.mexpress.nz—and encode the tracking number as a path segment in your HTTP client.

bash
curl --fail-with-body \
  'https://mexpress.nz/api/v1/public/tracking/MX123456789/'
bash
curl --head \
  'https://mexpress.nz/api/v1/public/tracking/MX123456789/'

Read the 200 projection

The shape below is a contract example. Values are illustrative, not test data to hard-code.

json
{
  "tracking_number": "MX123456789",
  "status": "out_for_delivery",
  "milestone": "out_for_delivery",
  "reason": null,
  "status_label": "Out for delivery",
  "package_count": 1,
  "package_summary": { "out_for_delivery": 1 },
  "projection_revision": 7,
  "occurred_at": "2026-08-02T01:15:00.000000Z",
  "timeline": [{
    "status": "out_for_delivery",
    "label": "Out for delivery",
    "occurred_at": "2026-08-02T01:15:00.000000Z"
  }]
}
FieldHow to use it
tracking_numberConfirm the shipment displayed to the customer.
status, status_labelPresent the current customer-safe state.
milestone, reasonAdd context only when present.
package_count, package_summaryDescribe the package state at a summary level.
occurred_at, timelineRender customer-visible chronology.
projection_revisionDetect a changed projection in your own cache or UI.

Present returned labels and timeline as a customer experience, not an operational screen. The response never contains recipient contact or address data, package scan codes, POD media, precise location, driver/device identity, billing data, raw scan evidence, or internal fields.

Failures, rate limits, and safe polling

StatusMeaningYour handling
404Unknown or not publicly visible.Show one neutral unavailable result; do not infer or expose the reason.
429The anonymous request is rate limited.Read the positive Retry-After value and wait at least that long.

Steady-state limits are 5 requests/second per source IP with a burst of 30. A shared service limit is also applied. For 429, wait for Retry-After, then use exponential backoff with jitter; never use a tight retry loop or treat rate limiting as proof that a tracking number exists.

Poll only when a customer experience needs a refresh. A conservative default is at most once per minute for the same tracking number. Use Webhooks when your backend needs delivery-driven updates instead of frequent polling.

Verification checklist

  • [ ] GET displays only documented safe projection fields.
  • [ ] HEAD is used only when no response body is needed.
  • [ ] 404 has one neutral customer-facing treatment.
  • [ ] 429 honours a positive Retry-After before any retry.
  • [ ] Polling has backoff, jitter, and no tight loop.

Next step

Use Webhooks when your system should receive delivery changes as they occur.

M Express server-to-server integration guide