Integration
Tracking API
A read-only HTTP API that returns the current status and movement history of a shipment. Intended for tracking aggregators and marketplace integrations.
Tracking number format
| Pattern | ^ASL[0-9]{11}$ |
|---|---|
| Structure | ASL + 10 digits + 1 check digit |
| Length | 14 characters |
| Check digit | Luhn (mod 10), computed over the 10 digits that precede it |
| Example | ASL48271930652 |
The check digit makes the format self-validating, so an invalid number can be rejected before any lookup. Numbers are randomly allocated, not sequential.
Endpoint
GET https://asltrack.com/api/v1/track/{tracking_number}
A query form is also accepted, which some clients find easier to template:
GET https://asltrack.com/api/v1/track?n={tracking_number}
Authentication
None is required — a tracking number is the only credential, as with any
carrier. Integration partners are issued a key to send as an
x-api-key header, which exempts them from the rate limit
described below.
Response
200 — shipment found
{
"found": true,
"carrier": "ASLTrack",
"tracking_number": "ASL48271930652",
"status": "in_transit",
"estimated_delivery": "Arriving tomorrow",
"origin": "AUBURN, WA",
"destination": "ERIE, PA",
"destination_country": "US",
"last_event_at": "2026-09-20T10:31:00.000Z",
"delivered_at": null,
"events": [
{
"occurred_at": "2026-09-20T10:31:00.000Z",
"status": "out_for_delivery",
"description": "Out for delivery",
"location": "ERIE, PA"
},
{
"occurred_at": "2026-09-20T04:22:00.000Z",
"status": "in_transit",
"description": "Arrived at sorting facility",
"location": "ERIE, PA"
}
]
}
Events are ordered newest first and capped at 50. Timestamps are ISO 8601
in UTC. location is city and state only, and is
null when a precise enough location is not available.
404 — not found
{ "found": false, "carrier": "ASLTrack" }
A malformed number and an unknown number return the same status and the same body. The two are deliberately not distinguished, so a client cannot use the response to discover which numbers are in use. Validate the format yourself before calling if you need to tell the difference — the pattern above is all that is required.
Other statuses
429 | Rate limit reached. Retry after the window, or send a partner key. |
|---|---|
503 | Temporarily unavailable. Safe to retry with backoff. |
405 | Method not allowed. Only GET is supported. |
Status values
info_received | Shipping label created; the parcel has not moved yet |
|---|---|
in_transit | Moving through the network |
out_for_delivery | With the delivery driver |
delivered | Delivered to the address |
exception | A delivery attempt did not succeed |
The same vocabulary is used for the shipment-level status and
for each event's status. Shipment status only moves forward; it
never regresses to an earlier stage.
Rate limits
- Successful lookups are not counted.
- Repeated lookups that find nothing are counted per IP address, with a default allowance of 30 in 5 minutes.
- Requests carrying a valid partner key are exempt.
The limit exists to make number-space scanning impractical, not to restrict legitimate polling.
Caching
Responses for delivered shipments may be cached for up to an hour; a
shipment still in transit may be cached for one minute. The
Cache-Control header on each response states which applies.
Integration support
For partner keys, sample live tracking numbers, or a webhook-based feed instead of polling, see the contact page.