Revenova TMS Web Services Guide

Prev Next

Revenova TMS can act as a back-end TMS for a front-end customer portal or other TMS.  Any web service-capable UI client software can connect to the Revenova TMS.

This guide is intended for developers who want to integrate their front-end portal or TMS to the Revenova TMS.

API-based LTL Loads can be created, quoted, tendered, and tracked and using the following JSON-based, RESTful web services.

Web Service Setup – Revenova TMS Administrator

  1. The Salesforce user accounts that invoke the API should be associated with API-only, Partner Community profiles with API Enabled.

  2. Make sure all Sharing Settings are appropriate for each API user/profile.

  3. Set the Login IP Ranges for each API profile to prevent unauthorized endpoints from accessing the API.

  4. Each web service request from a client UI is counted against the org limits for inbound API calls.

  5. Change the password for all API users on a periodic basis, proactively informing API users ahead of time.

Revenova Web Service User Setup

Perform the following steps to set up customer-specific API users for the Revenova Web Service.

Community users (Customer Portal and/or Email Loop users) that require access to Web Services require additional setup instructions. If creating a standard TMS API user, skip the steps for 2a and 2b.

  1. Clone the Partner Community security profile and name the new security profile. For example, “Company Community API User.”

  2. Add the cloned security profile to the Member profiles for the current partner community.

    1. Customer Community users (accessing the Revenova Web Services from a Customer Portal or Email Loop) require additional setup. Complete the following setup steps as necessary.

      1. Navigate to the Account and create a Contact record for each Customer Community User.

      2. From the Contact record, choose the dropdown and select Enable Customer User.

        1. If the Enable Customer User button is not available, add the button to the Contact page layout with the following steps.

          1. From Setup → Object Manager, choose the Contact object.

          2. On the Page Layouts tab, select the preferred layout.

          3. Choose the Mobile & Lightning Actions option and add the Enable Customer User action to the Salesforce Mobile and Lightning Experience Actions section.

      3. From the User layout, select the Customer Community Plus Login User License. Enter any additional required fields.

      4. Click Save.

    2. Enable the Profiles for the members of the Community.

      1. From Setup, search for and select All Sites.

      2. Select the Workspaces link for the appropriate Community Site. Repeat for multiple Customer Portal and/or Email Loop Communities.

      3. Choose the Members tab.

        1. Under the Select Profiles section, select the All option.

        2. Choose the cloned profile created above and Add it to the Select Profiles section.

        3. Click Save.

  3. Confirm the profile contains each of the following values. All Administrative and General User permissions checkboxes should be Unchecked except for the following fields.

    1. Apex REST Services

    2. API Enabled

    3. Api Only User (Only for TMS API Users)

      Community users should not Check the Api Only User box. This field is only Checked for the TMS API User(s).

  4. For each API User complete the following.

    1. Temporarily Uncheck the API Only User checkbox on the security profile.

    2. Create/Community Enable the Account, Contact, and User records using the profile above, setting the email to yourself.

    3. Respond to the portal welcome email and change/note the password.

    4. Re-Check the API Only User checkbox on the security profile.

    5. Add a TMS license to the new user.

      1. Community users operate with the Customer Community Plus Login license.

    6. Update any sharing rules, validations, role assignments, etc. needed to establish the user’s access rights.  

      1. These values are usually identical to the settings for the Partner Community non-API users.

    7. Obtain and add the IP address ranges of the calling process to the security profile IP whitelist.

    8. Send the developer invoking the API the credentials and key org information. An example is provided below.

  • ID:  xxxx@email.com

  • PW:  xxxxx11223344

  • ORG ID:  00D1I000000ndNs

  • Login URL:   https://login.salesforce.com/services/Soap/c/42.0

  • Services URL:  https://na73.salesforce.com/

There is a packaged TMS Web Service permission set that provides access to all web services. Use caution if using this permission set and set object/field security as necessary.

Web Service Notes -- Client TMS/UI

  1. Authentication is performed via a SOAP-based login service.  

  2. Do not hard-code the credentials or URLs provided for access to the service as they may change.

  3. All subsequent calls are REST/JSON-based with a session token returned from the login service.

  4. If a load is updated, all related quotes are deleted, and the load will need to be requoted.

  5. Tendered loads cannot be updated (via the API).

  6. Tendered loads cannot be re-tendered (via the API).

  7. Loads cannot be deleted (via the API).

  8. The primary key data type for all TMS objects is an 18-character alphanumeric string field.  For example, the “loadId” element.

  9. Customer-specific credit limits are enforced and can prevent load tendering.

  10. Please provide the Revenova TMS administrator with the IP address (range) of the web service client.

The TMSRateIQService must be accessed by an internal user ID with credentials for the Load Boards used in the RateIQ calculation definition.

Additionally, Read access for Rate Calculation and Rate Calculation Rules must be provided for all TMSRateIQService users.

Rate Calculations

Rate Calculation Rules

Prerequisites

The following information is provided by a Revenova TMS administrator:

  • 15-character Org Id

  • Salesforce domain URL for the Org

  • Login username

  • Login password

Authentication

Access to any of the REST web services first requires authentication. Authentication provides a session token that must be passed as an HTTP header parameter with all subsequent web services calls.

Although data is accessed via RESTful JSON-based web services, authentication requires a login API call via a SOAP/XML authentication service.

Example Request

HTTP Type: POST

The URL for the login services includes the following:

  • Test: https://test.salesforce.com/services/Soap/c/42.0

  • Production: https://login.salesforce.com/services/Soap/c/42.0

Required headers:

The raw body of the POST is shown below.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:urn="urn:enterprise.soap.sforce.com">
   <soapenv:Header>
       <urn:LoginScopeHeader>
           <urn:organizationId>[15-character org ID]</urn:organizationId>
       </urn:LoginScopeHeader>
   </soapenv:Header>
   <soapenv:Body>
      <urn:login>
         <urn:username>[user login name]</urn:username>
         <urn:password>[user password]</urn:password>
      </urn:login>
   </soapenv:Body>
</soapenv:Envelope>

Example Response

Parse out the <sessionId> element and use that value in the header of all subsequent transactions.

  • “Authorization” “Bearer [session Id]

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <loginResponse>
         <result>
            <metadataServerUrl>https://cs95.salesforce.com/services/Soap/m/42.0/00D0x0000000OgX</metadataServerUrl>
            <passwordExpired>false</passwordExpired>
            <sandbox>true</sandbox>
            <serverUrl>https://cs95.salesforce.com/services/Soap/c/42.0/00D0x0000000OgX</serverUrl>
            <sessionId>00D0x0000000OgX!ARUAahsbu6NwZXuNPCCRLXVuPagWqOneIt1gI4pz_Pnuxh5PNuER0c3y835CfFqVOUwzcxrPRvl7aC6sZdNXsscBUg.8Sc4Iz</sessionId>
            <userId>00541000002ap4jAAA</userId>
            <userInfo>
               <accessibilityMode>false</accessibilityMode>
               <chatterExternal>false</chatterExternal>
               <currencySymbol xsi:nil="true"/>
               <orgAttachmentFileSizeLimit>5242880</orgAttachmentFileSizeLimit>
               <orgDefaultCurrencyIsoCode xsi:nil="true"/>
               <orgDefaultCurrencyLocale xsi:nil="true"/>
               <orgDisallowHtmlAttachments>false</orgDisallowHtmlAttachments>
               <orgHasPersonAccounts>false</orgHasPersonAccounts>
               <organizationId>00D0x0dd0000OgXEAU</organizationId>
               <organizationMultiCurrency>true</organizationMultiCurrency>
               <organizationName>MC1</organizationName>
               <profileId>00e4100ds00wJ3UAAU</profileId>
               <roleId>00E410000dde1dBEAQ</roleId>
               <sessionSecondsValid>7200</sessionSecondsValid>
               <userDefaultCurrencyIsoCode>CAD</userDefaultCurrencyIsoCode>
               <userEmail>dtralio7@revenova.com</userEmail>
               <userFullName>Dave Revenova</userFullName>
               <userId>005410048402ap4jAAA</userId>
               <userLanguage>en_US</userLanguage>
               <userLocale>en_US</userLocale>
               <userName>mc1portal@revenova.com.partial1</userName>
               <userTimeZone>America/Chicago</userTimeZone>
               <userType>PowerPartner</userType>
               <userUiSkin>Theme3</userUiSkin>
            </userInfo>
         </result>
      </loginResponse>
   </soapenv:Body>
