Zum Hauptinhalt springen

API-Schlüssel

Premium-Funktion

BasePeak.AI verwendet Bearer-Tokens mit eingeschränktem Geltungsbereich für den programmatischen Zugriff. Ein Token ist an die Person gebunden, die es erstellt hat, führt eine ausdrückliche Liste von Scopes und kann nie mehr tun, als dieses Konto im Moment der Ausstellung selbst durfte.

Einen Schlüssel erstellen

Die Oberfläche finden Sie unter Profil → API-Schlüssel.

  1. Klicken Sie auf API-Schlüssel erstellen.
  2. Füllen Sie aus:
    • Name – ein kurzes Label, das in der Liste erscheint. Pflichtfeld.
    • Beschreibung – optionaler Freitext.
    • Ablauf – optional. Ohne Ablaufdatum gilt der Schlüssel bis zum Widerruf.
    • Geltungsbereiche – mindestens einer. Über Geltungsbereich hinzufügen wählen Sie die Art des Zugriffs und – wo sinnvoll – den Agenten, die Anmeldedaten oder „Beliebiger Agent“ bzw. „Beliebige Anmeldedaten“.
  3. Kopieren Sie das Token. Es wird genau einmal angezeigt – gespeichert wird nur ein Hash. Ein verlorenes Token kann daher nicht wiederhergestellt, sondern nur ersetzt werden.
Welche Scopes der Dialog anbietet

Der Dialog bietet die Scopes an, die Ihr Konto voraussichtlich ausstellen darf: Chat- und credential:use:-Scopes immer, die Datei- und Unterhaltungs-Scopes für jeden Agenten, für den Sie freigeschaltet sind (agent:files-write zusätzlich nur, wenn Sie selbst die Berechtigung agent:update besitzen), und einen Management-Scope nur, wenn Sie die zugehörige Berechtigung selbst besitzen. Management-Scopes gelten immer für alle Objekte ihres Typs – einzige Ausnahme ist agent:update, das auf einen Agenten festgelegt werden kann. Die endgültige Prüfung übernimmt in jedem Fall der Server beim Anlegen; schlägt sie fehl, nennt die Fehlermeldung den Grund.

Für die Chat- sowie die Datei- und Unterhaltungs-Scopes bietet die Agentenauswahl die Agenten an, für die der Schlüssel ausgestellt werden kann – einschließlich derer, die Sie nur über eine Gruppenfreigabe oder ein eigenes Projekt erreichen. Nicht aufgeführt werden System-Agenten und Freigaben auf gelöschte Agenten; beides ließe sich zwar ausstellen, ergibt als Ziel eines Schlüssels aber keinen Sinn. Für agent:update gilt eine andere Regel: Diese Berechtigung ist an keinen bestimmten Agenten gebunden, daher listet die Agentenauswahl dort alle Agenten der Instanz.

API-Zugriff ist eine Premium-Funktion

Der programmatische API-Zugriff ist eine Premium-Funktion. Das Anlegen eines Schlüssels scheitert mit 403 (API access is disabled for this instance), wenn das Merkmal apiAccess deaktiviert ist; auch bestehende Schlüssel authentifizieren sich dann nicht mehr. Das Merkmal folgt Ihrem Abonnement und ist nicht selbst verwaltbar. Wenden Sie sich in diesem Fall an Ihren BasePeak.AI-Kontakt.

Token-Format

sk-bpai-<user_id>-<key_id>-<secret>

Nur das letzte Segment ist geheim; die übrigen kennzeichnen, welcher Schlüssel vorgelegt wird. Die gespeicherte maskierte Form (sk-bpai-1-42-…jvT8) darf in Logs erscheinen und ist das, was die Oberfläche nach dem Anlegen anzeigt.

Einen Schlüssel verwenden

Senden Sie ihn als Bearer-Token:

curl -sS https://your-instance.platform.basepeak.ai/api/invoke/a17jlm7 \
-H "Authorization: Bearer sk-bpai-1-42-…" \
-H "Content-Type: text/plain" \
--data 'Hallo!'

Header je Schnittstelle

