Appearance
Power BI, Excel and Grafana
Your own dashboards on Omaya's occupancy, without writing code. Power BI, Excel and Grafana each read a table from a web address with two headers, and Omaya gives the two tables they need as CSV.
The two tables
| Address | One row per | Use it for |
|---|---|---|
/api/v1/occupancy/hourly?format=csv | Zone and hour | Your own charts: busiest hours, rooms side by side, trends. Up to 31 days a call |
/api/v1/space/utilisation?format=csv | Zone | The Space Utilisation report as a table: occupied share, typical and peak headcount, capacity, cost of idle space, verdict. Up to 92 days |
/api/v1/space/utilisation?format=csv&table=floors | Floor | Rent, occupied share, cost per used m², seats needed against seats provided |
/api/v1/space/utilisation?format=csv&table=buildings | Building | The building's class (opportunity, alert, resilient), the floors that could be given back and the sentence that explains it |
Areas come in m² (area_m2, cost_per_used_m2) and, alongside, in your organisation's area unit (area, cost_per_used_area, release_area, with area_unit = m2 or sqft), so a dashboard in square feet needs no conversion.
Add &from=2026-09-01&to=2026-09-30 for a period (calendar days on your organisation's clock; the last seven days if you leave them out) and &venue_uid=… for one floor. Without format=csv the same addresses answer JSON, for anything that prefers it.
The hourly table's columns: date, hour (your local time), zone_uid, zone_name, venue_uid, venue_name, capacity, peak (the most people in the zone in that hour), source and in_operating_hours (1 when the hour is inside the venue's opening hours on an open day).
Read source before you add numbers up. sensor is a counting sensor or radar and counts everyone. presence is a presence sensor: 1 means in use, not one person. gateway counts only the people carrying a tag. A chart that adds all three as "people" will mislead someone.
Before you start
- In Omaya, open My Profile → API keys and create a key just for this dashboard, named after it (for example Power BI — facilities). If the file is ever shared too widely, you revoke that one key and nothing else breaks.
- Note your organisation's identifier, the one you type at the login form.
- Your Omaya address, for example
https://omaya.example.com.
The key travels with the file
Anyone who opens the Power BI or Excel file can see the key in its query. Treat the file like a password: share the published report, not the file.
Power BI Desktop
- Home → Get data → Web.
- Choose Advanced.
- URL parts: your address followed by the table, for example
https://omaya.example.com/api/v1/occupancy/hourly?format=csv&from=2026-09-01&to=2026-09-30. - HTTP request header parameters: add
X-Tenant-IDwith your organisation's identifier, then Add header andX-Api-Keywith the key. - OK. If Power BI asks how to connect, choose Anonymous — the headers carry the key.
- In the preview, check the first row became the column names, then Load.
Check it worked: the table has one row per zone and hour, and peak is a whole number. 401 — Missing X-Tenant-ID or X-Api-Key header means a header name is mistyped; Invalid API key means the key was revoked or copied short.
A rolling period instead of fixed dates: leave from and to off for the last seven days, or build them with Power Query parameters.
Excel
- Data → Get Data → From Other Sources → From Web.
- Advanced, then the same URL parts and the same two headers as Power BI.
- OK, Anonymous if asked, then Load.
Data → Refresh All fetches the latest figures.
Grafana
- Install the Infinity data source plugin and add it as a data source.
- Under the data source's Headers, add
X-Tenant-IDandX-Api-Key. Allow your Omaya address under Allowed hosts. - In a panel: Type CSV, Source URL, and the table's address.
- For time series, set
dateandhouras the time columns or use the occupancy history endpoint per zone; see Reading data out.
How fresh the numbers are
The hourly table is built from the same rows as Space Utilisation: a counting sensor's hour is updated on every reading, a tag hour every fifteen minutes. Refreshing every hour is plenty; refreshing every minute fetches the same table.
Related
Reading data out · API reference · Reports → Space Utilisation, in the app