# SDKs

Vibedasher liefert offizielle, vollständig typisierte SDKs für **TypeScript** und **Python**, generiert aus der OpenAPI-Spezifikation der API, damit sie im Gleichschritt mit der Plattform bleiben. So erreicht Ihr eigener Code die betriebene Plattform: SQL gegen Ihre Datensätze ausführen, Aktualisierungen auslösen, Verbindungen und Zugriffsrechte verwalten, ein Dashboard an lebende Daten anbinden oder alles automatisieren, was die [MCP-Werkzeuge](/de/guides/build-with-your-agent.md) aus einem Skript statt aus einem Agenten heraus tun.

| Sprache    | Paket                                                                    | Hier dokumentiert |
| ---------- | ------------------------------------------------------------------------ | ----------------- |
| TypeScript | [`@vibedasher/client`](https://www.npmjs.com/package/@vibedasher/client) | 4.1.5             |
| Python     | [`vibedasher`](https://pypi.org/project/vibedasher/)                     | 4.3.19            |

Beide SDKs authentifizieren sich mit einem **API-Schlüssel** im `X-Api-Key`-Header. Erzeugen Sie einen in der App unter **Einstellungen → API-Schlüssel** auf [cloud.vibedasher.com](https://cloud.vibedasher.com) — siehe [Authentifizierung](/de/api/authentication.md). (Die SDKs sind der *Code*-Pfad; wenn Ihr Agent Vibedasher über MCP steuert, meldet er sich stattdessen mit `vibedasher login` an und braucht überhaupt keinen Schlüssel — siehe [Mit Ihrem Agenten bauen](/de/guides/build-with-your-agent.md).)

Keinem der beiden Clients muss mitgeteilt werden, in welcher Region Ihr Konto liegt. Ohne Basis-URL und ohne `region` lösen beide `https://api.vibedasher.com/api` auf, das jede Anfrage anhand des mitgeführten Zugangsschlüssels routet — siehe [Ein Host, geroutet über Ihren Zugangsschlüssel](/de/api/authentication.md#one-host-routed-by-your-credential). `region` zu übergeben wird weiterhin unterstützt und bindet den Client an den eigenen Hostnamen dieser Region, `https://api.{region}.vibedasher.com/api`; ein explizites `baseUrl` / `base_url` hat Vorrang vor beidem. (`region` wurde in `@vibedasher/client` 4.1.5 und `vibedasher` 4.3.19 optional.)

Suchen Sie einen bestimmten Endpunkt? Durchsuchen Sie die vollständige **[API Reference](/de/reference/vibedasher-sdk-api.md)** — jede Operation gruppiert nach Ressource, mit curl-/Python-/TypeScript-Anfragebeispielen, generiert aus denselben Signaturen, auf denen die SDKs aufbauen.

## Die Form jedes Aufrufs[​](#die-form-jedes-aufrufs "Direkter Link zur Die Form jedes Aufrufs")

Beide SDKs stellen denselben **nach Ressourcen gruppierten Fluent-Client** bereit. Ihn einmal konstruieren, dann Methoden gruppiert nach Ressource aufrufen. Die Signaturen sind **flach**: zuerst die Pfadparameter (in Pfadreihenfolge), dann der Anfragekörper, dann ein optionales abschließendes Optionsobjekt mit den Abfrageparametern. Es gibt keine `path`-/`query`-/`body`-Wrapper-Objekte.

Die Ressourcen sind dieselben 23 in beiden Sprachen, camelCase in TypeScript und snake\_case in Python:

`accounts`, `aiProviders`, `apiKeys`, `chats`, `connections`, `dashboardSubscriptions`, `datasets`, `dbt`, `embedTokens`, `folders`, `groups`, `images`, `questions`, `refreshes`, `skills`, `sql`, `subscriptions`, `tasks`, `templates`, `tools`, `upload`, `users`, `viz`.

Eine Nicht-2xx-Antwort **wirft** — `VibedasherApiError` in beiden Sprachen. Methoden lösen sich nie zu einer Fehler-Union auf, sodass Sie ein Ergebnis nicht vor der Verwendung prüfen müssen.

## TypeScript[​](#typescript "Direkter Link zur TypeScript")

```
npm install @vibedasher/client
```

```
import { Vibedasher, VibedasherApiError } from '@vibedasher/client';



const client = new Vibedasher({

  apiKey: process.env.VIBEDASHER_API_KEY!,

});



// Datensätze auflisten — Abfrageparameter kommen in das abschließende Optionsobjekt

const page = await client.datasets.list({ limit: 50 });



// Erstellen — der Körper ist positional

const created = await client.datasets.create({ name: 'Sales', type: 'csv' });



// Eines per ID abrufen — Pfadparameter sind positional

const one = await client.datasets.get(created.dataset.id);



// Aktualisieren — Pfadparameter, dann Körper

const updated = await client.datasets.update(one.dataset.id, { name: 'Sales 2026' });
```

Jede Methode ist durchgehend typisiert: Die Argumenttypen und der aufgelöste Antworttyp stammen aus der Spezifikation, und die ressourcenweisen Schnittstellen (`DatasetsResource`, `DatasetsListOptions`, …) sowie die Modelltypen (`DatasetResponse`, `DatasetUpdate`, …) werden aus der Paketwurzel exportiert, falls Sie eine Variable annotieren möchten.

### SQL ausführen[​](#sql-ausführen "Direkter Link zur SQL ausführen")

`client.query` ist die handgeschriebene Methode, die die generierte Oberfläche nicht hat: ein Aufruf hinein, typisierte spaltenweise Ergebnisse heraus.

```
const result = await client.query({

  sql: 'SELECT country, SUM(revenue) AS revenue FROM sales GROUP BY 1',

});

console.log(result.columns, result.rows);
```

`datasetIds` ist optional — lassen Sie es weg, und der Server löst die Datensatzmenge aus den Aliasnamen auf, die Ihr SQL referenziert, und wendet genau dieselbe Autorisierung an.

### Eine CSV hochladen[​](#eine-csv-hochladen "Direkter Link zur Eine CSV hochladen")

```
const uploaded = await client.datasets.upload({

  name: 'Sales',

  content: 'country,revenue\nFR,10\nDE,12\n',

});

console.log(uploaded.cleanSQLName); // der Alias für client.query-SQL
```

### Notausgang[​](#notausgang "Direkter Link zur Notausgang")

Der zugrunde liegende `fetch`-Client liegt auf der Instanz als `client.http`, falls Sie Interceptors, ein eigenes `fetch` oder Überschreibungen pro Aufruf benötigen. Es gibt kein Singleton auf Modulebene, das konfiguriert werden müsste: Jede `Vibedasher`-Instanz besitzt ihren eigenen Client, sodass zwei Clients in einem Prozess sich niemals gegenseitig die Basis-URL oder den Schlüssel überschreiben.

## Python[​](#python "Direkter Link zur Python")

```
pip install vibedasher
```

```
from vibedasher import Vibedasher, VibedasherApiError

from vibedasher.models import DatasetCreate, DatasetUpdate



client = Vibedasher(api_key="<your-api-key>")



# Datensätze auflisten — Abfrageparameter sind keyword-only

page = client.datasets.list(limit=50)



# Erstellen — der Körper ist das erste positionale Argument

created = client.datasets.create(DatasetCreate(name="Sales", type_="csv"))



# Eines per ID abrufen — Pfadparameter sind positional

one = client.datasets.get(created.dataset.id)



# Aktualisieren — Pfadparameter, dann Körper

updated = client.datasets.update(one.dataset.id, DatasetUpdate(name="Sales 2026"))
```

Anfrage- und Antwortmodelle liegen in `vibedasher.models`. Ressourcenattribute sind snake\_case (`client.datasets`, `client.api_keys`, `client.ai_providers`, `client.embed_tokens`, `client.viz`, …), und ebenso die Methoden.

### SQL ausführen[​](#sql-ausführen-1 "Direkter Link zur SQL ausführen")

```
result = client.query(sql="SELECT country, SUM(revenue) AS revenue FROM sales GROUP BY 1")

print(result.columns, result.rows)
```

### Eine CSV hochladen[​](#eine-csv-hochladen-1 "Direkter Link zur Eine CSV hochladen")

```
uploaded = client.datasets.upload(name="Sales", content="country,revenue\nFR,10\nDE,12\n")

print(uploaded["cleanSQLName"])  # der Alias für client.query-SQL
```

### Notausgang[​](#notausgang-1 "Direkter Link zur Notausgang")

Die flachen Operationsmodule unter `vibedasher.api.<tag>` werden weiterhin für alles ausgeliefert, was die Fassade nicht abdeckt. Bauen Sie einen rohen Client mit `create_client` und rufen Sie `.sync()`, `.sync_detailed()`, `.asyncio()` oder `.asyncio_detailed()` auf:

```
from vibedasher import create_client

from vibedasher.api.datasets import read_datasets



raw = create_client(api_key="<your-api-key>")

datasets = read_datasets.sync(client=raw)
```

## Fehlerbehandlung[​](#fehlerbehandlung "Direkter Link zur Fehlerbehandlung")

Beide SDKs werfen bei einer Nicht-2xx-Antwort, sodass sich der Glückspfad geradlinig liest und Fehler dort abgefangen werden, wo Sie sie behandeln möchten.

**TypeScript:**

```
import { Vibedasher, VibedasherApiError } from '@vibedasher/client';



try {

  const page = await client.datasets.list({ limit: 50 });

  console.log(page.datasets);

} catch (err) {

  if (err instanceof VibedasherApiError) {

    console.error(`Request failed (${err.status})`, err.detail, err.requestId);

  } else {

    throw err;

  }

}
```

**Python:**

```
from vibedasher import VibedasherApiError



try:

    page = client.datasets.list(limit=50)

except VibedasherApiError as err:

    print(f"Request failed ({err.status_code})", err.detail, err.request_id)
```

Häufige Statuscodes: **401/403** (fehlender oder ungültiger API-Schlüssel, oder ein Schlüssel, der auf einer nur per Sitzung erreichbaren Route verwendet wird), **404** (nicht gefunden, oder eine Visualisierung, die nicht veröffentlicht ist), **422** (Validierungsfehler der Anfrage). Die Referenzseite jedes Endpunkts listet die genauen Antworten auf, die er liefern kann.

## Paginierung[​](#paginierung "Direkter Link zur Paginierung")

Listen-Endpunkte liefern eine Ergebnisseite plus einen `nextKey`-Cursor zurück. Sie müssen diesen Cursor selten selbst steuern: Jede auflistbare Ressource trägt `iterAll()` (TypeScript) / `iter_all()` (Python), das die Seiten durchläuft und Zeilen liefert.

**TypeScript:**

```
for await (const ds of client.datasets.iterAll()) {

  handle(ds);

}
```

**Python:**

```
for ds in client.datasets.iter_all():

    handle(ds)
```

Beide stellen außerdem die Form auf Seitenebene bereit (`iterPages()` / `iter_pages()`), wenn Sie die Hülle statt der Zeilen möchten. Das Steuern des Cursors von Hand funktioniert weiterhin — geben Sie `nextKey` als `exclusiveStartKey` (`exclusive_start_key` in Python) zurück und stoppen Sie, wenn es `null`/`None` zurückkommt — aber die Iteratoren erkennen zudem einen Cursor, der nicht mehr weiterkommt, und werfen einen Fehler, statt endlos zu schleifen.

Der Name auf der Leitung — den der cURL-Tab und die Parametertabelle jeder Referenzseite zeigen — lautet immer `exclusiveStartKey`; das TypeScript-SDK behält diese camelCase-Schreibweise als Optionsschlüssel, und das Python-SDK stellt denselben Parameter als Schlüsselwort `exclusive_start_key` bereit. Es ist ein einziger Cursor, je nach Sprache geschrieben — nie beide in einer Anfrage.

## Vorbehalt zur Antworttypisierung[​](#vorbehalt-zur-antworttypisierung "Direkter Link zur Vorbehalt zur Antworttypisierung")

Manche API-Routen liefern derzeit lose typisierte Antworten (`object` / `Any`), weil sie auf dem Backend eine generische Antwortform deklarieren. Anfragekörper, Abfrage-/Pfadparameter und eine wachsende Zahl von Antworten sind vollständig typisiert. Antworttypen werden Modul für Modul gehärtet — aktualisieren Sie das SDK, um Verbesserungen zu übernehmen.

hinweis

Die SDKs werden generiert, niemals von Hand bearbeitet. Wenn Sie eine Lücke entdecken, liegt sie fast immer vorgelagert in der OpenAPI-Spezifikation der API — melden Sie sich über die [Kontaktseite](https://vibedasher.com/contact).