HeaderWoZweck
Authorization: Bearer <token>überallDas Token.
X-BPAI-Agent: <agent>nur /v1/chat/completionsWelcher Agent ausgeführt wird. Muss vom Scope des Schlüssels abgedeckt sein.
X-BPAI-Thread-Id: <thread>beide Chat-SchnittstellenEine bestehende Unterhaltung fortsetzen.
Accept/api/invoke/{id}Wählt Streaming, JSON oder reinen Text.

Bei /api/invoke/{id} kommt der Agent aus dem URL-Pfad, nicht aus einem Header. Siehe Invoke-API und OpenAI-kompatible API.

Mit den OpenAI-SDKs

from openai import OpenAI

client = OpenAI(
api_key="sk-bpai-1-42-…",
base_url="https://your-instance.platform.basepeak.ai/v1",
default_headers={"X-BPAI-Agent": "a17jlm7"},
)

resp = client.chat.completions.create(
model="ignored", # es wird das Modell des Agenten verwendet
messages=[{"role": "user", "content": "Hallo!"}],
)
print(resp.choices[0].message.content)
import OpenAI from "openai";

const client = new OpenAI({
apiKey: "sk-bpai-1-42-…",
baseURL: "https://your-instance.platform.basepeak.ai/v1",
defaultHeaders: { "X-BPAI-Agent": "a17jlm7" },
});

const resp = await client.chat.completions.create({
model: "ignored",
messages: [{ role: "user", content: "Hallo!" }],
});
console.log(resp.choices[0].message.content);

Scopes

Ein Scope besteht aus drei Segmenten:

resource:action:id

resource und action stammen aus einer festen Liste – keines der beiden darf ein Platzhalter sein. Nur id darf * lauten.

Chat-Scopes

ScopeErlaubt
agent:chat:a17jlm7Chat mit genau diesem Agenten
agent:chat:*Chat mit jedem Agenten, auf den das zugehörige Konto Zugriff hat
credential:use:<credential>Erlaubt dem Schlüssel, ein gespeichertes Credential zu nutzen – und damit die Werkzeuge, die es benötigen. Siehe unten.

Ein Schlüssel mit Platzhalter wird bei jedem Aufruf erneut gegen die aktuellen Berechtigungen des zugehörigen Kontos geprüft. Er kann daher nie einen Agenten erreichen, den dieses Konto nicht auch im Browser öffnen könnte.

Credential-Scopes entscheiden, welche Werkzeuge dem Agenten bleiben

Das ist die häufigste Ursache dafür, dass „der Agent im Browser funktioniert, über die API aber seine Werkzeuge ignoriert“.

Die Werkzeuge eines Agenten benötigen häufig ein gespeichertes Credential – ein Google-Konto für den Kalender, ein Token für GitHub. Bei jedem Aufruf mit einem API-Schlüssel wird der Lauf gegen die credential:use:…-Scopes des Schlüssels gefiltert:

  • Credentials, die der Schlüssel nicht abdeckt, werden aus dem Agenten entfernt, und
  • jedes Werkzeug, das eines dieser Credentials benötigt, wird aus dem Lauf entfernt.

Das geschieht stillschweigend. Es gibt weder einen Fehler noch eine Warnung in der Antwort: der Agent antwortet einfach, als gäbe es das Werkzeug nicht.

Scopes des SchlüsselsWirkung
nur agent:chat:<id>Jedes Werkzeug mit Credential wird entfernt. Der Agent kann nur aus seinen Anweisungen und seinem Wissen antworten.
agent:chat:<id> + credential:use:*Es wird nichts entfernt. Der Agent läuft mit allen Werkzeugen.
agent:chat:<id> + credential:use:googleNur Werkzeuge mit abgedeckten Credentials bleiben, die übrigen werden entfernt.

Wenn Ihre Anbindung die Werkzeuge des Agenten benötigt, stellen Sie den Schlüssel also mit credential:use:* aus (oder nennen Sie die einzelnen Credentials):

{ "name": "calendar-bot", "scopes": ["agent:chat:a17jlm7", "credential:use:*"] }

Werkzeuge ohne Credential sind nie betroffen.

Management-Scopes

Neun weitere Berechtigungen schalten die Management-API frei:

