Quoting Integration Guide
This guide shows how to use the Pricing Insights API as the quoting engine behind a UI you build. For setup, see Getting Started; for the full request body and response fields, see the API Reference.
This guide applies to Pricing Insights API v2 only.
What is the Pricing Insights API?
The Pricing Insights API returns a data-backed price estimate for moving one or more vehicles on a given lane (pickup → delivery). Each response includes the recommended price, a price range, a confidence score, and the comparable moves the estimate is built from. Estimates are informational and not a guaranteed or binding price. Actual prices vary by lane, timing, and other factors. Think of the recommended price as a data-backed anchor for the lane and vehicles you send — a starting point for your own pricing, not a number your customer has to see.
Use it to power your own quoting flow, calculator, or checkout step — so you can generate a quote the moment a lead enters a lane and one or more vehicles. The estimate powers your pricing behind the scenes, and you decide what your customer sees.
We provide the API. You build the UI. Super Dispatch does not offer a quoting widget or drop-in component, so you call the API and render the response however fits your product.
Build your own quote UI
This is where the integration lives — you map the response onto your own interface. Super Dispatch does not provide a component, so render whatever fits your product.
How it works:
- Send the lane and one or more vehicles to the API.
- Get back a recommended price plus supporting signals.
- Add your margin and any adjustments in your own system.
- Show your customer your quoted price.
Signals for your pricing decision (internal)
These fields help you judge the estimate and set a price. Most brokers keep them internal.
| Signal | Response field |
|---|---|
| Recommended price (anchor) | data.price |
| Price range | data.price_range_lower to data.price_range_upper |
| Confidence score | data.confidence |
| Orders behind the estimate | data.volume |
| Comparable loads | data.recent_moves[] |
Re-request whenever the lane or vehicles change.
What to show your customer
Most brokers keep the signals above internal and show the customer a single, clean number — your quoted price.
Your quoted price = recommended price + your margin. You set your margin in your own system, at your own discretion.
Because the recommended price already reflects the lane and vehicles you send, some customers apply further adjustments for factors such as inoperable vehicles, enclosed transport, or oversized or modified vehicles — again, set in your own system.
The recommended price is an informational estimate. You independently set your own prices and margins at your sole discretion.
The signals are for your decision — not necessarily your customer's screen. Confidence, order volume, and comparable loads help you judge the estimate and price with confidence. Most brokers keep them behind the scenes and show the customer one clean quoted price.
Get a quote
Send a POST to /api/v2/recommended-price with the lane and one or more vehicles — a single request can include multiple vehicles, and the estimate covers the set. Try it below: enter a lane and vehicles to see a sample quote. For a copy-paste walkthrough see Quickstart; for every field definition see the API Reference.
This playground renders sample data to illustrate the response shape and a possible UI — it does not call the live API (your key must stay server-side). The Build it yourself snippets it shows are real.
A minimal starting point — call the API from your backend, then render the response in your own UI.
- curl
- HTML
- CSS
- JavaScript
curl -X POST "https://pricing-insights.superdispatch.com/api/v2/recommended-price" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"trailer_type": "open",
"pickup": { "city": "Los Angeles", "state": "CA", "zip": "90001" },
"delivery": { "city": "Dallas", "state": "TX", "zip": "75201" },
"vehicles": [
{ "type": "sedan", "is_inoperable": false, "make": "Toyota", "model": "Camry", "year": "2019" }
]
}'
<form id="quote-form">
<input name="pickup" placeholder="Pickup ZIP" value="90001" />
<input name="delivery" placeholder="Delivery ZIP" value="75201" />
<select name="trailer_type">
<option value="open">Open</option>
<option value="enclosed">Enclosed</option>
</select>
<select name="vehicle_type">
<option value="sedan">Sedan</option>
<option value="suv">SUV</option>
<option value="van">Van</option>
</select>
<button type="submit">Get quote</button>
</form>
<div id="quote-result" hidden>
<div class="price"></div>
</div>
#quote-form {
display: grid;
gap: 0.5rem;
max-width: 320px;
}
#quote-form input,
#quote-form select,
#quote-form button {
padding: 0.5rem 0.6rem;
font: inherit;
border: 1px solid #d9dbe4;
border-radius: 6px;
}
#quote-form button {
background: #5b63f5;
color: #fff;
border: 0;
cursor: pointer;
}
#quote-result { margin-top: 1rem; }
#quote-result .price { font-size: 2rem; font-weight: 700; }
// Call YOUR backend, which adds the X-API-Key header and forwards the
// request to the Pricing Insights API. Never expose your key in the browser.
const form = document.getElementById("quote-form");
const result = document.getElementById("quote-result");
form.addEventListener("submit", async (event) => {
event.preventDefault();
const data = new FormData(form);
const body = {
trailer_type: data.get("trailer_type"),
pickup: { zip: data.get("pickup") },
delivery: { zip: data.get("delivery") },
vehicles: [
{
type: data.get("vehicle_type"),
is_inoperable: false,
make: "Toyota",
model: "Camry",
year: "2019",
},
],
};
const response = await fetch("/api/quote", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body),
});
const { data: quote } = await response.json();
// Show the customer one clean number — the recommended price. Signals like
// confidence and price_range_* are for your pricing decision, not their screen.
result.hidden = false;
result.querySelector(".price").textContent =
"$" + quote.price.toLocaleString();
});
Errors & limits
Every response uses the same envelope: meta.status is either "success" or "fail". On failure, the response includes a type you can branch on, such as SAME_ZIP_CODES or NO_ROUTE_AVAILABLE. The API allows up to 50 requests per 10 seconds and returns 429 when you exceed that.
See Response Handling for the full envelope and error catalog, and Route Coverage & Limits for supported lanes.