Simpler Route Optimisation#

Tarot Routing - Route Optimisation API

Quickstart#

1. Auth#

If you don’t have an account already, Sign Up for one or reach out to us at info@tarotanalytics.com

Then, get your Access Token:

URL='https://api.route.optimiser.app/api/auth/token'
HEADERS='Content-Type: application/json'
BODY='{
        "email": "your_email_address",
        "password": "your_password"
}'

RESP=$(curl "$URL" -H "$HEADERS" --data "$BODY")

# jq is a command line utility for parsing JSON
# you can install it with `apt install jq` or equivalent.
# The idea is just to get the `access_token` from the JSON response.
TOKEN=$(echo $RESP | jq -r .access_token)

Learn More…

2. Request Body#

Second, let’s prepare a JSON request body made up of Jobs, Drivers and Settings representing your routing problem:

Request Body ex1.json#
{
  "drivers": [
    {
      "uid": "drvid1",
      "shift_start": 8,
      "shift_end": 17,
      "location": {"lat": -33.867798, "lon": 151.166256}
    }
  ],
  "jobs": [
    {
      "uid": "uid1",
      "duration": 2,
      "location": {"lat": -33.849489, "lon": 151.127482}
    },
    {
      "uid": "uid2",
      "duration": 2,
      "location": {"lat": -33.880661, "lon": 151.183096}
    },
    {
      "uid": "uid3",
      "duration": 2,
      "location": {"lat": -33.913168, "lon": 151.262267}
    }
  ],
  "settings": {}
}
Here’s one I prepared earlier#
wget https://opt.dev.route.optimiser.app/docs/_static/ex1.json

Learn More…

3. Optimise#

You can access the Route Optimisation API by sending a POST request to the Synchronous Route Optimisation API endpoint.

TOKEN={your_tarot_routing_token}
curl https://api.route.optimiser.app/api/optimise \
      -H "Authorization: Token $TOKEN" \
      -H "Content-Type: application/json" \
      --data "@ex1.json"

Learn More…

4. Response#

A few seconds later, you’ll receive a response:

Response Body#
{
    "runs": [
        [
            {
                "location": {
                    "lat": -33.86779863,
                    "lon": 151.1662566
                },
                "shift_start": 8.0,
                "shift_end": 17.0,
                "lunch_time": 11.25,
                "lunch_duration": 1.25,
                "capacity": null,
                "run": 1,
                "seq": 0,
                "uid": "drvid1"
            },
            {
                "location": {
                    "lat": -33.84948962,
                    "lon": 151.1274823
                },
                "duration": 2.0,
                "arrive_after": null,
                "leave_by": null,
                "size": null,
                "run": 1,
                "seq": 1,
                "eta": "08:14",
                "etd": "08:16",
                "decimal_eta": 8.25,
                "decimal_etd": 8.28,
                "uid": "uid1"
            },
            {
                "location": {
                    "lat": -33.91316848,
                    "lon": 151.2622676
                },
                "duration": 2.0,
                "arrive_after": null,
                "leave_by": null,
                "size": null,
                "run": 1,
                "seq": 2,
                "eta": "08:52",
                "etd": "08:54",
                "decimal_eta": 8.88,
                "decimal_etd": 8.91,
                "uid": "uid3"
            },
            {
                "location": {
                    "lat": -33.88066125,
                    "lon": 151.1830961
                },
                "duration": 2.0,
                "arrive_after": null,
                "leave_by": null,
                "size": null,
                "run": 1,
                "seq": 3,
                "eta": "09:19",
                "etd": "09:21",
                "decimal_eta": 9.32,
                "decimal_etd": 9.35,
                "uid": "uid2"
            }
        ]
    ],
    "unserved_jobs": [],
    "settings": {
        "single_run": false,
        "allocate_fairly": true,
        "runs_only": true,
        "lunch_duration": 1.25,
        "lunch_time": 11.25,
        "job_duration": 2.0,
        "verbose": false,
        "shift_end": 17,
        "shift_start": 8,
        "iterative": false,
        "single_day": true
    }
}

The runs element is a list of Runs. The first Object in each Run is the Driver. All Subsequent objects in that Run are the Jobs.

Any Jobs listed in unserved_jobs were not able to be served with the Drivers provided.

Learn More…

Next Steps#

Route Optimisation is complex, but we try to make it as easy as possible to just get to the parts you need!

  1. Have a quick read of Route Optimisation Concepts to get familiar with terminology.

  2. Learn How to Express Constraints to the Route Optimisation API .