Contents

Simpler Route Optimisation

Tarot Routing - Route Optimisation API

Quickstart

First, you’ll need an auth token .

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

Then, 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"

and 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.