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 }.
| Methode | Pfad | Beschreibung |
|---|---|---|
GET | /v1/team-chat/channels | Eigene Chats, zuletzt aktive zuerst, mit Ungelesen-Zahl, letzter Nachricht und bei Direktchats der anderen Person (peer). Cursor-basiert. |
POST | /v1/team-chat/channels | Gruppe anlegen: { name, member_ids[] }. Höchstens 200 Mitglieder. |
POST | /v1/team-chat/direct | Direktchat mit einer Person holen oder anlegen: { user_id }. Pro Paar gibt es genau einen. |
GET | /v1/team-chat/channels/:id | Ein Chat mit allen Mitgliedern und can_manage (darf umbenennen, archivieren, Mitglieder verwalten). |
PATCH | /v1/team-chat/channels/:id | Gruppe umbenennen oder archivieren: { name?, is_archived? }. Nur Gruppen-Owner und Administratoren. |
POST | /v1/team-chat/channels/:id/members | Mitglieder hinzufügen: { user_ids[] }. Nur Personen desselben Kontos. |
DELETE | /v1/team-chat/channels/:id/members/:user_id | Mitglied entfernen oder die Gruppe selbst verlassen. |
GET | /v1/team-chat/channels/:id/messages | Verlauf, neueste zuerst, cursor-basiert (limit Standard 25, höchstens 100). |
POST | /v1/team-chat/channels/:id/messages | Nachricht senden: { content, conversation_id?, file_ids? }. |
POST | /v1/team-chat/channels/:id/read | Gelesen bis zu einer Nachricht: { message_id }. |
PATCH | /v1/team-chat/channels/:id/membership | Nur 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/:id | Eigene Nachricht bearbeiten: { content } — bis 15 Minuten nach dem Senden. |
DELETE | /v1/team-chat/messages/:id | Eigene Nachricht löschen. Ein Platzhalter bleibt, Anhänge werden entfernt. |
GET | /v1/team-chat/unread | Summe aller ungelesenen Nachrichten: { unread_count } — für Seitenleiste und App-Badge. |
GET | /v1/team-chat/files/:id | Kurzlebiger 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
- Upload anfordern: POST /api/v1/files/upload mit Dateiname, Typ und Größe — ohne conversation_id.
- Die Datei per PUT an die zurückgegebene upload_url schicken.
- 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.
- 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.
| Ereignis | Raum | Beschreibung |
|---|---|---|
team.message.new | team:<id> | Neue Nachricht, vollständig wie in der API. |
team.message.updated | team:<id> | Nachricht bearbeitet. |
team.message.removed | team:<id> | Nachricht gelöscht: { channel_id, message_id }. |
team.read | team:<id>, Nutzerraum | Jemand hat gelesen: { channel_id, user_id, message_id }. |
team.channel.updated | team:<id> | Name, Archiv oder Mitglieder geändert. Mit removed: true an die Person, die entfernt wurde. |
team.message.new | Nutzerraum | Kurzform { channel_id, message_id } für Chats, die gerade nicht offen sind — Anlass, Liste und Zähler neu zu laden. |
team.channel.updated | Nutzerraum | Auf einem anderen Gerät stumm oder laut geschaltet: { channel_id, is_muted } — Liste und Ungelesen-Zahl neu laden. |
team.channel.added | Nutzerraum | Sie 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
| Status | Code | Beschreibung |
|---|---|---|
| 403 | ERR_USER_TOKEN_REQUIRED | Aufruf mit API-Schlüssel statt Nutzertoken. |
| 403 | ERR_FEATURE_NOT_AVAILABLE | Der Tarif enthält keinen Team-Chat. |
| 403 | ERR_LITE_SEAT_RESTRICTED | Lite-Sitz versucht zu schreiben. |
| 404 | ERR_NOT_CHANNEL_MEMBER | Chat gibt es nicht, oder Sie sind kein Mitglied. |
| 400 | ERR_USER_NOT_IN_TENANT | Die Person gehört nicht zu Ihrem Konto. |
| 400 | ERR_INVALID_CONVERSATION | Das Kundengespräch gehört nicht zu Ihrem Konto. |
| 400 | ERR_INVALID_ATTACHMENT | Die Datei gibt es nicht, gehört jemand anderem, hängt schon an einer Nachricht oder wurde nie hochgeladen. |
| 400 | ERR_FILE_TOO_LARGE | Die Datei ist größer als 20 MB. |
| 400 | ERR_FILE_MIME_MISMATCH | Der Inhalt passt nicht zum angegebenen Typ; die Datei wurde entfernt. |
| 400 | ERR_INVALID_CURSOR | Der Cursor ist ungültig. |
| 409 | ERR_CHANNEL_ARCHIVED | Die Gruppe ist archiviert. |
| 409 | ERR_MESSAGE_NOT_EDITABLE | Die Nachricht ist älter als 15 Minuten oder gelöscht. |
Alle Fehler folgen dem üblichen Format { "error": …, "code": … } — siehe Fehlercodes.