Drayage Quote
Endpoint: POST /v1/drayage/quote
Submit container and location details to receive drayage rates for Import or Export operations. The response includes a quoteNumber and a list of available rates, each with its own rateNumber.
Authentication required All requests to this endpoint require a valid bearer token. See Authentication.
Request Body
These fields are required to submit a complete Drayage quote request.
| Field | Type | Required | Description |
|---|---|---|---|
requestingUser | string | Yes | Email of the user submitting the quote |
customerName | string | Yes | Customer name associated with the quote |
customerBsn | integer | Yes | Branch identifier for your organization. Retrieve from GET /v1/customers |
operationType | string | Yes | "Import" or "Export" |
market | object | Yes | Port or rail origin location |
warehouse | object | Yes | Final destination address |
container | object | Yes | Container type and shipment details |
Field Reference
operationType
| Value | Description |
|---|---|
"Import" | Container moving inbound from port to warehouse |
"Export" | Container moving outbound from warehouse to port |
market
Retrieve available markets from GET /v1/tools/drayage/markets.
"market": {
"country": "US",
"state": "MD",
"city": "Baltimore",
"postalCode": "21224",
"name": "Baltimore, MD"
}
warehouse
The final delivery or pickup address for the customer.
"warehouse": {
"country": "US",
"state": "MD",
"city": "Baltimore",
"postalCode": "21224"
}
container
| Field | Type | Description |
|---|---|---|
containerType | string | Equipment name from GET /v1/tools/drayage/container-types. Example: "Container", "FlatRack", "ReeferContainer" |
containerLength | integer | Valid length for the selected equipment type (e.g., 20, 40, 45) |
weight | number | Total container weight |
isReefer | boolean | true if the container requires refrigeration |
"container": {
"containerType": "Container",
"containerLength": 20,
"weight": 1032,
"isReefer": true
}
Container reference data.
Use GET /v1/tools/drayage/container-types to get valid container type names and their available lengths before building the quote request.
Request Example
{
"requestingUser": "example@mail.com",
"customerName": "Example Customer",
"customerBsn": "YOUR_CUSTOMER_BSN",
"operationType": "Import",
"market": {
"country": "US",
"state": "MD",
"city": "Baltimore",
"postalCode": "21224",
"name": "Baltimore, MD"
},
"warehouse": {
"country": "US",
"state": "MD",
"city": "Baltimore",
"postalCode": "21224"
},
"container": {
"containerType": "Container",
"containerLength": 20,
"weight": 1032,
"isReefer": true
}
}
Response
{
"data": {
"quoteNumber": 8917403,
"rates": [
{
"fuel": 0,
"freight": 507.91,
"prenotice": "2-3 days",
"rateNumber": 1,
"expectedTotal": 787.91,
"expectedAccessorialsCosts": 280,
"suggestedRate": 838.71,
"accessorials": [
{
"name": "Reefer",
"cost": 200,
"quantity": 1
},
{
"name": "Chassis",
"cost": 40,
"quantity": 2
}
]
}
],
"notes": [
{
"drayageMarketZipCode": "21224",
"note": "Hazmat and FDA warehouse facilities available"
}
],
"remarks": [
{
"drayageMarketZipCode": "21224",
"accessorialNumber": 545,
"remark": "Driver Detention: $100/Additional Hour. 1 Free Hour for Loading/Unloading/Terminal Transaction"
}
],
"disclaimers": [
{
"drayageMarketZipCode": "21224",
"disclaimer": "Rate per Container"
}
]
},
"errors": null
}
Key Response Fields
| Field | Description |
|---|---|
quoteNumber | Unique quote ID — save this for booking |
rates[].rateNumber | Rate-specific ID — save this for booking |
rates[].expectedTotal | Buy rate (freight + accessorials) |
rates[].expectedTotal | Base buy price |
rates[].suggestedRate | Suggested sell price |
rates[].freight | Base freight cost |
rates[].prenotice | Required pre-notification window |
notes | General market information notes |
remarks | Specific accessorial conditions and additional charges |
disclaimers | Important conditions for the quoted rate |
Review remarks and disclaimers:
Always surface remarks and disclaimers to your users before booking. They contain critical conditions like additional potential charges and operational constraints.
Empty carrier quotes If carrierQuotes is empty on a 200 OK response, no carrier matched the lane. Contact PRIMO customer service to review coverage for your Market/Warehouse.
Next Steps
- Drayage Book → — Use your
quoteNumberandrateNumberto create a booking