</soapenv:Envelope>

A web service call example showing headers set properly. Note that calls are using REST/JSON.

Note that if the session token expires or is invalid, an error message is received.

[
    {
        "message": "Session expired or invalid",
        "errorCode": "INVALID_SESSION_ID"
    }
]

TMSLoadService

This service allows users to complete the following actions.

  • Get the details of an existing load.

  • Create a new load.

  • Update an existing load.

The response body to a Get a Load call is largely identical to the request body of a Create a Load or Update a Load calls. This greatly simplifies testing, cloning, etc.

Get a Load

Example Request

HTTP Type: GET

URL: [salesforce domain]/services/apexrest/rtms/tmsloadservice/[18-character load Id]

Example URL: https://cs95.salesforce.com/services/apexrest/rtms/tmsloadservice/a0i0x000080BUgeAAG

Example Response

{
    "weightUnits": "lbs",
    "volumeUnits": null,
    "trackingProvider": null,
    "trackingProviderCustomer": null,
    "trackingNumber": null,
    "trackingNumberCustomer": null,
    "totalWeight": 1000,
    "totalVolume": null,
    "tenderAcceptedDate": "2018-04-19T14:00:58.000Z",
    "Stops": [
        {
            "stopStatus": "En Route",
            "stopNumber": 1,
            "shippingReceivingHours": "10:00-20:00",
            "shippingContact": {
                "phone": "(312) 555-1919",
                "lastName": "Catheter R",
                "firstName": "Dave",
                "email": "dtralio7@revenova.com"
            },
            "references": "Carrier Pickup Number: 1524146458446",
            "pickupDeliveryNumber": "1234567",
            "milesAway": 173.227,
            "location": {
                "shippingStateProvince": "IN",
                "shippingPostalCode": "46278",
                "shippingCountry": "US",
                "shippingCity": "Indianapolis",
                "shippingAddress": "6102 Victory Way",
                "companyName": "Catheter Research, Inc. (CRI)"
            },
            "kilometersAway": 278.781919336435076628938267154405,
            "isPickup": true,
            "isGeolocation": false,
            "isDropOff": false,
            "instructions": null,
            "expectedDate": "2018-04-19",
            "departureTime": null,
            "departureDate": null,
            "cumulativeMiles": 0,
            "carrierStatusComments": null,
            "carrierStatusAsOf": "2018-04-19T14:01:06.000Z",
            "carrierStatus": "No Issues",
            "carrierEtaTime": "04:15",
            "carrierEtaDate": "2018-04-19",
            "arrivalTime": null,
            "arrivalStatus": "On Schedule 173mi / 279km away",
            "arrivalDate": null,
            "appointmentTime": "10:00",
            "appointmentRequired": true,
            "address": "6102 Victory Way, Indianapolis, Indiana 46278"
        },
        {
            "stopStatus": null,
            "stopNumber": 2,
            "shippingReceivingHours": "10:00-20:00",
            "shippingContact": {
                "phone": "(312) 555-1919",
                "lastName": "Cardinal H",
                "firstName": "Dave",
                "email": "dtralio7@revenova.com"
            },
            "references": null,
            "pickupDeliveryNumber": null,
            "milesAway": 360.46,
            "location": {
                "shippingStateProvince": "OH",
                "shippingPostalCode": "43017",
                "shippingCountry": "US",
                "shippingCity": "Dublin",
                "shippingAddress": "7000 Cardinal Place",
                "companyName": "Cardinal Health"
            },
            "kilometersAway": 580.104317710353395958292227992616,
            "isPickup": false,
            "isGeolocation": false,
            "isDropOff": true,
            "instructions": null,
            "expectedDate": null,
            "departureTime": null,
            "departureDate": null,
            "cumulativeMiles": 187.232,
            "carrierStatusComments": null,
            "carrierStatusAsOf": null,
            "carrierStatus": null,
            "carrierEtaTime": null,
            "carrierEtaDate": null,
            "arrivalTime": null,
            "arrivalStatus": "On Schedule 360mi / 580km away",
            "arrivalDate": null,
            "appointmentTime": "22:00",
            "appointmentRequired": false,
            "address": "7000 Cardinal Place, Dublin, Ohio 43017"
        }
    ],
    "stateLane": "IN:OH",
    "shipToAddress": "7000 Cardinal Place, Dublin, Ohio 43017",
    "shipStatus": "On Schedule 173mi / 279km away",
    "shipFromAddress": "6102 Victory Way, Indianapolis, Indiana 46278",
    "scheduleStatus": "On Schedule",
    "proNumber": null,
    "poNumber": null,
    "podReceived": false,
    "otherInstructions": null,
    "origin": "Indianapolis, Indiana",
    "orderNumber": null,
    "orderDate": "2018-04-19",
    "modeName": "LTL",
    "loadStatusComments": null,
    "loadStatus": "Dispatched",
    "loadPostingDescription": "Hello",
    "loadNumber": "Load-101699",
    "loadId": "a0i0x0000014APkAAM",
    "LineItems": [
        {
            "weightUnits": "lbs",
            "weight": 1000,
            "volumeUnits": null,
            "volume": null,
            "turnable": false,
            "stackable": false,
            "scheduleBCode": "1910.10.2000",
            "pickupStopNumber": 1,
            "packagingUnits": "Cartons",
            "packagingUnitCount": 20,
            "nmfcNumber": "21652-10",
            "nmfcClass": "55",
            "linearFeet": 10,
            "itemNumber": "Item",
            "itemDescription": "Fooda",
            "htsCode": "1910.10.2000",
            "hsCode": "1910.10",
            "hazMatPackingGroup": null,
            "hazMatNumber": null,
            "hazMatContact": null,
            "hazMatClassDivision": null,
            "hazardousMaterials": false,
            "handlingUnitWidth": 44,
            "handlingUnits": "Pallets",
            "handlingUnitLength": 44,
            "handlingUnitHeight": 44,
            "handlingUnitCount": 2,
            "dimensionUnits": "in",
            "deliveryStopNumber": 2
        }
    ],
    "linearFeet": 10,
    "lastReportedState": "IL",
    "lastReportedLongitude": -87.65139,
    "lastReportedLatitude": 41.874372,
    "lastReportedCountry": "US",
    "lastReportedCity": "Chicago",
    "lastModifiedDate": "2018-04-19T14:01:22.000Z",
    "hazardousMaterials": false,
    "expectedShipDate": "2018-04-19",
    "expectedDeliveryDate": null,
    "distanceMiles": 187,
    "distanceKilometers": 301,
    "destination": "Dublin, Ohio",
    "deliveryStatus": "On Schedule 360mi / 580km away",
    "currencyCode": "USD",
    "createdDate": "2018-04-19T13:17:14.000Z",
    "containerTrailerNumber": "MAEU1234567",
    "cityLane": "Indianapolis, IN:Dublin, OH",
    "carrierUploads": null,
    "carrier": "Estes Express",
    "cargoValue": 20000,
    "bookingNumber": null,
    "billOfLadingNumber": "1459695004",
    "apiLoadId": null,
    "Accessorials": [
        {
            "stopNumber": 1,
            "accessorialName": "Lift Gate Pick Up",
            "accessorialId": "a01410000069DXmAAM"
        },
        {
            "stopNumber": 2,
            "accessorialName": "Lift Gate Delivery",
            "accessorialId": "a01410000069DXlAAM"
        }
    ]
}

