How do I get tracking webhooks for UPS, FedEx and USPS?
One lastscanned webhook URL covers UPS, FedEx, USPS and every other carrier, 549 in all. Set it with PUT /v1/webhook, then POST /v1/watches. You get tracking.updated and watch.ended events, signed with HMAC-SHA256 in Lastscanned-Signature. These come from scheduled checks, not a real-time push from the carrier, and need no carrier account.
Try it
curl -X PUT https://api.lastscanned.com/v1/webhook \
-H "Authorization: Bearer lsk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/lastscanned"}'
# the response has your signing secret (whsec_...)curl -X POST https://api.lastscanned.com/v1/watches \
-H "Authorization: Bearer lsk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"trackingNumber": "1ZG2242W6822298280", "carrier": "ups", "metadata": {"order": "1042"}}'curl -X POST https://api.lastscanned.com/v1/watches \
-H "Authorization: Bearer lsk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"trackingNumber": "541270563758", "carrier": "fedex", "metadata": {"order": "1043"}}'curl -X POST https://api.lastscanned.com/v1/watches \
-H "Authorization: Bearer lsk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"trackingNumber": "YOUR_USPS_NUMBER", "carrier": "usps", "metadata": {"order": "1044"}}'{
"id": "evt_63e401d5f73a4c31ef8fa8d9",
"type": "tracking.updated",
"createdAt": "2026-10-27T18:20:36Z",
"data": {
"watch": { "id": "wat_109060ade9f9a48732117f7a", "trackingNumber": "541270563758", "carrier": "fedex", "metadata": { "order": "1043" } },
"previousStatus": "in_transit",
"result": { "carrier": "fedex", "status": "delivered", "...": "same shape as /v1/track" }
}
}Carrier webhooks compared with a lastscanned watch
| Option | How it works | Price | Notes |
|---|---|---|---|
| UPS Track Alert | Subscribe by tracking number or shipper account number, with your webhook URL and an OAuth token from a UPS developer app. | Through your UPS developer account | UPS only. UPS describes it as near real time. |
| FedEx Advanced Integrated Visibility webhook | Register on the FedEx Developer Portal, create an organization with an enterprise billing account and shipping accounts, then subscribe by account or tracking number. | Through your FedEx account | FedEx only. Covers U.S. and Canada domestic and U.S.-Canada international parcel services. |
| USPS tracking webhook | Open to shippers for their own Mailer ID, platforms with a shipper's merchant access token, and service providers under a signed agreement. | Through USPS; service providers pay a fee | USPS only. You must be authorized for the Mailer ID or tracking number. |
| lastscanned watches | PUT /v1/webhook once, then POST /v1/watches with tracking numbers from any shipper. | Watching counts as one unique number; re-checks are free. Pro: $4.99/mo for 1,000, then $0.015 each. | All 549 carriers in one event shape. Scheduled checks, so slower than a carrier's own push. |
Carrier webhook terms from UPS Track Alert API spec, FedEx webhook service description and USPS API access, read on November 9, 2026. They can change.
How often each watch is checked
| Status | Next check |
|---|---|
| out_for_delivery | 15 minutes |
| exception | 30 minutes |
| in_transit | 1 hour |
| label_created | 2 hours |
An event goes out when a scheduled check finds a change. It is not a live push from the carrier.
Details
Scheduled checks, not a carrier push
UPS, FedEx and USPS don't push anything to lastscanned. We re-check each watch on the schedule above and send your webhook when something changed, so an event can arrive up to one check interval after the scan.
When a carrier's own webhook is better
If you are the shipper, have the carrier account, and need the lowest delay on that one carrier, use the carrier's program. A watch suits numbers from any shipper, or several carriers behind one URL.
The sample numbers
The UPS and FedEx numbers above are real and already delivered, so their watches end on the first check. Watch an open number of your own to see updates arrive.
How a watch ends
A delivered or returned package ends with its last tracking.updated. watch.ended means the watch stopped without a final status: not_found after 14 days with no carrier record, or expired after 90 days.
FAQ
- Is there one webhook endpoint for UPS, FedEx and USPS?
- Yes. One URL set with PUT /v1/webhook receives events for every watched number, across UPS, FedEx, USPS and the rest of the 549 carriers.
- Are these webhooks real time?
- No. They come from scheduled checks: every 15 minutes out for delivery, 30 minutes on an exception, hourly in transit and every 2 hours at label created.
- Do I need a UPS, FedEx or USPS account?
- Not for lastscanned. The carriers' own programs each need a developer registration with that carrier, and FedEx and USPS tie access to your shipping account or Mailer ID.
- How do I verify the signature?
- Lastscanned-Signature carries t= and v1=. Compute HMAC-SHA256 of the timestamp, a dot and the raw body with your whsec_ secret, compare it with v1, and reject anything older than 5 minutes.
- Can I receive events in 17TRACK's format?
- Yes. Set the webhook format to 17track and the same events go out in 17TRACK's v2 shape.
- What does a webhook cost?
- Watching a number counts as one tracked number, and re-checks are free. Pro is $4.99/mo for 1,000 unique numbers, then $0.015 each.