Panvaya Logistics API
A unified REST API for ocean container and air cargo tracking, multi-carrier sailing schedules, live vessel AIS coordinates, freight carbon and CBAM estimates, maritime ETS comparisons, port congestion, and sea distance & transit time.
pv_test_...) · 100 free trial credits · Zero card requiredSimple Auth
Pass key in X-API-Key header. Instant sandbox test keys.
Real-Time Tracking
Milestone events, vessel legs, and live AIS coordinates.
Supported Ocean Carriers
Maersk, MSC, CMA CGM, COSCO, Hapag-Lloyd, ONE, etc.
Success-Only Billing
100 free trial credits. 404s and errors are never billed.
Overview
The Panvaya REST API delivers normalized supply chain intelligence across global shipping lines. All endpoints return standard JSON payloads and are served under a single base URL.
https://api.panvaya.com/api/v1Quickstart: First request in 30 seconds
Get from zero to your first normalized tracking payload in 3 simple steps:
Get Your API Key
Sign in to your API Dashboard and generate a sandbox (pv_test_) or live (pv_live_) key.
Run Your First Call
Execute a test query using cURL, Node.js, or Python. All calls return structured, normalized JSON without carrier quirks.
Success-Only Billing
100 free credits are pre-loaded on every trial account. 404s and errors are never billed.
curl -X POST "https://api.panvaya.com/api/v1/track/ocean" \
-H "X-API-Key: pv_test_your_sandbox_key" \
-H "Content-Type: application/json" \
-d '{"container": "MSKU8094830"}'Open Maritime Standards & Data Hygiene
Panvaya is built strictly on open maritime, freight, and data exchange standards. Our API eliminates proprietary carrier payload fragmentation so your engineering team never writes carrier-specific parsers:
Ocean carrier milestones are transformed into canonical Digital Container Shipping Association (DCSA) event types (LOAD, DISC, DEPA, ARRI, GTIN, GTOT, STRP).
Every container query is verified against ISO 6346 and Bureau International des Containers (BIC) specifications (4-letter owner prefix + 6-digit serial + modulo-11 check digit) before routing to prevent invalid upstream queries.
All maritime origin, transshipment, and destination ports are mapped to authoritative 5-character United Nations LOCODEs (SGSIN, NLRTM, CNSHA) with validated coordinates.
Automated voyage greenhouse gas (GHG) calculations conform to Smart Freight Centre GLEC Framework v3.0 and ISO 14083:2023 for compliant Scope 3 corporate ESG disclosures.
Authentication
Authenticate your requests by including your API key in the X-API-Key header on every call.
X-API-Key: pv_live_your_key_here- • Live keys start with
pv_live_and are used in production environments. - • Sandbox keys start with
pv_test_and allow safe testing with the exact same API response contracts. - • You can also supply the token as standard Bearer:
Authorization: Bearer <key>.
Quota & pricing
Panvaya utilizes transparent, success-only metering. API calls that return an error or 404 NOT_FOUND are never charged.
Free Trial
100 Credits
Included on all free accounts
Standard Pricing
120 Credits
Per $1 USD pool balance
Per-Request Cost
1 – 5 Credits
Tracking (1), Schedules (1/carrier), Embed (5)
Check your remaining credit balance anytime via GET /api/v1/usage or in your API Dashboard.
Rate limits
API keys have a default token-bucket rate limit of 10 requests per minute with continuous token refill.
Every API response returns standard rate-limiting and correlation headers:
X-Request-Id: req_01928374abcd
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 9
Sending X-Request-Id with a request is optional. Panvaya generates one if omitted and returns it for support and log correlation.
If throttled, the API responds with HTTP 429 RATE_LIMIT_EXCEEDED and includes a Retry-After: <seconds> header.
Higher rate limits are available for enterprise accounts on request. Submit a request to unlock higher limits.
Embedded Tracking UI
Publish a Panvaya-hosted ocean tracker on your website using an iframe. Organization administrators configure widgets in Integrations → Web embedding, then copy the installation code. No secret API key is included.
Embedded Ocean Tracking is enabled by default. Its default price is 5 credits per successful search, including cache hits. API, webhook and embedded ocean tracking share the same distinct tracking-reference allowance. Failed searches and page views are unbilled.
Widgets default to an approved-reference allowlist. Open search lets visitors track any supported reference using your balance. Set exact allowed website origins and a daily credit budget. The hosted public page is enabled separately. An allowlist restricts searchable references; it does not authenticate individual visitors. The iframe URL is public and copyable. Website restrictions block unapproved browser frames, but do not authenticate custom HTTP clients.
<iframe src="https://panvaya.com/embed/YOUR_WIDGET_ID" title="Shipment tracking" style="width:100%;height:720px;border:0" loading="lazy" referrerpolicy="strict-origin"></iframe>For private customer access, enable Require private access and have your backend request a one-time, reference-scoped launch using an existing organization-admin API key. Approved references can also be added or removed through the API. Neither operation consumes tracking credits.
Automated Webhook Delivery
Eliminate polling loops with scheduled push deliveries.
Subscribe containers, Bills of Lading, or Bookings to recurring tracking runs from 5 minutes up to 30 days. Panvaya handles ocean carrier anti-bot bypasses, normalizes events to DCSA standards, and pushes HTTPS payloads to your receiver.
Sea Tracking
/track/oceanLook up ocean container status, milestone timeline, port pairs, vessel details, and live AIS coordinates. Supply either an ISO container number, Bill of Lading (BOL), or Booking reference.
| Field | Type | Required | Description |
|---|---|---|---|
| container | string | Conditional | ISO 6346 container number (e.g. MSKU8094830). May be combined with bol or bk. |
| bol | string | Conditional | Bill of Lading reference. Cannot be combined with bk. |
| bk | string | Conditional | Booking reference. Cannot be combined with bol. |
| shipping_line_scac | string | Optional | Carrier SCAC (e.g. MAEU, MSCU). Optional, bypasses auto-discovery. |
| include_route_data | boolean | Optional | Set true to include route polyline segments, live AIS vessel coordinates, and telematics (speed, course, heading, distance to go in NM). |
Understanding the Normalized Tracking Schema
To keep payloads compact and avoid duplicating lengthy port coordinates and vessel specifications across dozens of events, Panvaya returns ports and vessels in top-level arrays. Events link to them by ID:
event.location_id ➔ data.locations[]
Lookup by ID gives Port Name, Country, UN/LOCODE, Lat/Lng, and Timezone.
event.transport_id ➔ data.transports[]
Lookup by ID gives Vessel Name, IMO, MMSI, Call Sign, and Voyage number.
// Fast lookup maps
const locationMap = new Map(data.locations.map(loc => [loc.id, loc]));
const transportMap = new Map(data.transports.map(t => [t.id, t]));
// Enrich milestones with port and vessel details
const enrichedMilestones = container.events.map(event => ({
code: event.event_code,
milestone: event.event_name,
timestamp: event.event_time,
isActual: event.actual,
portName: locationMap.get(event.location_id)?.name,
unlocode: locationMap.get(event.location_id)?.locode,
vesselName: transportMap.get(event.transport_id)?.name,
voyage: transportMap.get(event.transport_id)?.voyage,
}));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 '{"container": "MSKU8094830", "include_route_data": true}'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 '{"bol": "MAEU123456789"}'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 '{"bk": "MAEU123456789"}'{ "status": "success", "data": { …Click to expand List carriers
/carriersReturns all active ocean shipping lines and their Standard Carrier Alpha Codes (SCAC). Pass the carrier SCAC code in shipping_line_scac during tracking to bypass automatic carrier discovery.
curl "https://api.panvaya.com/api/v1/carriers" \
-H "X-API-Key: pv_live_your_key_here"{ "mode": "ocean", "carriers": [ …Click to expand Air Cargo Tracking
/track/airTrack a full air waybill (AWB). Compact and formatted inputs resolve to the same canonical AWB. Air shares your API credit pool and distinct tracking allowance with Ocean. Each successful response uses the configured Air credit cost; repeated requests for an enrolled AWB do not use another distinct tracking unit in the same cycle. Failed requests are not billed.
| Field | Type | Required | Description |
|---|---|---|---|
| awb | string | Required | Full 11-digit AWB, for example 044-45428036. Compact input is also accepted. |
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 '{"awb": "044-45428036"}'The response contains canonical AWB and airline identity, origin and destination airports, planned and actual dates, pieces, weight, shipment status, flight legs, milestones, map route points and waypoints. Missing carrier values remain null. Airport-local dates are preserved.
Success returns the Air object directly, with camelCase field names and airport IATA codes. It does not use the Ocean containers, vessel or shipping-line schema. Errors use the shared errors envelope: 400 for invalid input or unsupported airlines, 404 for no tracking data, 402 for insufficient quota, and 502 UPSTREAM_UNAVAILABLE for airline outages.
{ "awbNumber": "044-45428036", "airlineId": 52, …Click to expand Cargo Airlines API
/airlinesReturns supported, available cargo airlines with their names and 3-digit Air Waybill (AWB) prefixes. Send the full AWB to /track/air; its prefix identifies the airline automatically. No separate airline code is needed. This directory requires an API key and is free to call, subject to rate limits.
curl "https://api.panvaya.com/api/v1/airlines" \
-H "X-API-Key: pv_live_your_key_here"{ "mode": "air", "airlines": [ …Click to expand Sailing Schedules
Search point-to-point departure and arrival schedules between any two UN/LOCODE ports across major ocean carriers with transit times, transshipments, and per-carrier execution statuses. Try sailing schedules
/schedules/searchSearch upcoming departures and arrivals between two UN/LOCODE ports. Returns normalized sailings alongside per-carrier execution statuses (FOUND, NO_SAILINGS, FILTERED, PARTIAL, TIMEOUT, FAILED) for transparent observability.
| Field | Type | Required | Description |
|---|---|---|---|
| origin | string | Required | Origin UN/LOCODE, e.g. CNSHA (Shanghai). |
| destination | string | Required | Destination UN/LOCODE, e.g. NLRTM (Rotterdam). |
| date | string | Optional | Earliest departure date in YYYY-MM-DD format. Defaults to today. |
| weeks | number | Optional | Forward search horizon in weeks (1 to 12). Defaults to 4. |
| carriers | array | Optional | Optional carrier filter by name or SCAC (e.g. ["MAEU"]). Omit to search all. |
curl -X POST "https://api.panvaya.com/api/v1/schedules/search" \
-H "X-API-Key: pv_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"origin":"CNSHA","destination":"NLRTM","date":"2025-09-01","weeks":8,"carriers":["MAEU"]}'{ "origin": { "name": "Shanghai", …Click to expand Reading this response
- Final ETA: arrival is the final destination ETA. If it is null, finalEtaStatus is NOT_PUBLISHED; an intermediate leg arrival is never substituted.
- Freshness: servedAt is this API response time. Each sailing's retrievedAt is Panvaya's carrier capture time and cached tells you whether that sailing came from cache. The top-level cached flag is true only when every successful carrier came from cache.
- Carrier timestamps: sourceUpdatedAt is currently null because no adapter has a verified schedule update time. sourceResultTimestamp is MSC's raw result-generation text, not a schedule update time.
CO2 Calculator
Calculate freight carbon emissions (GLEC Framework) between two ports or airports. Returns CO2e in kg and tonnes, car-km equivalents, and trees needed to offset. Try the carbon calculator
/carbon/calculateEstimate carbon emissions by origin, destination, cargo weight, and transport mode. Estimates are not certified emissions reports.
| Field | Type | Required | Description |
|---|---|---|---|
| origin | string | Required | Origin location as UN/LOCODE, e.g. NLRTM (Rotterdam), CNSHA (Shanghai). |
| destination | string | Required | Destination location as UN/LOCODE, e.g. SGSIN (Singapore), USNYC (New York). |
| weightKg | number | Required | Total cargo weight in kilograms. |
| mode | string | Required | Transport mode: "ocean" or "air". |
curl -X POST "https://api.panvaya.com/api/v1/carbon/calculate" \
-H "X-API-Key: pv_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"origin": "NLRTM", "destination": "SGSIN", "weightKg": 18000, "mode": "ocean"}'{ "origin": { "name": "Shanghai", …Click to expand CBAM & Maritime ETS Calculator API
Estimate embedded product emissions and maritime ETS costs. Uses CARBON_CALCULATOR credits on success. Standalone calculations are read-only; reference factors are planning values, not certified defaults or tax calculations. Responses contain no internal database IDs; API report URLs are null. Downloads use authenticated web endpoints. Try the public CBAM calculator
/carbon/cbamReturns product emissions, nullable freight emissions and a separate EUR maritime ETS comparison. Unknown commodities, ambiguous HS codes, invalid ports and non-EUR invoices return 400. Unknown or foreign shipment references return 404; multiple matches require a public UUID. Missing route data stays null. The illustrative allowance price is EUR 70/t; estimates do not verify carrier invoices.
| Field | Type | Required | Description |
|---|---|---|---|
| cnCode | string | Required | 8-digit CN code; hsCode alias accepted. A 6-digit HS code must identify one commodity. Spaces allowed. |
| netWeightKg | number | Required | Net cargo weight: 0.01 to 100,000,000 kg, subject to the emissions storage limit. weightKg alias accepted. |
| originCountry | string | Optional | Manufacturing country as ISO alpha-2, such as CN or IN. DEFAULT uses general reference factors. |
| origin | string | Optional | Origin port UN/LOCODE, e.g. CNSHA. Add both ports for freight and ETS estimates. |
| destination | string | Optional | Destination port UN/LOCODE, e.g. NLRTM. Missing ports or coordinates leave route estimates null. |
| invoicedEtsSurcharge | number | Optional | Optional nonnegative carrier surcharge in EUR, up to 99,999,999.99. |
| invoicedCurrency | string | Optional | EUR only. Convert other currencies before comparing. |
| shipmentIdentifier | string | Optional | Optional public shipment UUID or organization-owned container/B/L reference. Omit for standalone calculations. Never writes a saved calculation. |
curl -X POST "https://api.panvaya.com/api/v1/carbon/cbam" \
-H "X-API-Key: pv_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"cnCode":"72083900","netWeightKg":20000,"originCountry":"DEFAULT"}'{ "shipmentIdentifier": null, "carrierName": null, …Click to expand Sea Distance & Transit Time
Calculate sea distance and estimated transit time between any two ports. Routes through real ocean channels including Suez, Panama, Gibraltar, and Malacca strait. Supports danger-zone avoidance to reroute via the Cape of Good Hope. Try the distance calculator
/distance-time/calculateCalculate routed sea distance in km and nautical miles, plus estimated transit time between two ports.
| Field | Type | Required | Description |
|---|---|---|---|
| origin | string | Optional | Origin port as UN/LOCODE, e.g. NLRTM (Rotterdam), CNSHA (Shanghai). Required if waypoints not provided. |
| destination | string | Optional | Destination port as UN/LOCODE, e.g. SGSIN (Singapore), USNYC (New York). Required if waypoints not provided. |
| waypoints | array | Optional | Optional multi-stop array of port waypoints (up to 6 stops), e.g. [{"locode": "CNSHA"}, {"locode": "NLRTM"}]. |
| avoidDangerZones | boolean | Optional | When true, routes around the Red Sea and Suez Canal via the Cape of Good Hope. Default: false. |
curl -X POST "https://api.panvaya.com/api/v1/distance-time/calculate" \
-H "X-API-Key: pv_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"origin": "NLRTM", "destination": "SGSIN", "avoidDangerZones": false}'{ "safe": false, "totalNm": 8305.2, …Click to expand Vessel Details
Retrieve stored vessel master specifications including IMO, MMSI, vessel name, flag, call sign, dimensions, gross tonnage, and TEU capacity.
/vesselsReturns vessel master records by 7-digit IMO or 9-digit MMSI.
| Field | Type | Required | Description |
|---|---|---|---|
| imo | string | Optional | Checksum-valid seven-digit IMO number, e.g. 9525338. Provide either imo or mmsi. |
| mmsi | string | Optional | Nine-digit Maritime Mobile Service Identity, e.g. 566093000. Provide either imo or mmsi. |
curl "https://api.panvaya.com/api/v1/vessels?imo=9525338" \
-H "X-API-Key: pv_live_your_key_here"{ "imo": 9525338, "mmsi": 566093000, …Click to expand Latest Vessel Position
Fetch real-time vessel AIS positions, current speed, navigational course, origin/destination ports, ATD, and calculated ETA.
/vessels/positionReturns latest live AIS position, speed, course, and voyage progress by IMO or MMSI.
| Field | Type | Required | Description |
|---|---|---|---|
| imo | string | Optional | Checksum-valid seven-digit IMO number, e.g. 9525338. Provide either imo or mmsi. |
| mmsi | string | Optional | Nine-digit Maritime Mobile Service Identity, e.g. 566093000. Provide either imo or mmsi. |
curl "https://api.panvaya.com/api/v1/vessels/position?imo=9525338" \
-H "X-API-Key: pv_live_your_key_here"{ "imo": 9525338, "mmsi": 566093000, …Click to expand Incoterms Reference
Look up one of the 11 Incoterms 2020 trade terms by code. The response includes the full name, applicable transport mode, risk and cost transfer points, and a 12-stage responsibility breakdown. View the Incoterms guide
/incoterms/{code}Returns detailed Incoterm data including risk and cost transfer points and per-stage seller/buyer responsibilities.
| Field | Type | Required | Description |
|---|---|---|---|
| code | string | Required | Three-letter Incoterm code: EXW, FCA, FAS, FOB, CFR, CIF, CPT, CIP, DAP, DPU, or DDP. |
curl "https://api.panvaya.com/api/v1/incoterms/FOB" \
-H "X-API-Key: pv_live_your_key_here"{ "code": "FOB", "name": "Free On Board", …Click to expand Port Congestion
Monitor real-time global port congestion covering the top 300+ ocean container ports. Returns anchor wait times, berthing durations, approaching vessel queues, and TEU throughput by UN/LOCODE or country code. View the congestion map
/port-congestionReturns real-time congestion metrics for ports filtered by UN/LOCODE or country code.
| Field | Type | Required | Description |
|---|---|---|---|
| locode | string | Optional | Filter by specific port UN/LOCODE (e.g. SGSIN, NLRTM, CNNBO, USLAX). Monitors top 300+ ocean container ports. Air cargo airport hubs (e.g. USJFK, GBLHR) and inland depots return 404 NOT_FOUND. |
| country | string | Optional | Filter by country ISO code to get all ports in a country, e.g. SG, NL, CN. |
curl "https://api.panvaya.com/api/v1/port-congestion?locode=SGSIN" \
-H "X-API-Key: pv_live_your_key_here"{ "count": 1, "ports": [ …Click to expand Credit usage
/usageReturns your organization credit balance, credits used, remaining credits, exact 30-day period reset timestamp, and enabled products with per-call costs. This account endpoint is unbilled.
curl "https://api.panvaya.com/api/v1/usage" \
-H "X-API-Key: pv_live_your_key_here"{ "creditLimit": 12000, "creditsUsed": 1280, …Click to expand Download usage report
/usage/reportDownloads your organization's success-only billing ledger as a CSV file. Filters by product and date range are optional. This administrative endpoint is unbilled.
| Field | Type | Required | Description |
|---|---|---|---|
| productCode | string | Optional | Filter by product code, e.g. SEA_TRACKING, AIR_TRACKING, SAILING_SCHEDULES. |
| from | date | Optional | Inclusive start date in YYYY-MM-DD format. |
| to | date | Optional | Inclusive end date in YYYY-MM-DD format. |
curl "https://api.panvaya.com/api/v1/usage/report?productCode=SEA_TRACKING&from=2025-08-01&to=2025-08-07" \
-H "X-API-Key: pv_live_your_key_here" \
-o panvaya-api-usage.csvtimestamp,api_product,environment,request_reference,credits_charged 2025-08-02T14:22:01Z,SEA_TRACKING,live,MSKU8094830,1 2025-08-03T09:15:33Z,SAILING_SCHEDULES,live,CNSHA-NLRTM,2 …Click to expand Health check
/healthPublic unmetered probe for automated uptime monitors, load balancers, and orchestration health checks. Bypasses API key authentication.
curl "https://api.panvaya.com/api/v1/health"{
"status": "operational",
"service": "panvaya-tracking-api",
"version": "v1",
"timestamp": "2026-10-12T07:55:00Z",
"database": "operational"
}Errors
Errors use a standard JSON envelope with a machine-readable code string. Branch your application logic on the error code, not the error message text.
{
"errors": [{
"code": "INVALID_REQUEST",
"title": "Invalid request",
"detail": "One of container, bol, or bk is required."
}]
}| Status | Code | Meaning |
|---|---|---|
| 400 | INVALID_REQUEST | A required parameter is missing, invalid, or mutually exclusive. |
| 400 | CARRIER_NOT_SUPPORTED | The requested or detected shipping line or airline is unavailable or unsupported. |
| 401 | MISSING_API_KEY | No API key was provided in the X-API-Key or Authorization header. |
| 401 | INVALID_API_KEY | The provided API key is invalid or unrecognized. |
| 401 | KEY_REVOKED / KEY_EXPIRED | The API key has been revoked or has reached expiration. |
| 402 | QUOTA_EXCEEDED | Your account API credit balance is exhausted for this billing period. |
| 403 | API_PRODUCT_NOT_ENABLED | This API product is not enabled for your organization. |
| 404 | NOT_FOUND | No tracking data or vessel records were found for the reference. |
| 429 | RATE_LIMIT_EXCEEDED | Rate limit exceeded (10 req/min). Check Retry-After in response. |
| 502 | UPSTREAM_ERROR | The carrier or external data provider is temporarily unavailable. |
| 502 | UPSTREAM_UNAVAILABLE | The airline tracking provider is temporarily unavailable. |
| 503 | CARRIER_MAINTENANCE | The selected carrier is temporarily marked as under maintenance. The request is not billed. |
| 500 | SERVER_ERROR | An internal operation failed. Retry later or contact support; failed requests are not billed. |
Sandbox testing
Generate a sandbox test key (prefixed pv_test_) to develop and test in non-production environments. Sandbox requests utilize identical endpoints and schemas, keeping test and production credentials strictly isolated.
Ready to start integrating? Generate your API keys or contact our team for high-volume enterprise plans.
Start building with the Panvaya REST API
Get your API key in seconds with 100 free trial credits included on all accounts.