Create a Load

Example Request

HTTP Type: POST

URL: [salesforce domain]/services/apexrest/rtms/tmsloadservice

Example URL: https://cs95.salesforce.com/services/apexrest/rtms/tmsloadservice

The request body is largely identical to both the GET response and the response body (except no loadId element should be passed in this request). Optional parameters do not need to be passed. Make sure that only one of IsPickup and isDropoff is true for a stop. Accessorials are optional, of course.

Here is a “minimal” new load creation request body with two accessorials. Make sure to pass “Temp Load Name” for the loadNumber.

The streamQuotes field must be set to True to use the enhancements introduced in the Spring ‘25 release. This feature is backwards-compatible and no changes are required to continue to use the TMSLoadService.

{ "wsl" :
  {
    "weightUnits": "lbs",
    "totalWeight": 1000,
    "temperatureControlled": false,
    "streamQuotes": true,
    "Stops": [
        {
            "stopNumber": 1,
            "shippingReceivingHours": "09:00-22:00",
            "shippingContact": {
                "phone": "(312) 555-1919",
                "lastName": "Ardmore Po",
                "firstName": "Dave",
                "email": "dtralio7@revenova.com"
            },
            "location": {
                "shippingStateProvince": "OH",
                "shippingPostalCode": "44145",
                "shippingCountry": "US",
                "shippingCity": "Westlake",
                "shippingAddress": "24610 Detroit Road Suite 1200",
                "companyName": "Ardmore Power Logistics, LLC"
            },
            "isPickup": true,
            "isDropOff": false,
            "isGeolocation": false,
            "expectedDate": "2018-04-18",
            "appointmentTime": null,
            "appointmentRequired": false
        },
        {
            "stopNumber": 2,
            "shippingReceivingHours": "09:00-22:00",
            "shippingContact": {
                "phone": "(312) 555-1919",
                "lastName": "Awardco Fr",
                "firstName": "Dave",
                "email": "dtralio7@revenova.com"
            },
            "location": {
                "shippingStateProvince": "TX",
                "shippingPostalCode": "77379",
                "shippingCountry": "US",
                "shippingCity": "Spring",
                "shippingAddress": "18118 Strack Drive",
                "companyName": "Awardco Freight Management Group, Inc."
            },
            "isPickup": false,
            "isDropOff": true,
            "isGeolocation": false,
            "expectedDate": null,
            "appointmentTime": null,
            "appointmentRequired": false
        }
    ],
    "proNumber": null,
    "poNumber": null,
    "orderDate": "2018-04-18",
    "modeName": "LTL",
    "loadPostingDescription": "Hello",
    "loadNumber": "Temp Load Name",
    "LineItems": [
        {
            "weightUnits": "lbs",
            "weight": 1000,
            "stackable": false,
            "turnable": false,
            "scheduleBCode": null,
            "pickupStopNumber": 1,
            "packagingUnits": null,
            "packagingUnitCount": null,
            "nmfcNumber": null,
            "nmfcClass": "50",
            "linearFeet": null,
            "itemNumber": "Item",
            "itemDescription": "Fooda",
            "htsCode": null,
            "hsCode": null,
            "hazMatPackingGroup": null,
            "hazMatNumber": null,
            "hazMatContact": null,
            "hazMatClassDivision": null,
            "hazardousMaterials": false,
            "handlingUnitWidth": 44,
            "handlingUnits": "Pallets",
            "handlingUnitLength": 44,
            "handlingUnitHeight": 44,
            "handlingUnitCount": 2,
            "dimensionUnits": "in",
            "deliveryStopNumber": 2
        }
    ],
    "linearFeet": null,
    "hazardousMaterials": false,
    "distanceMiles": 1291,
    "distanceKilometers": 2078,
    "cargoValue": 20000,
    "containerTrailerNumber": "MAEU1234567",
    "billOfLadingNumber": null,
    "Accessorials": [
        {
            "stopNumber": 1,
            "accessorialName": "Lift Gate Pick Up",
            "accessorialId": "a014100000634tfAAA"
        },
        {
            "stopNumber": 2,
            "accessorialName": "Lift Gate Delivery",
            "accessorialId": "a014100000634teAAA"
        }
    ]
  }
}

Required fields to create and tender a “minimal” new load with two accessorials.

Field

Required to Create Load

Required to Tender Load

weightUnits

Yes

--

totalWeight

Yes

--

temperatureControlled

Yes

--

streamquotes

No

No

Stops (array)

Yes

--

stopNumber

Yes (Stop 1, Stop 2, Accessorials)

--

shippingReceivingHours

--

Yes (Stop 1 & Stop 2)

shippingContact

--

Yes (Stop 1 & Stop 2)

phone

--

Yes (Stop 1 & Stop 2)

lastName

--

Yes (Stop 1 & Stop 2)

firstName

--

Yes (Stop 1 & Stop 2)

Email

--

Yes (Stop 1 & Stop 2)

shippingStateProvince

Yes (Stop 1 & Stop 2)

--

shippingPostalCode

Yes (Stop 1 & Stop 2)

--

shippingCountry

Yes (Stop 1 & Stop 2)

--

shippingCity

Yes (Stop 1 & Stop 2)

--

shippingAddress

--

Yes (Stop 1 & Stop 2)

companyName

--

Yes (Stop 1 & Stop 2)

isPickup

Yes (Stop 1 & Stop 2)

--

isDropOff

Yes (Stop 1 & Stop 2)

--

isGeolocation

No

No

expectedDate

Yes (Stop 1)

--

appointmentTime

No

No

appointmentRequired

No

No

proNumber

No

No

poNumber

No

No

orderDate

No

No

modeName

Yes

--

loadPostingDescription

No

No

loadNumber

Yes

--

LineItems (array)

Yes

--

weightUnits

Yes

--

weight

Yes

--

stackable

Yes

--

turnable

Yes

--

scheduleBCode

No

No

pickupStopNumber

Yes

--

packagingUnits

No

No

packagingUnitCount

No

No

nmfcNumber

No

No

nmfcClass

Yes

--

linearFeet

No

No

itemNumber

Yes

--

itemDescription

Yes

--

htsCode

No

No

hsCode

No

No

hazMatPackagingGroup

No

No

hazMatNumber

No

No

hazMatContact

No

No

hazMatClassDivision

No

No

hazardousMaterials

No

No

handlingUnitWidth

Yes

--

handlingUnits

Yes

--

handlingUnitLength

Yes

--

handlingUnitHeight

Yes

--

handlingUnitCount

Yes

--

dimensionalUnits

Yes

--

deliveryStopNumber

Yes

--

distanceMiles

No

No

distanceKilometers

No

No

cargoValue

No

No

containerTrailerNumber

No

No

billofLadingNumber

No

No

Accessorials (array)

No

No

accessorialName

Yes (Stop 1 & Stop 2)

--

accessorialID

Yes (Stop 1 & Stop 2)

--

Example Response

The response body is largely identical to the request body. The addition of optional and read-only parameters include the loadId and the final setting of the loadNumber.

Use the array of strings in the Get Streamed Quotes operation to receive quotes more efficiently. Call the Get Streamed Quotes operation for each string returned in the streamQuotesContext field.

