Developers

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.

Base URL
https://api.panvaya.com/api/v1

Authentication

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:

Header
X-API-Key: pv_live_your_key_here

Live 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

POST/track/ocean

Look up an ocean container by its ISO 6346 number.

FieldTypeRequiredDescription
containerNumberstringYesContainer number, e.g. MSCU1234567.
carrierIdintegerNoOptional 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

200 OK
{
  "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

POST/track/air

Look up an air shipment by its air waybill (AWB) number.

FieldTypeRequiredDescription
awbNumberstringYesAWB number, with or without the 3-digit airline prefix.
carrierIdintegerNoOptional 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

200 OK
{
  "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

GET/carriers?mode=ocean

Returns supported carriers and their Panvaya ids, for the optional carrierId parameter. Pass mode=ocean or mode=air.

cURL
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.

400 Bad Request
{
  "error": {
    "code": "INVALID_REQUEST",
    "message": "containerNumber is required."
  }
}
StatusCodeMeaning
400INVALID_REQUESTA required parameter is missing or malformed.
400CARRIER_NOT_SUPPORTEDThe detected carrier is not supported for tracking.
401MISSING_API_KEYNo API key was provided in the X-API-Key header.
401INVALID_API_KEYThe provided key is not recognised.
401KEY_REVOKED / KEY_EXPIREDThe key has been revoked or has expired.
402QUOTA_EXCEEDEDYour monthly API allotment is spent.
403API_ACCESS_DISABLEDAPI access is not enabled for your organization.
404NOT_FOUNDNo tracking data was found for the reference.
429RATE_LIMIT_EXCEEDEDPer-minute rate limit exceeded. See Retry-After.
502UPSTREAM_ERRORThe 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