Integrieren · E1 · 7 Stufen

Public REST API & Token-Authentifizierung

Track E ist der Andock-Track. In E1 sprichst du den Helpdesk-Assistenten der Muster GmbH per nativer REST-API an — mit echten cURL-Aufrufen und Agent-UUID-Token.

Was du in diesem Tutorial anbindest

Wir sprechen den in Track C gebauten Helpdesk-Assistenten der Muster GmbH (Container „Produkthandbücher“) per REST an: eine Chat-Frage stellen, die Wissensdatenbank durchsuchen, einen AI-Service ausführen und ein Dokument hochladen — alles über die Public API mit Agent-UUID-Token. Statt Konfigurations-Reitern gibt es hier echte Request/Response-Paare als Code-Blöcke.

Voraussetzung: Track B, ein Agent mit aktiviertem externem Zugriff (vgl. C1 Stufe 6) und Grundkenntnisse HTTP/JSON sowie cURL/Postman. Alle Werte sind Demo-Platzhalter: Basis-URL https://muster.auxdata.example, Token ${AUX_TOKEN}, Agent 123, Container 456, Service 789 — keine echten Secrets.

Quellenregel Track E: Basis-URL, Endpunktpfade, Feldnamen und Schemata sind gegen die Swagger/OpenAPI der konkreten Instanz zu prüfen (/swagger/index.html bzw. /swagger/doc.json). Wo dieses Tutorial und Swagger abweichen, gilt Swagger. Native API (/api/v1, Agent-UUID-Token) ist E1; den OpenAI-kompatiblen Adapter zeigt der Kasten weiter unten in dieser Lektion.

Quellen und Stand

Geprüft gegen das AuxData-Administrator-Handbuch (Stand Juni 2026), Kapitel 15 „Public REST API und Token-Authentifizierung“ (15.1–15.8), und die öffentliche Swagger-Datei https://auxdata.ai/swagger/doc.json (Abgleich 02.06.2026). Konkrete Kundeninstanzen weiterhin gegen /swagger/index.html prüfen. Mini-Quiz mit 7 Fragen, kein Zertifikat.

Stufe 1 von 7

API-Übersicht

Wo die Public API liegt — und was sie kann.

1Basis-URL & Versionierung

Alle Public-Endpunkte liegen unter https://<instanz>/api/v1/. In der Demo: https://muster.auxdata.example/api/v1/. (AH 14.1)