{
    "weightUnits": "lbs",
    "volumeUnits": null,
    "trackingProvider": null,
    "trackingProviderCustomer": null,
    "trackingNumber": null,
    "trackingNumberCustomer": null,
    "totalWeight": 1000,
    "totalVolume": null,
    "tenderAcceptedDate": "2018-04-19T14:00:58.000Z",
    "streamQuotesContext": [
        "UE+G4DKGl5FeMQEYAKprny8IzyWjL6aoH2XkACuK8I1mJ1gSYjHiTHEuQfMZVswUJzwG0Kksspvo0DFJrOm4+J7xfEHk/et6IhsJhLbJDqXpUs/7Pj2J2SaKmwPgLuns",
        "wEPi0CXJ8yIRHouZcsOtTm9vTaatfU1FTkUghcwRUQN4GDTUZCoMQ1eYqibUow2RoH/g38zSDTEd5AwtVG4tGWYaXz94KMbvbkhtjirk05zLoS+IkEhT2+mX+D51F+lt",
        "CgZ5eDi81Azfx9ws+D96RGQqa8b9dJWXtVmnsSFayRkJUFh4rPMlsSdi/sLsSjCWsePT1iVlYCuX6v6VG/U1SNJpQnxfSoqxjdtUG4MJ0RcL6Ik1VT+8fYIMBL3yMcza",
        "jNynZw72Yor9etG1G90jqFGy9dQR2jm1bA5UNGITHaFrld3V+o5Edn6JppaRYgzRrrDh8KsnF+PyljvXpsiP2GwGk/KPwaTev9he9s6xD/TIv0GO9tMkHl7vGayDA8I1",
        "POqYJisu+en9u/HvJo35kcA0m8YZcaXipaYvFeSJHU/0T/oxUjVG6doqEiZ1RERw3A9epXgaBLXhz4zl5aEleZOEn4lyMWKFOXd02CY2yF/Cdk9BM9eEAe01YC+7+1sm",
        "YS05M1oIGML2fOu4Htfkilrh3l41le/iojyxiN5yN9FroStucafxYyqU+oR3ZUHNSUcmzl6IgwqxwW/JFLrkVTHtxEdH+4z+qmHkianCO2PHYBPSIrntx7RISNp9Ande",
        "aycPe/12Yb2jIdOJeshvYEooJ0yvUy93inTWa91hdapXX3HTht7FTwczb99Pqyc6sjztmyJUsfkqYXUX8ZmjF0/054Pj6Pgr6XGSptbiSBJ3T2nGqOZQ7HPhlOw8p0QK",
        "zPAYeDheigVB8CMiSQYZgr/9Kts/QOqeJxc4xUQE3d3UsPYYLvk6LPob1+uq1K05nsH16pI7WvUUvMOkHSq7VkihvCZEW3yluG0UrdhRXu6ifoIvKAoinVaGsVRYUmNc"
    ],
    "streamQuotes": true,
    "Stops": [	
        {
            "stopStatus": "En Route",
            "stopNumber": 1,
            "shippingReceivingHours": "10:00-20:00",
            "shippingContact": {
                "phone": "(312) 339-1984",
                "lastName": "Catheter R",
                "firstName": "Dan",
                "email": "dctest@revenova.com"
            },
            "references": "Carrier Pickup Number: 1524146458446",
            "pickupDeliveryNumber": "1234567",
            "milesAway": 173.227,
            "location": {
                "shippingStateProvince": "IN",
                "shippingPostalCode": "46278",
                "shippingCountry": "US",
                "shippingCity": "Indianapolis",
                "shippingAddress": "6102 Victory Way",
                "companyName": "Catheter Research, Inc. (CRI)"
            },
            "kilometersAway": 278.781919336435076628938267154405,
            "isPickup": true,
            "isDropOff": false,
            "isGeolocation": false,
            "instructions": null,
            "expectedDate": "2018-04-19",
            "departureTime": null,
            "departureDate": null,
            "cumulativeMiles": 0,
            "carrierStatusComments": null,
            "carrierStatusAsOf": "2018-04-19T14:01:06.000Z",
            "carrierStatus": "No Issues",
            "carrierEtaTime": "04:15",
            "carrierEtaDate": "2018-04-19",
            "arrivalTime": null,
            "arrivalStatus": "On Schedule 173mi / 279km away",
            "arrivalDate": null,
            "appointmentTime": "10:00",
            "appointmentRequired": true,
            "address": "6102 Victory Way, Indianapolis, Indiana 46278"
        },
        {
            "stopStatus": null,
            "stopNumber": 2,
            "shippingReceivingHours": "10:00-20:00",
            "shippingContact": {
                "phone": "(312) 999-1984",
                "lastName": "Cardinal H",
                "firstName": "Dennis",
                "email": "dc2test@revenova.com"
            },
            "references": null,
            "pickupDeliveryNumber": null,
            "milesAway": 360.46,
            "location": {
                "shippingStateProvince": "OH",
                "shippingPostalCode": "43017",
                "shippingCountry": "US",
                "shippingCity": "Dublin",
                "shippingAddress": "7000 Cardinal Place",
                "companyName": "Cardinal Health"
            },
            "kilometersAway": 580.104317710353395958292227992616,
            "isPickup": false,
            "isDropOff": true,
            "isGeolocation": false,
            "instructions": null,
            "expectedDate": null,
            "departureTime": null,
            "departureDate": null,
            "cumulativeMiles": 187.232,
            "carrierStatusComments": null,
            "carrierStatusAsOf": null,
            "carrierStatus": null,
            "carrierEtaTime": null,
            "carrierEtaDate": null,
            "arrivalTime": null,
            "arrivalStatus": "On Schedule 360mi / 580km away",
            "arrivalDate": null,
            "appointmentTime": "22:00",
            "appointmentRequired": false,
            "address": "7000 Cardinal Place, Dublin, Ohio 43017"
        }
    ],
    "stateLane": "IN:OH",
    "shipToAddress": "7000 Cardinal Place, Dublin, Ohio 43017",
    "shipStatus": "On Schedule 173mi / 279km away",
    "shipFromAddress": "6102 Victory Way, Indianapolis, Indiana 46278",
    "scheduleStatus": "On Schedule",
    "proNumber": null,
    "poNumber": null,
    "podReceived": false,
    "otherInstructions": null,
    "origin": "Indianapolis, Indiana",
    "orderNumber": null,
    "orderDate": "2018-04-19",
    "modeName": "LTL",
    "loadStatusComments": null,
    "loadStatus": "Dispatched",
    "loadPostingDescription": "Hello",
    "loadNumber": "Load-101699",
    "loadId": "a0i0x0000014APkAAM",
    "LineItems": [
        {
            "weightUnits": "lbs",
            "weight": 1000,
            "volumeUnits": null,
            "volume": null,
            "turnable": false,
            "stackable": false,
            "scheduleBCode": "1910.10.2000",
            "pickupStopNumber": 1,
            "packagingUnits": "Cartons",
            "packagingUnitCount": 20,
            "nmfcNumber": "21652-10",
            "nmfcClass": "55",
            "linearFeet": 10,
            "itemNumber": "Item",
            "itemDescription": "Fooda",
            "htsCode": "1910.10.2000",
            "hsCode": "1910.10",
            "hazMatPackingGroup": null,
            "hazMatNumber": null,
            "hazMatContact": null,
            "hazMatClassDivision": null,
            "hazardousMaterials": false,
            "handlingUnitWidth": 44,
            "handlingUnits": "Pallets",
            "handlingUnitLength": 44,
            "handlingUnitHeight": 44,
            "handlingUnitCount": 2,
            "dimensionUnits": "in",
            "deliveryStopNumber": 2
        }
    ],
    "linearFeet": 10,
    "lastReportedState": "IL",
    "lastReportedLongitude": -87.65139,
    "lastReportedLatitude": 41.874372,
    "lastReportedCountry": "US",
    "lastReportedCity": "Chicago",
    "lastModifiedDate": "2018-04-19T14:01:22.000Z",
    "hazardousMaterials": false,
    "expectedShipDate": "2018-04-19",
    "expectedDeliveryDate": null,
    "distanceMiles": 187,
    "distanceKilometers": 301,
    "destination": "Dublin, Ohio",
    "deliveryStatus": "On Schedule 360mi / 580km away",
    "currencyCode": "USD",
    "createdDate": "2018-04-19T13:17:14.000Z",
    "containerTrailerNumber": "MAEU1234567",
    "cityLane": "Indianapolis, IN:Dublin, OH",
    "carrierUploads": null,
    "carrier": "Estes Express",
    "cargoValue": 20000,
    "bookingNumber": null,
    "billOfLadingNumber": "1459695004",
    "apiLoadId": null,
    "Accessorials": [
        {
            "stopNumber": 1,
            "accessorialName": "Lift Gate Pick Up",
            "accessorialId": "a01410000069DXmAAM"
        },
        {
            "stopNumber": 2,
            "accessorialName": "Lift Gate Delivery",
            "accessorialId": "a01410000069DXlAAM"
        }
    ]
}

