Skip to content
Get started

OData API

Grunddata exposes a read-only OData feed at /odata, designed for Excel, Power Query and Power BI.

The contract is driven entirely by views. A view defines the entity set name and the exact fields exposed.

Endpoint Purpose
GET /odata/ The OData service document. This is the URL you paste into Excel or Power BI.
GET /odata/$metadata The EDM metadata document generated from your views
GET /odata/{EntitySet} Read the active records of one view
GET /odata/{EntitySet}({SourceId}) Read a single active record by its SourceId
  1. In Excel, select Data → Get Data → From Other Sources → From OData Feed.

    In Power BI Desktop, select Get Data → OData feed.

    Excel OData feed dialog with the service root URL entered

  2. Enter your customer API’s OData service root. The exact host is provided for your environment; the path is usually:

    https://<your-customer-api-host>/api/odata/

    Some deployments expose the API at the host root instead:

    https://<your-customer-api-host>/odata/

    Use the URL supplied by your Grunddata administrator. It must end at /odata/, not at a specific view.

  3. When Excel asks how to connect, select Organizational account, then click Sign in.

    Grunddata uses Microsoft Entra ID. Sign in with the organisation account that has access to the customer environment.

  4. Excel opens the Navigator. Select one or more views, preview the fields, and click Load.

    The views listed here are the OData contracts configured in Grunddata. A table does not appear just because it exists; it must have a view.

    Excel Navigator showing Grunddata OData views and the Load button

Option Support
$select Choose which fields to return
$top Limit the number of rows. Capped server-side.
$skip Skip rows
$count Return the total count
$filter eq, ne, gt, ge, lt, le; startswith(Field,'x'), contains(Field,'x'); predicates joined with and
$orderby Single and multi-field, with asc / desc

Filtering, ordering and paging are pushed down to the database, so they are fast on large tables. Server-driven paging applies when $top is omitted.

GET /odata/AccountsView?$select=Code,Name,CurrencyCode
GET /odata/AccountsView?$filter=CurrencyCode eq 'SEK'
GET /odata/AccountsView?$filter=contains(CounterpartyName,'Nordea') and Version gt 1
GET /odata/AccountsView?$orderby=CounterpartyName asc,Limit desc
GET /odata/AccountsView?$count=true&$top=100

Views can expose system fields:

Field Notes
SourceId The entity key. Present in every view.
Code The record’s business key
Name The record’s readable label
Version The revision number
CreatedAt When this version was created

Plus your attributes. Domain attributes appear as up to three scalar fields:

Field Contains
{Attribute}SourceId The referenced record’s source_id
{Attribute}Code The referenced record’s Code
{Attribute}Name The referenced record’s Name

All three are usable in $filter and $orderby:

GET /odata/LimitsView?$filter=CounterpartyCode eq 'NORDEASE'
GET /odata/LimitsView?$orderby=CounterpartyName asc

Soft-deleted records are excluded from the feed. You always see the current, active state. See Commits and versions.

The feed is deliberately narrow:

  • Write operations. OData is read-only. Use the plugins or the API to change data.
  • Nested or multi-hop $expand.
  • $apply.
Symptom Likely cause
No tables offered in the navigator No views exist, or you lack access to them
Authentication fails in Excel or Power BI Confirm you are signing in with your organisation account; check with your administrator that the client is permitted
A field is missing It is not ticked in the view. Edit the view and add it.
A query returns fewer rows than expected Server-driven paging is active — let the connector follow the next-page links, or set $top