Panvaya API
A metered REST API for ocean tracking, sailing schedules, Incoterms, freight carbon estimates, port congestion, and auditable usage reporting.
API key auth
Simple X-API-Key header.
Sandbox keys
Same real flow and credit rules as live.
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. Live and sandbox keys use the same real provider flow, rate limit, and credit rules; the environment label only identifies the key used for the request.
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
Signed-in Free and Premium workspaces include 10 API trial credits. Enterprise uses a purchased credit pool for an exact 30-day period, priced at 120 credits per $1 USD. Each enabled product has an organization-specific per-success credit cost. A Sea Tracking cache hit is a successful, billed response. Failed and 404 NOT_FOUND calls are never billed. Live and sandbox keys are billed the same way. Sea Tracking and CO2 Calculator use one credit per successful response by default, while Sailing Schedules uses five; your workspace may have different product costs. Track your consumption on the Integration page. When the allotment is spent, requests return 402 QUOTA_EXCEEDED until the next 30-day credit period begins. No reset job is needed: the first API request on or after the reset time advances the period before it is evaluated.
Create Shipment uses two separate quotas. The product is included in normal product grants and can also be configured by a superadmin. Creating a shipment consumes no API credit and writes no API usage row. Its first successful asynchronous track consumes one normal web ocean shipment quota unit. Each successful Get Shipment or List Shipments request consumes the configured Create Shipment API credit cost, one credit by default, and appears in the API usage report. Pending GET responses are successful and billed; validation, authorization, quota, and not-found failures are not.
Rate limits
Each key has its own token-bucket rate limit, set to 10 requests per minute by default. Tokens refill continuously rather than all at once at the next minute. Every authenticated API request uses one rate-limit token, whether it ultimately succeeds or fails.
Responses include X-RateLimit-Limit and X-RateLimit-Remaining. A throttled request returns 429 RATE_LIMIT_EXCEEDED with Retry-After in seconds.
Credit usage
/usageReturns the organization credit limit, used credits, remaining credits, exact 30-day reset time, and enabled products with their per-call costs. This account endpoint is not billed.
curl "https://api.panvaya.com/api/v1/usage" \
-H "X-API-Key: pv_live_your_key_here"Checking access…
Sign in to viewDownload usage report
/usage/reportDownloads the success-only billing ledger as CSV. Filters are organization-scoped and optional. This reporting endpoint is not billed.
| Field | Type | Required | Description |
|---|---|---|---|
| productCode | string | No | Filter by a stable API product code, e.g. SEA_TRACKING. |
| from | date | No | Inclusive start date in YYYY-MM-DD format. |
| to | date | No | Inclusive end date in YYYY-MM-DD format. |
curl "https://api.panvaya.com/api/v1/usage/report?productCode=SEA_TRACKING&from=2026-08-01&to=2026-08-07" \
-H "X-API-Key: pv_live_your_key_here" \
-o panvaya-api-usage.csvChecking access…
Sign in to viewSea Tracking
/track/oceanLook up an ocean container, bill of lading, or booking. Supply at least one reference; bol and bk cannot be combined. A container supplied with either document reference returns only that container from the document tracking result. Every reference type reuses the same successful response for two hours when fresh. Container, B/L, and booking responses all use data.containers; a container lookup normally contains one item, while B/L and booking lookups may contain several. Events reference shared locations and transports by response-local ids, keeping the response normalized and compact. Each container exposes the resolvediso_code, canonical dimensions, and capabilities underequipment. Each event usesid and event_time, and references transport details through transport_id. Transport mode and voyage are returned once in data.transports, not repeated in each event. Declared fields are always returned, withnull when a value is unavailable. Every successful response is billed and its normalized reference is written to the usage ledger.
| Field | Type | Required | Description |
|---|---|---|---|
| container | string | No | ISO 6346 container number. May be combined with bol or bk to select one container. |
| bol | string | No | Bill of lading reference. Cannot be combined with bk. |
| bk | string | No | Booking reference. Cannot be combined with bol. |
| shipping_line_scac | string | No | Optional shipping-line SCAC (see List carriers) to bypass discovery. |
| include_route_data | boolean | No | Set true to include route segments, current position, and available AIS details. Defaults to false. |
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"}'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"}'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}'Signed-in response example with include_route_data enabled
Checking access…
Sign in to viewCreate shipment
/shipments/oceanCreates a shipment for the user who created the API key, starts tracking asynchronously, and makes it visible on that user's Shipments page. It uses the same validation, duplicate checks, carrier support checks, and web ocean quota rules as a UI upload. The response is 202 Accepted with an opaque shipment_id UUID and a Location header. The Create Shipment API product must be enabled, but POST does not require an available API credit. Creation itself consumes no API credit and creates no API usage row; the first successful background track consumes one web ocean shipment quota unit.
| Field | Type | Required | Description |
|---|---|---|---|
| container | string | No | ISO 6346 container number. |
| bol | string | No | Bill of lading reference. Cannot be combined with bk. |
| bk | string | No | Booking reference. Cannot be combined with bol. |
| shipping_line_scac | string | No | Optional shipping-line SCAC to bypass discovery. |
curl -X POST https://api.panvaya.com/api/v1/shipments/ocean \
-H "X-API-Key: pv_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"container": "MSKU8094830", "shipping_line_scac": "MAEU"}'Get shipment
/shipments/{shipment_id}Returns a shipment only when it belongs to the API-key creator. While tracking is running, the endpoint returns 202 and a null tracking field. Once finished it returns the normalized core tracking response without UI-only CO2 or exception fields. Every successful GET, including a pending response, consumes the configured Create Shipment product cost and records the shipment UUID in API usage.
curl "https://api.panvaya.com/api/v1/shipments/550e8400-e29b-41d4-a716-446655440000" \
-H "X-API-Key: pv_live_your_key_here"List shipments
/shipments?page=0&size=20Returns all non-deleted shipments belonging to the API-key creator, including shipments created through either the UI or API. Results use user_shipment as the source of truth and are ordered by created_at descending. Each successful page request consumes the configured Create Shipment product cost and is recorded in API usage.
| Field | Type | Required | Description |
|---|---|---|---|
| page | integer | No | Zero-based page number. Defaults to 0. |
| size | integer | No | Page size from 1 to 100. Defaults to 20. |
curl "https://api.panvaya.com/api/v1/shipments?page=0&size=20" \
-H "X-API-Key: pv_live_your_key_here"{
"data": [{
"shipment_id": "550e8400-e29b-41d4-a716-446655440000",
"references": {
"container": "MSKU8094830",
"bol": null,
"bk": null
},
"shipping_line": { "scac": "MAEU", "name": "Maersk" },
"status": "IN_TRANSIT",
"tracking_status": "SUCCESS",
"tracking_error": null,
"created_at": "2026-08-11T16:30:00",
"updated_at": "2026-08-11T16:35:00"
}],
"pagination": {
"page": 0,
"size": 20,
"total_elements": 1,
"total_pages": 1,
"first": true,
"last": true
}
}List carriers
/carriersReturns supported carriers and their SCAC codes for the optional shipping_line_scac parameter. Panvaya tracking supports ocean containers, bills of lading, and booking references.
curl "https://api.panvaya.com/api/v1/carriers" \
-H "X-API-Key: pv_live_your_key_here"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 | Yes | 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"Checking access…
Sign in to viewSailing Schedules
Search normalized point-to-point schedules across the existing carrier schedule providers. Results are sorted by departure and share the same per-carrier cache as the dashboard schedule search. Try sailing schedules
/schedules/searchSearch departures from an origin UN/LOCODE to a destination. Results cover the configured four-week horizon, are not paginated, and cost 5 credits only when sailings are returned successfully.
| Field | Type | Required | Description |
|---|---|---|---|
| origin | string | Yes | Origin UN/LOCODE, e.g. CNSHA. |
| destination | string | Yes | Destination UN/LOCODE, e.g. NLRTM. |
| date | string | No | Earliest departure in yyyy-MM-dd format. Defaults to today. |
| carriers | array | No | Up to 20 carrier names or SCACs. Omit to search all enabled providers. |
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":"2026-09-01","carriers":["MAEU"]}'Checking access…
Sign in to viewCO2 Calculator
Calculate carbon emissions for ocean and air freight shipments between any two locations. Uses GLEC Framework emission factors with distance-based routing uplift. Returns CO2e in kilograms and tonnes, the emission factor applied, equivalent car-km driven, and trees needed to offset. Try the carbon calculator
/carbon/calculateCalculate CO2 emissions for a freight shipment by origin, destination, weight, and transport mode.
| Field | Type | Required | Description |
|---|---|---|---|
| origin | string | Yes | Origin location as UN/LOCODE, e.g. NLRTM (Rotterdam), CNSHA (Shanghai). |
| destination | string | Yes | Destination location as UN/LOCODE, e.g. SGSIN (Singapore), USNYC (New York). |
| weightKg | number | Yes | Total cargo weight in kilograms. |
| mode | string | Yes | 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"}'Checking access…
Sign in to viewPort Congestion
Get port congestion metrics including vessel anchor wait times, berthing durations, approaching vessel counts, and TEU throughput for major ports worldwide. Panvaya refreshes the shared provider snapshot after 12 hours; every successful API response is billed. View the congestion map
/port-congestionReturns congestion data for ports filtered by UN/LOCODE or country code.
| Field | Type | Required | Description |
|---|---|---|---|
| locode | string | No | Filter by specific port UN/LOCODE, e.g. SGSIN (Singapore), NLRTM (Rotterdam). |
| country | string | No | 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"Checking access…
Sign in to viewErrors
Errors use a consistent envelope with a stable, machine-readable code. Branch on the code, not the 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 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 API credit balance is insufficient. |
| 403 | API_PRODUCT_NOT_ENABLED | This API product 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 keys
Create a sandbox key (prefixed pv_test_) to keep test and production credentials separate. Sandbox requests use the same endpoints, external tracking flow, rate limit, and credit consumption as live keys.
Ready to integrate? Generate your keys or talk to our team about volume pricing.
Start building with the Panvaya API
Sign in to open API & Integration and generate a sandbox key in seconds.
Open API & Integration