Dateien, Projekte und Wissen

Über die REST-API Dateien hochladen, Arbeit in Projekten organisieren, Wissensdatenbanken aufbauen und teilen sowie Teams verwalten.

18 Min. Lesezeit · Aktualisiert am 28. September 2026

Diese Ressourcen geben einem Modell etwas, womit es arbeiten kann. Dateien sind Uploads, die Sie an eine Nachricht oder eine Ausführung anhängen. Projekte bündeln Chats, Prompts und Dateien mit gemeinsamen Anweisungen und einem Standardmodell. Wissensdatenbanken sind Ordnerbäume mit Dokumenten, die für die Suche indexiert und in Antworten als Quelle angegeben werden. Teams sind Gruppen innerhalb Ihres Workspace, mit denen Sie Projekte, Wissensdatenbanken und Unterhaltungen teilen.

Alle Pfade beziehen sich auf https://api.stickyprompts.com/api/v1. Jeder Request läuft als der Benutzer, dem der API-Schlüssel gehört. Alle Prüfungen zu Eigentum, Freigaben und Workspace-Rollen gelten also für diesen Benutzer.

Konventionen

  • Objekte enthalten neben Feldern in snake_case die großgeschriebenen Basisfelder ID, CreatedAt, UpdatedAt und DeletedAt (null bei aktiven Datensätzen).
  • Paginierte Endpunkte lesen page (Standard 1) und size (Standard 10) und setzen die Response-Header X-Total-Count, X-Page und X-Page-Size. Siehe Fehler, Paginierung und Kontingente.
  • Fehler haben die Form {"error": "message"}. Kontingentfehler lauten 429 {"error": "Quota exceeded", "reason": "<reason>"}.

Dateien

Das Datei-Objekt

Jeder Upload-Endpunkt liefert dasselbe Datei-Objekt.

{
  "ID": 4812,
  "CreatedAt": "2026-09-28T09:14:03.512Z",
  "UpdatedAt": "2026-09-28T09:14:03.512Z",
  "DeletedAt": null,
  "name": "northwind-q3-report.pdf",
  "path": "https://<storage-host>/<bucket>/231/k9Tq2vX8bLmN3pRs7wYz4cDf6gHj1kLm.pdf",
  "preview_path": "",
  "public_path": "",
  "user_id": 231,
  "workspace_id": 17,
  "project_id": null,
  "fileType": "file_search",
  "partial": false
}
FeldTypBedeutung
IDintegerDie Datei-ID, die Sie in Unterhaltungen und Ausführungen als Anhang übergeben.
namestringUrsprünglicher Dateiname.
pathstringDirekte URL des gespeicherten Objekts: <storage URI>/<bucket>/<user id>/<32 random chars><extension>. Ob es ohne Zugangsdaten lesbar ist, hängt von der Speicherkonfiguration außerhalb der API ab.
preview_pathstringNur bei .docx gesetzt (in eine PDF-Vorschau umgewandelt) und bei .jfif (als .jpg ausgeliefert). Sonst leer.
public_pathstringÖffentlicher Freigabe-Slug, leer, wenn die Datei nicht geteilt ist. Siehe POST /file/:id/public.
user_id, workspace_id, project_idinteger oder nullWer hochgeladen hat, dessen Workspace zum Zeitpunkt des Uploads und das Projekt, falls in ein Projekt hochgeladen wurde.
fileTypestringSchlüssel in camelCase. image, file_search, spreadsheet, code_interpreter oder code_interpreter_output, abgeleitet aus der Dateiendung.
partialbooleanNur true, solange generierte Inhalte noch geschrieben werden. Bei Uploads immer false.

So wird fileType ermittelt. Der Abgleich der Endung unterscheidet Groß- und Kleinschreibung. REPORT.PDF landet daher bei code_interpreter.

  • image: .png .jpg .jpeg .gif .webp .bmp .tiff .tif .ico .heic .heif .jfif .avif .svg
  • file_search: .c .cc .cpp .h .hpp .cs .css .scss .less .doc .docx .go .html .java .js .jsx .ts .tsx .vue .json .md .pdf .php .pptx .py .rb .sh .bat .ps1 .tex .txt .xml .yaml .yml .toml .ini .log .rtf .odt .rst .sql .kt .swift .rs .r .m .lua .pl
  • spreadsheet: .xlsx .xlsm .xlam .xltm .xltx .xls .csv .tsv .ods .ots .numbers
  • code_interpreter: alles andere

POST /file

POST /api/v1/file
Berechtigung files_manage

Lädt eine oder mehrere Dateien in Ihre persönliche Dateibibliothek hoch. Der Upload läuft synchron: Wenn die Antwort eintrifft, ist jede Datei gespeichert und hat eine ID. Ein MCP-Gegenstück zum Hochladen gibt es nicht.

Body (multipart/form-data)
upload[] file in form erforderlich
Ein Part pro Datei. Wiederholen Sie das Feld, um mehrere Dateien hochzuladen. Der Name lautet wörtlich upload[]: Parts unter einem anderen Namen werden ignoriert, und der Request gelingt mit [].

Der API-Code erzwingt hier weder eine Größenbeschränkung noch eine Liste zulässiger Dateiendungen. Jede Grenze, auf die Sie stoßen, stammt von der Infrastruktur vor der API.

curl -X POST https://api.stickyprompts.com/api/v1/file \
  -H "Authorization: Bearer $STICKY_API_KEY" \
  -F "upload[]=@northwind-q3-report.pdf" \
  -F "upload[]=@pricing.xlsx"
import os, requests

