v1.0 REST APIOpenAPI 3.1 Ready

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.

Get API KeyOpen OpenAPI Spec
Instant Sandbox Access (pv_test_...) · 100 free trial credits · Zero card required

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

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

Quickstart: First request in 30 seconds

Get from zero to your first normalized tracking payload in 3 simple steps:

1

Get Your API Key

Sign in to your API Dashboard and generate a sandbox (pv_test_) or live (pv_live_) key.

2

Run Your First Call

Execute a test query using cURL, Node.js, or Python. All calls return structured, normalized JSON without carrier quirks.

3

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:

DCSA Track & Trace 2.2 / 3.0

Ocean carrier milestones are transformed into canonical Digital Container Shipping Association (DCSA) event types (LOAD, DISC, DEPA, ARRI, GTIN, GTOT, STRP).

ISO 6346 & BIC Validation

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.

UN/CEFACT & UN/LOCODE Locations

All maritime origin, transshipment, and destination ports are mapped to authoritative 5-character United Nations LOCODEs (SGSIN, NLRTM, CNSHA) with validated coordinates.

GLEC Framework & ISO 14083

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.

Authentication Header
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.

HTML
<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

Push AutomationZero-Cost Retries

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.

⚡ 5m – 30d Intervals⚓ Canonical DCSA 2.2 / 3.0🔒 AES-256-GCM Receiver Auth

Sea Tracking

POST/track/ocean

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

FieldTypeRequiredDescription
containerstringConditionalISO 6346 container number (e.g. MSKU8094830). May be combined with bol or bk.
bolstringConditionalBill of Lading reference. Cannot be combined with bk.
bkstringConditionalBooking reference. Cannot be combined with bol.
shipping_line_scacstringOptionalCarrier SCAC (e.g. MAEU, MSCU). Optional, bypasses auto-discovery.
include_route_databooleanOptionalSet 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.