Update a Load

Example Request

HTTP Type: PATCH

URL: [salesforce domain]/services/apexrest/rtms/tmsloadservice

Example URL: https://cs95.salesforce.com/services/apexrest/rtms/tmsloadservice

The request format is identical to the POST transaction request format with the addition of the correct loadId and loadName parameters.

The request body is largely identical to both the GET response and the response body (except no loadId element should be passed in this request). Optional parameters do not need to be passed. Make sure that only one of IsPickup and isDropoff is true for a stop. Accessorials are optional, of course.

Example Response

The response format is identical to the POST transaction response format.

TMSQuoteService

This service allows users to complete the following action.

  • Get one or more LTL API-based quotes for a Load.

When quoting Loads with Project44, set a value for the LTL API Timeout Override (Seconds) field on TMS Admin → Configuration to return quotes faster. The minimum recommended value is 5 seconds.

There are two methods to obtain quotes based on the streamQuotes field when creating or updating a Load.

  • If the streamQuotes field is True, call the getStreamedQuotes operation for each string returned from the TMSLoadService.

  • If the streamQuotes field is False or Null, call the TMSQuoteService to generate quotes.

Example Request

HTTP Type: GET

URL: [salesforce domain]/services/apexrest/rtms/tmsquoteservice/[18-character load Id]

Example URL: https://cs95.salesforce.com/services/apexrest/rtms/tmsquoteservice/a0i0x000000BUgeAAG

Example Response

[
    {
        "usedLiability": 1000,
        "transitTime": 4,
        "serviceClass": "Standard Rate",
        "rating": "B",
        "quoteNumber": "Carrier Quote 123",
        "quoteId": "a0D0U000000LLkYUAW",
        "price": 395.66,
        "newliability": 2000,
        "modeName": "LTL",
        "loadNumber": "Load-123",
        "estimatedDelivery": null,
        "directInterline": "Interline",
        "currencyCode": "$",
        "carrier": "AAA Cooper Transportation - P44"
    },
    {
        "usedLiability": 1000,
        "transitTime": 3,
        "serviceClass": "Standard Rate",
        "rating": null,
        "quoteNumber": "Carrier Quote 124",
        "quoteId": "a0D0U000000LLkZUAW",
        "price": 583.2,
        "newliability": 2000,
        "modeName": "LTL",
        "loadNumber": "Load-123",
        "estimatedDelivery": "2018-04-23",
        "directInterline": "Direct",
        "currencyCode": "$",
        "carrier": "YRC - P44"
    },
    {
        "usedLiability": 1000,
        "transitTime": 3,
        "serviceClass": "ACCELERATED SERVICE",
        "rating": null,
        "quoteNumber": "Carrier Quote 125",
        "quoteId": "a0D0U000000LLkaUAG",
        "price": 629.43,
        "newliability": 2000,
        "modeName": "LTL",
        "loadNumber": "Load-123",
        "estimatedDelivery": "2018-04-23",
        "directInterline": "Direct",
        "currencyCode": "$",
        "carrier": "YRC - P44"
    },
    {
        "usedLiability": 1000,
        "transitTime": 3,
        "serviceClass": "GUARANTEED STANDARD BY 5 P.M.",
        "rating": null,
        "quoteNumber": "Carrier Quote 126",
        "quoteId": "a0D0U000000LLkbUAG",
        "price": 644.84,
        "newliability": 2000,
        "modeName": "LTL",
        "loadNumber": "Load-123",
        "estimatedDelivery": "2018-04-23",
        "directInterline": "Direct",
        "currencyCode": "$",
        "carrier": "YRC - P44"
    },
    {
        "usedLiability": null,
        "transitTime": 2,
        "serviceClass": "Standard Rate",
        "rating": null,
        "quoteNumber": "Carrier Quote 127",
        "quoteId": "a0D0U000000LLkcUAG",
        "price": 1759.46,
        "newliability": null,
        "modeName": "LTL",
        "loadNumber": "Load-123",
        "estimatedDelivery": "2018-04-20",
        "directInterline": "Unspecified",
        "currencyCode": "$",
        "carrier": "Con-way Freight - P44"
    }
]

Get Streamed Quotes

Example Request

HTTP Type: POST

URL: [salesforce domain]/services/apexrest/rtms/tmsquoteservice/[18-character load Id]

Example URL: https://cs95.salesforce.com/services/apexrest/rtms/tmsquoteservice/a1yQL000000arDtYAI

Note that a call to the Get Streamed Quotes operation should be completed for each string returned from the Create a Load operation.

Project44 has 2 separate strings for LTL and VLTL quoting.

{
  "wsqc": {
    "quoteContext": "Kvc4XASWXBv9+WMdnbg7q1HAJoL4/mnPZnq97860xnT/YbG1DoFwjQ1PUBSc/0LQz7yaIUha7BEbFLnLQowfEhTdvUxtKLLp59Qp2jZfPi1zExZFxch5cVBX6l/EPXoX",
    "loadId": "a1yQL000000arDtYAI"
  }
}

Example Response

The response packet is identical to the getQuotes response packet, but contains a subset (one API) of quotes.

TMSTenderService

This service allows users to complete the following action.

  • Tender a Load based on a Carrier quote returned from the TMSQuoteService.

Example Request

HTTP Type: POST

URL: [salesforce domain]/services/apexrest/rtms/tmstenderservice

Example URL: https://cs95.salesforce.com/services/apexrest/rtms/tmstenderservice

{
"txn" : {
        "loadId" : "a0i0x000000BV0NAAW",
        "quoteId" : "a0D0x000000P1BzEAK"
    }
}

Example Response

{
    "tenderSuccessful": true,
    "errorMessage": null,
    "carrierBillToState": "IL",
    "carrierBillToPostalCode": "60603",
    "carrierBillToName": "Revenova, LLC",
    "carrierBillToCountry": "US",
    "carrierBillToCity": "Chicago",
    "carrierBillToAddress": "79 W. Monroe Street Suite 900"
}

Example Error Response

{
    "tenderSuccessful": false,
    "errorMessage": "System.DmlException--Upsert failed. First exception on row 0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, rtms.CustomerQuoteUpsert: execution of AfterInsert\n\ncaused by: rtms.ValidationException: You cannot have more than one accepted Customer Quote for a given Load.\n\n(rtms): []--(rtms)\n\n"
}

TMSLoadStatusService

This service allows users to complete the following actions.

  • Return load- and stop-level status for one or more loads.

  • Return POD documents for one load.

Example Request

HTTP Type: GET

URL: [salesforce domain]/services/apexrest/rtms/tmsloadstatusservice/[18-character load Id]

Example URL: https://cs95.salesforce.com/services/apexrest/rtms/tmsloadstatusservice/a0i0x000000BV0NAAW

A comma-delimited list of Load Ids may be passed to receive the status for more than one load.

The POD contents are Base 64 encoded.

Example Response

