Carrier management operations
- Convert quote to shipment
MVMNT API (1.1.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" }, "errors": [ { … } ] }
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)mode: How the quoted freight movesorder: Order details including stops
- 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)
How the quoted freight moves. Mode sits alongside the order, not inside it, so a quote and the shipment it converts to carry it in the same place.
Not persisted yet, and therefore not required: a quote references its order by id, so the nested order this body accepts has no backing write either. Send it for the shape a converted shipment will use; read it back from the shipment, not from the quote.
Order details (route, freight)
At least origin and destination stops
Whether freight is collected or delivered at this stop. PICKUP and DELIVERY are accepted as aliases and stored as PICK and DROP.
Reference to an existing location. The most complete way to place a stop, and the only one that carries a street address.
Place the stop by postal code when there is no location to reference. Mutually exclusive with location, cityId and airportCode.
Place the stop in a city from the reference catalog. Mutually exclusive with location, postalCode and airportCode.
Place the stop at an airport, for air freight whose origin or destination is a terminal rather than an address. Mutually exclusive with location, postalCode and cityId.
Equipment required for the order. Reference an entry from GET /v1/reference-data/equipment by id, or by key using the equipment name (matched case-insensitively).
- 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"
},
"mode": "FTL",
"order": {
"stops": [
{
"type": "PICK",
"postalCode": "90021",
"requestedStartDate": "2025-01-20"
},
{
"type": "DROP",
"postalCode": "11430",
"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" }