Event Resolver Snippet (JavaScript / TypeScript)
// 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}'
Bill of Lading cURL
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"}'
Booking cURL
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"}'
200 OKResponse example(150 lines)
{ "status": "success", "data": { …Click to expand

List carriers

GET/carriers

Returns 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
curl "https://api.panvaya.com/api/v1/carriers" \
  -H "X-API-Key: pv_live_your_key_here"
200 OKResponse example(45 lines)
{ "mode": "ocean", "carriers": [ …Click to expand

Air Cargo Tracking

POST/track/air

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

FieldTypeRequiredDescription
awbstringRequiredFull 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.

200 OKIllustrative Air response(122 lines)
{ "awbNumber": "044-45428036", "airlineId": 52, …Click to expand

Cargo Airlines API

GET/airlines

Returns 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
curl "https://api.panvaya.com/api/v1/airlines" \
  -H "X-API-Key: pv_live_your_key_here"
200 OKResponse example(45 lines)
{ "mode": "air", "airlines": [ …Click to expand
Planning & Schedules APIs

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

POST/schedules/search

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

FieldTypeRequiredDescription
originstringRequiredOrigin UN/LOCODE, e.g. CNSHA (Shanghai).
destinationstringRequiredDestination UN/LOCODE, e.g. NLRTM (Rotterdam).
datestringOptionalEarliest departure date in YYYY-MM-DD format. Defaults to today.
weeksnumberOptionalForward search horizon in weeks (1 to 12). Defaults to 4.
carriersarrayOptionalOptional carrier filter by name or SCAC (e.g. ["MAEU"]). Omit to search all.
cURL
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"]}'
200 OKResponse example(134 lines)
{ "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

POST/carbon/calculate

Estimate carbon emissions by origin, destination, cargo weight, and transport mode. Estimates are not certified emissions reports.

FieldTypeRequiredDescription
originstringRequiredOrigin location as UN/LOCODE, e.g. NLRTM (Rotterdam), CNSHA (Shanghai).
destinationstringRequiredDestination location as UN/LOCODE, e.g. SGSIN (Singapore), USNYC (New York).
weightKgnumberRequiredTotal cargo weight in kilograms.
modestringRequiredTransport mode: "ocean" or "air".
cURL
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"}'
200 OKResponse example(23 lines)
{ "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

POST/carbon/cbam

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

FieldTypeRequiredDescription
cnCodestringRequired8-digit CN code; hsCode alias accepted. A 6-digit HS code must identify one commodity. Spaces allowed.
netWeightKgnumberRequiredNet cargo weight: 0.01 to 100,000,000 kg, subject to the emissions storage limit. weightKg alias accepted.
originCountrystringOptionalManufacturing country as ISO alpha-2, such as CN or IN. DEFAULT uses general reference factors.
originstringOptionalOrigin port UN/LOCODE, e.g. CNSHA. Add both ports for freight and ETS estimates.
destinationstringOptionalDestination port UN/LOCODE, e.g. NLRTM. Missing ports or coordinates leave route estimates null.
invoicedEtsSurchargenumberOptionalOptional nonnegative carrier surcharge in EUR, up to 99,999,999.99.
invoicedCurrencystringOptionalEUR only. Convert other currencies before comparing.
shipmentIdentifierstringOptionalOptional public shipment UUID or organization-owned container/B/L reference. Omit for standalone calculations. Never writes a saved calculation.
cURL
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"}'
200 OKResponse example(37 lines)
{ "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

POST/distance-time/calculate

Calculate routed sea distance in km and nautical miles, plus estimated transit time between two ports.

FieldTypeRequiredDescription
originstringOptionalOrigin port as UN/LOCODE, e.g. NLRTM (Rotterdam), CNSHA (Shanghai). Required if waypoints not provided.
destinationstringOptionalDestination port as UN/LOCODE, e.g. SGSIN (Singapore), USNYC (New York). Required if waypoints not provided.
waypointsarrayOptionalOptional multi-stop array of port waypoints (up to 6 stops), e.g. [{"locode": "CNSHA"}, {"locode": "NLRTM"}].
avoidDangerZonesbooleanOptionalWhen true, routes around the Red Sea and Suez Canal via the Cape of Good Hope. Default: false.
cURL
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}'
200 OKResponse example(52 lines)
{ "safe": false, "totalNm": 8305.2, …Click to expand
Maritime Intelligence & Vessels

Vessel Details

Retrieve stored vessel master specifications including IMO, MMSI, vessel name, flag, call sign, dimensions, gross tonnage, and TEU capacity.

GET/vessels

Returns vessel master records by 7-digit IMO or 9-digit MMSI.

FieldTypeRequiredDescription
imostringOptionalChecksum-valid seven-digit IMO number, e.g. 9525338. Provide either imo or mmsi.
mmsistringOptionalNine-digit Maritime Mobile Service Identity, e.g. 566093000. Provide either imo or mmsi.
cURL
curl "https://api.panvaya.com/api/v1/vessels?imo=9525338" \
  -H "X-API-Key: pv_live_your_key_here"
200 OKResponse example(14 lines)
{ "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.

GET/vessels/position

Returns latest live AIS position, speed, course, and voyage progress by IMO or MMSI.

FieldTypeRequiredDescription
imostringOptionalChecksum-valid seven-digit IMO number, e.g. 9525338. Provide either imo or mmsi.
mmsistringOptionalNine-digit Maritime Mobile Service Identity, e.g. 566093000. Provide either imo or mmsi.
cURL
curl "https://api.panvaya.com/api/v1/vessels/position?imo=9525338" \
  -H "X-API-Key: pv_live_your_key_here"
200 OKResponse example(20 lines)
{ "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

GET/incoterms/{code}

Returns detailed Incoterm data including risk and cost transfer points and per-stage seller/buyer responsibilities.

FieldTypeRequiredDescription
codestringRequiredThree-letter Incoterm code: EXW, FCA, FAS, FOB, CFR, CIF, CPT, CIP, DAP, DPU, or DDP.
cURL
curl "https://api.panvaya.com/api/v1/incoterms/FOB" \
  -H "X-API-Key: pv_live_your_key_here"
200 OKResponse example(34 lines)
{ "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

GET/port-congestion

Returns real-time congestion metrics for ports filtered by UN/LOCODE or country code.

FieldTypeRequiredDescription
locodestringOptionalFilter 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.
countrystringOptionalFilter by country ISO code to get all ports in a country, e.g. SG, NL, CN.
cURL
curl "https://api.panvaya.com/api/v1/port-congestion?locode=SGSIN" \
  -H "X-API-Key: pv_live_your_key_here"
200 OKResponse example(40 lines)
{ "count": 1, "ports": [ …Click to expand
Account & Usage APIs

Credit usage

GET/usage

Returns 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
curl "https://api.panvaya.com/api/v1/usage" \
  -H "X-API-Key: pv_live_your_key_here"
200 OKResponse example(33 lines)
{ "creditLimit": 12000, "creditsUsed": 1280, …Click to expand

Download usage report

GET/usage/report

Downloads your organization's success-only billing ledger as a CSV file. Filters by product and date range are optional. This administrative endpoint is unbilled.

FieldTypeRequiredDescription
productCodestringOptionalFilter by product code, e.g. SEA_TRACKING, AIR_TRACKING, SAILING_SCHEDULES.
fromdateOptionalInclusive start date in YYYY-MM-DD format.
todateOptionalInclusive end date in YYYY-MM-DD format.
cURL
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.csv
200 OKCSV File Download Sample(6 lines)
timestamp,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

GET/health

Public unmetered probe for automated uptime monitors, load balancers, and orchestration health checks. Bypasses API key authentication.

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

400 Bad Request
{
  "errors": [{
    "code": "INVALID_REQUEST",
    "title": "Invalid request",
    "detail": "One of container, bol, or bk is required."
  }]
}
StatusCodeMeaning
400INVALID_REQUESTA required parameter is missing, invalid, or mutually exclusive.
400CARRIER_NOT_SUPPORTEDThe requested or detected shipping line or airline is unavailable or unsupported.
401MISSING_API_KEYNo API key was provided in the X-API-Key or Authorization header.
401INVALID_API_KEYThe provided API key is invalid or unrecognized.
401KEY_REVOKED / KEY_EXPIREDThe API key has been revoked or has reached expiration.
402QUOTA_EXCEEDEDYour account API credit balance is exhausted for this billing period.
403API_PRODUCT_NOT_ENABLEDThis API product is not enabled for your organization.
404NOT_FOUNDNo tracking data or vessel records were found for the reference.
429RATE_LIMIT_EXCEEDEDRate limit exceeded (10 req/min). Check Retry-After in response.
502UPSTREAM_ERRORThe carrier or external data provider is temporarily unavailable.
502UPSTREAM_UNAVAILABLEThe airline tracking provider is temporarily unavailable.
503CARRIER_MAINTENANCEThe selected carrier is temporarily marked as under maintenance. The request is not billed.
500SERVER_ERRORAn 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.