Skip to main content
GET
/
vehicles
/
{vehicleId}
/
locations
Historical Vehicle Locations
curl --request GET \
  --url https://api.withterminal.com/tsp/v1/vehicles/{vehicleId}/locations \
  --header 'Authorization: Bearer <token>' \
  --header 'Connection-Token: <connection-token>'
import requests

url = "https://api.withterminal.com/tsp/v1/vehicles/{vehicleId}/locations"

headers = {
"Connection-Token": "<connection-token>",
"Authorization": "Bearer <token>"
}

response = requests.get(url, headers=headers)

print(response.text)
const options = {
method: 'GET',
headers: {'Connection-Token': '<connection-token>', Authorization: 'Bearer <token>'}
};

fetch('https://api.withterminal.com/tsp/v1/vehicles/{vehicleId}/locations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.withterminal.com/tsp/v1/vehicles/{vehicleId}/locations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Connection-Token: <connection-token>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"net/http"
"io"
)

func main() {

url := "https://api.withterminal.com/tsp/v1/vehicles/{vehicleId}/locations"

req, _ := http.NewRequest("GET", url, nil)

req.Header.Add("Connection-Token", "<connection-token>")
req.Header.Add("Authorization", "Bearer <token>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.get("https://api.withterminal.com/tsp/v1/vehicles/{vehicleId}/locations")
.header("Connection-Token", "<connection-token>")
.header("Authorization", "Bearer <token>")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.withterminal.com/tsp/v1/vehicles/{vehicleId}/locations")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Connection-Token"] = '<connection-token>'
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
{
  "results": [
    {
      "id": "vcl_loc_01D8ZQFGHVJ858NBF2Q7DV9MNC",
      "provider": "geotab",
      "vehicle": "vcl_01D8ZQFGHVJ858NBF2Q7DV9MNC",
      "locatedAt": "2021-01-06T03:24:53.000Z",
      "location": {
        "longitude": -122.4194155,
        "latitude": 37.7749295
      },
      "metadata": {
        "modifiedAt": "2023-11-07T05:31:56Z"
      },
      "sourceId": "123456789",
      "driver": "drv_01D8ZQFGHVJ858NBF2Q7DV9MNC",
      "address": {
        "formatted": "1.5 miles from Austin, TX"
      },
      "heading": 25,
      "speed": 95.33,
      "raw": []
    }
  ],
  "next": "cD0yMDIxLTAxLTA2KzAzJTNBMjQlM0E1My40MzQzMjYlMkIwMCUzQTAw"
}
{
"code": "bad_request",
"message": "Invalid request body",
"detail": [
{
"message": "'vehicleId' property must be a valid ulid",
"path": "{requestQuery}.vehicleId",
"suggestion": "Please ensure you submit a valid 'vehicleId' property",
"context": {}
}
]
}
{
"code": "unauthorized",
"message": "Unauthorized Request",
"detail": "Please ensure you have a valid API key"
}
{
"code": "forbidden",
"message": "Forbidden Request",
"detail": "Please ensure the connection token matches the resource you are attempting to access."
}
{
"code": "not_found",
"message": "Resource not found",
"detail": "Could not find resource with ID: 2342342"
}
{
"code": "too_many_requests",
"message": "Too Many Requests",
"retryAfter": 60,
"detail": "You have exceeded your rate limit. Please try again later."
}
{
"code": "internal_server_error",
"message": "Internal Server Error",
"detail": "Something went wrong"
}
Note: Given the large volume of location data available, we encourage customers to accept compressed (gzip) responses in order to maximize throughput. This is supported with many popular HTTP clients. Result limits vary depending on if results are compressed or not.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Headers

Connection-Token
string
required

The token returned when a user authenticated their account. This authorizes access to a specific account.

Pattern: ^con_tkn_\S+$
Example:

"con_tkn_22vUhkC6tgre4kwaYfUkCDA1rzn6eyb4"

Path Parameters

vehicleId
string<ulid>
required

Vehicle to retrieve breadcrumb locations for Unique identifier for the vehicle in Terminal.

Pattern: ^vcl_[0-9A-HJKMNP-TV-Z]{26}$
Example:

"vcl_01D8ZQFGHVJ858NBF2Q7DV9MNC"

Query Parameters

cursor
string<cursor>

Pagination cursor to start requests from

Example:

"cD0yMDIxLTAxLTA2KzAzJTNBMjQlM0E1My40MzQzMjYlMkIwMCUzQTAw"

limit
integer

The maximum number of results to return in a page.

startAt
string<date-time>

Timestamp to start from - defaults to beginning of history

Example:

"2021-01-06T03:24:53.000Z"

endAt
string<date-time>

Timestamp to end at - defaults to now

Example:

"2021-01-06T03:24:53.000Z"

raw
boolean

Include raw responses used to normalize model. Used for debugging or accessing unique properties that are not unified.

Response

OK

results
Vehicle Location · object[]
required
next
string<cursor>

Cursor used for pagination.

Example:

"cD0yMDIxLTAxLTA2KzAzJTNBMjQlM0E1My40MzQzMjYlMkIwMCUzQTAw"