API overview
The BI Endpoints are API pages inside Business Central. They are read-only, company-scoped, follow OData v4 conventions, and are authenticated with an OAuth 2.0 bearer token from Microsoft Entra ID.
Construction of the URL
A sample endpoint URL, broken down:
https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{environment}/api/datawareness/endpoints/v1.0/companies({companyId})/glEntries?$filter=postingDate ge 2026-01-01
| Part | Meaning |
|---|---|
https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{environment}/api/ | The Business Central base URL. Replace {tenantId} with the tenant's GUID and {environment} with the environment, for example Production. |
datawareness/endpoints/ | The root of this application (publisher and API group). |
v1.0/ | The current version of the endpoints. |
companies({companyId})/ | The company to read from. Replace {companyId} with the company's GUID; list companies with GET https://api.businesscentral.dynamics.com/v2.0/{tenantId}/{environment}/api/v2.0/companies. |
glEntries | The entity set to read. See the category pages, starting with Finance. |
?$filter=postingDate ge 2026-01-01 | Optional query options. See Querying the endpoints. |
Spaces in a query are sent URL-encoded, for example postingDate%20ge%202026-01-01.
You don't need to assemble URLs by hand: each endpoint's page under BI
Endpoints in Business Central shows its URL for the current environment
and company, and the biEndpoints metadata returns the same in url.
Authentication
Always send a bearer token: Authorization: Bearer <access_token>. A token is
only valid for a limited time, so request a new one from your app registration
when it expires. See Authentication.
Response format
{
"@odata.context": "https://api.businesscentral.dynamics.com/v2.0/.../$metadata#companies(...)/glEntries",
"value": [
{
"@odata.etag": "W/\"JzE5Oz...\"",
"entryNo": 1,
"gLAccountNo": "2910",
"postingDate": "2026-01-02",
"documentNo": "START",
"amount": 1500.0,
"systemModifiedAt": "2026-01-02T08:14:22.12Z"
}
]
}
- The rows are in the array
value. - Field names are camelCase. The fields of every endpoint are listed by the
propertiesmetadata endpoint. - Every endpoint includes
systemModifiedAt, when the record was created or last modified. Use it for incremental loads. - The business key of each endpoint —
entryNo,no,documentNo&&lineNoand so on — identifies a record. Use it as the key in your warehouse. - Enum and option values, such as
documentTypeorstatus, are rendered as text in the API Output Language chosen on BI Endpoints Setup.
Pagination
A response holds at most 20,000 rows. When the query matches more, the
response also contains @odata.nextLink: the URL of the next page. Keep
calling it until it is no longer returned. See
Pagination.
Subscription tiers
Each endpoint requires the Free or Premium tier; see
Free and Premium. The tier of every endpoint is
on the category pages and in the tier field of
biEndpoints.
Errors
Errors use Business Central's standard OData error body:
{
"error": {
"code": "Application_DialogException",
"message": "This endpoint requires a Premium subscription. Your current subscription tier is Free. Please upgrade to access this endpoint."
}
}
| Status | Typical cause |
|---|---|
400 Bad Request | The subscription is not activated, the endpoint needs a higher tier, or the query is invalid. Read error.message. |
401 Unauthorized | The token is missing, expired or for the wrong app. |
403 Forbidden | The app lacks a permission set in Business Central, or the company ID is wrong. |
404 Not Found | The extension is not installed, or the endpoint name, URL or environment is wrong. |
429 Too Many Requests | Business Central throttling. Retry with backoff and use smaller pages. |
See Troubleshooting for what to check for each.
Limits
Request limits are set by the Business Central platform, not by BI Endpoints; see Microsoft's operational limits. In practice:
- Filter on
systemModifiedAtto read only what changed. - Use
$selectto read only the fields you need. - Request smaller pages with
Prefer: odata.maxpagesize=5000for large tables. - Reuse a token until it expires instead of requesting one per call.
Endpoint groups
| Group | Pages |
|---|---|
| Data, by category | Finance, Sales, Purchasing, Inventory, Jobs, Resources, Manufacturing, Assembly, Approvals |
| Deletions | deletedEntries |
| Metadata | biEndpoints, properties, relationships, referencedBy, applicationInfo |
| Custom endpoints | customData |
| Management API | tables, tableFields, customEndpoints, customEndpointColumns |