[
    {
        "stopList": [
            {
                "stopStatus": "Departed",
                "stopNumber": 1,
                "stopName": "Stop 1",
                "milesAway": null,
                "departureTime": "02:30",
                "departureDate": "2018-04-19",
                "carrierStatus": "Loaded Clean",
                "carrierETATime": null,
                "carrierETADate": null,
                "arrivalTime": "02:00",
                "arrivalDate": "2018-04-19",
                "appointmentTime": "10:00",
                "appointmentRequired": true
            },
            {
                "stopStatus": "En Route",
                "stopNumber": 2,
                "stopName": "Stop 2",
                "milesAway": 177.969,
                "departureTime": null,
                "departureDate": null,
                "carrierStatus": "No Issues",
                "carrierETATime": "03:45",
                "carrierETADate": "2018-04-19",
                "arrivalTime": null,
                "arrivalDate": null,
                "appointmentTime": "22:00",
                "appointmentRequired": false
            }
        ],
        "podList": [],
        "loadStatusComments": null,
        "loadStatus": "In Transit",
        "loadName": "Load-101702",
        "loadId": "a0i0x0000014AQEAA2",
        "lastReportedState": "IN",
        "lastReportedLongitude": -86.158064,
        "lastReportedLocation": "Indianapolis, IN",
        "lastReportedLatitude": 39.768365,
        "lastReportedCountry": "US",
        "lastReportedCity": "Indianapolis"
    }
]

Example Response with Inline POD document

[
    {
        "stopList": [
            {
                "stopStatus": "Departed",
                "stopNumber": 1,
                "stopName": "Stop 1",
                "milesAway": null,
                "departureTime": "02:30",
                "departureDate": "2018-04-19",
                "carrierStatus": "Loaded Clean",
                "carrierETATime": null,
                "carrierETADate": null,
                "arrivalTime": "02:00",
                "arrivalDate": "2018-04-19",
                "appointmentTime": "10:00",
                "appointmentRequired": true
            },
            {
                "stopStatus": "En Route",
                "stopNumber": 2,
                "stopName": "Stop 2",
                "milesAway": 177.969,
                "departureTime": null,
                "departureDate": null,
                "carrierStatus": "No Issues",
                "carrierETATime": "03:45",
                "carrierETADate": "2018-04-19",
                "arrivalTime": null,
                "arrivalDate": null,
                "appointmentTime": "22:00",
                "appointmentRequired": false
            }
        ],
        "podList": [
            {
                "fileType": "png",
                "fileName": "Proof of Delivery",
                "contents": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAANCAYAAACdKY9CAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAHdElNRQfeCBYUJDBt/E7bAAAAB3RFWHRBdXRob3IAqa7MSAAAAAx0RVh0RGVzY3JpcHRpb24AEwkhIwAAAAp0RVh0Q29weXJpZ2h0AKwPzDoAAAAOdEVYdENyZWF0aW9uIHRpbWUANfcPCQAAAAl0RVh0U29mdHdhcmUAXXD/OgAAAAt0RVh0RGlzY2xhaW1lcgC3wLSPAAAACHRFWHRXYXJuaW5nAMAb5ocAAAAHdEVYdFNvdXJjZQD1/4PrAAAACHRFWHRDb21tZW50APbMlr8AAAAGdEVYdFRpdGxlAKju0icAAAAbSURBVChTY/wPBAwkACYoTTQY1UAMGIEaGBgAA4IEFgXnMO8AAAAASUVORK5CYII="
            }
        ],"loadStatusComments": null,
        "loadStatus": "In Transit",
        "loadName": "Load-101702",
        "loadId": "a0i0x0000014AQEAA2",
        "lastReportedState": "IN",
        "lastReportedLongitude": -86.158064,
        "lastReportedLocation": "Indianapolis, IN",
        "lastReportedLatitude": 39.768365,
        "lastReportedCountry": "US",
        "lastReportedCity": "Indianapolis"
    }
]

TMSReferenceDataService

This service allows users to complete the following action.

  • Get valid values for enumeration fields to create Loads.

The following enumeration fields must be used for this service.

  • Mode Name

  • Accessorial Name and Id

  • Packaging Units

  • Handling Units

  • Dimension Units

  • Weight Units

  • Volume Units

  • NMFC Class

  • HazMat Class

  • HazMat Packing Group

Example Request

HTTP Type: GET

URL: [salesforce domain]/services/apexrest/rtms/tmsreferencedataservice

Example URL: https://cs95.salesforce.com/services/apexrest/rtms/tmsreferencedataservice

Example Response