ScopeErlaubt
agent:create:*Agenten anlegen, auflisten, lesen, kopieren, exportieren, importieren
agent:update:*Agenten ändern, inklusive der Zuordnung von Wissenssammlungen
agent:delete:*Agenten löschen
knowledgeset:manage:*Wissenssammlungen, ihre Dateien, Im- und Exporte
tool-reference:manage:*Werkzeuge und MCP-Server
model-provider:manage:*Modelle und Modellanbieter
trigger:manage:*Webhooks, E-Mail-Empfänger, Cronjobs
task:manage:*Aufgaben und Aufgabenausführungen
team:manage:*Agenten-Teams

Management-Scopes müssen * als id verwenden – mit Ausnahme von agent:update, siehe unten.

Mehrere Scopes pro Schlüssel

Ein Schlüssel darf beliebig viele Scopes tragen. Chat- und Management-Scopes auf einem Schlüssel zu mischen ist unterstützt und üblich:

{
"name": "provisioning-bot",
"scopes": ["agent:chat:*", "agent:create:*", "knowledgeset:manage:*"]
}

Beim Anlegen prüft der Server, dass Sie die angeforderten Agenten- und Management-Berechtigungen aktuell selbst besitzen. Eine Berechtigung, die Sie nicht haben, wird mit 403 abgelehnt. Das verhindert Schlüssel, die entweder wirkungslos wären oder eine Rechteausweitung darstellten. (credential:use:-Scopes werden bewusst nicht so geprüft.)

Scopes ohne erreichbare Route werden in der Regel abgelehnt statt wirkungslos gespeichert – mcp:*, agent:read und admin:* sind keine gültigen Scopes.

Scopes für Dateien und Unterhaltungen

Vier weitere Scopes betreffen Dateien und den Gesprächsverlauf. Jeder ist auf einen Agenten bezogen, thread:files:a17jlm7 bedeutet also „die Threads dieses Agenten“:

ScopeErlaubt
agent:files:<agent|*>Dateien im eigenen Arbeitsbereich des Agenten auflisten und herunterladen (nur lesend). Diese Dateien werden in jede neue Unterhaltung übernommen.
agent:files-write:<agent|*>Alles, was agent:files erlaubt, plus Hochladen und Löschen. Eine Erweiterung von agent:files – ein Schlüssel braucht nicht beide. Lässt sich nur ausstellen, wenn das ausstellende Konto selbst die Berechtigung agent:update besitzt (siehe unten); ein reiner Chat-Nutzer kann sich Schreibzugriff auf den Arbeitsbereich eines Agenten nicht selbst verschaffen.
thread:files:<agent|*>Auflisten, Herunterladen, Hochladen und Löschen im Arbeitsbereich einer einzelnen Unterhaltung (beide Richtungen, ein Scope).
thread:read:<agent|*>Unterhaltungen dieses Agenten auflisten (GET /api/threads), einzeln abrufen (GET /api/threads/{id}) und ihren Verlauf erneut abspielen (GET /api/threads/{id}/events) – nur die eigenen Unterhaltungen des Schlüsselkontos. Siehe Threads.

Sie werden wie Chat-Scopes vergeben: Sie müssen den Agenten erreichen können, um sie auszustellen. agent:files-write verlangt zusätzlich, dass Sie selbst die Berechtigung agent:update besitzen – sonst scheitert das Anlegen mit 403, genau wie bei einem Management-Scope ohne die passende Berechtigung. Darüber hinaus sind diese Scopes voneinander und von agent:chat unabhängig – ein Chat-Schlüssel erhält keinen Dateizugriff, ein Datei-Schlüssel kann nicht chatten.

POST /api/threads/{id}/abort braucht keinen eigenen Scope: Einen Lauf zu starten und ihn abzubrechen ist dieselbe Befugnis, agent:chat deckt beides ab.

Diese Scopes lassen sich – wie Management-Scopes – im Dialog Profil → API-Schlüssel → API-Schlüssel erstellen vergeben oder über REST anlegen (POST /api/account/apikeys).

Scopes für Projekte

Acht weitere Scopes adressieren ein Projekt statt eines Agenten – die Einheit, in der auch der Browser eine Unterhaltung führt. Jeder nimmt eine konkrete p1…-Projekt-ID oder *:

