Custom endpoints
Custom BI endpoints let you expose data from any Business Central table through the BI Endpoints API — without writing AL code or deploying an extension — when the standard endpoints don't cover what you need. You can select any table, including tables added by other extensions, and fields that extensions added to standard tables.
:::info Premium
Custom endpoints require a Premium subscription. On the Free tier you can create and configure custom endpoints, but their data is not served until the subscription is upgraded.
:::
Set up a custom endpoint
- Open the BI Endpoints page and choose Custom BI Endpoints in the menu bar.
- On the Custom BI Endpoints list, create a new record.
- On the Custom Endpoint card, fill in:
- Endpoint Name — the name used to select the endpoint when calling
the API. It must be unique, cannot be the name of a standard endpoint,
and must be camelCase: start with a lowercase letter and contain only
letters and digits, for example
myCustomTable. - Source Table — use the lookup to select the table. It lists every table in the environment, including tables added by other extensions. When a table is selected, its primary key fields are mapped into the first columns automatically.
- Type — Master Data or Transactional Data.
- Description — shown in the BI Endpoints metadata.
- Active — switch it on to make the endpoint available through the API.
- Endpoint Name — the name used to select the endpoint when calling
the API. It must be unique, cannot be the name of a standard endpoint,
and must be camelCase: start with a lowercase letter and contain only
letters and digits, for example
- In Column Mapping, choose the fields to expose. Each row maps a column
slot (
col1,col2, … up tocol50) to a field: pick it with the Source Field lookup, which includes fields added by extensions. The Label is filled in automatically. The primary key columns are already mapped and cannot be cleared. - Close the card. Once Active is on, the endpoint appears in the BI Endpoints list with the category Custom.

The app registration that reads the data needs read permission on the source table. Tables covered by a standard endpoint are included in DTW BI ENDPOINTS; for other tables, add a permission set that can read them. See Permissions.
Custom endpoint definitions are environment-wide: one definition serves every company.
Call a custom endpoint
All custom endpoints are served through a single endpoint, customData,
and told apart by an endpointName filter. The ready-made URL is on the
endpoint's page under BI Endpoints, and in url in the biEndpoints
metadata. It includes:
- a
$filterthat selects the endpoint by name, and - a
$selectthat lists the column slots that are mapped, plussystemModifiedAt.
GET .../companies({companyId})/customData?$filter=endpointName eq 'myCustomTable'&$select=col1,col2,systemModifiedAt
The response uses the generic column names:
{
"value": [
{ "col1": "CATEGORY A", "col2": "These are the primary customers", "systemModifiedAt": "2026-09-11T09:12:44Z" },
{ "col1": "CATEGORY B", "col2": "These are also important", "systemModifiedAt": "2026-09-11T09:12:44Z" }
]
}
Incremental loads and deletions work as for any endpoint: add
and systemModifiedAt ge … to the filter, and read
deletedEntries?$filter=entitySetName eq 'myCustomTable'. See
Incremental loads and deletions.
Find out what each column holds
Query the properties metadata with the endpoint name:
GET .../companies({companyId})/properties?$filter=entitySetName eq 'myCustomTable'
{
"value": [
{ "entitySetName": "myCustomTable", "propertyName": "col1", "propertyCaption": "code", "dataType": "Code", "isPrimaryKey": true },
{ "entitySetName": "myCustomTable", "propertyName": "col2", "propertyCaption": "description", "dataType": "Text", "isPrimaryKey": false },
{ "entitySetName": "myCustomTable", "propertyName": "systemModifiedAt", "propertyCaption": "systemModifiedAt" }
]
}
propertyCaption is the column's label and dataType its Business Central
type. A sample request for both calls is in the Postman collection under
BI Endpoints > V1 > Custom.
Column values
Every column in customData is served as text. Use dataType from
properties to convert it:
| Type | Served as |
|---|---|
Decimal | JSON number syntax inside the string — a dot as decimal separator, no thousand separator, for example "1253.54" — whatever the region of the user the API runs as |
Boolean | "true" or "false", whatever the output language |
Date | yyyy-MM-dd |
DateTime | yyyy-MM-ddTHH:mm:ss |
| Option and enum | The caption in the API output language |
Cloud Connector stores the columns under their real names and with these types applied.
Manage custom endpoints from code
The same definitions can be created, changed and deleted through the Management API.