Track an air waybill
One 11-digit AWB in; status, route, flights, pieces and weight out, with Cargo-IMP milestones normalised to a single timeline.
Path parameters
Air waybill, any format. The 3-digit prefix identifies the airline.
Response schema
118 fields
Nested exactly as the JSON is. Open a branch to read its fields; hover a name for the full dot-path.
data
The payload. Everything an endpoint returns sits under this key.
Air waybill number.
The three-digit prefix half of the AWB, which is what identifies the issuing airline.
Airline 2-letter IATA code.
Airline name.
Current normalised status of the shipment. Ocean lifecycle order: discharged, available, delivered, returned_empty. Two values end a shipment, delivered and returned_empty, and returned_empty outranks delivered.
Origin code (airport IATA or UN/LOCODE).
Origin port name, falling back to its UN/LOCODE.
origin_location
The origin airport in full: both codes, the city, the country and its coordinate. Null when the airline named a station we could not resolve.
Three-letter IATA airport code, which is the code an AWB and a flight number are quoted against.
Four-letter ICAO airport code, for systems that speak ICAO. Null when we hold none.
Human-readable name.
City the airport serves.
Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.
Country name.
ISO 3166-1 alpha-2 country code.
Latitude.
Longitude.
IANA time zone of the place. Null when we could not resolve the port.
Destination code (airport IATA or UN/LOCODE).
Destination port name, falling back to its UN/LOCODE.
destination_location
The destination airport in full, on the same terms.
Three-letter IATA airport code, which is the code an AWB and a flight number are quoted against.
Four-letter ICAO airport code, for systems that speak ICAO. Null when we hold none.
Human-readable name.
City the airport serves.
Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.
Country name.
ISO 3166-1 alpha-2 country code.
Latitude.
Longitude.
IANA time zone of the place. Null when we could not resolve the port.
Number of pieces.
Gross weight in kilograms.
Operating flight number.
departure
Departure of the consignment as a pair: the estimate and the actual. Read `actual` before treating a flight as flown.
Planned departure (ISO 8601). It stays populated after the actual lands, so schedule and outcome can be compared.
Real departure (ISO 8601), or null while the leg is unflown. This is the field that says a flight went.
arrival
Arrival of the consignment as the same pair.
Planned arrival (ISO 8601), kept alongside the actual.
Real arrival (ISO 8601), or null until the consignment is on the ground at that airport.
Arrival time (ISO 8601). Null when the carrier publishes none and we cannot predict one.
True when arrival is confirmed rather than estimated.
Milestone timeline, oldest to newest.
events[]
The Cargo-IMP status code the airline filed, for example FOH and RCS on acceptance, DEP and ARR in flight, RCF on transfer, NFD on notification, DLV on delivery. UNKNOWN when the airline sent a code we do not recognise, never a guess.
Our grouping of that code: ACCEPTANCE, FLIGHT, CUSTOMS or DELIVERY. FLIGHT is the fallback for a code with no family of its own.
True when the event happened. False means planned or estimated.
Event timestamp (ISO 8601), or null when the carrier gave none.
datetimes
The event as a pair: the estimate and the actual. The flat `datetime` next to it is whichever of the two is the more definite.
When the event was planned for. Null when the airline filed no estimate.
When the event actually happened. Null on a planned event, which is how the two are told apart.
Airport station code.
The airport this event happened at, by name.
location
UN/LOCODE for the event, or null when the carrier gave no place.
Three-letter IATA airport code, which is the code an AWB and a flight number are quoted against.
Four-letter ICAO airport code, for systems that speak ICAO. Null when we hold none.
Human-readable name.
City the airport serves.
Why the field stands where it does: resolved, contract_required, not_published, not_applicable or awaiting_carrier.
Country name.
ISO 3166-1 alpha-2 country code.
Latitude.
Longitude.
IANA time zone of the place. Null when we could not resolve the port.
Operating flight number.
Number of pieces.
Gross weight in kilograms.
The carrier own phrasing for the event, falling back to our word for the code.
The AWB broken into flown and planned legs, in order, each with its own airports, flight and times.
routes[]
Position of the leg on the waybill, starting at 1.
Where the leg stands, for example ARRIVED or DEPARTED. Read it before reading its times.
What carries the leg: PLANE, or TRUCK on a road feeder segment, which is normal on European AWBs. Null when the airline did not say.
from
Airport the leg leaves.
Three-letter IATA airport code, which is the code an AWB and a flight number are quoted against.
Four-letter ICAO airport code, for systems that speak ICAO. Null when we hold none.
Human-readable name.
City the airport serves.
State, province or region of the port, when the gazetteer holds one.
Country name.
ISO 3166-1 alpha-2 country code.
Latitude.
Longitude.
IANA time zone of the place. Null when we could not resolve the port.
to
Airport the leg reaches.
Three-letter IATA airport code, which is the code an AWB and a flight number are quoted against.
Four-letter ICAO airport code, for systems that speak ICAO. Null when we hold none.
Human-readable name.
City the airport serves.
State, province or region of the port, when the gazetteer holds one.
Country name.
ISO 3166-1 alpha-2 country code.
Latitude.
Longitude.
IANA time zone of the place. Null when we could not resolve the port.
departure
Departure of the consignment as a pair: the estimate and the actual. Read `actual` before treating a flight as flown.
Planned departure (ISO 8601). It stays populated after the actual lands, so schedule and outcome can be compared.
Real departure (ISO 8601), or null while the leg is unflown. This is the field that says a flight went.
arrival
Arrival of the consignment as the same pair.
Planned arrival (ISO 8601), kept alongside the actual.
Real arrival (ISO 8601), or null until the consignment is on the ground at that airport.
Operating flight number.
Number of pieces.
Gross weight in kilograms.
The drawn geometry of the leg as lat and lng pairs. Empty on an inland leg, where we do not draw a line we cannot verify.
metadata
Everything about the ANSWER rather than the shipment: what resolved, where it came from, how fresh it is, and what it cost you.
The upstream status for the lookup itself, OK on a normal answer. It describes the ANSWER, not the shipment.
airline
The issuing airline resolved from the AWB prefix, with its codes and its own tracking site.
Human-readable name.
3-digit AWB prefix.
Three-letter IATA airport code, which is the code an AWB and a flight number are quoted against.
Four-letter ICAO airport code, for systems that speak ICAO. Null when we hold none.
Where we POST the events.
When the record itself last changed in our database, which includes bookkeeping writes. For "when did we last learn something about the shipment", read last_updated_at.
True when this answer came from our cache rather than a fresh airline call. The data is still ours and still stamped: read updated_at for how old it is.
When the cached answer stops being served and the next call goes to the airline.
error
Present INSTEAD of data when the lookup failed. The two never appear together, so branch on which key you got.
Machine-readable failure code. `not_found` means the airline has no data for that AWB, which is not the same as the AWB being invalid.
What went wrong, in one sentence, including which upstream said so.
curl 'https://api.aircargomcp.com/track/020-12345675' \
-H "Authorization: Bearer tmcp_YOUR_API_KEY"const res = await fetch("https://api.aircargomcp.com/track/020-12345675", {
headers: {
"Authorization": "Bearer tmcp_YOUR_API_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://api.aircargomcp.com/track/020-12345675",
headers={"Authorization": "Bearer tmcp_YOUR_API_KEY"},
)
data = res.json() {
"data": {
"awb": "020-12345675",
"airline_prefix": "020",
"airline_iata": "LH",
"airline_name": "Lufthansa Cargo",
"status": "delivered",
"origin": "VCP",
"origin_name": "Viracopos International Airport",
"origin_location": {
"iata_code": "VCP",
"icao_code": "SBKP",
"name": "Viracopos International Airport",
"city": "Campinas",
"state": "São Paulo",
"country": "Brazil",
"country_code": "BR",
"lat": -23.0074005127,
"lng": -47.1344985962,
"timezone": "America/Sao_Paulo"
},
"destination": "BOM",
"destination_name": "Chhatrapati Shivaji International Airport",
"destination_location": {
"iata_code": "BOM",
"icao_code": "VABB",
"name": "Chhatrapati Shivaji International Airport",
"city": "Mumbai",
"state": "Maharashtra",
"country": "India",
"country_code": "IN",
"lat": 19.0886993408,
"lng": 72.8678970337,
"timezone": "Asia/Kolkata"
},
"pieces": 3,
"weight_kg": 2790,
"flight_number": "LH8362",
"departure": {
"estimated": "2026-08-09T03:20:00.000Z",
"actual": "2026-08-09T04:18:01.000Z"
},
"arrival": {
"estimated": "2026-08-11T05:50:00.000Z",
"actual": "2026-08-11T05:34:00.000Z"
},
"eta": "2026-08-11T05:34:00.000Z",
"eta_is_actual": true,
"events": [
{
"status_code": "FOH",
"event_family": "ACCEPTANCE",
"is_actual": true,
"datetime": "2026-08-07T13:54:14.000Z",
"datetimes": {
"estimated": null,
"actual": "2026-08-07T13:54:14.000Z"
},
"station": "VCP",
"station_name": "Viracopos International Airport",
"location": {
"iata_code": "VCP",
"icao_code": "SBKP",
"name": "Viracopos International Airport",
"city": "Campinas",
"state": "São Paulo",
"country": "Brazil",
"country_code": "BR",
"lat": -23.0074005127,
"lng": -47.1344985962,
"timezone": "America/Sao_Paulo"
},
"flight_number": null,
"pieces": 3,
"weight_kg": 2790,
"description": "Freight on hand, 3 pcs / 2790 kg"
},
{
"status_code": "RCS",
"event_family": "ACCEPTANCE",
"is_actual": true,
"datetime": "2026-08-08T13:59:04.000Z",
"datetimes": {
"estimated": "2026-08-08T17:20:00.000Z",
"actual": "2026-08-08T13:59:04.000Z"
},
"station": "VCP",
"station_name": "Viracopos International Airport",
"location": {
"iata_code": "VCP",
"icao_code": "SBKP",
"name": "Viracopos International Airport",
"city": "Campinas",
"state": "São Paulo",
"country": "Brazil",
"country_code": "BR",
"lat": -23.0074005127,
"lng": -47.1344985962,
"timezone": "America/Sao_Paulo"
},
"flight_number": null,
"pieces": 3,
"weight_kg": 2790,
"description": "Received from shipper, 3 pcs / 2790 kg"
}
],
"routes": [
{
"order_id": 1,
"status": "ARRIVED",
"transport_type": "PLANE",
"from": {
"iata_code": "VCP",
"icao_code": "SBKP",
"name": "Viracopos International Airport",
"city": "Campinas",
"state": "São Paulo",
"country": "Brazil",
"country_code": "BR",
"lat": -23.0074005127,
"lng": -47.1344985962,
"timezone": "America/Sao_Paulo"
},
"to": {
"iata_code": "FRA",
"icao_code": "EDDF",
"name": "Frankfurt am Main International Airport",
"city": "Frankfurt am Main",
"state": "Hesse",
"country": "Germany",
"country_code": "DE",
"lat": 50.0264015198,
"lng": 8.543129921,
"timezone": "Europe/Berlin"
},
"departure": {
"estimated": "2026-08-09T03:20:00.000Z",
"actual": "2026-08-09T04:18:01.000Z"
},
"arrival": {
"estimated": "2026-08-09T20:00:00.000Z",
"actual": "2026-08-09T20:40:00.000Z"
},
"flight_number": "LH8263",
"pieces": 3,
"weight_kg": 2790,
"path": [
[
-23.0074005127,
-47.1344985962
],
[
-19.007,
-45.336
],
[
-16.007,
-43.964
]
]
}
],
"metadata": {
"status_code": "OK",
"airline": {
"name": "Lufthansa Cargo",
"prefix": "020",
"iata_code": "LH",
"icao_code": "GEC",
"url": "https://www.lufthansa-cargo.com"
},
"updated_at": "2026-08-19T17:29:55.000Z",
"from_cache": true,
"cache_expires": "2026-08-19T23:29:55.712Z"
}
}
}