ScopeErlaubt
project:chat:<p|*>Unterhaltungen im Projekt beginnen und fortsetzen
project:files:<p|*>Geteilten Arbeitsbereich des Projekts auflisten und herunterladen
project:files-write:<p|*>Zusätzlich hochladen und löschen; strikte Erweiterung von project:files
project:knowledge:<p|*>Wissenssammlung des Projekts auflisten (inklusive Einlese-Status) und herunterladen
project:knowledge-write:<p|*>Zusätzlich hochladen und löschen; strikte Erweiterung von project:knowledge
project:tasks:<p|*>Aufgaben des Projekts: anlegen, lesen, ändern, löschen, ausführen und ihre Läufe
project:threads:<p|*>Unterhaltungen des Projekts lesen: auflisten, abrufen und erneut abspielen
project:env:<p|*>Umgebungsvariablen des Projekts lesen – einschließlich der Werte
project:env-write:<p|*>Umgebungsvariablen des Projekts setzen

project:files-write und project:knowledge-write sind strikte Erweiterungen ihrer lesenden Geschwister – ein Schlüssel mit der schreibenden Hälfte muss die lesende nicht zusätzlich ausstellen.

project:env und project:env-write sind unabhängige Hälften

Anders als bei Dateien und Wissen impliziert hier die schreibende Hälfte nicht die lesende, und umgekehrt. project:env liest die gespeicherten Werte der Umgebungsvariablen zurück – dort liegen die Geheimnisse der Werkzeuge eines Projekts. project:env-write setzt sie. Ein Schlüssel, der nur ein Geheimnis rotieren soll, muss es dafür nie lesen können – deshalb bleibt dieser eine Scope vom sonst geltenden Muster ausgenommen. Details und Beispiele: Projekte.

project:tasks ist bewusst nicht aufgeteilt – ein Scope deckt Lesen, Schreiben und Ausführen im Projekt gleichermaßen ab, analog zu task:manage auf der flachen Oberfläche.

project:threads ist ebenfalls nicht aufgeteilt, allerdings aus dem umgekehrten Grund: Der Scope ist rein lesend und hat keine schreibende Hälfte. Unterhaltungen zu ändern oder zu löschen ist über API-Schlüssel generell nicht möglich, und das Abbrechen eines laufenden Zuges (POST /api/threads/{id}/abort) bleibt beim Chat-Scope – einen Lauf zu starten und ihn zu stoppen ist dieselbe Befugnis.

project:chat schließt das Zurücklesen der Unterhaltung nicht ein

Ein Schlüssel mit ausschließlich project:chat:<p> kann Unterhaltungen beginnen und fortsetzen, sie aber weder auflisten noch abrufen oder erneut abspielen – er muss den Antwort-Header X-Bpai-Thread-Id mitschneiden und die ID selbst aufbewahren. Vergeben Sie zusätzlich project:threads:<p>, damit die Integration ihre eigenen Unterhaltungen zurücklesen kann.

Greifen Sie zu project:threads:<p> statt zu thread:read:<agent>, wann immer die Absicht lautet „diese Integration liest ihr eigenes Projekt“: thread:read ist an den Agenten gebunden und erlaubt damit jede Unterhaltung dieses Agenten – über alle Projekte hinweg, die er bedient. Siehe Unterhaltungen.

Alle neun Projekt-Scopes gründen ausschließlich auf Projektmitgliedschaft. Anders als bei agent:files-write ist dafür keine Management-Berechtigung nötig, auch nicht für die schreibenden Hälften: Die Browser-Sitzung verlangt für dieselben Mutationen ebenfalls nur Zugriff auf das Projekt. Ausführliche Routen, Beispiele und Fehlerfälle: Projekte.

task:manage gegenüber project:tasks

Die beiden Aufgaben-Scopes überschneiden sich, ohne dass einer den anderen enthält:

ScopeReichweite
task:manage (nur *)Jede Aufgabe, die dem Konto des Schlüssels gehört, über alle Projekte hinweg – kein Pinnen auf ein einzelnes Projekt möglich.
project:tasks:<p>Jede Aufgabe in genau diesem Projekt – auch eine, die dem Konto nur über eine ThreadAuthorization-Freigabe zugänglich ist, nicht über Eigentum. Das sieht die flache Oberfläche (GET /api/tasks) gar nicht, da sie ausschließlich nach Eigentum filtert.

