> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.navipartner.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.navipartner.com/_mcp/server.

# List Tables

GET https://api.npretail.app/{tenant}/{environment}/{company}/tablemetadata

Lists the tables that the BI endpoint can expose, with their English and translated names, whether the caller is allowed to read each one, and whether each one supports replication.

This endpoint returns no business data. It is open to every caller that holds the BI permission set, whether or not any table has been allowed for them.

Reference: https://docs.navipartner.com/apis/api-reference/bi/service-tablemetadata/list-tables

## Authentication

- `x-np-api-key` header (required) — API Key authentication via header

## Request

### Path parameters

- `tenant` (string, required) — Your Entra Tenant ID. [More details.](/paths#1-tenant)
- `environment` (string, required) — Your Business Central Environment. [More details.](/paths#2-environment)
- `company` (string, required) — Your Business Central Company. [More details.](/paths#3-company)

### Headers

- `Accept-Language` (string, optional) — The language to use for the translated captions, for example `da-DK`. Defaults to the language of the calling user, and then to English.

## Response

### 200

- `language` (string, required) — The language tag used for the translated captions in this response.
- `data` (list of TableSummary, required)

## Types

### TableSummary

One table that the BI API can expose.

- `tableNo` (integer, required) — The Business Central table number, used as the path parameter of the BI endpoint.
- `name` (string, required) — The caption of the table in English.
- `translatedName` (string, required) — The caption of the table in the language of the response.
- `systemName` (string, required) — The AL object name of the table.
- `allowed` (boolean, required) — Whether the calling API key or Entra ID application may read this table through the BI endpoint.
- `syncSupported` (boolean, required) — Whether the table has the index that ordering by row version requires. Every BI read is incremental, so a table where this is false cannot be read through the BI endpoint at all until the index is added.
- `dataPerCompany` (boolean, required) — Whether the table holds separate data per company. A table without it returns the same records in every company.

## Examples

**Response**

```json
{
  "language": "en-US",
  "data": [
    {
      "tableNo": 27,
      "name": "Item",
      "translatedName": "Item",
      "systemName": "Item",
      "allowed": true,
      "syncSupported": true,
      "dataPerCompany": true
    }
  ]
}
```

**SDK Code**

```python List the available tables
import requests

url = "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./tablemetadata"

headers = {"x-np-api-key": "<NaviPartner API Key>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript List the available tables
const url = 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./tablemetadata';
const options = {method: 'GET', headers: {'x-np-api-key': '<NaviPartner API Key>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go List the available tables
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./tablemetadata"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("x-np-api-key", "<NaviPartner API Key>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby List the available tables
require 'uri'
require 'net/http'

url = URI("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./tablemetadata")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["x-np-api-key"] = '<NaviPartner API Key>'

response = http.request(request)
puts response.read_body
```

```java List the available tables
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./tablemetadata")
  .header("x-np-api-key", "<NaviPartner API Key>")
  .asString();
```

```php List the available tables
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./tablemetadata', [
  'headers' => [
    'x-np-api-key' => '<NaviPartner API Key>',
  ],
]);

echo $response->getBody();
```

```csharp List the available tables
using RestSharp;

var client = new RestClient("https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./tablemetadata");
var request = new RestRequest(Method.GET);
request.AddHeader("x-np-api-key", "<NaviPartner API Key>");
IRestResponse response = client.Execute(request);
```

```swift List the available tables
import Foundation

let headers = ["x-np-api-key": "<NaviPartner API Key>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.npretail.app/01234567-89ab-cdef-0123-456789abcdef/production/CRONUS%2520International%2520Ltd./tablemetadata")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```