Skip to main content

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​

  1. Open the BI Endpoints page and choose Custom BI Endpoints in the menu bar.
  2. On the Custom BI Endpoints list, create a new record.
  3. 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.
  4. In Column Mapping, choose the fields to expose. Each row maps a column slot (col1, col2, … up to col50) 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.
  5. 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 $filter that selects the endpoint by name, and
  • a $select that lists the column slots that are mapped, plus systemModifiedAt.
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:

TypeServed as
DecimalJSON 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
Dateyyyy-MM-dd
DateTimeyyyy-MM-ddTHH:mm:ss
Option and enumThe 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.