Aufgaben anlegen existiert zudem nur auf der projektbezogenen Route – ein flaches POST /api/tasks gibt es nicht.

Einen Schlüssel auf einen Agenten festlegen

agent:update ist die einzige Management-Berechtigung, die eine konkrete ID akzeptiert:

ScopeReichweite
agent:update:*Jeder Agent, den das zugehörige Konto ändern darf
agent:update:a17jlm7Nur Agent a17jlm7 – bei jedem anderen 403

In Kombination mit einem passenden Chat-Scope erhalten Sie einen Schlüssel, der mit genau einem Agenten sprechen und genau diesen Agenten ändern darf – und sonst nichts:

{ "name": "self-improve", "scopes": ["agent:chat:a17jlm7", "agent:update:a17jlm7"] }

Die Festlegung verengt ausschließlich den Schlüssel. Sie ändert nicht, was Sie beim Anlegen bereits besitzen müssen.

Schlüssel verwalten

Die Liste zeigt Name, maskiertes Token, Erstellungszeit, letzte Nutzung und Ablauf. Die letzte Nutzung wird asynchron und höchstens einmal pro Minute und Schlüssel aktualisiert; ein sehr aktueller Aufruf erscheint daher möglicherweise nicht sofort.

Ein Widerruf wirkt unmittelbar – die nächste Anfrage mit diesem Token erhält 401.

Rotieren stellt ein neues Geheimnis für denselben Schlüssel aus: ID, Name, Scopes, Ablaufdatum und Audit-Log bleiben erhalten, das alte Geheimnis funktioniert sofort nicht mehr, und das neue wird genau einmal angezeigt.

Instanz-Administratoren sehen unter Zugriff → API-Schlüssel im Admin-Bereich zusätzlich die Schlüssel aller Benutzer – maskiert, mit Besitzer und Audit-Log – und können jeden Schlüssel widerrufen. Geheimnisse werden nie gespeichert oder angezeigt; auch ein Administrator kann prüfen, aber niemals einen Benutzer imitieren.

REST-Referenz

Diese Routen gehören zur Browser-Sitzung, die die Schlüssel besitzt. API-Schlüssel können keine API-Schlüssel erstellen oder verwalten.

MethodePfadBeschreibung
GET/api/account/apikeysEigene Schlüssel auflisten. Enthält nie das Geheimnis.
POST/api/account/apikeysSchlüssel anlegen. Die einzige Antwort, die das Token im Klartext enthält.
GET/api/account/apikeys/{id}Metadaten eines Schlüssels.
GET/api/account/apikeys/{id}/auditDie 50 neuesten Audit-Einträge dieses Schlüssels. Nicht paginiert.
DELETE/api/account/apikeys/{id}Widerrufen. Liefert 204; ein erneuter Aufruf 404.
POST/api/account/apikeys/{id}/rotateNeues Geheimnis für denselben Schlüssel; die Antwort enthält es genau einmal.

Anfrage zum Anlegen:

{
"name": "ci-pipeline",
"description": "Generator für Release Notes",
"scopes": ["agent:chat:a17jlm7"],
"expiresAt": "2026-12-31T23:59:59Z"
}

Antwort – beachten Sie key, das Sie nicht wieder sehen werden:

{
"id": 42,
"userId": "1",
"name": "ci-pipeline",
"description": "Generator für Release Notes",
"key": "sk-bpai-1-42-sJ_jvT…",
"maskedKey": "sk-bpai-1-42-...jvT8",
"scopes": ["agent:chat:a17jlm7"],
"createdAt": "2026-06-05T12:34:56Z",
"expiresAt": "2026-12-31T23:59:59Z"
}

Mindestens ein Scope ist erforderlich.

Audit-Verlauf

Jeder erfolgreiche Aufruf mit einem Schlüssel wird protokolliert: welcher Schlüssel und Agent, die Route, der resultierende Statuscode und die Dauer. Die Aufbewahrung beträgt standardmäßig 90 Tage. Die 50 neuesten Einträge sind über GET /api/account/apikeys/{id}/audit abrufbar.

Sicherheitsmodell

