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.