Resources

Trackers

Read the latest carrier scan, fetch the full event history, and subscribe to delivery + exception events. Tracking is automatically attached to every label we purchase — no separate subscribe step required.

How trackers attach

When you call /labels/create, we automatically register a tracker with the carrier using the label's tracking number. Every subsequent carrier scan fires a webhook from the carrier to our infrastructure, which we relay to your registered webhook endpoint and persist to the tracker's event history. You never have to call a "subscribe" endpoint separately.

Tracker id === label id

Trackers and labels share the same id. Use the label id you got back from /labels/create to fetch tracker state — there is no separate trackerId.

Get a tracker

GET/api/v1/labels/{id}/trackerScope: read:shipments

Latest tracking event + a list of all events received so far, newest first.

Response (200 OK)

  • idstring
    Same as the label id.
  • trackingNumberstring
    Carrier tracking number.
  • carrierstring
    USPS / UPS / FedEx / DHL.
  • statusstring
    Normalised tracker status — one of pre_transit, in_transit, out_for_delivery, delivered, exception, return_to_sender, unknown.
  • estDeliveryDatestring | null
    Carrier's current best estimate as a UTC calendar day, formatted YYYY-MM-DD(no time component). Updates as the shipment progresses; null when the carrier hasn't computed one. The other date fields on this endpoint (occurredAt, etc.) use full ISO-8601 timestamps with timezone.
  • eventsarray
    Tracking events newest first. Each event: { status, statusDetail, message, occurredAt, location: { city, state, country, zip } }.
JSON
{
  "id": "lbl_CCC...",
  "trackingNumber": "9405511...",
  "carrier": "USPS",
  "status": "in_transit",
  "estDeliveryDate": "2026-06-29",
  "events": [
    {
      "status": "in_transit",
      "statusDetail": "Arrived at USPS Regional Facility",
      "message": "Arrived at USPS Regional Origin Facility",
      "occurredAt": "2026-06-26T19:14:00Z",
      "location": { "city": "San Francisco", "state": "CA", "country": "US", "zip": "94110" }
    },
    {
      "status": "pre_transit",
      "statusDetail": "Shipping Label Created",
      "message": "Shipping Label Created, USPS Awaiting Item",
      "occurredAt": "2026-06-26T12:14:00Z",
      "location": null
    }
  ]
}

Public tracking page

Every label gets a public, no-auth tracking page at shiponline.app/track/<trackingNumber>. Pass this URL to your customer in your shipping confirmation email — it shows the same data as the API tracker, plus your branding if you're on a Pro plan with branded tracking configured.

Subscribe to events

Most production integrations subscribe to tracking events via webhooks rather than polling. The relevant event types are:

  • tracker.updated — fires on every new scan.
  • shipment.delivered — fires once, when delivery is confirmed.
  • shipment.exception — fires when the carrier flags a problem.
  • shipment.return_to_sender — fires when the carrier marks the package as returning.

See Webhooks for subscription + signature verification.

Stuck or shipping production?

We read every developer email.

API questions, OAuth quirks, custom-flow integration help — email support@shiponline.app and a human replies, usually within a few hours.

  • No card to start
  • Labels in 60 seconds
  • Up to 70% off retail