Create a shipment

Register a shipment, define the intended receiver + delivery address, and get back a signed QR code.

POST /api/shipments
Creates a shipment + returns QR code metadata.
{
  "receiver_name": "Vantage Medical Supply",
  "destination_address": {
    "line1": "742 Industrial Way",
    "city": "Laredo",
    "state": "TX",
    "zip": "78040"
  },
  "window_start": "2025-11-02T12:00:00Z",
  "window_end":   "2025-11-02T20:00:00Z",
  "allowed_requestors": [
    "carrier_usa_west",
    "warehouse_port_A"
  ]
}
Returns:
  • shipment_id
  • qr_code_svg / qr_code_png
  • signature_valid (bool)

Verify before release

A warehouse (or yard gate) can scan the QR and call Veriport to confirm the shipment is allowed to leave with this driver, to this destination.

GET /api/shipments/{shipment_id}/verify
Used at handoff / custody change.
{
  "shipment_id": "XP4-22B",
  "destination_locked": true,
  "destination_address": "742 Industrial Way, Laredo, TX 78040",
  "current_custody": "Port Warehouse A",
  "approved_change_requests": [],
  "release_allowed": true
}

Request a destination change

Carriers or dispatchers don’t just “call the warehouse.” They submit a digital request. The original creator must approve it for it to become active.

POST /api/shipments/{shipment_id}/change_request
Propose a new drop address.
{
  "requested_by": "carrier_usa_west",
  "new_address": {
    "line1": "1255 W 52nd Ave",
    "city": "Denver",
    "state": "CO",
    "zip": "80216"
  },
  "reason": "Customs hold at original DC, reroute to bonded facility"
}

The shipment owner will then APPROVE or DENY. That decision is forever part of the audit trail.