[
    {
        "value": "LTL",
        "label": "LTL",
        "category": "MODE"
    },
    {
        "value": "a01410000069DXIAA2",
        "label": "After Hours Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXJAA2",
        "label": "After Hours Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXKAA2",
        "label": "Airport/Gov/Mines/Gas & Oil Fields Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXLAA2",
        "label": "Airport/Gov/Mines/Gas & Oil Fields Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXMAA2",
        "label": "Blind Shipments",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXNAA2",
        "label": "Construction/Utility Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXOAA2",
        "label": "Construction/Utility Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXQAA2",
        "label": "Customs",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXYAA2",
        "label": "Excess Length - Over 120\"",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXXAA2",
        "label": "Excess Length - Up to 120\"",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXWAA2",
        "label": "Excess Value",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXZAA2",
        "label": "Exhibition/Trade Show Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXaAAM",
        "label": "Exhibition/Trade Show Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXbAAM",
        "label": "Expedited",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXcAAM",
        "label": "Extra Labor Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXdAAM",
        "label": "Extra Labor Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXeAAM",
        "label": "Guaranteed",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXfAAM",
        "label": "Hazardous Material Handling",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXgAAM",
        "label": "High Cost Delivery Surcharge",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXhAAM",
        "label": "Holiday Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXiAAM",
        "label": "Holiday Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXjAAM",
        "label": "Inside Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXkAAM",
        "label": "Inside Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXlAAM",
        "label": "Lift Gate Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXmAAM",
        "label": "Lift Gate Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXnAAM",
        "label": "Limited Access Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXoAAM",
        "label": "Limited Access Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXpAAM",
        "label": "Lumper Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXqAAM",
        "label": "Lumper Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXrAAM",
        "label": "Notify Prior to Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DY9AAM",
        "label": "Other",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXsAAM",
        "label": "Piers/Wharves Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXtAAM",
        "label": "Piers/Wharves Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXuAAM",
        "label": "Protect From Freezing",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXwAAM",
        "label": "Residential Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXxAAM",
        "label": "Residential Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DY4AAM",
        "label": "Saturday Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DY5AAM",
        "label": "Saturday Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXyAAM",
        "label": "Single Shipment Fee",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DXzAAM",
        "label": "Sort/Segregate Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DY0AAM",
        "label": "Sort/Segregate Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DY2AAM",
        "label": "Storage Destination",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DY3AAM",
        "label": "Storage Origin",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DY6AAM",
        "label": "Sunday Delivery",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a01410000069DY7AAM",
        "label": "Sunday Pick Up",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a014100000K1vwTAAR",
        "label": "Terminal Charge",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a014100000K1vwJAAR",
        "label": "War Risk Surcharge - Destination",
        "category": "ACCESSORIAL"
    },
    {
        "value": "a014100000K1vwEAAR",
        "label": "War Risk Surcharge - Origin",
        "category": "ACCESSORIAL"
    },
    {
        "value": "Bags",
        "label": "Bags",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Bales",
        "label": "Bales",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Barrels",
        "label": "Barrels",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Baskets",
        "label": "Baskets",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Bins",
        "label": "Bins",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Bottles",
        "label": "Bottles",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Boxes",
        "label": "Boxes",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Bundles",
        "label": "Bundles",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Canisters",
        "label": "Canisters",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Carboys",
        "label": "Carboys",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Cartons",
        "label": "Cartons",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Cases",
        "label": "Cases",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Coils",
        "label": "Coils",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Containers",
        "label": "Containers",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Crates",
        "label": "Crates",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Cylinders",
        "label": "Cylinders",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Drums",
        "label": "Drums",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Kegs",
        "label": "Kegs",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Other",
        "label": "Other",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Packages",
        "label": "Packages",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Pallets",
        "label": "Pallets",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Pieces",
        "label": "Pieces",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Reels",
        "label": "Reels",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Rolls",
        "label": "Rolls",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Skids",
        "label": "Skids",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Spools",
        "label": "Spools",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Tanks",
        "label": "Tanks",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Trays",
        "label": "Trays",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Truckloads",
        "label": "Truckloads",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Tubes",
        "label": "Tubes",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Units",
        "label": "Units",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Vats",
        "label": "Vats",
        "category": "HANDLING UNIT"
    },
    {
        "value": "Bags",
        "label": "Bags",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Bales",
        "label": "Bales",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Barrels",
        "label": "Barrels",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Baskets",
        "label": "Baskets",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Bins",
        "label": "Bins",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Bottles",
        "label": "Bottles",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Boxes",
        "label": "Boxes",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Bundles",
        "label": "Bundles",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Canisters",
        "label": "Canisters",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Carboys",
        "label": "Carboys",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Cartons",
        "label": "Cartons",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Cases",
        "label": "Cases",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Coils",
        "label": "Coils",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Containers",
        "label": "Containers",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Crates",
        "label": "Crates",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Cylinders",
        "label": "Cylinders",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Drums",
        "label": "Drums",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Kegs",
        "label": "Kegs",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Other",
        "label": "Other",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Packages",
        "label": "Packages",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Pallets",
        "label": "Pallets",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Pieces",
        "label": "Pieces",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Reels",
        "label": "Reels",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Rolls",
        "label": "Rolls",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Skids",
        "label": "Skids",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Spools",
        "label": "Spools",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Tanks",
        "label": "Tanks",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Trays",
        "label": "Trays",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Truckloads",
        "label": "Truckloads",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Tubes",
        "label": "Tubes",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Units",
        "label": "Units",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "Vats",
        "label": "Vats",
        "category": "PACKAGING UNIT"
    },
    {
        "value": "lbs",
        "label": "lbs",
        "category": "WEIGHT UNIT"
    },
    {
        "value": "kg",
        "label": "kg",
        "category": "WEIGHT UNIT"
    },
    {
        "value": "Cubic Feet",
        "label": "Cubic Feet",
        "category": "VOLUME UNIT"
    },
    {
        "value": "Cubic Inches",
        "label": "Cubic Inches",
        "category": "VOLUME UNIT"
    },
    {
        "value": "Cubic Meters",
        "label": "Cubic Meters",
        "category": "VOLUME UNIT"
    },
    {
        "value": "Gallons",
        "label": "Gallons",
        "category": "VOLUME UNIT"
    },
    {
        "value": "Liters",
        "label": "Liters",
        "category": "VOLUME UNIT"
    },
    {
        "value": "in",
        "label": "in",
        "category": "DIMENSION UNIT"
    },
    {
        "value": "cm",
        "label": "cm",
        "category": "DIMENSION UNIT"
    },
    {
        "value": "ft",
        "label": "ft",
        "category": "DIMENSION UNIT"
    },
    {
        "value": "m",
        "label": "m",
        "category": "DIMENSION UNIT"
    },
    {
        "value": "50",
        "label": "50",
        "category": "NMFC CLASS"
    },
    {
        "value": "55",
        "label": "55",
        "category": "NMFC CLASS"
    },
    {
        "value": "60",
        "label": "60",
        "category": "NMFC CLASS"
    },
    {
        "value": "65",
        "label": "65",
        "category": "NMFC CLASS"
    },
    {
        "value": "70",
        "label": "70",
        "category": "NMFC CLASS"
    },
    {
        "value": "77.5",
        "label": "77.5",
        "category": "NMFC CLASS"
    },
    {
        "value": "85",
        "label": "85",
        "category": "NMFC CLASS"
    },
    {
        "value": "92.5",
        "label": "92.5",
        "category": "NMFC CLASS"
    },
    {
        "value": "100",
        "label": "100",
        "category": "NMFC CLASS"
    },
    {
        "value": "110",
        "label": "110",
        "category": "NMFC CLASS"
    },
    {
        "value": "125",
        "label": "125",
        "category": "NMFC CLASS"
    },
    {
        "value": "150",
        "label": "150",
        "category": "NMFC CLASS"
    },
    {
        "value": "175",
        "label": "175",
        "category": "NMFC CLASS"
    },
    {
        "value": "200",
        "label": "200",
        "category": "NMFC CLASS"
    },
    {
        "value": "250",
        "label": "250",
        "category": "NMFC CLASS"
    },
    {
        "value": "300",
        "label": "300",
        "category": "NMFC CLASS"
    },
    {
        "value": "400",
        "label": "400",
        "category": "NMFC CLASS"
    },
    {
        "value": "500",
        "label": "500",
        "category": "NMFC CLASS"
    },
    {
        "value": "1.1",
        "label": "1.1",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "1.2",
        "label": "1.2",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "1.3",
        "label": "1.3",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "1.4",
        "label": "1.4",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "1.5",
        "label": "1.5",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "1.6",
        "label": "1.6",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "2.1",
        "label": "2.1",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "2.2",
        "label": "2.2",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "2.3",
        "label": "2.3",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "3",
        "label": "3",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "4.1",
        "label": "4.1",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "4.2",
        "label": "4.2",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "4.3",
        "label": "4.3",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "5.1",
        "label": "5.1",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "5.2",
        "label": "5.2",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "6.1",
        "label": "6.1",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "6.2",
        "label": "6.2",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "7",
        "label": "7",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "8",
        "label": "8",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "9",
        "label": "9",
        "category": "HAZMAT CLASS"
    },
    {
        "value": "I",
        "label": "I",
        "category": "HAZMAT PACKING GROUP"
    },
    {
        "value": "II",
        "label": "II",
        "category": "HAZMAT PACKING GROUP"
    },
    {
        "value": "III",
        "label": "III",
        "category": "HAZMAT PACKING GROUP"
    }
]

TMSRateIQService

This service allows users to complete the following actions.

  • Get RateIQ data for a given Lane and Mode. A summary rate row is always first in the list, followed by the weighted contributions for each matching row from the Rate Calculation.

  • Data sources include internal TMS data, DAT, Truckstop, and FreightWaves.

Example Request

HTTP Type: POST

URL: [salesforce domain]/services/apexrest/rtms/tmsrateiqservice

Example URL: https://partial1-revemc1.cs44.force.com/services/apexrest/rtms/tmsraiteiqservice

{ "input" :
	{
		"FromAddress" : "8216 Miller Road",
		"FromCity" : "Houston",
		"FromState" : "TX",
		"FromPostalCode" : "77049",
		"FromCountry" : "US",
		"FromLatitude" : 29.7604,
		"FromLongitude" : -95.3698,
		"ToAddress" : "6880 Parkway Drive",
		"ToCity" : "Brookfield",
		"ToState" : "OH",
		"ToPostalCode" : "44403",
		"ToCountry" : "US",
		"ToLatitude" : 41.2341,
		"ToLongitude" : -80.5661,
		"CurrencyCode" : "USD",
		"PerMileRates" : true,
		"ModeId" : "a0j41000001JunjAAC"
	}
}

Example Response

