Veho API: Last-Mile Labels, Quotes, Tracking and Manifests

Veho is a US regional last-mile carrier. You tender packages to a Veho facility and Veho delivers them, seven days a week, in the metro areas it serves. The veho carrier talks to the Veho API, version 2.

Credentials#

Veho issues an API key per environment: one for the sandbox and one for production. There is no OAuth step; the key travels in every request.

Parameter Veho value
key API key

The same value can come from the environment as RS_VEHO_KEY. The key is redacted from meta.debug_information.

Sandbox#

Set "test": true to call the sandbox (api.sandbox.shipveho.com) with your sandbox key. Sandbox orders are free and never delivered. The sandbox serves only a subset of Veho's ZIP codes; an order to any other ZIP is rejected as unserviceable. The list is public at api.sandbox.shipveho.com/v2/serviceable-zips, or ask with addressvalidate (below).

Supported actions#

Action Veho call
getallrates POST /quote/rate
submitshipment POST /orders, then GET /labels/{packageId}.{format}
track GET /packages/tracking
voidshipment PUT /orders/{orderId}/events/cancelled
createmanifest POST /manifests
addressvalidate GET /serviceable-zips

Pickups are arranged with your Veho representative, not through the API. Veho is US only, prices in USD and takes pounds and inches; other units are converted. Packages may weigh at most 50 lb, measure at most 48 inches on any side and 5.7 cubic feet in volume.

Services#

service is the Veho service class. Names are accepted in any case, with or without separators (groundPlus, ground_plus and Ground Plus are the same).

Service class Notes
groundPlus Default, available to every account
groundPlusOne .. groundPlusFour Contract only
nextDay, sameDay, twoDay Contract only
vehoValue, premiumEconomy, expressAir Contract only

Rates#

Veho quotes one service class per call, so getallrates returns one rate: the class in service, or Ground Plus when none is given. A quote needs ship_code, to_code and every package's weight, length, width and height.

{
  "carrier": "Veho",
  "action": "getallrates",
  "params": {
    "key": "YOUR_VEHO_API_KEY",
    "test": true,
    "ship_code": "80216",
    "to_code": "80302",
    "ship_date": "2026-10-10",
    "packages": [ { "weight": 2, "length": 10, "width": 8, "height": 4 } ]
  }
}
{
  "desc": "Veho Ground Plus",
  "service_code": "groundPlus",
  "rate": 7.85,
  "currency": "USD",
  "est_delivery_days": 3,
  "zone": "2",
  "billing_weight": 2,
  "billing_weight_units": "LB",
  "rate_id": "dd4b0d81-a237-44c6-89f1-3be7650bb7ff",
  "rate_detail": [ { "amount": 7.85, "currency": "USD", "type": "shipping" } ]
}

Veho quotes each package separately. rate is the sum; a shipment with several packages lists each package's share in rate_detail as package_1, package_2 and so on. rate_id holds the quote id of every package, comma separated in package order. Pass it back as rate_id on submitshipment to ship at the quoted price.

Veho calls its quote endpoint a pilot: the rates and transit times are estimates, and the rates in your Veho contract prevail.

Creating a label#

{
  "carrier": "Veho",
  "action": "submitshipment",
  "params": {
    "key": "YOUR_VEHO_API_KEY",
    "test": true,
    "service": "groundPlus",
    "image_type": "rs_zpl",
    "reference_value": "ORDER-1001",
    "ship_date": "2026-10-10",
    "shipper": "RocketShipIt",
    "ship_addr1": "500 Sender Rd",
    "ship_city": "Denver",
    "ship_state": "CO",
    "ship_code": "80216",
    "to_name": "Fred Flintstone",
    "to_addr1": "301 Cobblestone Way",
    "to_addr2": "Apt 2",
    "to_city": "Boulder",
    "to_state": "CO",
    "to_code": "80302",
    "to_phone": "3035550100",
    "to_email": "[email protected]",
    "special_instructions": "Leave at the side door",
    "packages": [
      { "weight": 2, "length": 10, "width": 8, "height": 4, "description": "Books", "reference_value": "ORDER-1001-1", "insured_value": 25 }
    ]
  }
}

One request creates one Veho order for the destination with one Veho package per entry in packages. Without packages, Veho creates a single package from your account defaults.

Parameter mapping#

RocketShipIt parameter Veho field
service serviceClass (default groundPlus)
image_type label format: pdf (default), rs_zpl or rs_png
rate_id quoteId of each package, from getallrates
reference_value (or po_number) externalId of the order, your order number
account_number merchantId, for platforms shipping on behalf of a registered merchant
ship_date shipDate of each package, the day it is tendered (today or later)
delivery_date slaDeliveryDate, the day the order must be delivered
shipper, ship_* fromName and fromAddress
to_name recipient, the full name (required)
to_company company
to_addr1 destination street
to_addr2, to_addr3 destination apartment line
to_city, to_state, to_code destination city, state and ZIP
to_phone phone, used for delivery SMS
to_email email, used for delivery notifications (required on some accounts)
special_instructions instructions for the driver
packages[].weight, weight_unit weight in pounds
packages[].length/width/height, length_unit dimensions in inches
packages[].description description, printed on the label
packages[].reference_value externalId of the package
packages[].insured_value (or insured_value for one package) declaredValue, in cents
packages[].hazmat special handling: limited quantity hazmat (arrange with Veho first)
packages[].signature_type or signature_type set to PIN attended delivery with PIN verification

