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.
| Parameter | Required | Notes |
|---|---|---|
since | Yes, except vehicles | First fleet-local date, in YYYY-MM-DD form. |
until | Yes, except vehicles | Last fleet-local date, in YYYY-MM-DD form. Both bounds are inclusive. The range cannot exceed 366 days. |
limit | No | Rows per page. Default 1000; maximum 5000. |
offset | No | First 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.
| Feed | Path | One row for |
|---|---|---|
| Daily metrics | GET /v1/ | One vehicle on one day: distance, drive and idle time, overspeed, harsh events, fatigue. |
| Trips | GET /v1/ | One trip: start and end time, duration, distance, driving metrics, start and end point. |
| Events | GET /v1/ | One alarm or driving event: type, severity, driver, trip. |
| Zone visits | GET /v1/ | One stay in a zone: zone name and type, entry and exit time, minutes. |
| Vehicles | GET /v1/ | One vehicle: name, status, last report, current drivers. A lookup table. |
Excel Power Query
- Create an API key with the
analytics:readscope. Follow the API keys setup guide. - In Excel, select Data → Get Data → From Other Sources → Blank Query.
- Open Advanced Editor. Replace its contents with the query below.
- Replace the API key and date values.
- Set
Feedtodaily,trips,events,visits, orvehicles. - Select Done, then select Close & Load.
- 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.
- Create an API key with the
analytics:readscope. Follow the API keys setup guide. - Open your sheet. Select Extensions → Apps Script.
- Replace the contents of
Code.gswith the script below. - Replace the API key and date values.
- Set
FILODOS_FEEDtodaily,trips,events,visits, orvehicles. - In the function list select
loadFilodosFeed, then select Run. Approve access when Google asks. - Return to the sheet. The script clears the open tab and writes the header row plus all rows.
- To load more feeds, open one more tab for each feed. Change
FILODOS_FEEDand 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
- Create an API key with the
analytics:readscope. - In Power BI Desktop, select Get data → Blank query.
- Open Manage Parameters. Create text parameters named
FilodosApiKey,FilodosSince, andFilodosUntil. Enter your key and date bounds. - Open Advanced Editor. Paste the Excel query above.
- Delete the
ApiKey,Since, andUntillines. - Replace
ApiKey,Since, andUntilin the query with the parameter names. - Select Done. Select all columns, then select Transform → Detect Data Type.
- Duplicate the query for each other feed and change
Feed. Then select Close & Apply. - In the model view, relate each table to
vehiclesondevice_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.