Send a quote
Turn a rate search into a quote to your customer: the same numbered quote, with your branding and an ACCEPT link, that your team would export from HighQube. You'll need a key with Create quotes (quotes:write). To read quotes back, it also needs Read quotes (quotes:read).
Create the quote
Send the search again to POST /rate-search/export, with the customer it's for. This quotes Great Lakes Furniture every Chicago to Shanghai 40'HC rate, with $150 added per container and rounded up to the next $5:
curl "https://api-dev.highqube.ai/rate-search/export" \
-H "Authorization: Bearer $HIGHQUBE_API_KEY" \
-H "Idempotency-Key: GLF-PO-48213" \
-H "Content-Type: application/json" \
-d '{
"isSelectedAll": true,
"customer_id": 2,
"routes": [{"origin": "USCHI", "destination": "CNSGH"}],
"containerSizes": ["40HC"],
"is_margin_apply": true,
"margin_flat_rate": 150,
"margin_round_up_to": "5"
}' \
-o quote.xlsx
The answer is the quote as an Excel workbook. Its first page has the quote number, the dates and the ACCEPT link; the rates follow.
customer_idmakes the export a quote to that customer. It uses their saved column layout and contact details, plus your branding, and HighQube numbers and records it. Without a customer, you get a plain rate sheet instead, not a quote (GET /quotes?kind=sheetlists those).- Margin is optional: a flat amount per container (
margin_flat_rate), or a percentage (margin_percentage) of the base rate or the total (margin_apply_to). It's added to the base rate, so base rate plus surcharges still equals the total on the quote.margin_round_up_torounds the result up to a multiple of 1, 5 or 10. - Only some rows? Send
isSelectedAll: falsewithselectedRows, the rows from your rate search. - Always send an
Idempotency-Key, such as your own order number, so a retry can't file the quote twice. See Retrying safely.
The quote stays open for up to 30 days, and never past the day its earliest rate expires.
There's no endpoint for listing your customers yet. GET /quotes returns the customer_id of every customer you've already quoted.
Find your quotes
curl -G "https://api-dev.highqube.ai/quotes" \
-H "Authorization: Bearer $HIGHQUBE_API_KEY" \
-d status=pending -d size=25
Quotes come newest first. Filter by status, customer_id, date_from and date_to, or search, which matches the quote number, the customer's name, or a lane. Page through them with page and size.
Each quote says what it covers and what it earns you, per container size. Here is the one above, with some fields left out:
{
"id": 12,
"reference": "Q-000001",
"status": "pending",
"issued_at": "2026-11-10T18:23:13.808665Z",
"valid_until": "2026-12-10T18:23:14.106673Z",
"customer_id": 2,
"customer_name": "Great Lakes Furniture",
"lanes": [
{
"label": "Chicago, IL (USCHI) → Shanghai, CN (CNSGH)",
"rate_count": 4,
"sizes": [
{
"equipment_size": "40'HC",
"container_type": "Dry",
"commodities": ["FAK"],
"rate_count": 4,
"buy": { "low": 572.0, "high": 715.0 },
"sell": { "low": 725.0, "high": 865.0 },
"margin": { "low": 150.0, "high": 153.0 }
}
]
}
],
"currency": "USD"
}
buy is what the rates cost you, sell what the customer pays, and margin the difference. The margin is $153 on the cheapest rate because $572 + $150 = $722 rounds up to $725.
status is pending until the customer accepts with the link (accepted, which stays even after the quote runs out). A quote nobody accepted becomes expired once valid_until has passed, and requote_requested if the customer then asks for new rates. archived means it was withdrawn or replaced by a requote.
Open one, or download it again
# Everything about a quote: status, lanes, and each rate with its buy, sell and margin
curl "https://api-dev.highqube.ai/quotes/12" -H "Authorization: Bearer $HIGHQUBE_API_KEY"
# The workbook again, exactly as it was sent
curl "https://api-dev.highqube.ai/quotes/12/download" \
-H "Authorization: Bearer $HIGHQUBE_API_KEY" -o Q-000001.xlsx
The download is the quote as it was issued, not a new search: the rates in it don't change when the contract does.

