SilentChat

Team-Chat-API

Mit dem Team-Chat schreiben sich Ihre Mitarbeiter direkt oder in Gruppen — mit Dateien, Erwähnungen und Bezug auf ein Kundengespräch. Das Dashboard und unsere App nutzen genau die Endpunkte auf dieser Seite. Basis-URL wie bei der übrigen API: https://api.silentchat.de/api

Zugang

  • Ab dem ersten bezahlten Tarif enthalten. Ohne Team-Chat im Tarif antwortet jeder Endpunkt mit 403 ERR_FEATURE_NOT_AVAILABLE.
  • Nur mit dem Zugangstoken eines angemeldeten Nutzers (Authorization: Bearer …). API-Schlüssel werden abgewiesen, denn der Team-Chat gehört immer einer Person.
  • Lite-Sitze dürfen lesen und ihren Lesestand setzen, aber nicht schreiben, anlegen oder verwalten.
  • Einen Chat sieht nur, wer Mitglied ist — auch Administratoren lesen keine fremden Direktnachrichten. Für alle anderen antwortet ein Chat wie ein nicht vorhandener (404).

Endpunkte

Alle Pfade relativ zur Basis-URL. Personen erscheinen in Antworten nur als { id, display_name, avatar_url }.

MethodePfadBeschreibung
GET/v1/team-chat/channelsEigene Chats, zuletzt aktive zuerst, mit Ungelesen-Zahl, letzter Nachricht und bei Direktchats der anderen Person (peer). Cursor-basiert.
POST/v1/team-chat/channelsGruppe anlegen: { name, member_ids[] }. Höchstens 200 Mitglieder.
POST/v1/team-chat/directDirektchat mit einer Person holen oder anlegen: { user_id }. Pro Paar gibt es genau einen.
GET/v1/team-chat/channels/:idEin Chat mit allen Mitgliedern und can_manage (darf umbenennen, archivieren, Mitglieder verwalten).
PATCH/v1/team-chat/channels/:idGruppe umbenennen oder archivieren: { name?, is_archived? }. Nur Gruppen-Owner und Administratoren.
POST/v1/team-chat/channels/:id/membersMitglieder hinzufügen: { user_ids[] }. Nur Personen desselben Kontos.
DELETE/v1/team-chat/channels/:id/members/:user_idMitglied entfernen oder die Gruppe selbst verlassen.
GET/v1/team-chat/channels/:id/messagesVerlauf, neueste zuerst, cursor-basiert (limit Standard 25, höchstens 100).
POST/v1/team-chat/channels/:id/messagesNachricht senden: { content, conversation_id?, file_ids? }.
POST/v1/team-chat/channels/:id/readGelesen bis zu einer Nachricht: { message_id }.
PATCH/v1/team-chat/channels/:id/membershipNur für Sie stummschalten: { is_muted }. Stumm heißt: keine Benachrichtigung für Direktnachrichten, keine Zählung in /unread — Erwähnungen melden sich weiterhin. Auch mit Lite-Sitz erlaubt.
PATCH/v1/team-chat/messages/:idEigene Nachricht bearbeiten: { content } — bis 15 Minuten nach dem Senden.
DELETE/v1/team-chat/messages/:idEigene Nachricht löschen. Ein Platzhalter bleibt, Anhänge werden entfernt.
GET/v1/team-chat/unreadSumme aller ungelesenen Nachrichten: { unread_count } — für Seitenleiste und App-Badge.
GET/v1/team-chat/files/:idKurzlebiger Link auf einen Anhang (nur für Mitglieder). Mit ?download=true immer als Download.

Blättern

Listen liefern data und pagination. Solange hasMore wahr ist, holen Sie die nächste Seite mit cursor aus der letzten Antwort. Ein manipulierter Cursor ergibt 400 ERR_INVALID_CURSOR.

GET /api/v1/team-chat/channels/:id/messages?limit=50&cursor=<token>

200 → {
  "data": [ { "id": "…", "content": "…", "created_at": "2026-09-17T09:04:00Z", … } ],
  "pagination": { "cursor": "eyJhdCI6…", "hasMore": true }
}

Nachrichten

Eine Nachricht braucht Text, Anhänge oder einen Bezug auf ein Kundengespräch — mindestens eines davon. Text ist höchstens 10.000 Zeichen lang.

POST /api/v1/team-chat/channels/:id/messages
{
  "content": "<@5f0c6b1e-3a1d-4c55-9a1e-2b7d0c1e4f10> can you take this one?",
  "conversation_id": "…",   // optional
  "file_ids": ["…"]         // optional, max. 10
}