with open("northwind-q3-report.pdf", "rb") as a, open("pricing.xlsx", "rb") as b:
    r = requests.post(
        "https://api.stickyprompts.com/api/v1/file",
        headers={"Authorization": f"Bearer {os.environ['STICKY_API_KEY']}"},
        files=[("upload[]", a), ("upload[]", b)],
    )
r.raise_for_status()
for f in r.json():
    print(f["ID"], f["name"], f["fileType"])
import { readFile } from "node:fs/promises";

const form = new FormData();
form.append("upload[]", new Blob([await readFile("northwind-q3-report.pdf")]), "northwind-q3-report.pdf");
form.append("upload[]", new Blob([await readFile("pricing.xlsx")]), "pricing.xlsx");

const files = await fetch("https://api.stickyprompts.com/api/v1/file", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.STICKY_API_KEY}` },
  body: form,
}).then((r) => r.json());
console.log(files.map((f) => [f.ID, f.fileType]));

Antwort. 200 mit einem Array von Datei-Objekten in der Reihenfolge des Uploads.

Fehler. 500 {"error": "could not upload files"}, wenn der Body kein gültiges Multipart ist oder das Speichern fehlschlägt.

Eine hochgeladene Datei verwenden

  • In einer Nachricht einer Unterhaltung oder in einer Ausführung: "attachments": [{"id": 4812, "type": "file"}]. Mit "temp": true hängen Sie die Datei nur für diesen einen Aufruf an. Siehe Unterhaltungen und Nachrichten.
  • An einem Prompt: POST /prompt/:id/file mit {"file_ids": [4812]}. Siehe Prompts und Ausführungen.
  • Für die Tabellenverarbeitung: Übergeben Sie die Datei als file_id an POST /xlsx/start-process. Siehe Modelle und Medien.

GET /file

GET /api/v1/file
Berechtigung files_get MCP-Tool list_files

Listet jede Datei auf, die Sie hochgeladen haben, einschließlich der Dateien in Projekten und Wissensdatenbanken und der generierten Ausgaben der Tabellenverarbeitung. Eine feste Sortierreihenfolge gibt es nicht.

Query-Parameter
page integer in query optional Standard 1
Seitennummer.
size integer in query optional Standard 10
Einträge pro Seite.

Antwort. 200 mit einem Array von Datei-Objekten.

DELETE /file/:id

DELETE /api/v1/file/:id
Berechtigung files_delete

Löscht eine Datei, die Sie hochgeladen haben: Sie wird (samt einer etwaigen Vorschau) aus dem Speicher entfernt, und der Datensatz wird als gelöscht markiert (Soft Delete).

Pfadparameter
id integer in path erforderlich
Datei-ID.

Antwort. 204, ohne Body.

Fehler. 400 {"error": "Invalid file ID"}, 404 {"error": "File not found"}, 403 {"error": "You do not have permission to delete this file"} (Sie haben die Datei nicht hochgeladen), 502 {"error": "Failed to delete file"}.

POST /file/:id/public

POST /api/v1/file/:id/public
Berechtigung files_manage

Erstellt oder ersetzt einen öffentlichen Freigabe-Slug für eine Datei, die Sie hochgeladen haben. Ein erneuter Aufruf erzeugt einen neuen Slug und macht den alten ungültig. Wer den Slug kennt, kann GET /public/file/:slug ohne Authentifizierung aufrufen. Der Aufruf liefert das Datei-Objekt einschließlich path (und 404 {"error": "File not found"}, sobald die Freigabe widerrufen ist). Ein URL-Format für Freigaben auf Basis des Slugs legt die API nicht fest.

Pfadparameter
id integer in path erforderlich
Datei-ID.

Antwort. 200 mit dem Datei-Objekt. public_path enthält einen neuen 32-stelligen Slug wie "Qx7_mB2kLr9-TtZwP4nV8cHd3JfG6sYq".

Fehler. 400 Invalid file ID, 404 File not found, 403 {"error": "You do not have permission to share this file"}.

DELETE /file/:id/public

DELETE /api/v1/file/:id/public
Berechtigung files_delete

Widerruft den öffentlichen Link, indem public_path geleert wird.

Pfadparameter
id integer in path erforderlich
Datei-ID.

Antwort. 204. Fehler. 400 Invalid file ID, 404 File not found, 403 {"error": "You do not have permission to modify this file"}.

Projekte

Ein Projekt bündelt Unterhaltungen, Prompts und Dateien und bringt Standardanweisungen und ein Standardmodell mit. Es ist die API-Seite von Projekte. Jede :id akzeptiert die numerische ID oder den slug. Dateien, die in ein Projekt hochgeladen wurden, werden automatisch an Unterhaltungen angehängt, die im Projekt gestartet werden, jeweils nur für diesen Aufruf (verwenden Sie dafür bei den Unterhaltungs-Endpunkten den Header X-Project-ID).

Zugriffsmodell

  • Der Inhaber darf alles. Nur der Inhaber kann das Projekt löschen oder seine Freigaben ändern.
  • Andere erhalten Zugriff über Freigaben für den gesamten Workspace, einzelne Benutzer oder Teams. Die wirksamen Flags ergeben sich aus der Vereinigung aller Freigaben. Eine Freigabe gewährt Lesezugriff (das Projekt und seine Dateien sehen, es anheften). Zusätzliche Flags: prompt_management (die Prompts des Projekts verwalten), file_management (Dateien hochladen und löschen) und project_management (das Projekt mit PATCH bearbeiten).

Das Projekt-Objekt

{
  "ID": 305,
  "CreatedAt": "2026-09-01T12:00:00Z",
  "UpdatedAt": "2026-09-27T16:40:00Z",
  "DeletedAt": null,
  "slug": "k7Tq2vX",
  "name": "Northwind Launch",
  "description": "Everything for the Q4 launch",
  "instructions": "Answer in British English. Keep it short.",
  "color": "#3B82F6",
  "icon": "rocket",
  "ai_model_id": null,
  "auto_model_type": "best",
  "user_id": 231,
  "is_pinned": false,
  "has_files": true,
  "current_user_permission": { "prompt_management": false, "file_management": false, "project_management": false },
  "workspace_share": true,
  "workspace_share_flags": { "prompt_management": true, "file_management": false, "project_management": false },
  "user_shares": [
    { "user_id": 240, "user": { "ID": 240, "first_name": "Dora", "...": "..." },
      "flags": { "prompt_management": true, "file_management": true, "project_management": false } }
  ],
  "team_shares": [
    { "team_id": 12, "team": { "ID": 12, "name": "Marketing", "...": "..." },
      "flags": { "prompt_management": false, "file_management": true, "project_management": false } }
  ]
}
  • icon muss leer sein oder einer dieser Werte: folder rocket hat-glasses box flask-conical book-open briefcase circle-dollar-sign puzzle cpu plane cross database paw-print headset. color ist ein Hex-String und wird nicht validiert.
  • Normalerweise ist genau eines der beiden Felder gesetzt: ai_model_id (ein festes Modell) oder auto_model_type (best, balanced, cheapest).
  • ai_model, pin, files, conversations, prompts und has_files fehlen, wenn sie nicht geladen wurden.
  • current_user_permission zeigt nur Flags, die über Freigaben gewährt wurden. Der Inhaber hat alle Rechte, sieht aber meist überall false.
  • has_files, current_user_permission, user_shares und team_shares werden nur von GET /project/:id befüllt. An anderer Stelle fehlt has_files, die Berechtigungsflags sind alle false, und die Freigabelisten sind null.

POST /project

POST /api/v1/project

Legt ein Projekt an. Das Standardmodell stammt aus Ihren Voreinstellungen (bevorzugtes Modell oder automatische Modellwahl), ersatzweise gilt der Standard der Plattform. instructions lässt sich hier nicht setzen: Verwenden Sie dafür PATCH.

Body
name string erforderlich
Projektname.
description string optional
Freitext.
color string optional
Hex-Farbe.
icon string optional
Einer der oben genannten Icon-Namen.
curl -X POST https://api.stickyprompts.com/api/v1/project \
  -H "Authorization: Bearer $STICKY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Northwind Launch", "description": "Everything for the Q4 launch", "icon": "rocket" }'

Antwort. 201 mit dem Projekt-Objekt.

Fehler. 400 ("Project name is required" oder ein Binding-Fehler, "Invalid project icon"), 500 {"error": "Failed to create project"}.

GET /project

GET /api/v1/project
Berechtigung projects_get MCP-Tool list_projects

Listet die Projekte auf, die Ihnen gehören, und dazu die Projekte, die mit Ihnen geteilt wurden, die neuesten zuerst.

Query-Parameter
page integer in query optional Standard 1
Seitennummer.
size integer in query optional Standard 10
Einträge pro Seite.
search string in query optional
Abgleich mit Name oder Beschreibung, ohne Unterscheidung von Groß- und Kleinschreibung.
is_shared boolean in query optional
true: nur Projekte, die mit Ihnen geteilt wurden. false: nur Projekte, die Ihnen gehören. Weglassen für beides.

Antwort. 200 mit einem Array von Projekt-Objekten.

Die Zugriffsfilterung greift erst nach der Paginierung. Eine Seite kann daher weniger als size Einträge enthalten, und X-Total-Count kann höher sein als das, was Sie sehen. is_pinned ist in dieser Liste immer false: Verwenden Sie GET /project/pinned. Fehler. 400 {"error": "Invalid is_shared parameter"}.

GET /project/pinned

GET /api/v1/project/pinned
Berechtigung projects_get

Ihre angehefteten Projekte, das zuerst angeheftete zuerst, mit is_pinned: true und befülltem pin. Nicht paginiert.

GET /project/:id

GET /api/v1/project/:id
Berechtigung projects_get MCP-Tool get_project

Liefert das vollständige Projekt-Objekt.

Pfadparameter
id string in path erforderlich
Projekt-ID oder Slug.
Query-Parameter
include_files string in query optional
true liefert die Dateien des Projekts als files (Datei-Objekte) mit.

Fehler. 404 {"error": "Project not found"}, 403 {"error": "You don't have access to this project"}.

PATCH /project/:id

PATCH /api/v1/project/:id
Berechtigung projects_manage

Ändert ein Projekt. Sie müssen der Inhaber sein oder project_management besitzen. Jedes Feld ist optional, senden Sie aber mindestens eines.

Pfadparameter
id string in path erforderlich
Projekt-ID oder Slug.
Body
name string optional
Darf nicht leer sein.
description string optional
Freitext.
color string optional
Hex-Farbe.
icon string optional
Icon-Name oder "", um das Icon zu entfernen.
instructions string optional
Anweisungen für das Modell auf Projektebene. Es gelten die Regeln Ihres Workspace für sensible Daten: Passende Inhalte werden geschwärzt, oder der Request wird abgelehnt.
ai_model_id integer optional
Setzt ein festes Modell und leert auto_model_type.
auto_model_type string optional
best, balanced oder cheapest. Leert ai_model_id.

Antwort. 200 mit dem Projekt-Objekt.

Fehler. 400 bei Project name cannot be empty, only one of ai_model_id or auto_model_type may be set, invalid auto_model_type, Invalid project icon, No fields provided for update oder einer Sperre wegen sensibler Daten ({"error": "...", "code": "..."}); 404 Project not found; 403 You don't have access to this project.

DELETE /project/:id

DELETE /api/v1/project/:id

Löscht das Projekt zusammen mit seinen Unterhaltungen, Projektdateien, Anheftungen, Prompts und Freigabe-Einträgen. Nur für den Inhaber.

Pfadparameter
id string in path erforderlich
Projekt-ID oder Slug.

Antwort. 204. Fehler. 404 Project not found, 403 You don't have access to this project.

POST /project/:id/pin

POST /api/v1/project/:id/pin
Berechtigung projects_manage

Heftet ein Projekt, das Sie sehen können, an oder löst die Anheftung wieder. Pro Benutzer sind höchstens 5 Projekte angeheftet.

Pfadparameter
id string in path erforderlich
Projekt-ID oder Slug.

Antwort. 200 {"message": "Project pinned", "pinned": true} oder 200 {"message": "Project unpinned", "pinned": false}.

Fehler. 400 {"error": "Maximum 5 projects can be pinned"}, 404, 403.

PATCH /project/:id/share_with_workspace

PATCH /api/v1/project/:id/share_with_workspace
Berechtigung projects_manage

Teilt das Projekt mit Ihrem gesamten Workspace oder hebt diese Freigabe auf. Nur für den Inhaber, und Sie müssen zu einem Workspace gehören. Flags, die Sie weglassen, behalten ihren aktuellen Wert.

Pfadparameter
id string in path erforderlich
Projekt-ID oder Slug.
Body
share boolean optional
true teilt mit dem Workspace, false hebt die Freigabe auf. Weggelassen: Es ändert sich nichts.
prompt_management boolean optional
Wird nur zusammen mit share: true angewendet.
file_management boolean optional
Wird nur zusammen mit share: true angewendet.
project_management boolean optional
Wird nur zusammen mit share: true angewendet.

Antwort. 200 {"message": "Project shared with workspace"}, auch beim Aufheben der Freigabe.

Fehler. 403 {"error": "You don't have access to this project's share settings"}, 400 {"error": "User is not in a workspace"}, 404.

PATCH /project/:id/share_with_user

PATCH /api/v1/project/:id/share_with_user
Berechtigung projects_manage

Teilt das Projekt mit einzelnen Benutzern in Ihrem Workspace. Nur für den Inhaber.

Pfadparameter
id string in path erforderlich
Projekt-ID oder Slug.
Body
shares array erforderlich
Einträge der Form { "user_id", "share", "prompt_management", "file_management", "project_management" }. share: true gewährt Lesezugriff, share: false entfernt die Freigabe für den Benutzer vollständig. Ohne share werden nur die angegebenen Flags geändert.
{
  "shares": [
    { "user_id": 240, "share": true, "prompt_management": true, "file_management": true },
    { "user_id": 251, "share": false }
  ]
}

Die Einträge werden der Reihe nach angewendet, und der Request bricht beim ersten fehlerhaften Eintrag ab. Bereits angewendete Einträge bleiben bestehen.

Antwort. 200 {"message": "Project sharing with users updated"}.

Fehler. 404 {"error": "User not found"}, 400 {"error": "Target user is not in the same workspace"} sowie die oben genannten Fehler zu Inhaber und Workspace.

PATCH /project/:id/share_with_team

PATCH /api/v1/project/:id/share_with_team
Berechtigung projects_manage

Wie share_with_user, nur verwenden die Einträge team_id. Das Team muss zu Ihrem Workspace gehören.

Pfadparameter
id string in path erforderlich
Projekt-ID oder Slug.
Body
shares array erforderlich
Einträge der Form { "team_id", "share", "prompt_management", "file_management", "project_management" }.

Antwort. 200 {"message": "Project sharing with teams updated"}.

Fehler. 404 {"error": "Team not found"}, 400 {"error": "Target team is not in the same workspace"}.

POST /project/:id/file

POST /api/v1/project/:id/file
Berechtigung projects_manage

Lädt Dateien in ein Projekt hoch. Sie müssen der Inhaber sein oder file_management besitzen. Funktioniert wie POST /file: synchron, multipart/form-data, ohne Größenbeschränkung und ohne Liste zulässiger Endungen im API-Code. Bei jeder entstandenen Datei ist project_id gesetzt.

Pfadparameter
id string in path erforderlich
Projekt-ID oder Slug.
Body (multipart/form-data)
upload[] file in form erforderlich
Ein Part pro Datei. Für mehrere Dateien wiederholen.

Antwort. 200 mit einem Array von Datei-Objekten.

Fehler. 404 Project not found, 403 {"error": "You don't have access to this project"}, 500 {"error": "could not upload files"}.

GET /project/:id/file

GET /api/v1/project/:id/file
Berechtigung projects_get

Listet die Dateien eines Projekts auf. Jede ist ein Datei-Objekt mit dem zusätzlichen Feld can_delete (true, wenn Sie Projektdateien verwalten dürfen oder die Datei hochgeladen haben). Gibt es keine Vorschau, enthält preview_path ersatzweise den Wert von path.

Pfadparameter
id string in path erforderlich
Projekt-ID oder Slug.
[
  {
    "ID": 4820,
    "name": "brand-guidelines.pdf",
    "path": "https://<storage-host>/<bucket>/231/Hq3...pdf",
    "preview_path": "https://<storage-host>/<bucket>/231/Hq3...pdf",
    "project_id": 305,
    "fileType": "file_search",
    "partial": false,
    "can_delete": true
  }
]

DELETE /project/:id/file/:fileId

DELETE /api/v1/project/:id/file/:fileId
Berechtigung projects_manage

Entfernt einen Dateieintrag aus dem Projekt. Sie brauchen Lesezugriff und außerdem entweder file_management (oder das Eigentum am Projekt), oder Sie müssen die Datei selbst hochgeladen haben.

Pfadparameter
id string in path erforderlich
Projekt-ID oder Slug.
fileId integer in path erforderlich
Datei-ID.

Antwort. 200 {"message": "File deleted successfully"}.

Fehler. 400 Invalid file ID, 404 Project not found, 404 {"error": "File not found in project"}, 403 {"error": "You don't have access to delete this file"}.

Wissensdatenbanken

Eine Wissensdatenbank ist ein Ordnerbaum mit Dokumenten, die für die Suche in Abschnitte zerlegt und indexiert werden. Sie ist die API-Seite von Wissensdatenbanken. Um eine Wissensdatenbank in einer Unterhaltung oder Ausführung zu nutzen, übergeben Sie knowledge_base_ids, optional mit knowledge_base_limit_node_ids, um die Suche auf bestimmte Ordner oder Dateien zu beschränken, sowie world_knowledge. IDs von Wissensdatenbanken sind immer numerisch (keine Slugs).

Zugriffsstufen (current_user_permission und access_type einer Freigabe):

WertErlaubt
kb_accessDie Wissensdatenbank lesen und in Chats verwenden.
kb_uploadWie oben, zusätzlich Dateien hochladen.
kb_editWie oben, zusätzlich die Wissensdatenbank umbenennen, Ordner verwalten und beliebige Dateien löschen.
noneKein Zugriff.

Der Inhaber hat immer kb_edit. Nur der Inhaber kann die Wissensdatenbank löschen oder ihre Freigaben ändern. Wer eine Datei hochgeladen hat, kann sie immer selbst löschen.

Das Wissensdatenbank-Objekt

{
  "ID": 44,
  "CreatedAt": "2026-09-10T08:30:00Z",
  "UpdatedAt": "2026-09-10T08:30:00Z",
  "DeletedAt": null,
  "user_id": 231,
  "user": { "ID": 0, "email": "", "first_name": "", "...": "zero values" },
  "name": "Northwind Help Center",
  "description": "Policies, onboarding and FAQs",
  "color": "#10B981",
  "icon": "book-open",
  "document_count": 18,
  "member_count": 6,
  "current_user_permission": "kb_edit",
  "user_shares": [
    { "user_id": 240, "user": { "ID": 240, "first_name": "Dora", "...": "..." }, "access_type": "kb_upload", "added_at": "2026-09-11T09:00:00Z" }
  ],
  "team_shares": [
    { "team_id": 12, "team": { "ID": 12, "name": "Customer Support", "...": "..." }, "access_type": "kb_access", "added_at": "2026-09-11T09:05:00Z" }
  ]
}

Das Inhaberobjekt user wird nie geladen und enthält immer Nullwerte: Verwenden Sie user_id. document_count zählt Dateien, keine Ordner. member_count liefern nur GET und PUT für eine einzelne Wissensdatenbank.

POST /knowledge-bases

POST /api/v1/knowledge-bases

Legt eine Wissensdatenbank an.

Body
name string erforderlich
Name der Wissensdatenbank.
icon string erforderlich
Einer der unter Projekte aufgeführten Icon-Namen.
description string optional
Freitext.
color string optional
Hex-Farbe (wird nicht validiert).

Antwort. 201 mit der Wissensdatenbank, document_count: 0, member_count: 0 und leeren Freigabelisten.

Fehler. 400 {"error": "Knowledge base name is required"}, 400 {"error": "Invalid knowledge base icon"}.

GET /knowledge-bases

GET /api/v1/knowledge-bases

Listet jede Wissensdatenbank auf, die Ihnen gehört oder auf die Sie über eine Freigabe zugreifen können. Nicht paginiert. Jeder Eintrag enthält die Felder der Wissensdatenbank sowie document_count und current_user_permission (kein member_count und keine Freigabelisten).

GET /knowledge-bases/:id

GET /api/v1/knowledge-bases/:id

Liefert die vollständige Wissensdatenbank. Erfordert mindestens kb_access.

Pfadparameter
id integer in path erforderlich
ID der Wissensdatenbank.

Fehler. 400 Invalid knowledge base ID, 404 Knowledge base not found, 403 {"error": "You don't have access to this knowledge base"}.

PUT /knowledge-bases/:id

PUT /api/v1/knowledge-bases/:id

Ersetzt name, description, color und icon, mit demselben Body und derselben Validierung wie bei POST. Eine weggelassene description wird geleert. Erfordert kb_edit.

Pfadparameter
id integer in path erforderlich
ID der Wissensdatenbank.
Body
name string erforderlich
Name der Wissensdatenbank.
icon string erforderlich
Icon-Name.
description string optional
Wird geleert, wenn weggelassen.
color string optional
Hex-Farbe.

Antwort. 200 mit der vollständigen Wissensdatenbank.

Fehler. Wie bei POST, dazu 403 {"error": "You are not authorized to update this knowledge base"} und 404.

DELETE /knowledge-bases/:id

DELETE /api/v1/knowledge-bases/:id

Löscht die Wissensdatenbank mit allen Ordnern, Dateien, gespeicherten Objekten und Indexdaten. Nur für den Inhaber.

Pfadparameter
id integer in path erforderlich
ID der Wissensdatenbank.

Antwort. 204. Fehler. 404 Knowledge base not found, 403 {"error": "You are not authorized to delete this knowledge base"}.

PATCH /knowledge-bases/:id/share_with_user

PATCH /api/v1/knowledge-bases/:id/share_with_user

Teilt eine Wissensdatenbank mit Benutzern in Ihrem Workspace. Nur für den Inhaber, und Sie müssen zu einem Workspace gehören. Wird eine Freigabe entfernt, werden die Agenten, die diese Wissensdatenbank nutzen, erneut geprüft.

Pfadparameter
id integer in path erforderlich
ID der Wissensdatenbank.
Body
shares array erforderlich
Einträge der Form { "user_id", "access_type" }. access_type ist kb_access, kb_upload oder kb_edit, um eine Stufe zu setzen (die bisherige wird ersetzt), oder null, "" bzw. none, um die Freigabe zu entfernen.
{
  "shares": [
    { "user_id": 240, "access_type": "kb_upload" },
    { "user_id": 251, "access_type": null }
  ]
}

Die Einträge werden der Reihe nach angewendet, und die Verarbeitung bricht beim ersten fehlerhaften Eintrag ab.

Antwort. 200 {"message": "Knowledge base sharing with users updated"}.

Fehler. 400 {"error": "User is not in a workspace"}, 403 {"error": "You don't have access to this knowledge base's share settings"}, 404 User not found, 400 Target user is not in the same workspace, 400 {"error": "Invalid access_type"}.

PATCH /knowledge-bases/:id/share_with_team

PATCH /api/v1/knowledge-bases/:id/share_with_team

Wie share_with_user, mit team_id statt user_id.

Pfadparameter
id integer in path erforderlich
ID der Wissensdatenbank.
Body
shares array erforderlich
Einträge der Form { "team_id", "access_type" }.

Antwort. 200 {"message": "Knowledge base sharing with teams updated"}.

GET /knowledge-bases/:id/folders

GET /api/v1/knowledge-bases/:id/folders

Listet die direkten Kinder einer Ebene des Baums auf, also Ordner und Dateien. Über diesen Endpunkt fragen Sie auch den Indexierungsstatus einer Datei ab.

Pfadparameter
id integer in path erforderlich
ID der Wissensdatenbank.
Query-Parameter
parent_id integer in query optional
Knoten-ID des aufzulistenden Ordners. Für die oberste Ebene weglassen (oder einen nicht numerischen Wert übergeben).
{
  "folders": [
    { "ID": 501, "name": "Policies", "parent_id": null, "size": 2483112,
      "CreatedAt": "2026-09-10T08:31:00Z", "UpdatedAt": "2026-09-10T08:31:00Z" }
  ],
  "files": [
    {
      "ID": 502,
      "name": "Northwind Refund Policy.md",
      "parent_id": null,
      "file_data_id": 4830,
      "file_data": { "ID": 4830, "name": "Northwind Refund Policy.md", "fileType": "file_search", "...": "..." },
      "size": 912334,
      "download_url": "https://<storage-host>/<bucket>/231/Zp8...md",
      "preview_url": "https://<storage-host>/<bucket>/231/Zp8...md",
      "status": "done",
      "status_progress": 100,
      "can_delete": true,
      "CreatedAt": "2026-09-10T08:32:00Z",
      "UpdatedAt": "2026-09-10T08:33:10Z"
    }
  ]
}

POST /knowledge-bases/:id/folders

POST /api/v1/knowledge-bases/:id/folders

Legt einen Ordner an. Erfordert kb_edit. Namen müssen unter Geschwistern eindeutig sein, wobei Ordner und Dateien denselben Namensraum teilen.

Pfadparameter
id integer in path erforderlich
ID der Wissensdatenbank.
Body
name string erforderlich
Ordnername.
parent_id integer optional
Ein Ordner in derselben Wissensdatenbank. Für die oberste Ebene weglassen oder null übergeben.

Antwort. 201. Die aktuelle Implementierung liefert den Ordner mit Nullwerten ("ID": 0, leerer name), obwohl er angelegt wurde. Listen Sie die Ordner mit GET /knowledge-bases/:id/folders erneut auf, um die ID des neuen Ordners zu erhalten.

Fehler. 403 {"error": "You don't have access to create folders in this knowledge base"}, 400 {"error": "Folder name is required"}, 404 {"error": "Parent folder not found"}, 400 {"error": "Folder or document with this name already exists"}.

GET /knowledge-bases/:id/folders/:folderId

GET /api/v1/knowledge-bases/:id/folders/:folderId

Liefert einen einzelnen Ordner: ID, name, parent_id, size, CreatedAt, UpdatedAt. Erfordert kb_access.

Pfadparameter
id integer in path erforderlich
ID der Wissensdatenbank.
folderId integer in path erforderlich
Knoten-ID des Ordners.

Fehler. 404 {"error": "Folder not found"}, 403.

PATCH /knowledge-bases/:id/folders/:folderId

PATCH /api/v1/knowledge-bases/:id/folders/:folderId

Benennt einen Ordner um. Ordner lassen sich nicht verschieben. Erfordert kb_edit.

Pfadparameter
id integer in path erforderlich
ID der Wissensdatenbank.
folderId integer in path erforderlich
Knoten-ID des Ordners.
Body
name string erforderlich
Neuer Name. Ein leerer Name führt zu 400 {"error": "No fields provided for update"}.

Antwort. 200 mit dem geänderten Ordner. Fehler. 400 {"error": "Folder or document with this name already exists"}.

DELETE /knowledge-bases/:id/folders/:folderId

DELETE /api/v1/knowledge-bases/:id/folders/:folderId

Löscht den Ordner und alles darunter, einschließlich der gespeicherten Dateien und Indexdaten. Erfordert kb_edit.

Pfadparameter
id integer in path erforderlich
ID der Wissensdatenbank.
folderId integer in path erforderlich
Knoten-ID des Ordners.

Antwort. 204.

POST /knowledge-bases/:id/files

POST /api/v1/knowledge-bases/:id/files

Lädt pro Request ein Dokument hoch. Erfordert kb_upload oder höher, und das Kontingent wird zuerst geprüft. Der Dateiname muss im Zielordner eindeutig sein. Der API-Code erzwingt keine Größenbeschränkung.

Pfadparameter
id integer in path erforderlich
ID der Wissensdatenbank.
Body (multipart/form-data)
file file in form erforderlich
Das Dokument. Der Feldname lautet file, nicht upload[]. Zulässige Endungen (ohne Unterscheidung von Groß- und Kleinschreibung): .txt .md .markdown .pdf .docx .xlsx .csv .png .jpg .jpeg.
folder_id string in form optional
Knoten-ID des Zielordners. Für die oberste Ebene weglassen.
curl -X POST https://api.stickyprompts.com/api/v1/knowledge-bases/44/files \
  -H "Authorization: Bearer $STICKY_API_KEY" \
  -F "file=@Northwind Refund Policy.md" \
  -F "folder_id=501"
import os, time, requests

BASE = "https://api.stickyprompts.com/api/v1"
H = {"Authorization": f"Bearer {os.environ['STICKY_API_KEY']}"}

with open("Northwind Refund Policy.md", "rb") as f:
    node = requests.post(f"{BASE}/knowledge-bases/44/files", headers=H,
                         files={"file": f}, data={"folder_id": "501"}).json()

# Wait until the document is indexed before relying on it
while True:
    listing = requests.get(f"{BASE}/knowledge-bases/44/folders", headers=H,
                           params={"parent_id": 501}).json()
    status = next(x["status"] for x in listing["files"] if x["ID"] == node["ID"])
    if status in ("done", "error"):
        print(status)
        break
    time.sleep(3)
import { readFile } from "node:fs/promises";

const BASE = "https://api.stickyprompts.com/api/v1";
const headers = { Authorization: `Bearer ${process.env.STICKY_API_KEY}` };

const form = new FormData();
form.append("file", new Blob([await readFile("Northwind Refund Policy.md")]), "Northwind Refund Policy.md");
form.append("folder_id", "501");
const node = await fetch(`${BASE}/knowledge-bases/44/files`, { method: "POST", headers, body: form }).then((r) => r.json());

for (;;) {
  const { files } = await fetch(`${BASE}/knowledge-bases/44/folders?parent_id=501`, { headers }).then((r) => r.json());
  const { status } = files.find((x) => x.ID === node.ID);
  if (status === "done" || status === "error") { console.log(status); break; }
  await new Promise((r) => setTimeout(r, 3000));
}

Antwort. 201 mit einem Dateiknoten (gleicher Aufbau wie die Einträge in files oben) mit status: "uploading" und status_progress: 0. Upload, Textextraktion und Indexierung laufen anschließend im Hintergrund:

statusstatus_progress
uploadingUpload-Fortschritt in Prozent
processing0
indexingIndexierungsfortschritt in Prozent
done100
errorVerarbeitung fehlgeschlagen

Fragen Sie GET /knowledge-bases/:id/folders?parent_id=<folder_id> ab, bis die Datei done meldet, bevor Sie sich bei der Suche auf sie verlassen.

Fehler. 403 {"error": "You don't have access to upload files to this knowledge base"}, 429 bei erschöpftem Kontingent, 400 {"error": "File is required"}, 400 {"error": "Invalid folder ID"}, 404 {"error": "Parent folder not found"}, 400 {"error": "File extension not allowed. Allowed extensions: .txt, .md, ..."}, 400 {"error": "Folder or document with this name already exists"}.

DELETE /knowledge-bases/:id/files/:fileId

DELETE /api/v1/knowledge-bases/:id/files/:fileId

Löscht einen Dokumentknoten, die zugehörige gespeicherte Datei und ihre Indexdaten. Erfordert kb_edit, oder Sie müssen die Datei selbst hochgeladen haben.

Pfadparameter
id integer in path erforderlich
ID der Wissensdatenbank.
fileId integer in path erforderlich
Die Knoten-ID aus der Ordnerliste, nicht die Datei-ID.

Antwort. 204. Fehler. 404 {"error": "File not found"}, 403 {"error": "You don't have access to delete this file"}.

Teams

Teams gehören zu einem Workspace und dienen als Ziel für Freigaben von Projekten, Wissensdatenbanken und Unterhaltungen. Die Teamrollen sind owner und member. In Listen über den gesamten Workspace bedeutet none, dass Sie nicht Mitglied des Teams sind. Die Sicht für Admins beschreibt Benutzer und Teams.

AktionErlaubt für
Ein Team erstellenWorkspace-Inhaber oder -Admin
Alle Teams im Workspace auflistenWorkspace-Inhaber oder -Admin
Die Mitglieder eines Teams sehenTeammitglieder, Workspace-Inhaber oder -Admin
Ein Team umbenennen oder löschen, Mitglieder hinzufügen oder entfernenTeam-Inhaber, Workspace-Inhaber oder -Admin
Die Rolle eines Mitglieds ändern, ein Mitglied als owner hinzufügen, einen Inhaber entfernenWorkspace-Inhaber oder -Admin

Das Team-Objekt

{
  "ID": 12,
  "CreatedAt": "2026-09-05T10:00:00Z",
  "UpdatedAt": "2026-09-05T10:00:00Z",
  "DeletedAt": null,
  "workspace_id": 17,
  "workspace": { "ID": 0, "name": "", "...": "zero values" },
  "name": "Marketing",
  "description": "Campaigns and content",
  "color": "#F472B6",
  "member_count": 0
}

workspace wird nie geladen und ist immer ein Objekt mit Nullwerten. member_count ist nur in den Listen-Endpunkten aussagekräftig.

Ein Teammitglied ist ein Benutzerobjekt (ID, email, first_name, last_name, status, workspace_id und weitere Felder), ergänzt um die role des Mitglieds auf oberster Ebene.

POST /teams

POST /api/v1/teams
Berechtigung teams_manage

Erstellt ein Team und fügt Sie als dessen owner hinzu. Nur für Workspace-Inhaber oder -Admins.

Body
name string erforderlich
Teamname.
description string optional
Freitext.
color string optional
Hex-Farbe (wird nicht validiert).

Antwort. 201 mit dem Team-Objekt.

Fehler. 403 {"error": "You are not authorized to create a team"}, 400 {"error": "Team name is required"}.

GET /teams

GET /api/v1/teams
Berechtigung teams_get MCP-Tool list_teams

Die Teams, denen Sie angehören, jeweils mit member_count und current_user_role. Nicht paginiert. Liefert null statt [], wenn Sie keinem Team angehören.

GET /teams/all

GET /api/v1/teams/all
Berechtigung teams_get

Alle Teams in Ihrem Workspace, mit member_count und current_user_role (none, wenn Sie nicht Mitglied sind). Nur für Workspace-Inhaber oder -Admins. Liefert null, wenn der Workspace keine Teams hat.

Fehler. 404 {"error": "User is not a member of a workspace"}, 403 {"error": "You are not authorized to view all teams in this workspace"}.

GET /teams/:id/members

GET /api/v1/teams/:id/members
Berechtigung teams_get MCP-Tool list_team_members

Listet die Mitglieder eines Teams auf. Nur für Teammitglieder sowie Workspace-Inhaber und -Admins.

Pfadparameter
id integer in path erforderlich
Team-ID.

Antwort. 200 mit einem Array von Teammitgliedern.

Fehler. 400 Invalid team ID, 404 {"error": "Team not found"}, 403 {"error": "You are not authorized to view the members of this team"}.

PUT /teams/:id

PUT /api/v1/teams/:id
Berechtigung teams_manage

Ersetzt name, description und color eines Teams. Weggelassene Werte für description und color werden geleert. Für den Team-Inhaber sowie Workspace-Inhaber und -Admins.

Pfadparameter
id integer in path erforderlich
Team-ID.
Body
name string erforderlich
Teamname.
description string optional
Wird geleert, wenn weggelassen.
color string optional
Wird geleert, wenn weggelassen.

Antwort. 200 mit dem geänderten Team.

Fehler. 403 {"error": "You are not authorized to update this team"}, 400 Team name is required, 404 Team not found.

DELETE /teams/:id

DELETE /api/v1/teams/:id
Berechtigung teams_delete

Löscht ein Team mit höchstens einem Mitglied. Für den Team-Inhaber sowie Workspace-Inhaber und -Admins.

Pfadparameter
id integer in path erforderlich
Team-ID.

Antwort. 204. Fehler. 409 {"error": "Cannot delete a team with other members"}, 403 {"error": "You are not authorized to delete this team"}.

POST /teams/:id/members

POST /api/v1/teams/:id/members
Berechtigung teams_manage

Fügt ein Workspace-Mitglied zu einem Team hinzu. Für den Team-Inhaber sowie Workspace-Inhaber und -Admins. Wer jemanden als owner hinzufügen will, muss Workspace-Inhaber oder -Admin sein.

Pfadparameter
id integer in path erforderlich
Team-ID.
Body
user_id integer erforderlich
Ein Benutzer in Ihrem Workspace.
role string erforderlich
Senden Sie immer member oder owner. Über die Prüfung auf Inhaberrechte hinaus wird der Wert nicht validiert.

Antwort. 201. Der Body enthält derzeit nur role, alle Benutzerfelder haben Nullwerte. Rufen Sie GET /teams/:id/members auf, um das Mitglied wieder auszulesen.

Fehler. 403 {"error": "You are not authorized to add a team member"}, 403 beim Hinzufügen eines Inhabers ohne Admin-Rechte im Workspace, 409 {"error": "User is already a member of this team"}, 404 {"error": "User not found"}, 403 {"error": "User is not a member of this workspace"}.

PATCH /teams/:id/members/:memberUserId

PATCH /api/v1/teams/:id/members/:memberUserId
Berechtigung teams_manage

Ändert die Rolle eines Mitglieds. Um role zu ändern, müssen Sie Workspace-Inhaber oder -Admin sein.

Pfadparameter
id integer in path erforderlich
Team-ID.
memberUserId integer in path erforderlich
Die Benutzer-ID des Mitglieds.
Body
role string erforderlich
owner oder member.

Antwort. 200 mit dem Teammitglied und der neuen Rolle.

Fehler. 404 {"error": "Team member not found"}, 403 {"error": "You are not authorized to update this team member"}, 403 {"error": "Updating the role of this team member requires workspace admin permissions"}.

DELETE /teams/:id/members/:memberUserId

DELETE /api/v1/teams/:id/members/:memberUserId
Berechtigung teams_manage

Entfernt ein Mitglied. Für den Team-Inhaber sowie Workspace-Inhaber und -Admins. Um einen owner zu entfernen, müssen Sie Workspace-Inhaber oder -Admin sein. Sich selbst können Sie nicht entfernen.

Pfadparameter
id integer in path erforderlich
Team-ID.
memberUserId integer in path erforderlich
Die Benutzer-ID des Mitglieds.

Antwort. 204.

Fehler. 403 {"error": "You cannot remove yourself from a team"}, 403 {"error": "You are not authorized to remove this team member"}, 404 Team member not found, 403 {"error": "Removing an owner requires workspace admin permissions"}.