Carrier management operations
- Convert quote to shipment
MVMNT API (1.0.0)
The MVMNT API enables you to automate freight brokerage workflows by integrating directly with our Transportation Management System.
Postman setup guide: API Clients.
OAuth 2.0 client credentials flow. See Authentication Guide for details.
Headers:
Content-Type: application/x-www-form-urlencodedBody Parameters:
grant_type=client_credentials
client_id=YOUR_CLIENT_ID
client_secret=YOUR_CLIENT_SECRETcurl -X POST https://api.mvmnt.io/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET"Status: 200 OK
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600
}Response Fields:
access_token: JWT Bearer token to use for API requeststoken_type: AlwaysBearerexpires_in: Token lifetime in seconds (3600 = 1 hour)
Mutating requests (POST, PATCH, DELETE) accept an optional Idempotency-Key header (up to 255 characters). Retrying a request with the same key and the same body returns the original result instead of repeating the operation; reusing a key with a different body fails. Keys are scoped to your organization — keys chosen by other tenants can never collide with yours. Use a stable identifier from your system (for example your own record id plus the action) rather than a random value per attempt.
Reference Data
Read-only catalogs (equipment, charge codes, special requirements) referenced by id from other resources.
Every catalog also answers on its short top-level path, so GET /v1/charge-codes and GET /v1/reference-data/charge-codes are the same endpoint. The documented /reference-data/* form is canonical — it keeps the catalogs grouped here as more are added (port codes, cities, zip codes) — and the short form is a convenience alias.
Request
Search for quotes using filter criteria.
- Active quotes:
{ "filter": { "status": { "in": ["DRAFT", "REQUESTED", "QUOTED"] } } } - Won quotes:
{ "filter": { "status": { "equalTo": "WON" } } } - By customer:
{ "filter": { "customerId": { "equalTo": "uuid" } } } - Expiring soon:
{ "filter": { "expiresAt": { "lessThanOrEqualTo": "2025-01-20T00:00:00Z" } } }
- Productionhttps://api.mvmnt.io/v1/quotes/filter
- Demo (non-production)https://api.demo.mvmnt.io/v1/quotes/filter
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://api.mvmnt.io/v1/quotes/filter \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"filter": {
"status": {
"in": [
"DRAFT",
"REQUESTED",
"QUOTED"
]
}
},
"pageSize": 50
}'Quotes matching filter criteria
Quote direction.
SELL: Selling to shipper (customer quote)BUY: Buying from carrier (carrier quote)
Current status in the quote lifecycle.
Initial states:
CREATED: Quote being built (not yet drafted)NOT_A_QUOTE: Marked as not an actual quoteDRAFT: Quote being draftedREQUESTED: Customer requested a quote (needs pricing)
Active states:
QUOTED: Price sent to customerRECEIVED_REPLY: Received reply from customerSENT_REPLY: Sent reply to customerRECEIVED_COUNTER: Received counter-offerSENT_COUNTER: Sent counter-offer
Final states:
WON: Customer accepted the quoteLOST: Quote not acceptedPASS: Broker declined to quoteCANCELED: Quote canceled
Why the quote was lost
Reason why the quote was lost.
EXPIRED: Quote expired without responseNO_REASON: No specific reason givenNO_RESPONSE: Customer didn't respondTOO_HIGH: Price was too highTOO_SLOW: Response was too slowTRUCK_NOT_AVAILABLE: Capacity not availableWITHDRAWN: The offer was withdrawn before it was acceptedOTHER: Other reason (see lostReasonText)
{ "data": [ { … } ], "pagination": { "pageSize": 50, "hasNextPage": true, "hasPreviousPage": false, "endCursor": "eyJpZCI6IjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMCJ9" } }
Request
Create a new quote with order details.
Creating a quote also creates an associated Order containing the route and freight details. The Order is embedded in the Quote and cannot be managed separately.
customer: Reference to the customer (shipper profile)order: Order details including stops and mode
- Create quote with customer and order details
- Add pricing (amount) via PATCH
- Send to customer (status changes to QUOTED)
- Convert to shipment when accepted (POST /quotes/{id}/convert-to-shipment)
Order details (route, freight)
Transportation mode. Optional on write — a shipment or load created without one is stored with no mode, the same as one created in the TMS.
FTL: Full Truckload — the value the TMS stores and always returnsTL: legacy spelling ofFTL, still accepted on write, never returnedLTL: Less than TruckloadPTL: Partial TruckloadRLTL: Retail LTLAUTO: Auto transportEXPEDITED_AIR: Expedited airEXPEDITED_GROUND: Expedited groundAIR: Air freightOCEAN: Ocean freightRAIL: Rail freightINTERMODAL: Intermodal (multiple modes)DRAYAGE: Drayage/cartage
At least origin and destination stops
- Productionhttps://api.mvmnt.io/v1/quotes
- Demo (non-production)https://api.demo.mvmnt.io/v1/quotes
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://api.mvmnt.io/v1/quotes \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"customer": {
"id": "550e8400-e29b-41d4-a716-446655440000"
},
"order": {
"mode": "FTL",
"stops": [
{
"type": "PICKUP",
"address": {
"line1": "123 Warehouse Ave",
"city": "Los Angeles",
"country": "US",
"market": "LAX"
},
"requestedStartDate": "2025-01-20"
},
{
"type": "DELIVERY",
"address": {
"line1": "456 Distribution Center",
"city": "New York",
"country": "US",
"market": "JFK"
},
"requestedStartDate": "2025-01-25"
}
],
"freight": {
"handlingUnitQuantity": 10,
"handlingUnitType": "PALLET",
"weight": 15000
}
},
"amount": 2500,
"expiresAt": "2025-01-18T23:59:59Z"
}'Quote created successfully
Quote direction.
SELL: Selling to shipper (customer quote)BUY: Buying from carrier (carrier quote)
Current status in the quote lifecycle.
Initial states:
CREATED: Quote being built (not yet drafted)NOT_A_QUOTE: Marked as not an actual quoteDRAFT: Quote being draftedREQUESTED: Customer requested a quote (needs pricing)
Active states:
QUOTED: Price sent to customerRECEIVED_REPLY: Received reply from customerSENT_REPLY: Sent reply to customerRECEIVED_COUNTER: Received counter-offerSENT_COUNTER: Sent counter-offer
Final states:
WON: Customer accepted the quoteLOST: Quote not acceptedPASS: Broker declined to quoteCANCELED: Quote canceled
Why the quote was lost
Reason why the quote was lost.
EXPIRED: Quote expired without responseNO_REASON: No specific reason givenNO_RESPONSE: Customer didn't respondTOO_HIGH: Price was too highTOO_SLOW: Response was too slowTRUCK_NOT_AVAILABLE: Capacity not availableWITHDRAWN: The offer was withdrawn before it was acceptedOTHER: Other reason (see lostReasonText)
{ "id": "550e8400-e29b-41d4-a716-446655440000", "friendlyId": "Q003602", "key": "my-quote-001", "side": "SELL", "status": "CREATED", "amount": 2500, "target": 2200, "margin": 12, "expiresAt": "2019-08-24T14:15:22Z", "customer": { "id": "550e8400-e29b-41d4-a716-446655440000", "key": "ERP-CUSTOMER-ACME", "name": "Acme Manufacturing Corp", "friendlyId": "A123456", "status": "ACTIVE", "phoneNumber": "+1-555-123-4567", "website": "https://acme-manufacturing.com", "createdAt": "2025-01-15T10:00:00Z", "updatedAt": "2025-01-15T14:30:00Z", "deletedAt": null }, "carrier": { "id": "550e8400-e29b-41d4-a716-446655440000", "key": "ERP-CARRIER-SWIFT", "name": "Swift Transportation", "phoneNumber": "+1-555-987-6543", "email": "dispatch@swifttrans.com", "createdAt": "2025-01-15T10:00:00Z", "updatedAt": "2025-01-15T14:30:00Z", "deletedAt": null }, "order": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "key": "string", "mode": "FTL", "origin": { … }, "destination": { … }, "pickUpDate": "2019-08-24", "deliveryDate": "2019-08-24", "equipment": [ … ], "weight": 0, "mileage": 0 }, "lostReason": "EXPIRED", "lostReasonText": "string", "closedTime": "2019-08-24T14:15:22Z", "assignee": { "id": "550e8400-e29b-41d4-a716-446655440000", "key": "ERP-USER-12345", "email": "john.doe@example.com", "name": "John Doe", "phone": "+1-555-123-4567", "phoneExt": "123", "status": "ACTIVE", "avatarId": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "createdAt": "2025-01-15T10:00:00Z", "updatedAt": "2025-01-15T14:30:00Z", "deletedAt": null }, "shipmentId": "47efd5a2-af91-4417-950a-7f546cd1b5cf", "shipmentKey": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }
- Productionhttps://api.mvmnt.io/v1/quotes/{id}
- Demo (non-production)https://api.demo.mvmnt.io/v1/quotes/{id}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://api.mvmnt.io/v1/quotes/550e8400-e29b-41d4-a716-446655440000?by=key' \
-H 'Authorization: Bearer <YOUR_JWT_HERE>'Quote retrieved successfully
Quote direction.
SELL: Selling to shipper (customer quote)BUY: Buying from carrier (carrier quote)
Current status in the quote lifecycle.
Initial states:
CREATED: Quote being built (not yet drafted)NOT_A_QUOTE: Marked as not an actual quoteDRAFT: Quote being draftedREQUESTED: Customer requested a quote (needs pricing)
Active states:
QUOTED: Price sent to customerRECEIVED_REPLY: Received reply from customerSENT_REPLY: Sent reply to customerRECEIVED_COUNTER: Received counter-offerSENT_COUNTER: Sent counter-offer
Final states:
WON: Customer accepted the quoteLOST: Quote not acceptedPASS: Broker declined to quoteCANCELED: Quote canceled
Why the quote was lost
Reason why the quote was lost.
EXPIRED: Quote expired without responseNO_REASON: No specific reason givenNO_RESPONSE: Customer didn't respondTOO_HIGH: Price was too highTOO_SLOW: Response was too slowTRUCK_NOT_AVAILABLE: Capacity not availableWITHDRAWN: The offer was withdrawn before it was acceptedOTHER: Other reason (see lostReasonText)
{ "id": "550e8400-e29b-41d4-a716-446655440000", "friendlyId": "Q003602", "key": "my-quote-001", "side": "SELL", "status": "CREATED", "amount": 2500, "target": 2200, "margin": 12, "expiresAt": "2019-08-24T14:15:22Z", "customer": { "id": "550e8400-e29b-41d4-a716-446655440000", "key": "ERP-CUSTOMER-ACME", "name": "Acme Manufacturing Corp", "friendlyId": "A123456", "status": "ACTIVE", "phoneNumber": "+1-555-123-4567", "website": "https://acme-manufacturing.com", "createdAt": "2025-01-15T10:00:00Z", "updatedAt": "2025-01-15T14:30:00Z", "deletedAt": null }, "carrier": { "id": "550e8400-e29b-41d4-a716-446655440000", "key": "ERP-CARRIER-SWIFT", "name": "Swift Transportation", "phoneNumber": "+1-555-987-6543", "email": "dispatch@swifttrans.com", "createdAt": "2025-01-15T10:00:00Z", "updatedAt": "2025-01-15T14:30:00Z", "deletedAt": null }, "order": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "key": "string", "mode": "FTL", "origin": { … }, "destination": { … }, "pickUpDate": "2019-08-24", "deliveryDate": "2019-08-24", "equipment": [ … ], "weight": 0, "mileage": 0 }, "lostReason": "EXPIRED", "lostReasonText": "string", "closedTime": "2019-08-24T14:15:22Z", "assignee": { "id": "550e8400-e29b-41d4-a716-446655440000", "key": "ERP-USER-12345", "email": "john.doe@example.com", "name": "John Doe", "phone": "+1-555-123-4567", "phoneExt": "123", "status": "ACTIVE", "avatarId": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "createdAt": "2025-01-15T10:00:00Z", "updatedAt": "2025-01-15T14:30:00Z", "deletedAt": null }, "shipmentId": "47efd5a2-af91-4417-950a-7f546cd1b5cf", "shipmentKey": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }
Request
Update quote fields including status changes.
Status changes use this endpoint (not separate action endpoints):
- Set to QUOTED:
{ "status": "QUOTED", "amount": 2500 } - Set to WON:
{ "status": "WON" } - Set to LOST:
{ "status": "LOST", "lostReason": "TOO_HIGH" }
- When setting
statustoLOST,lostReasonis required - When
lostReasonisOTHER,lostReasonTextis required
To convert a won quote to a shipment, use POST /quotes/{id}/convert-to-shipment
Current status in the quote lifecycle.
Initial states:
CREATED: Quote being built (not yet drafted)NOT_A_QUOTE: Marked as not an actual quoteDRAFT: Quote being draftedREQUESTED: Customer requested a quote (needs pricing)
Active states:
QUOTED: Price sent to customerRECEIVED_REPLY: Received reply from customerSENT_REPLY: Sent reply to customerRECEIVED_COUNTER: Received counter-offerSENT_COUNTER: Sent counter-offer
Final states:
WON: Customer accepted the quoteLOST: Quote not acceptedPASS: Broker declined to quoteCANCELED: Quote canceled
Reason why the quote was lost.
EXPIRED: Quote expired without responseNO_REASON: No specific reason givenNO_RESPONSE: Customer didn't respondTOO_HIGH: Price was too highTOO_SLOW: Response was too slowTRUCK_NOT_AVAILABLE: Capacity not availableWITHDRAWN: The offer was withdrawn before it was acceptedOTHER: Other reason (see lostReasonText)
- Productionhttps://api.mvmnt.io/v1/quotes/{id}
- Demo (non-production)https://api.demo.mvmnt.io/v1/quotes/{id}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X PATCH \
'https://api.mvmnt.io/v1/quotes/550e8400-e29b-41d4-a716-446655440000?by=key' \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"status": "QUOTED",
"amount": 2500
}'Quote updated successfully
Quote direction.
SELL: Selling to shipper (customer quote)BUY: Buying from carrier (carrier quote)
Current status in the quote lifecycle.
Initial states:
CREATED: Quote being built (not yet drafted)NOT_A_QUOTE: Marked as not an actual quoteDRAFT: Quote being draftedREQUESTED: Customer requested a quote (needs pricing)
Active states:
QUOTED: Price sent to customerRECEIVED_REPLY: Received reply from customerSENT_REPLY: Sent reply to customerRECEIVED_COUNTER: Received counter-offerSENT_COUNTER: Sent counter-offer
Final states:
WON: Customer accepted the quoteLOST: Quote not acceptedPASS: Broker declined to quoteCANCELED: Quote canceled
Why the quote was lost
Reason why the quote was lost.
EXPIRED: Quote expired without responseNO_REASON: No specific reason givenNO_RESPONSE: Customer didn't respondTOO_HIGH: Price was too highTOO_SLOW: Response was too slowTRUCK_NOT_AVAILABLE: Capacity not availableWITHDRAWN: The offer was withdrawn before it was acceptedOTHER: Other reason (see lostReasonText)
{ "id": "550e8400-e29b-41d4-a716-446655440000", "friendlyId": "Q003602", "key": "my-quote-001", "side": "SELL", "status": "CREATED", "amount": 2500, "target": 2200, "margin": 12, "expiresAt": "2019-08-24T14:15:22Z", "customer": { "id": "550e8400-e29b-41d4-a716-446655440000", "key": "ERP-CUSTOMER-ACME", "name": "Acme Manufacturing Corp", "friendlyId": "A123456", "status": "ACTIVE", "phoneNumber": "+1-555-123-4567", "website": "https://acme-manufacturing.com", "createdAt": "2025-01-15T10:00:00Z", "updatedAt": "2025-01-15T14:30:00Z", "deletedAt": null }, "carrier": { "id": "550e8400-e29b-41d4-a716-446655440000", "key": "ERP-CARRIER-SWIFT", "name": "Swift Transportation", "phoneNumber": "+1-555-987-6543", "email": "dispatch@swifttrans.com", "createdAt": "2025-01-15T10:00:00Z", "updatedAt": "2025-01-15T14:30:00Z", "deletedAt": null }, "order": { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "key": "string", "mode": "FTL", "origin": { … }, "destination": { … }, "pickUpDate": "2019-08-24", "deliveryDate": "2019-08-24", "equipment": [ … ], "weight": 0, "mileage": 0 }, "lostReason": "EXPIRED", "lostReasonText": "string", "closedTime": "2019-08-24T14:15:22Z", "assignee": { "id": "550e8400-e29b-41d4-a716-446655440000", "key": "ERP-USER-12345", "email": "john.doe@example.com", "name": "John Doe", "phone": "+1-555-123-4567", "phoneExt": "123", "status": "ACTIVE", "avatarId": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "createdAt": "2025-01-15T10:00:00Z", "updatedAt": "2025-01-15T14:30:00Z", "deletedAt": null }, "shipmentId": "47efd5a2-af91-4417-950a-7f546cd1b5cf", "shipmentKey": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z" }
- Productionhttps://api.mvmnt.io/v1/quotes/{id}
- Demo (non-production)https://api.demo.mvmnt.io/v1/quotes/{id}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X DELETE \
'https://api.mvmnt.io/v1/quotes/550e8400-e29b-41d4-a716-446655440000?by=key' \
-H 'Authorization: Bearer <YOUR_JWT_HERE>'Request
Convert an accepted quote into a shipment.
- Quote status is set to WON (if not already)
- A new Shipment is created
- The Order from the quote is linked to the shipment
- Optionally, additional orders can be added
- Quote must be in QUOTED or WON status
- Quote cannot already have a shipment
Returns the IDs of both the quote and the newly created shipment.
- Productionhttps://api.mvmnt.io/v1/quotes/{id}/convert-to-shipment
- Demo (non-production)https://api.demo.mvmnt.io/v1/quotes/{id}/convert-to-shipment
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
'https://api.mvmnt.io/v1/quotes/550e8400-e29b-41d4-a716-446655440000/convert-to-shipment?by=key' \
-H 'Authorization: Bearer <YOUR_JWT_HERE>' \
-H 'Content-Type: application/json' \
-d '{}'{ "quoteId": "550e8400-e29b-41d4-a716-446655440000", "quoteStatus": "WON", "shipmentId": "660e8400-e29b-41d4-a716-446655440001", "shipmentKey": "SHP-12345", "orderId": "770e8400-e29b-41d4-a716-446655440002" }