HTTP-API des BI-Feeds
Der BI-Feed ist nicht nur für Tableau da. Er ist ein gewöhnlicher, lesender HTTP-Endpunkt – und der einzige zugesagte Weg, Daten aus dem Lakehouse programmatisch abzuholen, ohne die Governance zu umgehen.
Auf dieser Seite
Der zugesagte Weg
Der BI-Feed trägt eine eigene Vertragsversion und bleibt stabil. Die übrigen Pfade unter /api/agent/ gehören zur Konsole – wenn Sie einen davon brauchen, sprechen wir darüber.
Grundlagen
| Punkt | Wert |
|---|---|
| Basis | https://<host>/api/agent/tableau/ |
| Vertragsversion | 1 – steht in der Antwort von /info und steigt nur bei einer inkompatiblen Änderung. |
| Anmeldung | Bearer. Ein Keycloak-Zugriffstoken des Realms mit Publikum (aud) agent. Anderes Publikum: 401. |
| Methoden | Nur GET auf die Datenendpunkte. Der Feed nimmt kein SQL entgegen. |
| Zwischenspeicher | Jede Antwort trägt Cache-Control: no-store. |
| Protokollierung | Ein WORM-Eintrag je abgerufener Seite und je Schemaauskunft – ohne Zeilenwerte, aber mit Zielobjekt und Seitenparametern. |
Der Feed ist ab Werk aus
Eine Datenausleitung wird bewusst eingeschaltet: Bis die Administration den Schalter unter Daten → BI-Anbindung umlegt, antwortet der Feed mit 403.
Die Endpunkte
| Endpunkt | Wofür | Wer |
|---|---|---|
| GET /tableau/info | Selbstauskunft: Endpunkte, Grenzen, Anmeldung, JSONPath auf die Datensätze. | Jeder angemeldete Nutzer |
| GET /tableau/schema | Spalten eines Objekts mit Trino-Typ, Tableau-Typ und der Projektion, mit der umgewandelt wird. | Jeder, der das Objekt sehen darf |
| GET /tableau/rows | Eine Seite Daten, als JSON oder CSV. | Jeder, der das Objekt sehen darf |
| GET /tableau/settings | Stand des Schalters, der Zeilenobergrenze und der Katalog-Allowlist. | Plattform-Administration |
| PUT /tableau/settings | Diese Einstellungen ändern. Auditiert. | Plattform-Administration |
Spalten eines Objekts abfragen
Der Schema-Endpunkt sagt, was von einem Objekt überhaupt ausgeliefert werden kann. Spalten mit Typen, die das Zielwerkzeug nicht kennt, werden ausgelassen statt geraten – sie stehen in unsupportedColumns. Das Feld recommendedOrderBy nennt eine brauchbare Sortierspalte für das Blättern.
curl -sS \
-H "Authorization: Bearer $TOKEN" \
"https://lakehouse.example.invalid/api/agent/tableau/schema\
?catalog=iceberg&schema=produkte&table=produkte" | jq .Daten seitenweise holen
# Erste Seite. Ab der zweiten ist orderBy Pflicht – deshalb gleich setzen.
curl -sS \
-H "Authorization: Bearer $TOKEN" \
"https://lakehouse.example.invalid/api/agent/tableau/rows\
?catalog=iceberg&schema=produkte&table=produkte\
&limit=1000&offset=0&orderBy=artikelnummer" | jq '.meta, .data[0]'
# Als CSV, etwa zum Weiterreichen an ein Skript
curl -sS \
-H "Authorization: Bearer $TOKEN" \
"https://lakehouse.example.invalid/api/agent/tableau/rows\
?catalog=iceberg&schema=produkte&table=produkte\
&limit=1000&orderBy=artikelnummer&format=csv" > produkte.csvParameter von /tableau/rows
| Parameter | Pflicht | Bedeutung |
|---|---|---|
| catalog, schema, table | ja | Das Objekt – Tabelle oder Sicht. |
| limit | nein | Zeilen je Seite. Standard 10 000, harte Obergrenze 50 000, per Einstellung weiter senkbar. |
| offset | nein | Erste Zeile der Seite. |
| orderBy | ab offset > 0 | spalte, spalte:desc, mehrere komma-getrennt, oder * für alle Spalten. |
| format | nein | json (Standard) oder csv. |
Ohne orderBy wird ab der zweiten Seite nicht etwa unsortiert geliefert, sondern gar nicht: 400 order_required. OFFSET ohne ORDER BY ist in einer parallelen Engine nicht stabil – eine Seite könnte Zeilen doppelt bringen und andere auslassen, ohne dass irgendwo ein Fehler auftritt.
Antwortform
Die Datensätze liegen unter data – das ist der JSONPath, den auch Tableau liest. Daneben steht meta als Selbstauskunft der Seite; wer nur die Zeilen will, ignoriert es.
{
"data": [
{ "artikelnummer": "A-1001", "bezeichnung": "Rohrschelle 20 mm", "lagerbestand": 412 }
],
"meta": {
"object": { "catalog": "iceberg", "schema": "produkte", "table": "produkte" },
"columns": [
{ "name": "artikelnummer", "tableauType": "string" },
{ "name": "lagerbestand", "tableauType": "int" }
],
"unsupportedColumns": [],
"limit": 1000,
"offset": 0,
"rowCount": 1000,
"hasMore": true,
"order": ["artikelnummer"],
"orderAll": false,
"deterministicPaging": true
}
}hasMore kommt ohne Zählabfrage aus
Es wird aus rowCount === limit abgeleitet. Eine Schleife, die darauf prüft, liegt immer richtig – die letzte Seite kann dabei einmal leer ausfallen.
Fehlercodes
| Antwort | Bedeutung | Abhilfe |
|---|---|---|
| 401 | Kein oder abgelaufenes Token, oder falsches Publikum. | Token erneuern; aud muss agent sein. |
| 403 bridge_disabled | Der Feed ist ausgeschaltet. | Administration: Konsole → BI-Anbindung. |
| 403 catalog_not_allowed | Katalog steht nicht auf der Allowlist. | Administration: Freigaben pflegen. |
| 404 not_found | Objekt existiert nicht – oder ist für Sie nicht sichtbar. | Rechte in Trino prüfen. Beides sieht absichtlich gleich aus, damit die Antwort nichts über fremde Objekte verrät. |
| 400 order_required | Blättern ohne Sortierschlüssel. | orderBy setzen. |
| 400 invalid_page | limit, offset oder orderBy unzulässig. | Grenzen beachten – limit wird nicht stillschweigend gekürzt. |
| 400 query_error | Trino konnte die Abfrage nicht ausführen. | Meldung lesen; meist ein exotisch typisiertes Feld. Sicht mit umgewandelter Spalte anlegen. |
| 422 no_deliverable_columns | Keine Spalte des Objekts ist auslieferbar. | Sicht mit umgewandelten Spalten anlegen. |
| 502 upstream_error | Trino oder der Tokentausch war nicht erreichbar. | Betrieb prüfen. Einzelheiten stehen im Dienstprotokoll, nicht in der Antwort. |
Wie Sie an ein Token kommen
Der Feed stellt keine eigenen Token aus – er prüft die des Realms. Für einen einmaligen Abruf reicht ein Zugriffstoken aus der angemeldeten Sitzung. Für geplante Abrufe legt die Administration einen eigenen öffentlichen Client im Realm an und lässt das aufrufende Werkzeug den Authorization-Code-Fluss mit PKCE durchlaufen; der Client braucht einen Audience-Mapper auf agent. Die Adressen der Autorisierungs- und Token-Endpunkte nennt GET /tableau/info.
Ein Token trägt eine Identität
Auch hier gibt es kein Dienstkonto: Ein Token führt die Rechte einer Person – und deren Namen in jedem Audit-Eintrag.
Stand: Diese Seite beschreibt lavalake 0.16.0. Produkt und Dokumentation liegen in getrennten Repositories – im Zweifel gilt, was die Konsole zeigt.
Etwas fehlt?
Wenn diese Seiten Ihre Frage nicht beantworten, zeigen wir die Plattform in einer halben Stunde an Ihrem Fall.
Demo vereinbaren