201 → { "message": { "id": "…", "mentions": ["5f0c6b1e-…"], "attachments": [ … ], … } }
  • Erwähnungen stehen im Text als <@nutzer-id>. Gezählt werden nur Mitglieder des Chats; die Antwort nennt sie in mentions. Anzeigen sollten Sie den Namen der Person.
  • conversation_id verweist auf ein Kundengespräch Ihres Kontos; ein fremdes ergibt 400 ERR_INVALID_CONVERSATION.
  • Bearbeiten geht 15 Minuten lang, Löschen jederzeit. Gelöschte Nachrichten liefern removed_at und keinen Inhalt mehr.
  • Text wird nie als HTML ausgewertet. Zeigen Sie ihn als reinen Text an.

Anhänge

  1. Upload anfordern: POST /api/v1/files/upload mit Dateiname, Typ und Größe — ohne conversation_id.
  2. Die Datei per PUT an die zurückgegebene upload_url schicken.
  3. Beim Senden die file_ids mitgeben (höchstens 10). Erst jetzt prüfen wir den tatsächlichen Inhalt gegen den angegebenen Typ; höchstens 20 MB je Datei.
  4. Zum Anzeigen oder Herunterladen einen Link über GET /api/v1/team-chat/files/:id holen. Er gilt knapp eine Stunde (expires_at).
POST /api/v1/files/upload
{ "filename": "screenshot.png", "mime_type": "image/png", "size": 48213 }
201 → { "file": { "id": "…" }, "upload_url": "https://…" }

PUT <upload_url>            (Content-Type: image/png, body = file)

POST /api/v1/team-chat/channels/:id/messages
{ "content": "", "file_ids": ["…"] }

GET /api/v1/team-chat/files/:file_id?download=true
200 → { "file": { "url": "https://…", "expires_at": "…", "filename": "…", "mime_type": "…", "size": 48213 } }

Der allgemeine Endpunkt /api/v1/files/:id/download liefert Team-Anhänge nicht aus. Hochgeladene Dateien, die binnen 24 Stunden an keine Nachricht gehängt werden, räumen wir weg.

Echtzeit

Über die WebSocket-Verbindung des Dashboards (Nutzertoken) treten Sie dem Raum team:<id> bei — nur als Mitglied. Neue Chats und Ungelesen-Stände kommen zusätzlich über Ihren persönlichen Nutzerraum.

EreignisRaumBeschreibung
team.message.newteam:<id>Neue Nachricht, vollständig wie in der API.
team.message.updatedteam:<id>Nachricht bearbeitet.
team.message.removedteam:<id>Nachricht gelöscht: { channel_id, message_id }.
team.readteam:<id>, NutzerraumJemand hat gelesen: { channel_id, user_id, message_id }.
team.channel.updatedteam:<id>Name, Archiv oder Mitglieder geändert. Mit removed: true an die Person, die entfernt wurde.
team.message.newNutzerraumKurzform { channel_id, message_id } für Chats, die gerade nicht offen sind — Anlass, Liste und Zähler neu zu laden.
team.channel.updatedNutzerraumAuf einem anderen Gerät stumm oder laut geschaltet: { channel_id, is_muted } — Liste und Ungelesen-Zahl neu laden.
team.channel.addedNutzerraumSie wurden einem Chat hinzugefügt: { channel_id }.

Benachrichtigungen

Direktnachrichten und Erwähnungen in Gruppen lösen das Ereignis team.message aus — als Eintrag in der Glocke, als Einblendung und als Browser-Push, je nach den Einstellungen der Person (GET/PUT /api/v1/me/notification-preferences). Die Metadaten enthalten channel_id und message_id, bei Erwähnungen mention: "true".

Fehlercodes

StatusCodeBeschreibung
403ERR_USER_TOKEN_REQUIREDAufruf mit API-Schlüssel statt Nutzertoken.
403ERR_FEATURE_NOT_AVAILABLEDer Tarif enthält keinen Team-Chat.
403ERR_LITE_SEAT_RESTRICTEDLite-Sitz versucht zu schreiben.
404ERR_NOT_CHANNEL_MEMBERChat gibt es nicht, oder Sie sind kein Mitglied.
400ERR_USER_NOT_IN_TENANTDie Person gehört nicht zu Ihrem Konto.
400ERR_INVALID_CONVERSATIONDas Kundengespräch gehört nicht zu Ihrem Konto.
400ERR_INVALID_ATTACHMENTDie Datei gibt es nicht, gehört jemand anderem, hängt schon an einer Nachricht oder wurde nie hochgeladen.
400ERR_FILE_TOO_LARGEDie Datei ist größer als 20 MB.
400ERR_FILE_MIME_MISMATCHDer Inhalt passt nicht zum angegebenen Typ; die Datei wurde entfernt.
400ERR_INVALID_CURSORDer Cursor ist ungültig.
409ERR_CHANNEL_ARCHIVEDDie Gruppe ist archiviert.
409ERR_MESSAGE_NOT_EDITABLEDie Nachricht ist älter als 15 Minuten oder gelöscht.

Alle Fehler folgen dem üblichen Format { "error": …, "code": … } — siehe Fehlercodes.