Air Tracking
Push complete, standardized air cargo tracking events into your TMS, ERP, data warehouse, or customer experience through one API. Air Tracking extends the Vizion visibility platform with purpose-built airline and forwarder data.
Connection detailsBase URL:
https://air-prod.vizionapi.comAuthentication:
X-API-Keyheader on every requestInteractive docs: https://air-prod.vizionapi.com/docs
Key capabilities
| Capability | Detail |
|---|---|
| Connections | 22 airlines + 7 forwarders |
| HAWB + MAWB linking | Register a house waybill and Vizion auto-discovers the underlying master waybill, merging both into one chronological timeline |
| Airport coverage | 7,883 airports with canonical IATA codes and enriched locations |
| Polling frequency | Every active shipment checked at least hourly |
Quick start
Set your environment variables, then follow the five requests below to go from API key to live shipment.
export BASE_URL="https://air-prod.vizionapi.com"
export VIZION_API_KEY="<your-api-key>"1. Create a webhook
curl -sS -X POST "$BASE_URL/v1/webhooks" \
-H "X-API-Key: $VIZION_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/hooks/air",
"events": "[*]"
}'- Required:
url - Optional:
events[],filter_awbs[],filter_carriers[] - The response includes the webhook
idand an HMAC-SHA256secretfor verifying deliveries. "events": "[*]"subscribes to all event types.
2. Test the webhook
curl -sS -X POST "$BASE_URL/v1/webhooks/$WEBHOOK_ID/test" \
-H "X-API-Key: $VIZION_API_KEY"A 200 response confirms a sample payload was sent to your endpoint.
3. List providers
curl -sS "$BASE_URL/v1/providers?kind=forwarder" \
-H "X-API-Key: $VIZION_API_KEY"Filter by kind=carrier or kind=forwarder. Results include code, name, kind, IATA prefix, polling interval, and active state.
4. Register a shipment
curl -sS -X POST "$BASE_URL/v1/shipments" \
-H "X-API-Key: $VIZION_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"awb": "BKK00011771",
"forwarder": "KWE"
}'- Required:
awb - HAWBs require
forwarderunlesslinked_mawbs[]is supplied. - MAWBs are auto-routed by AWB prefix -- no carrier code needed.
- Returns
201for a new registration. Safe to retry; a duplicate returns the sameidwith200.
5. Fetch shipment details
curl -sS "$BASE_URL/v1/shipments/$SHIPMENT_ID" \
-H "X-API-Key: $VIZION_API_KEY"The response contains the enriched origin/destination, status, pieces, weight, estimated delivery, polling state, linked waybills, and the canonical event history.
API reference
Shipments
| Method | Endpoint | Codes | Description |
|---|---|---|---|
POST | /v1/shipments | 201 / 200, 400 | Register shipment. Body: awb (required), forwarder, linked_mawbs[]. Returns id, AWB type, provider, status, and tracking links. Safe to retry. |
GET | /v1/shipments | 200, 400 | Search shipments. At least one filter required: awb, forwarder, status, active. Supports limit (1--100) and offset. |
GET | /v1/shipments/{id} | 200, 400 / 404 | Get shipment details. Returns enriched route, status, pieces/weight, ETA, polling state, linked waybills, and canonical event history. |
DELETE | /v1/shipments/{id} | 200, 400 / 404 | Stop tracking. Data is retained; the polling worker stops. |
Providers
| Method | Endpoint | Codes | Description |
|---|---|---|---|
GET | /v1/providers | 200 | List providers. Optional kind=carrier|forwarder. Returns code, name, kind, IATA prefix, adapter, poll interval, and active flag. |
Webhooks
| Method | Endpoint | Codes | Description |
|---|---|---|---|
POST | /v1/webhooks | 200 | Register webhook. Body: url (required), optional events[], AWB and carrier filters. Returns registration result with HMAC-SHA256 secret. |
POST | /v1/webhooks/{id}/test | 200 | Send test delivery. Sends a sample payload to the registered URL. |
GET | /v1/webhooks/{id} | 200 | Get webhook. Returns webhook configuration details. |
PATCH | /v1/webhooks/{id} | 200 | Update webhook. Partial update: any of url, events[], filters, is_active. |
GET | /v1/webhooks/{id}/deliveries | 200 | Get delivery log. Returns last 100 delivery attempts. Optional status filter. |
DELETE | /v1/webhooks/{id} | 200 | Deactivate webhook. Disables the webhook without deleting it. |
Webhook events
| Event | Description |
|---|---|
shipment.created | A new shipment was registered |
shipment.status_changed | Shipment status updated (default subscription) |
shipment.delivered | Shipment delivered to consignee |
shipment.delayed | Shipment is delayed |
shipment.timeline_changed | Events were added or modified in the timeline |
shipment.deactivated | Tracking was stopped |
* | Wildcard -- subscribe to all events |
Canonical event codes
These codes standardize operational milestones across all air cargo providers. Each event includes the event_code, a canonical status, UTC timestamp, enriched location, flight_number, pieces, weight, and source waybill.
Booking, receipt, and movement
| Code | Description |
|---|---|
BKD | Booked for transport |
RCD | Consignment received |
RCS | Received from shipper |
MAN | Manifested on the flight |
PRE | Prepared for loading on the flight |
AWR | Documentation received at this location |
FOH | Freight on hand |
FWB | Freight Waybill processed |
DEP | Departed |
TFD | Transferred to another airline |
RCT | Received from another airline |
Transfer, arrival, and release
| Code | Description |
|---|---|
TRM | Consignment to be transferred to another airline |
RFF | Removed from flight |
RCF | Received from flight |
ARR | Arrived at destination |
NFD | Consignee notified of the arrival |
AWD | Documentation delivered to the consignee |
CCD | Consignment cleared by Customs |
DLV | Delivered to the consignee |
DIS | Discrepancy details |
TGC | Transferred to Customs/Government control |
Sample response
A delivered MAWB shipment (Cargolux, CGO to FRA via LUX):
{
"id": "0f1a9932-2ba8-4688-9435-45b6af79b392",
"awb": "172-03592853",
"awb_type": "mawb",
"origin": {
"iata_code": "CGO"
},
"destination": {
"iata_code": "FRA"
},
"status": "delivered",
"pieces": 10,
"weight_kg": "656.00",
"events": [
{
"timestamp": "2026-02-11T10:32:36.000Z",
"status": "received",
"event_code": "FOH",
"description": "Freight on hand at origin",
"location": { "iata_code": "CGO" },
"flight_number": null
},
{
"timestamp": "2026-02-11T18:41:00.000Z",
"status": "departed",
"event_code": "DEP",
"description": "Departed from origin",
"location": { "iata_code": "CGO" },
"flight_number": "CV9733"
},
{
"timestamp": "2026-02-12T09:47:00.000Z",
"status": "arrived",
"event_code": "ARR",
"description": "Arrived at transfer station",
"location": { "iata_code": "LUX" },
"flight_number": "CV9733"
},
{
"timestamp": "2026-02-12T17:29:00.000Z",
"status": "departed",
"event_code": "DEP",
"description": "Departed from transfer station",
"location": { "iata_code": "LUX" },
"flight_number": "CV0007S"
},
{
"timestamp": "2026-02-13T00:53:00.000Z",
"status": "arrived",
"event_code": "ARR",
"description": "Arrived at destination",
"location": { "iata_code": "FRA" },
"flight_number": "CV0007S"
},
{
"timestamp": "2026-02-15T21:29:00.000Z",
"status": "delivered",
"event_code": "DLV",
"description": "Delivered to the consignee at destination",
"location": { "iata_code": "FRA" },
"flight_number": "CV0007S"
}
]
}Carrier coverage
Airlines (MAWB tracking)
| Airline | IATA | AWB prefix | Events | Flight no. | Pieces/weight | Customs |
|---|---|---|---|---|---|---|
| Lufthansa Cargo | LH | 020 | Yes | Yes | Yes | Yes |
| American Airlines Cargo | AA | 001 | Yes | Yes | Yes | Yes |
| Delta Cargo | DL | 006 | Yes | Yes | Yes | Yes |
| United Cargo | UA | 016, 107, 215 | Yes | Yes | Yes | Yes |
| AFKL Cargo (Air France-KLM) | AF | 057, 074 | Yes | Yes | Yes | Yes |
| Saudia Cargo | SV | 065 | Yes | Yes | Yes | Yes |
| China Cargo Airlines | CK | 112 | Yes | Yes | Yes | Yes |
| IAG Cargo (BA) | BA | 125, 106, 145 | Yes | Yes | Yes | Yes |
| Cathay Pacific Cargo | CX | 160 | Yes | Yes | Yes | Yes |
| Cargolux | CV | 172 | Yes | Yes | Yes | Yes |
| Emirates SkyCargo | EK | 176 | Yes | Yes | Yes | Yes |
| Thai Airways Cargo | TG | 217 | Yes | Yes | Yes | -- |
| MASkargo (Malaysia Airlines) | MH | 232 | Yes | Yes | Yes | Yes |
| Atlas Air | 5Y | 233, 369 | Yes | Yes | Yes | Yes |
| Turkish Cargo | TK | 235 | Yes | Yes | Yes | Yes |
| China Airlines Cargo | CI | 297 | Yes | Yes | Yes | -- |
| Silk Way West Airlines | 7L | 501 | Yes | Yes | Yes | Yes |
| Etihad Cargo | EY | 607 | Yes | Yes | Yes | Yes |
| Singapore Airlines Cargo | SQ | 618 | Yes | Yes | Yes | -- |
| EVA Air Cargo | BR | 695 | Yes | Yes | Yes | Yes |
| Amerijet International | M8 | 810 | Yes | Yes | Yes | Yes |
Forwarders (HAWB tracking)
| Forwarder | Code | Events | Pieces/weight | Customs | MAWB auto-discovery |
|---|---|---|---|---|---|
| Apex Logistics | APEX | Yes | Yes | Yes | Yes |
| DB Schenker / DSV | SCHENKER | Yes | Yes | Yes | -- |
| DHL Global Forwarding | DHLGF | Yes | Yes | Yes | Yes |
| Expeditors International | EXPEDITORS | Yes | Yes | Yes | -- |
| Gati-KWE | GATIKWE | Yes | Yes | Yes | -- |
| Geodis | GEODIS | Yes | Yes | Yes | Yes |
| Kintetsu World Express | KWE | Yes | Yes | Yes | -- |
| TNT Express / FedEx | TNTFEDEX | Yes | Yes | Yes | -- |
Updated 4 days ago