Der konkrete Host hängt von deiner Instanz ab (das Handbuch nennt als Beispiel https://auxdata.ai). Gegen Swagger/Instanz prüfen. Die vollständige, aus dem Code generierte API-Referenz liegt unter https://<instanz>/swagger/index.html (BasePath /api/v1) und erlaubt direktes Ausprobieren.

Roter Faden: Bei jeder Abweichung zwischen diesem Tutorial und Swagger gilt Swagger. Es zeigt alle Endpunkte und die exakten Request-/Response-Schemata deiner Version.

2Was die API kann

Vier Aufgaben, jeweils gegen einen Agenten: Dokumente hochladen, semantische Suche, Chatbot-Anfragen und AI-Services ausführen.

3Endpunkt-Landkarte

Das Handbuch beschreibt sieben Kernrouten unter /api/v1. Die öffentliche Swagger-Datei listet zusätzlich einen Chat-Zusammenfassungs-Endpunkt. (AH 14.1, 15.8; Swagger-Abgleich 02.06.2026)

PUT …/document
PUT /agent/{agentid}/container/{containerid}/document — Datei-Upload (multipart/form-data).
PUT …/enhanced
PUT /agent/{agentid}/container/{containerid}/document/enhanced — Upload mit erweiterten Optionen (JSON + Base64).
POST Suche (alle)
POST /agent/{agentid}/document — semantische Suche über alle Container des Agenten.
POST Suche (einer)
POST /agent/{agentid}/container/{containerid}/document — Suche im angegebenen Container.
POST Chat (alle)
POST /agent/{agentid}/chat — Chat über alle Container.
POST Chat (einer)
POST /agent/{agentid}/container/{containerid}/chat — Chat mit einem Container als Wissensquelle.
POST Service
POST /agent/{agentid}/executeservice/{serviceid} — AI-Service ausführen.
POST Summarize
POST /agent/{agentid}/chat/{comUuid}/summarize — aktueller Swagger-Zusatz: Chat-Verlauf zu einem Wissensdokument zusammenfassen. Gegen die eigene Instanz prüfen.
Pflicht-Header: Die sieben Kernrouten erwarten einen Authorization-Header. Die Middleware lehnt Anfragen ohne diesen Header mit HTTP 401 ab (Details in Stufe 2). Beim Summarize-Zusatz zeigt die öffentliche Swagger-Datei keine Security-Angabe; vor Nutzung gegen die eigene Instanz prüfen. Pfad-IDs (agentid, containerid, serviceid) müssen numerisch sein.
✎ Übung: Öffne (gedanklich) https://muster.auxdata.example/swagger/index.html. Welche der 7 Routen brauchst du, um eine Support-Frage zu beantworten — und welche, um sie zu protokollieren?

✓ Das hast du angebunden

Stufe 2 von 7

Authentifizierung

Agent-UUID-Token, Bearer und der richtige Schalter.

1Pro Fähigkeit ein eigener UUID-Token

Jede Fähigkeit eines Agenten hat ihren eigenen UUID-Token plus einen „External Access“-Schalter. (AH 14.2.1)

StammdatenExterner ZugriffChatbotSuche
Token-Verwaltung
ChatChatbotConfig.Uuid
${AUX_TOKEN} (UUID, niemals im Code)
externalchatbotaccess = true
AI-ServiceAiServiceConfig.Uuid
${AUX_TOKEN}
externalchatbotaccess = true (mitgeprüft)
SucheSearchConfig.Uuid
${AUX_TOKEN}
externalsearchaccess = true
Dokumenten-UploadKnowledgeDbConfig.Uuid
${AUX_TOKEN}
tokenuploadaccess = true
Echter Agent-Editor, Reiter Externer Zugriff: Schalter für Externer Chatbot-Zugriff, Externer Suche-Zugriff und Externer Dokumenten-Upload
Echter Agent-Reiter „Externer Zugriff" an der Demo-Instanz — hier wird der externe API-Zugriff je Fähigkeit freigegeben; die zugehörigen UUID-Tokens liegen im jeweiligen Konfigurationsabschnitt

Feldnamen/Schalter gegen Swagger/Instanz prüfen — die exakten Bezeichner können je Version abweichen. Token-Format: eine UUID (z. B. e185f043-d68c-4c51-bdf8-16cce6b49628), im Tutorial durchgehend als Platzhalter ${AUX_TOKEN}.

Reiter Externer Zugriff mit Access-Tokens (offizielle Abbildung aus dem Admin-Handbuch)
Offizielle Abbildung aus dem Admin-Handbuch (Kap. 3) — der Reiter „Externer Zugriff" mit den Access-Tokens je Fähigkeit.

2Verwendung im Header

Den Token sendest du als Bearer-Token im Authorization-Header:

Authorization: Bearer ${AUX_TOKEN}

Den externen Zugriff schaltest du im Agenten frei (C1 Stufe 6 „Externer Zugriff“); auf Org-Ebene/Konnektor-Sicht vertieft das D2. Ist der externe Zugriff für die aufgerufene Fähigkeit nicht aktiv oder passt die UUID nicht → HTTP 401. Eine neue UUID lässt sich in den Agent-Einstellungen generieren (Rotation, vgl. Stufe 6).

Token = Secret: Niemals im Code/Repo/Log; nur über Umgebungsvariablen oder Secret-Manager. Ein UUID-Token gilt nur für seine eine Fähigkeit (Least Privilege) — das ist ein Feature, kein Mangel. Pro Integration einen eigenen Token, damit ein kompromittierter gezielt deaktiviert werden kann.
✎ Übung: Du willst nur Suchen extern erlauben, kein Chat. Welchen Token sendest du, und welcher Schalter muss aktiv sein? (Andeutung: SearchConfig.Uuid + externalsearchaccess.)

✓ Das hast du angebunden

Stufe 3 von 7

Endpunkte I: Chat & Suche

Die beiden Lese-/Frage-Endpunkte mit echtem Request/Response.

1Chat

POST /agent/{agentid}/chat (alle Container) bzw. POST /agent/{agentid}/container/{containerid}/chat (ein Container). (AH 14.3.3)

Request-Body ChatCommand, Pflichtfeld question. Weitere Felder u. a. comuuid (Konversations-ID — leer = neue Konversation; den zurückgegebenen Wert beim nächsten Aufruf wieder mitgeben), internetsearch, files, orgid, anonymize, stream, followUpQuestionMode, answerMode, usermail, usePersonalKnowledgeDb.

curl -X POST "https://muster.auxdata.example/api/v1/agent/123/chat" \
  -H "Authorization: Bearer ${AUX_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{ "question": "Wie setze ich das Gerät zurück?", "comuuid": "" }'

Response laut aktueller öffentlicher Swagger-Datei: ExecuteServiceStepResult (HTTP 200, gekürzt). Wichtigste Felder: answer, command, comuuid, context, documents, sources (SearchChunkResult[]), tokenusage, images, videos, error.

{
  "answer": "Halten Sie die Reset-Taste 10 Sekunden gedrückt ...",
  "comuuid": "8f2b1e...",
  "context": "...",
  "sources": [ /* SearchChunkResult[] */ ],
  "tokenusage": { /* TokenUsageStats */ },
  "error": ""
}
Streaming: Mit stream: true antwortet der Server als Server-Sent-Events (Content-Type: text/event-stream); Statusmeldungen kommen als data: { ... }-Events (JSON-serialisiertes ExecuteServiceStepResult).
Drop-in für OpenAI-Clients: AuxData stellt zusätzlich einen OpenAI-kompatiblen Endpunkt bereit (/v1/chat/completions). Bestehende OpenAI-SDK-Skripte laufen weiter, wenn du nur Base-URL und API-Key tauschst — das Feld model wählt dabei den Ziel-Agenten (nicht das Modell), und das Antwortverhalten steuert der Agent (nicht temperature). Die modernere Responses API (/v1/responses) ist über diesen Adapter nicht automatisch abgedeckt. (AH 14.3.3; gegen Instanz-Swagger prüfen)

2Suche

POST /agent/{agentid}/document (alle Container) bzw. POST /agent/{agentid}/container/{containerid}/document (ein Container). (AH 14.3.4)

Request-Body SearchCommand: question (Pflicht), qualitygate (minimale Ähnlichkeitsschwelle 0–1, Chunks darunter werden verworfen), resultLimit (max. Anzahl Chunks). Response laut aktueller öffentlicher Swagger-Datei: VectorStoreAnalysisResult mit content, documentId, documentSource, score. Wenn deine Instanz ein anderes Detail-/Array-Schema zeigt, gilt deren Swagger.

curl -X POST "https://muster.auxdata.example/api/v1/agent/123/document" \
  -H "Authorization: Bearer ${AUX_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{ "question": "Garantiebedingungen", "qualitygate": 0.7, "resultLimit": 10 }'

Schema-Felder gegen Swagger prüfen. In den cURL-Blöcken setzt die Zeilenfortsetzung mit \ mehrzeilige Befehle zusammen.

✎ Übung: Du willst eine mehrstufige Support-Konversation führen. Welches Feld trägst du beim zweiten Aufruf nach — und woher hast du den Wert? (Andeutung: comuuid aus der ersten Response — AH 14.3.3.)

✓ Das hast du angebunden

Stufe 4 von 7

Endpunkte II: AI-Service & Upload

Die schreibenden und ausführenden Endpunkte.

1AI-Service ausführen

POST /agent/{agentid}/executeservice/{serviceid}. Body = flache map[string]string; die erwarteten Parameter ergeben sich aus der Service-Definition. (AH 14.3.5)

curl -X POST "https://muster.auxdata.example/api/v1/agent/123/executeservice/789" \
  -H "Authorization: Bearer ${AUX_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{ "topic": "Datenschutz", "sprache": "Deutsch" }'

Response ExecuteServiceResult (command, answer = AiServiceMultiResult, error, background, usageid, tokenusage).

Binärdatei als Parameter: Da der Body flach string→string ist, wird eine Datei als string-escaptes JSON in einem Parameterwert verpackt. Enthält ein Wert ein JSON-Objekt mit dem Feld content, interpretiert der Server ihn als Datei. Felder: content (Base64, Pflicht), type (Dateiendung ohne Punkt, Pflicht), name (Pflicht), vision (bool, Default false), imagelimit (int, Default 20).

{
  "anhang": "{\"name\":\"vertrag.pdf\",\"type\":\"pdf\",\"content\":\"JVBERi0xLjQ...\"}"
}

2Upload (multipart)

PUT /agent/{agentid}/container/{containerid}/document. Body multipart/form-data, Form-Feld files. (AH 14.3.1)

Optionaler Header laut aktueller öffentlicher Swagger-Datei: link (Basis-Herkunftslink; der Server hängt den Dateinamen an). Falls deine Instanz zusätzlich einen Ersetzen-Mechanismus wie documentid anbietet, gilt deren Swagger. Response (HTTP 200): Array UploadedFilesResult mit filename, filetype, documentid.

curl -X PUT "https://muster.auxdata.example/api/v1/agent/123/container/456/document" \
  -H "Authorization: Bearer ${AUX_TOKEN}" \
  -H "link: https://intranet.example.com/dokumente" \
  -F "files=@/pfad/zur/datei.pdf"

3Upload (enhanced, JSON/Base64)

PUT /agent/{agentid}/container/{containerid}/document/enhanced. Body UploadDocumentCommandApi. (AH 14.3.2)

Felder u. a.: id, name, link, type (BIN = binär, vom DataReader geparst / TXT = Text direkt), filecontent (Base64 bei BIN, UTF-8-Text bei TXT), filetype (z. B. application/pdf laut Swagger-Beispiel), readimagedata/imagelimit, manualcontextenrichmentdata. Response laut aktueller öffentlicher Swagger-Datei: Array von UploadDocumentResult (command, documentid, error).

{
  "name": "handbuch.pdf",
  "type": "BIN",
  "filecontent": "JVBERi0xLjQ...",
  "filetype": "application/pdf",
  "readimagedata": true,
  "imagelimit": 20
}
Schreibend & teuer: Upload und AI-Service können schreibend oder teuer sein. Token mit Upload-Scope besonders schützen; große Dateien lieber über den enhanced-Upload + Container statt im Service-Body. Sehr große Dokumente über MaxParameterSize werden automatisch als „Large Document“ behandelt.
✎ Übung: Ein Vertrags-PDF soll von einem AI-Service zusammengefasst werden, ist aber zu groß für den Service-Body. Was ist der robustere Weg? (Andeutung: erst .../document/enhanced hochladen, dann Service container-basiert ausführen — AH 14.3.5.)

✓ Das hast du angebunden

Stufe 5 von 7

Fehlerbehandlung & Rate Limiting

Statuscodes richtig deuten und unter Last bestehen.

1Statuscodes

Die wichtigsten Rückgabecodes der Public API. (AH 14.4)

200 OK
erfolgreiche Anfrage.
400 Bad Request
fachlicher Fehler (z. B. keine Datei im Upload).
401 Unauthorized
Authorization-Header fehlt, ungültige Agent-UUID oder externer Zugriff nicht aktiviert.
403 Forbidden
Benutzer hat für das Feature keine Berechtigung.
422 Unprocessable Entity
Body nicht parsebar (ungültiges JSON, ungültige Pfadparameter).
429 Too Many Requests
Rate Limit überschritten.
501 Not Implemented
Feature nicht aktiv konfiguriert.
503 Service Unavailable
Initialisierungsfehler eines internen Dienstes (DB, LLM, Vector-DB …).

2Fehler-Response-Format

Fehler kommen als domain.Error mit code, message, errorObj, user, service. Der \n im message-String steht literal:

{
  "code": 401,
  "message": "Access Rights check failed\nuuid accesstoken rights check failed",
  "errorObj": {},
  "user": null,
  "service": ""
}

Sonderfall Rate-Limit: abweichend ein einfaches Objekt.

{ "error": "Rate limit exceeded" }

3Rate Limiting

Rate 100 Anfragen/Sekunde, Burst 200; Schlüssel ist der Bearer-Token (fehlt er, die Client-IP). (AH 14.5)

Limits gelten global über alle Routen, nicht pro Endpunkt. Inaktive Einträge werden nach 30 s aus dem Tracking entfernt. Bei Überschreitung → 429. Konkrete Zahlen gegen Instanz prüfen — sie stammen aus dem globalen Limiter und können je Deployment angepasst sein.

429 ist kein Bug, sondern Schutz. Immer Backoff einbauen (Stufe 6/7) — ohne Retry-Strategie bricht die Integration unter Last ab.
✎ Übung: Du bekommst 422 Unprocessable Entity mit „could not parse ...“. Was prüfst du zuerst? (Andeutung: Body gegen das 15.3-Schema; Pfad-IDs müssen numerisch sein — AH 14.4/15.8.)

✓ Das hast du angebunden

Stufe 6 von 7

Sicherheit

Token-Schutz und Betriebsdisziplin als Dauerthema.

1Token-Sicherheit

Der Agent-UUID-Token ist ein Secret — behandle ihn so. (AH 14.6)

Nie im Code
Tokens über Umgebungsvariablen oder Secret-Manager, niemals im Repo.
Rotieren
regelmäßig und bei Verdacht auf Kompromittierung; neue UUID in den Agent-Einstellungen generieren.
HTTPS Pflicht
unverschlüsselte API-Kommunikation ist nicht zulässig.
Minimaler Scope
ein Agent-UUID-Token erlaubt nur seine eine Fähigkeit (Chat, Suche, Upload, AI-Service).

2Best Practices

  1. Getrennte Tokens pro Integration — ein kompromittierter Token lässt sich zielgerichtet deaktivieren.
  2. Retry mit Backoff für 429 und 5xx.
  3. Logging der Aufrufe fürs Debugging — aber niemals das Bearer-Token mitloggen.
  4. Timeouts setzen, gerade für Chat-Streaming (Server-Timeout: 5 Minuten).

Den Token liest dein Client aus der Umgebung, nie aus dem Quelltext:

# Token aus der Umgebung lesen, niemals im Code:
export AUX_TOKEN="<deine-agent-uuid>"
curl -H "Authorization: Bearer ${AUX_TOKEN}" ...
Geleakter Token = offener Zugang zur jeweiligen Fähigkeit deines Agenten. Bei Verdacht: UUID rotieren (alte wird ungültig), Logs auf Missbrauch prüfen, betroffene Integration mit neuem Token versorgen.
Rate-Limit-Schlüssel = der Token selbst. Teilen sich mehrere Integrationen einen Token, teilen sie sich auch das gemeinsame 100-req/s-Kontingent — ein weiterer Grund für getrennte Tokens.
✎ Übung: Nenne zwei Gründe, warum jede Integration ihren eigenen Token bekommen sollte. (Andeutung: gezielte Deaktivierung bei Kompromittierung + getrennte Rate-Limit-Kontingente — AH 14.5/15.6.)

✓ Das hast du angebunden

Stufe 7 von 7

Programmierbeispiele & Troubleshooting

End-to-End und die häufigsten Fehlerbilder.

1Programmierbeispiel (Python)

Das Protokoll ist sprachunabhängig. Eine schlanke Client-Klasse kapselt Basis-URL + Bearer-Header. (AH 14.7)

import requests

class AuxDataAPI:
    def __init__(self, base_url, token):
        self.base_url = base_url.rstrip("/")
        self.headers = {
            "Authorization": f"Bearer {token}",
            "Content-Type": "application/json",
        }

    def chat(self, agent_id, question, comuuid=""):
        url = f"{self.base_url}/api/v1/agent/{agent_id}/chat"
        payload = {"question": question, "comuuid": comuuid}
        r = requests.post(url, json=payload, headers=self.headers)
        r.raise_for_status()
        return r.json()

# Token aus der Umgebung, niemals im Code:
api = AuxDataAPI("https://muster.auxdata.example", AUX_TOKEN)
print(api.chat(123, "Wie funktioniert die API?"))

JS und C# sind analog aufgebaut (gleiche Routen, gleicher Bearer-Header) — siehe Handbuch/Swagger. Kein echtes Token im Code: AUX_TOKEN kommt aus der Umgebung.

2Troubleshooting

Die typischen Fehlerbilder und ihre Lösung. (AH 14.8)

401 „authorization is required header“
Authorization: Bearer <token> setzen.
401 Rights check failed
passenden „External Access“-Schalter aktivieren und die UUID des richtigen Config-Bereichs senden.
403 Forbidden
bei JWT-Aufrufen prüfen, ob der Benutzer Mitglied des Agenten/der Organisation ist.
422 „could not parse ...“
Body gegen 15.3-Schema prüfen; Pfad-IDs müssen numerisch sein.
429
Backoff-Strategie; Limit gilt global pro Token bzw. IP.
500/503
Server-Logs auf Initialisierungsfehler interner Dienste (DB, LLM, Vector-DB) prüfen.
Debugging-Werkzeuge: Swagger UI (/swagger/index.html) zum schnellen Ausprobieren; Server-Logs (jeder domain.Error wird auch serverseitig geloggt); cURL/Postman für Header- und Body-Detailanalyse.

Zusammenfassung: 7 Kernendpunkte unter /api/v1 für Upload/Suche/Chat/AI-Service plus aktueller Swagger-Zusatz /chat/{comUuid}/summarize; Auth per Authorization: Bearer <token> — Agent-UUID (dieses Tutorial) oder Keycloak-JWT (instanz-/setup-abhängig, gegen Instanz prüfen); Schemata aus Go-Typen, in Swagger einsehbar; globales Rate Limiting 100 req/s, Burst 200.

Helpdesk-Assistent per REST angebunden!

Du hast den Helpdesk-Assistenten der Muster GmbH per REST angebunden — Chat, Suche, AI-Service und Upload mit Agent-UUID-Token, dazu Fehlerbehandlung, Rate Limiting und Token-Sicherheit. Mach das Quiz und geh dann weiter zu E2 — MCP: externe Tools sicher nutzen.

✎ Übung: Du bekommst dauerhaft 501 Not Implemented für den AI-Service-Aufruf. Wo suchst du? (Andeutung: Feature/Service nicht aktiv konfiguriert — Service-Definition und Aktivierung in der Instanz prüfen, danach Swagger — AH 14.4/15.8.)

✓ Das hast du angebunden

Kurz-Quiz

Sitzt die REST-Anbindung?

7 Fragen aus den Stufen 1–7. Kein Zertifikat — zur Selbstkontrolle. Beliebig oft wiederholbar.

Frage 1 von 7
Lade Frage…