Filodos

BI analytics

Read fleet-wide tables in Power BI, Excel Power Query, Google Sheets, or Looker Studio through a REST connector. Each feed gives one flat row per item for all vehicles of your organization. Part of the documentation.

Common rules

All feeds on this page use the same rules. One Power Query recipe reads each of them.

ParameterRequiredNotes
sinceYes, except vehiclesFirst fleet-local date, in YYYY-MM-DD form.
untilYes, except vehiclesLast fleet-local date, in YYYY-MM-DD form. Both bounds are inclusive. The range cannot exceed 366 days.
limitNoRows per page. Default 1000; maximum 5000.
offsetNoFirst row to return. Default 0. Use next_offset from the answer to read the next page.

The answer contains rows, total, limit, offset, and next_offset. The next offset is null when no rows remain. Dates use the fleet's Europe/Athens calendar. Timestamps are ISO 8601 Europe/Athens time with an explicit offset, for example 2026-10-04T08:00:00+03:00.

Create a key with the analytics:read scope. A key reads data for its organization only. Driver logins receive 403. A key without the scope receives 403. A reversed or too-long date range receives 422.

Each row has device_id and vehicle_name. The vehicle name comes from the live device list. It is null when that list is not available. Driver names come from the driver links on each vehicle. When two drivers share a vehicle at that time, the value lists both, with a comma between them.

Feeds

Each feed has its own page with an example request, an example answer, the Excel result, all fields, and the errors.

FeedPathOne row for
Daily metricsGET /v1/analytics/dailyOne vehicle on one day: distance, drive and idle time, overspeed, harsh events, fatigue.
TripsGET /v1/analytics/tripsOne trip: start and end time, duration, distance, driving metrics, start and end point.
EventsGET /v1/analytics/eventsOne alarm or driving event: type, severity, driver, trip.
Zone visitsGET /v1/analytics/visitsOne stay in a zone: zone name and type, entry and exit time, minutes.
VehiclesGET /v1/analytics/vehiclesOne vehicle: name, status, last report, current drivers. A lookup table.

Excel Power Query

  1. Create an API key with the analytics:read scope. Follow the API keys setup guide.
  2. In Excel, select Data → Get Data → From Other Sources → Blank Query.
  3. Open Advanced Editor. Replace its contents with the query below.
  4. Replace the API key and date values.
  5. Set Feed to daily, trips, events, visits, or vehicles.
  6. Select Done, then select Close & Load.
  7. To load more feeds, duplicate the query and change Feed. Give each query the name of its feed.
let
    ApiKey = "filodos_REPLACE_WITH_YOUR_KEY",
    Feed = "daily",
    Since = "2026-09-01",
    Until = "2026-10-05",
    BaseUrl = "https://filodos.gr/filodos-dashboard/api/scoring",

    GetPage = (Offset as number) as record =>
        Json.Document(
            Web.Contents(
                BaseUrl,
                [
                    RelativePath = "v1/analytics/" & Feed,
                    Query = [
                        since = Since,
                        until = Until,
                        limit = "5000",
                        offset = Number.ToText(Offset)
                    ],
                    Headers = [
                        Authorization = "Bearer " & ApiKey,
                        Accept = "application/json"
                    ]
                ]
            )
        ),

    Pages = List.Generate(
        () => [Page = GetPage(0)],
        each [Page] <> null,
        each
            if [Page][next_offset] = null then
                [Page = null]
            else
                [Page = GetPage([Page][next_offset])],
        each [Page][rows]
    ),
    Rows = List.Combine(Pages),
    Result = Table.FromRecords(Rows)
in
    Result

Excel may ask how to connect to the web source. Choose Anonymous. The query sends the API key in the bearer header. Set the source privacy level to Organizational if Excel asks.

Refresh the query to load current data. It requests each page until next_offset is null. The vehicles feed ignores the date values. Each feed page shows an example of the sheet that the query makes.

To get number and date columns, open the query in the Power Query editor. Select all columns, then select Transform → Detect Data Type. Timestamps become date/time/timezone values.

To relate the tables, use device_id. The trips and events feeds also share trip_id.

Google Sheets

Sheet formulas cannot send the Bearer header that the API needs. Use an Apps Script instead. The script below reads every page of one feed and writes its rows into the open sheet.

  1. Create an API key with the analytics:read scope. Follow the API keys setup guide.
  2. Open your sheet. Select Extensions → Apps Script.
  3. Replace the contents of Code.gs with the script below.
  4. Replace the API key and date values.
  5. Set FILODOS_FEED to daily, trips, events, visits, or vehicles.
  6. In the function list select loadFilodosFeed, then select Run. Approve access when Google asks.
  7. Return to the sheet. The script clears the open tab and writes the header row plus all rows.
  8. To load more feeds, open one more tab for each feed. Change FILODOS_FEED and run again.