{
    "ResultsReturned": true,
    "ResultsCount": 3,
    "Results": [
        {
            "TotalRate": 1.680,
            "TotalAmount": 2229.400,
            "Rule": null,
            "m_imageMap": {
                "Truckstop": "InternetTruckstop_Logo",
                "DAT": "DAT_Logo",
                "TMS": "Revenova_Logo"
            },
            "Lane": null,
            "IsSummary": true,
            "Image": null,
            "FuelRate": null,
            "FuelAmount": null,
            "FreightRate": null,
            "FreightAmount": null,
            "DistanceUnits": "Miles",
            "CurrencyCode": "USD",
            "Count": 295,
            "CompanyCount": null,
            "AverageMiles": 1327.0
        },
        {
            "TotalRate": 1.83,
            "TotalAmount": 2451.11,
            "Rule": {
                "attributes": {
                    "type": "rtms__RateCalculationRule__c",
                    "url": "/services/data/v48.0/sobjects/rtms__RateCalculationRule__c/a1P2M000003DlDzUAK"
                },
                "Id": "a1P2M000003DlDzUAK",
                "Name": "Rule-2",
                "rtms__Data_Source__c": "Truckstop",
                "rtms__Distance_Units__c": "Miles",
                "rtms__Equipment_Category__c": "Van",
                "rtms__Lookback_Days__c": "30",
                "rtms__Paid_Posted__c": "Paid",
                "rtms__Rate_Calculation__c": "a1Q2M000005jsC8UAI",
                "rtms__Rate_Type__c": "Spot",
                "rtms__Search_Radius__c": "100",
                "rtms__Threshold__c": 1,
                "rtms__Weight__c": 25.00
            },
            "m_imageMap": {
                "Truckstop": "InternetTruckstop_Logo",
                "DAT": "DAT_Logo",
                "TMS": "Revenova_Logo"
            },
            "Lane": "",
            "IsSummary": false,
            "Image": "InternetTruckstop_Logo",
            "FuelRate": null,
            "FuelAmount": null,
            "FreightRate": null,
            "FreightAmount": null,
            "DistanceUnits": "Miles",
            "CurrencyCode": "USD",
            "Count": 36,
            "CompanyCount": null,
            "AverageMiles": 1339
        },
        {
            "TotalRate": 1.53,
            "TotalAmount": 2007.69,
            "Rule": {
                "attributes": {
                    "type": "rtms__RateCalculationRule__c",
                    "url": "/services/data/v48.0/sobjects/rtms__RateCalculationRule__c/a1P2M000003DlE0UAK"
                },
                "Id": "a1P2M000003DlE0UAK",
                "Name": "Rule-3",
                "rtms__Data_Source__c": "Truckstop",
                "rtms__Distance_Units__c": "Miles",
                "rtms__Equipment_Category__c": "Van",
                "rtms__Lookback_Days__c": "30",
                "rtms__Paid_Posted__c": "Posted",
                "rtms__Rate_Calculation__c": "a1Q2M000005jsC8UAI",
                "rtms__Rate_Type__c": "Spot",
                "rtms__Search_Radius__c": "100",
                "rtms__Threshold__c": 1,
                "rtms__Weight__c": 25.00
            },
            "m_imageMap": {
                "Truckstop": "InternetTruckstop_Logo",
                "DAT": "DAT_Logo",
                "TMS": "Revenova_Logo"
            },
            "Lane": "",
            "IsSummary": false,
            "Image": "InternetTruckstop_Logo",
            "FuelRate": null,
            "FuelAmount": null,
            "FreightRate": null,
            "FreightAmount": null,
            "DistanceUnits": "Miles",
            "CurrencyCode": "USD",
            "Count": 259,
            "CompanyCount": null,
            "AverageMiles": 1315
        }]}

TMSRateIQRateSourceService

The TMSRateIQRateSourceService service allows users to complete the following actions.

  • Bulk import RateIQ data from one or more external sources.

  • Bulk delete RateIQ data.

Data delete requests reference the ship date of the record. (YYYY-MM-DD)

Example Data Import Request

HTTP Type: POST

URL: [salesforce domain]/services/apexrest/rtms/tmsrateiqratesourceservice

Example URL: https://partial1-revemc1.cs44.force.com/services/apexrest/rtms/tmsrateiqratesourceservice

{
    "inputData" : 
    [
        {
            "dataSource" : "Custom Source",		// Must be valid picklist value
            "mode" : "Truckload",			// Must be valid mode name
            "shipDate" : "2023-03-15",		// YYYY-MM-DD
            "equipmentCategory" : "Van",		// Van, Flatbed, Reefer, Specialized, Ocean/Intermodal
            "originCity" : "Chicago",
            "originState" : "IL",
            "originPostalCode" : "60603",
            "originCountry" : "US",
            "destinationCity" : "Boston",
            "destinationState" : "MA",
            "destinationPostalCode" : "02215",
            "destinationCountry" : "US",
            "freightCharge" : 1000,
            "fuelSurcharge" : 100,
            "freightPlusFuel" : 1100,
            "currencyCode" : "USD",
            "distance" : 1000,
            "distanceUnits" : "Miles"			// Miles or Kilometers
        },
        {
            "dataSource" : "Custom Source",
            "mode" : "Truckload",
            "shipDate" : "2023-03-16",
            "equipmentCategory" : "Van",
            "originCity" : "Chicago",
            "originState" : "IL",
            "originPostalCode" : "60603",
            "originCountry" : "US",
            "destinationCity" : "Boston",
            "destinationState" : "MA",
            "destinationPostalCode" : "02215",
            "destinationCountry" : "US",
            "freightCharge" : 1100,
            "fuelSurcharge" : 100,
            "freightPlusFuel" : 1200,
            "currencyCode" : "USD",
            "distance" : 1100,
            "distanceUnits" : "Miles"
        },
        {
            "dataSource" : "Custom Source",
            "mode" : "Truckload",
            "shipDate" : "2023-03-17",
            "equipmentCategory" : "Van",
            "originCity" : "Chicago",
            "originState" : "IL",
            "originPostalCode" : "60603",
            "originCountry" : "US",
            "destinationCity" : "Boston",
            "destinationState" : "MA",
            "destinationPostalCode" : "02215",
            "destinationCountry" : "US",
            "freightCharge" : 1100,
            "fuelSurcharge" : 100,
            "freightPlusFuel" : 1200,
            "currencyCode" : "USD",
            "distance" : 1100,
            "distanceUnits" : "Miles"
        }
    ]
}

Example Data Import Response

{
    "isOK" : true
	"errorMessage" : null
}

Example Data Deletion Request

HTTP Type: DELETE

URL: [salesforce domain]/services/apexrest/rtms/tmsrateiqratesourceservice?dataSource=Custom%20Source&fromDate=2023-01-04&toDate=2023-04-04

Example URL: https://partial1-revemc1.cs44.force.com/services/apexrest/rtms/tmsrateiqratesourceservice?dataSource=Custom%20Source&fromDate=2023-01-04&toDate=2023-04-04

Example Data Deletion Response

{
    "isOK" : true
	"errorMessage" : null
}

TMSTruckPostingService

This service allows users to complete the following action.

  • Insert and update one or more Truck Postings in the TMS.

Example Request

HTTP Type: POST

URL: [salesforce domain]/services/apexrest/rtms/tmstruckpostingservice

Example URL: https://partial1-revemc1.cs44.force.com/services/apexrest/rtms/tmstruckpostingservice

{ "pList" : [{
"carrierCountryCode" : "US",
"carrierName" : "Test Carrier",
"carrierStateProvinceCode" : "IL",
"comments" : "Hello Newman!",
"contactEmail" : "support@revenova.com",
"contactName" : "Dave Test",
"contactPhone" : "312-333-8888",
"dataSource" : "Tobor",
"dateAvailable" : "2018-04-19",
"dayOfWeekAvailable" : 1,
"datetimeCreated" : "2018-04-19T14:00:58.000Z",
"deliveryRangeInMiles" : 100,
"destinationCity" : "Chicago",
"destinationCountryCode" : "US",
"destinationLatitude" : 42.00000,
"destinationLongitude" : -87.0000,
"destinationStateProvinceCode" : "IL",
"dotNumber" : "1234567",
"equipmentDescription" : "53 Foot Dry Van",
"equipmentOptions" : "Tarps",
"fullTruckload" : true,
"mcNumber" : "MC92929",
"minimumMiles" : 100,
"numberAvailable" : 2,
"originCity" : "San Jose",
"originCountryCode" : "US",
"originLatitude" : 41.0000,
"originLongitude" : -88.000000,
"originStateProvinceCode" : "CA",
"pickupRangeInMiles" : 100,
"truckPostingId" : null 
}]}

Example Response

{
	[
	"a1Q2M000005jsC8UAI",
    "a1Q2M000005jsC8UAM"
    ]
}