AspektBehandlung
Das Token selbstWird nie gespeichert. Einmal angezeigt, danach nur als Hash vorhanden.
Geheimnis im RuhezustandMit bcrypt gehasht.
Der Authorization-HeaderWird direkt nach der Authentifizierung entfernt und erreicht damit weder Request-Handler noch deren Logs.
Erreichbare RoutenEin Schlüssel ist auf eine Positivliste beschränkt – Chat, Invoke, die Agenten- und Thread-Dateien, die Thread-Routen (auflisten, abrufen, Verlauf, abbrechen) und die Management-Routen. Alles andere antwortet mit 403, auch wenn Scopes anderes nahelegen.
Erneute Prüfung des KontosChat-Schlüssel mit Platzhalter werden bei jedem Aufruf gegen die aktuellen Rechte des zugehörigen Kontos geprüft.
WiderrufUnmittelbar wirksam.

Zwei Konsequenzen, die Sie einplanen sollten: Ein Widerruf wirkt sofort und erfordert kein Leeren von Caches – und die Reichweite eines Schlüssels schrumpft mit der des zugehörigen Kontos. Verliert dieses den Zugriff auf einen Agenten, sind Platzhalter-Schlüssel für diesen Agenten sofort wirkungslos.

Fehlerbehebung

AntwortBedeutungWas zu prüfen ist
401 auth/bad-token-formatDer Bearer ist kein wohlgeformtes sk-bpai-…-TokenAbschneiden in einer Umgebungsvariablen oder ein verbliebener Platzhalterwert. Vergleichen Sie mit dem maskierten Token in der Oberfläche.
401 auth/invalid-tokenWohlgeformt, aber nicht akzeptiertMeist widerrufen, sonst ein Tippfehler im Geheimnis. Da - im Geheimnis gültig ist, ändert eine fehlerhafte Kopie nicht immer die Länge.
401 auth/key-expiredAblaufdatum überschrittenDie Antwort enthält expiredAt zur Anzeige. Stellen Sie einen Ersatz aus.
403 auth/api-access-disabledapiAccess ist für die Instanz deaktiviertNicht selbst verwaltbar – wenden Sie sich an Ihren BasePeak.AI-Kontakt.
403 authz/scope-missingDie Scopes deckten die Anfrage nicht ab. Bei /v1/chat/completions und /api/invoke/{id} nennt der Body den requiredScope; die Datei-Routen (/api/agents/{id}/files…, /api/threads/{id}/files…) und die Thread-Routen (GET /api/threads, GET /api/threads/{id}, GET /api/threads/{id}/events, POST /api/threads/{id}/abort) antworten mit einem einfachen 403 ohne requiredScope-Feld.Bei /v1 prüfen, ob X-BPAI-Agent zu einem agent:chat:<id>-Scope passt; bei /api/invoke/{id} der Agent im Pfad. Bei den Thread-Routen, ob der Schlüssel entweder thread:read für den Agenten der Unterhaltung oder project:threads für ihr Projekt trägt – bzw. agent:chat beim Abbrechen.
403 auf einer erwarteten RouteDie Route steht nicht auf der PositivlisteThreads auflisten, abrufen, deren Verlauf abspielen und laufende Züge abbrechen sind mit einem Schlüssel möglich – Umbenennen (PUT) und Löschen (DELETE) eines Threads nicht. Siehe API-Überblick.
404 model_not_foundAgent oder Alias ist nicht auflösbarEine falsch geschriebene ID oder ein Alias, der auf dieser Instanz nicht existiert.

Threads aus einem Schlüssel erscheinen im Projekt „API“

Das ist erwartetes Verhalten. Nur /v1/chat/completions leitet einen Thread-Namen ab; über /api/invoke/{id} erzeugte Threads bleiben ohne Namen. In der Admin-Thread-Liste erscheint als Projekt wörtlich „API“, weil der Schlüssel einen Agenten-Scope und keinen Projekt-Scope trägt – diese Threads sind absichtlich keinem Projekt zugeordnet. Siehe Threads.

Das gilt für /api/invoke/{id} und /v1/chat/completions. Ein über POST /api/projects/{project_id}/invoke gestarteter Thread ist die Ausnahme: Er hängt am Projekt und erscheint dort wie jede andere Unterhaltung. Siehe Projekte.

Weiterführende Dokumentation