// Load one Filodos analytics feed into this sheet.
// 1. Create an API key with the analytics:read scope.
// 2. Paste the key below. Set FEED, SINCE, and UNTIL.
// 3. Select loadFilodosFeed and press Run. Approve access when Google asks.
// 4. For one more feed, open one more tab and run again with new FEED.

var FILODOS_API_KEY = 'filodos_REPLACE_WITH_YOUR_KEY';
var FILODOS_FEED = 'daily'; // daily, trips, events, visits, or vehicles
var FILODOS_SINCE = '2026-09-01'; // first fleet-local day, YYYY-MM-DD
var FILODOS_UNTIL = '2026-10-05'; // last fleet-local day, YYYY-MM-DD
var FILODOS_BASE_URL =
  'https://filodos.gr/filodos-dashboard/api/scoring';

function loadFilodosFeed() {
  var rows = filodosFetchAll_(FILODOS_FEED, FILODOS_SINCE, FILODOS_UNTIL);
  writeRows_(SpreadsheetApp.getActiveSheet(), rows);
}

function filodosFetchAll_(feed, since, until) {
  var all = [];
  var offset = 0;
  for (;;) {
    var params = {limit: '5000', offset: String(offset)};
    if (feed !== 'vehicles') {
      params.since = since;
      params.until = until;
    }
    var query = Object.keys(params).map(function (k) {
      return encodeURIComponent(k) + '=' + encodeURIComponent(params[k]);
    }).join('&');
    var res = UrlFetchApp.fetch(
      FILODOS_BASE_URL + '/v1/analytics/' + feed + '?' + query,
      {
        headers: {
          Authorization: 'Bearer ' + FILODOS_API_KEY,
          Accept: 'application/json'
        },
        muteHttpExceptions: true
      });
    if (res.getResponseCode() !== 200) {
      throw new Error(
        'Filodos answered ' + res.getResponseCode() + ': ' +
        res.getContentText());
    }
    var page = JSON.parse(res.getContentText());
    all.push.apply(all, page.rows);
    if (page.next_offset === null || page.next_offset === undefined) break;
    offset = page.next_offset;
  }
  return all;
}

function writeRows_(sheet, rows) {
  sheet.clearContents();
  if (rows.length === 0) {
    sheet.getRange(1, 1).setValue('No rows.');
    return;
  }
  var header = [];
  rows.forEach(function (row) {
    Object.keys(row).forEach(function (k) {
      if (header.indexOf(k) === -1) header.push(k);
    });
  });
  var values = [header].concat(rows.map(function (row) {
    return header.map(function (k) {
      var v = row[k];
      return v === null || v === undefined ? '' : v;
    });
  }));
  sheet.getRange(1, 1, values.length, header.length).setValues(values);
}

The script requests pages of 5000 rows until next_offset is null. The vehicles feed ignores the date values. Run the function again to refresh the data.

One script run stops after six minutes. This is a Google limit. If your fleet is large, split the date range into smaller parts. Load each part on its own tab.

The API key is a secret. If you share the sheet, keep the key in the script properties. Read it with PropertiesService instead of pasting it in the code.

To relate the tables, use device_id. The trips and events feeds also share trip_id.

Power BI Desktop

  1. Create an API key with the analytics:read scope.
  2. In Power BI Desktop, select Get data → Blank query.
  3. Open Manage Parameters. Create text parameters named FilodosApiKey, FilodosSince, and FilodosUntil. Enter your key and date bounds.
  4. Open Advanced Editor. Paste the Excel query above.
  5. Delete the ApiKey, Since, and Until lines.
  6. Replace ApiKey, Since, and Until in the query with the parameter names.
  7. Select Done. Select all columns, then select Transform → Detect Data Type.
  8. Duplicate the query for each other feed and change Feed. Then select Close & Apply.
  9. In the model view, relate each table to vehicles on device_id.

When Power BI asks for web credentials, choose Anonymous. The query adds the bearer key in its request header. If you publish the report, configure its web source credentials in the Power BI service.

The API key is a secret. Keep the PBIX file and its parameters available only to people who may use that key. Create a separate key for this feed and revoke it if you expose the file.