Panvaya Tracking API
A metered REST API for real-time ocean container and air cargo tracking. Authenticate with an API key, call one endpoint, and get normalized status, milestones, and ETAs across carriers.
API key auth
Simple X-API-Key header.
Sandbox mode
Free mock data to build against.
Overview
All endpoints are served under a single base URL and return JSON. Every request must include your API key in the X-API-Key header. There are two environments, selected by which key you use: live keys return real tracking data and consume your quota; sandbox keys return deterministic mock data for free.
https://api.panvaya.com/api/v1Authentication
Create a key from your dashboard under API & Integration. The full key is shown once at creation, so store it securely. Pass it on every request:
X-API-Key: pv_live_your_key_hereLive keys are prefixed pv_live_ and sandbox keys pv_test_. You may also send the key as Authorization: Bearer <key>.
Quota & billing
API usage is metered against your organization's monthly allotment. You are charged one call per successful live lookup that returns tracking data. Lookups that return 404 NOT_FOUND are never billed, and sandbox calls are always free. Track your consumption on the Integration page. When the allotment is spent, requests return 402 QUOTA_EXCEEDED until the window resets or the limit is raised.
Track a container
/track/oceanLook up an ocean container by its ISO 6346 number.
| Field | Type | Required | Description |
|---|---|---|---|
| containerNumber | string | Yes | Container number, e.g. MSCU1234567. |
| carrierId | integer | No | Optional carrier id (see List carriers) to disambiguate. |
curl -X POST https://api.panvaya.com/api/v1/track/ocean \
-H "X-API-Key: pv_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"containerNumber": "MSCU1234567"}'Example response
{
"status": "IN_TRANSIT",
"shipmentType": "OCEAN",
"carrierCode": "MSCU",
"carrierName": "Panvaya",
"containerNo": "MSCU1234567",
"eta": "2026-07-21T09:00:00",
"ata": null,
"milestones": [
{
"event": "Loaded on vessel",
"location": "Rotterdam, NL",
"timestamp": "2026-07-02T14:20:00"
},
{
"event": "Vessel departed",
"location": "Rotterdam, NL",
"timestamp": "2026-07-02T22:10:00"
}
]
}Track an air waybill
/track/airLook up an air shipment by its air waybill (AWB) number.
| Field | Type | Required | Description |
|---|---|---|---|
| awbNumber | string | Yes | AWB number, with or without the 3-digit airline prefix. |
| carrierId | integer | No | Optional carrier id (see List carriers). |
curl -X POST https://api.panvaya.com/api/v1/track/air \
-H "X-API-Key: pv_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"awbNumber": "020-12345675"}'Example response
{
"status": "IN_TRANSIT",
"shipmentType": "AIR",
"airlineName": "Panvaya",
"flightNumber": "PV123",
"originAirport": "FRA",
"destinationAirport": "JFK",
"eta": "2026-07-08T18:30:00",
"milestones": [
{ "event": "Received", "location": "FRA", "timestamp": "2026-07-07T09:00:00" },
{ "event": "Departed", "location": "FRA", "timestamp": "2026-07-07T13:45:00" }
]
}List carriers
/carriers?mode=oceanReturns supported carriers and their Panvaya ids, for the optional carrierId parameter. Pass mode=ocean or mode=air.
curl "https://api.panvaya.com/api/v1/carriers?mode=ocean" \
-H "X-API-Key: pv_live_your_key_here"Errors
Errors use a consistent envelope with a stable, machine-readable code. Branch on the code, not the message text.
{
"error": {
"code": "INVALID_REQUEST",
"message": "containerNumber is required."
}
}| Status | Code | Meaning |
|---|---|---|
| 400 | INVALID_REQUEST | A required parameter is missing or malformed. |
| 400 | CARRIER_NOT_SUPPORTED | The detected carrier is not supported for tracking. |
| 401 | MISSING_API_KEY | No API key was provided in the X-API-Key header. |
| 401 | INVALID_API_KEY | The provided key is not recognised. |
| 401 | KEY_REVOKED / KEY_EXPIRED | The key has been revoked or has expired. |
| 402 | QUOTA_EXCEEDED | Your monthly API allotment is spent. |
| 403 | API_ACCESS_DISABLED | API access is not enabled for your organization. |
| 404 | NOT_FOUND | No tracking data was found for the reference. |
| 429 | RATE_LIMIT_EXCEEDED | Per-minute rate limit exceeded. See Retry-After. |
| 502 | UPSTREAM_ERROR | The carrier data provider is temporarily unavailable. |
Sandbox mode
Create a sandbox key (prefixed pv_test_) to build and test your integration without spending quota. Sandbox requests hit the same endpoints and return the same response shape, populated with deterministic mock data. Switch to a live key when you are ready for real tracking.
Ready to integrate? Generate your keys or talk to our team about volume pricing.
Start building with the Panvaya API
Enable API access from your dashboard and generate a sandbox key in seconds.
Get API access