When ship_* and every package's weight and dimensions are present, or rate_id is set, the order is created with a quote and the summed rate is returned in charges.

Response#

shipment_id is the Veho order id, which voidshipment takes. Each entry in packages carries its own label, base64 encoded, and Veho's 14-character tracking id as tracking_number. The Veho package id and the barcode printed on the label are in alternative_tracking_ids. The package's links document holds the consumer tracking page (tracking_url), Veho's own label_url, and the quote when one was made.

{
  "shipment_id": "5cxKLWAqtZhbNFe9y",
  "tracking_number": "VH1234565CSK1W",
  "charges": 7.85,
  "packages": [
    {
      "tracking_number": "VH1234565CSK1W",
      "shipment_id": "5cxKLWAqtZhbNFe9y",
      "label_format": "application/zpl",
      "label": "XlhBXkZPNTAsNTBeQUROLDM2LDIwXkZE...",
      "alternative_tracking_ids": [
        { "type": "package_id", "value": "PKG_GqN8v5wvGNxmnFu4Y" },
        { "type": "barcode", "value": "VHGQN8V5WVGNXMNFU4Y" }
      ],
      "documents": [
        {
          "code": "links",
          "type": "text/uri-list",
          "metadata": [
            { "key": "tracking_url", "value": "https://track-sandbox.shipveho.com/#/trackingid/VH1234565CSK1W" },
            { "key": "label_url", "value": "https://api.sandbox.shipveho.com/v2/labels/PKG_GqN8v5wvGNxmnFu4Y.zpl" },
            { "key": "external_id", "value": "ORDER-1001-1" },
            { "key": "quote_id", "value": "dd4b0d81-a237-44c6-89f1-3be7650bb7ff" },
            { "key": "rate", "value": "7.85" },
            { "key": "zone", "value": "2" }
          ]
        }
      ]
    }
  ]
}

Veho renders labels a moment after the order exists. RocketShipIt retries the download for a few seconds; a label that still is not ready is reported as a Warning in errors with the package id, and the order stands. Fetch it later from the label_url, with your key in the apikey header.

Tracking#

Pass the Veho tracking id as tracking_number. To track by another identifier set reference_type to package_id, barcode or external_id (the package's reference_value). Events come back most recent first with Veho's event type in status_code, a plain description, and a generic status_type:

Veho event status_type
created, pending pre_transit
pickedUpFromClient, droppedOffAtVeho, PackageArrivedAtFacility, PackageDepartedFromFacility in_transit
pickedUpFromVeho out_for_delivery
delivered delivered
returned, returnedToClient, pendingReturnToClient returned
cancelled cancelled
misdelivered, discarded, PackageHadDeliveryIssue, notReceivedFromClient exception

A delivered event fills delivered_time and delivery_detail; Veho's SLA date is the estimated_delivery until then. ship_date is the package's dispatch date. A package Veho hands to another carrier lists that carrier's tracking number in alternative_tracking_ids.

Voiding#

voidshipment cancels the order in shipment_id. With only a tracking_number, the package is looked up first to find its order. Veho refuses to cancel an order once it has received the package.

Manifests#

Veho asks shippers to say which packages leave on which day. createmanifest sends that list:

{
  "carrier": "Veho",
  "action": "createmanifest",
  "params": {
    "key": "YOUR_VEHO_API_KEY",
    "ship_date": "2026-10-10",
    "tracking_numbers": ["VH1234565CSK1W", "VH1234565CSK2X"]
  }
}
RocketShipIt parameter Veho field
tracking_numbers the packages, as tracking ids (or package ids, barcodes or external ids per reference_type)
ship_date (or pickup_date) dispatchDate, the day the packages leave your facility
reference_value loadId
distribution_center tenderFacilityId, the Veho facility the packages are tendered to
transport_mode air for a plane load; anything else is a truck

Veho produces no manifest document. The response's manifest document lists the packages Veho updated and the ones it did not find in its metadata; each package not found is also a Warning in errors.

Serviceable ZIP check#

Veho has no address validation. addressvalidate fetches Veho's serviceable ZIP list and reports whether to_code is in it: match is true when Veho delivers there, and a ZIP outside the service area adds a Warning with the code unserviceable_zip_code. The street is not checked.

Errors#

Veho validation failures (HTTP 400 and 422) list each offending field. RocketShipIt returns the summary first, then one error per field with Veho's path to it and its stable error code:

"errors": [
  { "code": "422", "description": "Validation error", "type": "Error" },
  { "code": "invalid_string", "description": "destination.zipCode: Zip code format must be XXXXX, XXXXX-XXXX or XXXXXXXXX", "type": "Error" },
  { "code": "unserviceable_zip_code", "description": "destination.zipCode: Zip code is not serviceable", "type": "Error" }
]

A 401 means the key was rejected; check that a sandbox key is used with "test": true and a production key without it.