Price a batch of shipments
Accepts up to 1,000 quote requests and prices them after answering. The response is the batch in status PRICING with every item PENDING; read it at GET /v1/shipper/quotes/batch/{batchId} (the Location header) after Retry-After seconds until its status is COMPLETED or FAILED.
Each item is exactly a quote request and is priced as its own quote request would be. Results come back in the order you sent the items, so the position is how you match them; an item's customerReference, when you give one, is stored on its quote and finds it later. Each result is QUOTED with the same QuoteResponse a single request answers with, or NOT_QUOTED or UNDER_REVIEW with the same ProblemDetail. A refused or malformed item never fails the batch; only an envelope that cannot be taken does (no items, more than 1,000, or an empty item).
Idempotent twice over. With an Idempotency-Key, retrying the same request within 24h returns the original response; the same key with a different body returns 409 idempotency_key_conflict. Without one, the same items for your company within 24h return the batch that already ran, however far it has got; quotes stay valid for two days, so a replay never returns an expired price. One batch prices for your account at a time: a second, different batch while one is PRICING is refused with 409 batch_in_progress and the running batch's id.
UNDER_REVIEW items are the ones no automatic price can be trusted for; a person decides, and the item later becomes QUOTED or NOT_QUOTED. After a batch is COMPLETED, items change only that way and nothing else on the batch moves. The requiredPickupDate of an item is read as a day in the origin's time zone; send it with an offset, for example 2026-10-14T08:00:00-07:00.
Request
- Base URLhttps://api.oway.io
- URLhttps://api.oway.io/v1/shipper/quotes/batch
- AuthHTTP bearer and API key in header x-oway-api-key
Headers
Optional idempotency key. Retrying the same request with the same key within 24h returns the original response. Reusing the key with a different body returns 409 idempotency_key_conflict.
Request body
Example request
{
"customerReference": "plan-2026-10-14",
"items": [
{
"pickupAddress": {
"name": "Fairgrounds Distribution Center",
"address1": "1531 Junipero Avenue",
"address2": "Dock 5",
"city": "Long Beach",
"state": "CA",
"zipCode": "90804",
"country": "US",
"phoneNumber": "+18087857650",
"contactPerson": "Mike Johnson",
"phoneExtension": "204",
"email": "dock@example.com",
"openTime": "10:00",
"closeTime": "16:00",
"notes": "Dock 3, enter from back of building",
"appointmentRequired": true,
"callAheadRequired": true
},
"deliveryAddress": {
"name": "Fairgrounds Distribution Center",
"address1": "1531 Junipero Avenue",
"address2": "Dock 5",
"city": "Long Beach",
"state": "CA",
"zipCode": "90804",
"country": "US",
"phoneNumber": "+18087857650",
"contactPerson": "Mike Johnson",
"phoneExtension": "204",
"email": "dock@example.com",
"openTime": "10:00",
"closeTime": "16:00",
"notes": "Dock 3, enter from back of building",
"appointmentRequired": true,
"callAheadRequired": true
},
"orderComponents": [
{
"palletCount": 2,
"poundsWeight": 500,
"palletDimensions": [
72,
48,
48
],
"dimensions": {
"length": 48,
"width": 48,
"height": 72
},
"description": "Stone NOI",
"nmfcCode": "90500-04",
"freightClass": "100",
"packagingType": "Pallets"
}
],
"requiredPickupDate": "2026-04-01T08:00:00-07:00",
"customerReference": "2835391"
}
]
}Response
Batch accepted and pricing. Location is where to read it.
Example response
{
"id": "QB-8F3K29XA",
"customerReference": "plan-2026-10-14",
"createdAt": "2026-10-14T13:05:00Z",
"completedAt": "2026-10-14T13:06:40Z",
"counts": {
"items": 120,
"quoted": 97,
"notQuoted": 20,
"underReview": 3
},
"items": [
{
"customerReference": "2835391",
"quote": {
"id": "507f1f77bcf86cd799439013",
"quotedPriceInCents": 125000,
"quoteExpirationTime": "2024-12-20T15:30:00Z",
"transitDays": 2,
"estimatedDeliveryDate": "2024-12-22T15:30:00Z"
},
"problem": {
"type": "https://api.oway.io/errors/location-not-serviceable",
"title": "Bad Request",
"status": 400,
"detail": "pickupAddress.zipCode must be a 5-digit ZIP code",
"reason": "pickup_not_covered",
"violations": [
{
"field": "orderComponents[0].dimensions",
"entity": "deliveryAddress",
"reason": "Component dimensions of 110x48x40 are invalid (pallets must be less than 96x96x108, and greater than 1x1x1)"
}
]
}
}
]
}Changes
No recorded changes to this operation across all 1 revision of this API.