Shipper API

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.

post/v1/shipper/quotes/batch

Request

  • Base URL
    https://api.oway.io
  • URL
    https://api.oway.io/v1/shipper/quotes/batch
  • Auth
    HTTP bearer and API key in header x-oway-api-key

Headers

Idempotency-Keystring

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

customerReferencestring

Your own reference for the whole set, such as a plan or file name. Stored on the batch only; each item carries its own customerReference, or none.

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.

idstring

The batch id; read the batch by it

status'PRICING' | 'COMPLETED' | 'FAILED' required

PRICING: accepted, still pricing; read the batch again after Retry-After seconds. COMPLETED: every item has an outcome; items can still move from UNDER_REVIEW to QUOTED or NOT_QUOTED, and nothing else on the batch changes. FAILED: the run could not finish; submit the items again.

customerReferencestring

Your reference for the whole set, as sent

createdAtstring date-time

When the batch was accepted

completedAtstring date-time

When every item had an outcome; absent while PRICING

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.