Developers
Get Started
OpenAPI ↗
REST API v1 · Developer previewLive API credentials are not yet generally available. Hosted test access is not enabled.

API reference

Quotes

Request route and parcel data; select a returned quote ID. Quotes expose only customer price. Sandbox estimates and prices are synthetic, valid for 15 minutes.

Local sandbox only

Set PX_BASE_URL to http://127.0.0.1:4010/v1. Intended live host: https://api.parcelxpert.com/v1. Live requests are not released. Set PX_IDEMPOTENCY_KEY to one stored unique value per write; replace all example quote and shipment IDs with returned IDs.

Get quotes

POST/v1/quotes

Local sandbox returns synthetic retail offers for domestic, international and multi-parcel requests. 15 minute enforced quote expiry. These prices are fixtures and cannot be used for live shipping. Live pricing adapter remains a launch gap. Production access remains disabled. Unreleased server adapters and database controls are under certification; hosted test credentials are unavailable.

Required scope: quotes:read

Request body

FieldTypeDescription
collection_country
required
stringISO 3166-1 alpha-2 uppercase country code. Pattern: ^[A-Z]{2}$
collection_postcode
required
stringCollection postcode; UK postcodes must have valid format.
delivery_country
required
stringISO 3166-1 alpha-2 uppercase country code. Pattern: ^[A-Z]{2}$
delivery_postcode
required
stringDelivery postcode.
parcels
required
arrayTotal consignment weight cannot exceed 1000 kg. Individual services may impose lower limits. Max items: 100
parcels[].weight
required
numberWeight in kilograms.
parcels[].length
required
numberDimension in centimetres.
parcels[].width
required
numberDimension in centimetres.
parcels[].height
required
numberDimension in centimetres.
Response schema
FieldTypeDescription
data
required
array
data[].id
required
stringPX quote identifier.
data[].service_id
required
stringOpaque PX service identifier; does not identify a supplier account.
data[].courier
required
stringCustomer-facing courier.
data[].service
required
stringCustomer-facing service name.
data[].handover
required
stringValues: collection, drop_off
data[].price
required
object
data[].price.total
required
numberTotal retail customer price inclusive of applicable VAT. Minimum: 0
data[].price.net
required
numberMinimum: 0
data[].price.vat
required
numberMinimum: 0
data[].price.currency
required
stringISO 4217 currency. Pattern: ^[A-Z]{3}$
data[].estimated_transit_days
required
integer | nullEstimate, not a guarantee. Minimum: 1
data[].expires_at
required
stringISO 8601 timestamp with timezone. Responses use UTC Z.
data[].capabilities
required
object
data[].capabilities.collection
required
boolean
data[].capabilities.label_formats
required
array
data[].capabilities.customs_terms
required
array
HTTP responses and errors
200Success.
400Malformed JSON, cursor or idempotency header.
401Missing, invalid, expired or revoked key.
403Required scope not granted.
404Resource unavailable in this account and environment, or label format unavailable.
405Method not supported.
409Idempotency conflict, request in progress, expired/mismatched quote or cancellation unavailable.
413Body exceeds 256 KiB.
422Schema or capability validation failure.
429Enforced sandbox rate limit reached.
500Unexpected PX failure.
502Provider operation not confirmed. No blind booking retry.
503Provider unavailable or live API not released.

Request example

curl --request POST \
  --url "$PX_BASE_URL/quotes" \
  --header "Authorization: Bearer $PX_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{
  "collection_country": "GB",
  "collection_postcode": "NN1 1AA",
  "delivery_country": "GB",
  "delivery_postcode": "SW1A 1AA",
  "parcels": [
    {
      "weight": 2,
      "length": 30,
      "width": 20,
      "height": 15
    }
  ]
}'

Response example

{
  "data": [
    {
      "id": "qt_00000000-0000-4000-8000-000000000001",
      "service_id": "svc_test_drop_off",
      "courier": "PX Sandbox Courier",
      "service": "Test drop-off",
      "handover": "drop_off",
      "price": {
        "total": 6,
        "net": 5,
        "vat": 1,
        "currency": "GBP"
      },
      "estimated_transit_days": 3,
      "expires_at": "2026-10-04T10:40:00Z",
      "capabilities": {
        "collection": false,
        "label_formats": [
          "a4"
        ],
        "customs_terms": [
          "DAP"
        ]
      }
    }
  ]
}