Kalima REST API v1
Aufnahmen, Transkripte, KI-Zusammenfassungen, Aufgaben und Momente lesen, Audio hochladen und Aufnahmen ordnen.
Mit der Kalima REST API kann Ihre eigene Integration die Aufnahmen lesen, die Ihnen gehören, samt Transkript, KI-Zusammenfassung, Aufgaben und Momenten. Sie kann Audiodateien zur Transkription hochladen und Aufnahmen ordnen: Projekte, Namen, Sprecher, Freigabelinks und Zusammenfassungen.
Anmeldung
Es gibt zwei Wege:
- API-Schlüssel (Pro, Team und Enterprise) für eigene Skripte und Integrationen. Senden Sie den Schlüssel bei jeder Anfrage als Bearer-Token.
- OAuth (ab Plus) für die Automatisierungsplattformen, die Kalima registriert hat. Diese bitten Sie in einem Kalima-Fenster, die Verbindung zu bestätigen. Unter Einstellungen, Integrationen, Verbundene Apps können Sie eine solche Verbindung jederzeit entfernen.
Authorization: Bearer kal_xxxxxxxxxxxxxxxxxxxx
Einen Schlüssel erstellen Sie unter Einstellungen, Integrationen, API-Schlüssel. Kalima zeigt ihn nur einmal an, bewahren Sie ihn also sicher auf. Schritt für Schritt, auch für n8n und Make: Mit Zapier, n8n oder Make automatisieren.
Ein API-Schlüssel hat die Berechtigung read, write oder beide. read deckt alle Listen, Suchen, Feeds und Exporte ab. write brauchen Sie nur, wenn die Integration Audio hochlädt oder Aufnahmen und Projekte ändert. Jede Anfrage gilt für das Konto, dem der Schlüssel gehört, und sieht nur dessen eigene Aufnahmen.
Endpunkte
Basis-URL: https://meetkalima.com/api/v1
| Methode und Pfad | Zweck |
|---|---|
GET /me | Das Konto, zu dem die Anmeldung gehört |
GET /recordings | Aufnahmen seitenweise auflisten |
POST /recordings | Audio als neue Aufnahme hochladen |
GET /recordings/search | Aufnahmen über Wörter in Name oder Transkript finden |
GET /recordings/{id} | Eine Aufnahme mit Transkripttext und KI-Zusammenfassung |
PATCH /recordings/{id} | Eine Aufnahme umbenennen oder verschieben |
GET /recordings/{id}/transcript | Das Transkript als Abschnitte mit Sprecher und Startzeit |
GET /recordings/{id}/speakers | Die Sprecher einer Aufnahme |
PUT /recordings/{id}/speakers | Sprecher benennen |
POST /recordings/{id}/summary | Die KI-Zusammenfassung erstellen |
GET /recordings/{id}/export | Die Aufnahme als Datei |
POST /recordings/{id}/share-link | Den Freigabelink einschalten |
GET /summaries | Feed neuer KI-Zusammenfassungen |
GET /action-items | Feed der Aufgaben aus KI-Zusammenfassungen |
GET /moments | Feed der Momente, die beim Aufnehmen markiert wurden |
GET /projects | Projekte auflisten |
POST /projects | Ein Projekt anlegen |
GET /workspaces | Arbeitsbereiche auflisten |
/admin/... | Mitglieder, Teams und Richtlinien Ihrer Firma verwalten (Firmenschlüssel mit Verwaltungsrechten, siehe unten) |
GET /openapi.json | Der maschinenlesbare OpenAPI-Vertrag |
Jede Aufnahme trägt url, den Link, der sie in Kalima öffnet, und dazu Projekt und Arbeitsbereich, in denen sie liegt.
Aufnahmen auflisten
GET /recordings liefert standardmäßig den Feed fertiger Aufnahmen. Eine Aufnahme kommt genau einmal hinein, sobald nichts mehr in sie aufgenommen wird und sich ihr Transkript seit zwei Minuten nicht geändert hat. Ihren Platz behält sie danach, auch wenn Sie das Transkript später korrigieren. Wird später weiter in sie aufgenommen, kommt sie nicht ein zweites Mal hinein. Die neuesten Einträge stehen oben, und jeder trägt finishedAt, den Zeitpunkt, zu dem er in den Feed kam. Deshalb können Sie den Feed regelmäßig abfragen und jede id genau einmal verarbeiten, ohne ein Transkript zu erwischen, das noch wächst. Auch eine hochgeladene Datei ohne Sprache kommt hinein, mit segmentCount 0. So erfährt die Integration, die sie hochgeladen hat, dass sie fertig ist. Beim ersten Abruf reicht der Feed sieben Tage zurück.
Mit status=all erhalten Sie alle Aufnahmen in jedem Zustand, die neuesten zuerst, mit status=failed nur die Uploads, deren Transkription fehlgeschlagen ist. Jede Aufnahme hat einen status (recording, processing, failed oder ready), und updatedAt gibt an, wann sich Transkript oder Sprecher zuletzt geändert haben. Mit projectId oder workspaceId grenzen Sie jede dieser Listen ein.
Listen kommen seitenweise. Geben Sie den nextCursor einer Antwort als cursor zurück, bis er null ist. limit legt die Seitengröße fest (1 bis 100, Standard 25).
Wenn Sie nur Neues abrufen möchten, übergeben Sie die höchste sequence, die Sie kennen, als afterSequence. Jeder Eintrag im Feed trägt eine. Anders als finishedAt (das finishedAfter nimmt) bleibt sie genau, auch wenn viele Aufnahmen in derselben Millisekunde in den Feed kommen. Mit include=summary oder include=transcript,summary erhalten Sie den Inhalt direkt mit jedem Eintrag. Mit Transkript enthält eine Seite höchstens 10 Aufnahmen.
GET /recordings/search?q=budget findet Aufnahmen, in deren Name oder Transkript die Wörter vorkommen. Die beste Übereinstimmung steht oben, und jede bringt mit snippet die Stelle mit, an der die Wörter stehen. limit geht bis 25 (Standard 10), projectId oder workspaceId grenzen die Suche ein.
Eine Aufnahme lesen
GET /recordings/{id} liefert die Aufnahme mit transcriptText (Zeilen der Form Sprecher: Text) und summary. Die Zusammenfassung enthält einen Überblick, die wichtigsten Punkte, Aufgaben mit verantwortlicher Person und Termin, Entscheidungen, offene Fragen und die vollständige Zusammenfassung als Markdown. Solange für die Aufnahme keine Zusammenfassung erstellt wurde, ist summary gleich null.
Mit include=transcript, include=summary oder einem leeren include= laden Sie weniger. Ein Transkript mit mehr als 500.000 Zeichen wird an dieser Stelle abgeschnitten, transcriptTruncated ist dann true. Das vollständige Transkript in Abschnitten liefert GET /recordings/{id}/transcript.
GET /recordings/{id}/export?format=srt liefert die Aufnahme als Datei. Es ist dieselbe Datei, die der Export-Dialog in Kalima herunterlädt, und ihr Name steht im Header Content-Disposition. Als format gibt es txt, md, srt, vtt, json und summary-md. Hat die Aufnahme eine Übersetzung, exportiert track=translation bei md, srt und vtt die Übersetzung.
Feeds
Drei weitere Feeds funktionieren wie der Feed fertiger Aufnahmen. Die neuesten Einträge stehen oben und jeder kommt nur einmal. Mit cursor blättern Sie zurück, mit createdAfter holen Sie nur, was nach einem bestimmten Zeitpunkt hinzukam. Bei Zusammenfassungen und Aufgaben geht das mit afterSequence auch exakt. limit geht bis 50 (Standard 25), und projectId oder workspaceId grenzen jeden Feed ein.
GET /summariesenthält einen Eintrag, sobald eine Aufnahme ihre KI-Zusammenfassung bekommt, und einen weiteren, wenn die Zusammenfassung neu erstellt oder bearbeitet wird. Jeder Eintrag enthält die vollständige Zusammenfassung und eineversion: 1 für die erste Zusammenfassung einer Aufnahme, danach 2, 3 und so weiter. Umbenennen oder Verschieben bringt eine Zusammenfassung nicht erneut in den Feed. Er enthält die Zusammenfassungen der letzten sieben Tage.GET /action-itemsenthält jede Aufgabe aus diesen Zusammenfassungen einzeln, mitownerunddue, wenn die Zusammenfassung sie nennt. Wird eine Zusammenfassung neu erstellt und die Aufgabe bleibt, behält sie ihreid. So kommt sie nicht doppelt an. Hier zähltlimitdie Zusammenfassungen, nicht die Aufgaben.GET /momentsenthält die Momente, die beim Aufnehmen markiert wurden, mit KI-Titel und Position in der Aufnahme. Ein Moment wartet bis zu fünf Minuten auf seinen Titel, bevor er erscheint. Wann das war, steht inlistedAt, undcreatedAftervergleicht mit diesem Wert.
Aufnahmen ordnen
Dafür ist die Berechtigung write nötig.
- Umbenennen oder verschieben:
PATCH /recordings/{id}mitnameund wahlweiseprojectIdoderworkspaceId, nicht mit beiden. Beim Verschieben in ein Projekt kommt die Aufnahme wie in der App auch in den Arbeitsbereich des Projekts. Dafür brauchen Sie dort Bearbeitungsrechte, sonst lautet die AntwortPROJECT_ROLE_REQUIRED. MitprojectId: nullnehmen Sie sie aus ihrem Projekt heraus. Wird das Verschieben abgelehnt, ändert sich nichts, auch nicht der Name. - Sprecher benennen:
PUT /recordings/{id}/speakersmit{ "names": { "Speaker 1": "Anna Weber" } }. Jeder Schlüssel ist ein Sprecher, so wie das Transkript ihn zeigt, ein bereits vergebener Name oder ein Schlüssel ausGET /recordings/{id}/speakers. Ein leerer Name entfernt den Namen. Passt ein Schlüssel zu keinem Sprecher, wird die Anfrage mitSPEAKER_NOT_FOUNDabgelehnt. - Zusammenfassung erstellen:
POST /recordings/{id}/summaryantwortet mit der Zusammenfassung, wenn es eine gibt. Andernfalls kommt202mitstatus: "queued"zurück, und die Zusammenfassung erscheint nach ein bis zwei Minuten inGET /summariesund an der Aufnahme. Das verbraucht wie der Button „Zusammenfassung erstellen“ eine KI-Zusammenfassung aus Ihrem Tarif. Sind die Zusammenfassungen Ihres Tarifs aufgebraucht, kommtQUOTA_EXCEEDEDzurück und nichts wird eingereiht. Wird gerade noch eine Datei in die Aufnahme transkribiert, kommtRECORDING_NOT_READY. - Freigeben:
POST /recordings/{id}/share-linkschaltet den Freigabelink der Aufnahme ein und gibt ihn zurück. Jede Aufnahme hat einen Link, ein erneuter Aufruf liefert also denselben. Ein neuer Link öffnet sich für alle, die bei Kalima angemeldet sind und den Link haben. Die Freigaberegeln Ihrer Organisation gelten, und weiter oder enger stellen Sie den Zugriff in der App ein. - Projekte:
GET /projectslistet die Projekte, die Ihnen gehören oder mit Ihnen geteilt sind, die neuesten zuerst. Mitnamefinden Sie Namen, die den Text enthalten, ohne Rücksicht auf Groß- und Kleinschreibung oder Akzente, mit zusätzlichexact=truenur genau diesen Namen.editable=truezeigt nur Projekte, in die Sie Aufnahmen ablegen dürfen. Jedes Projekt trägt dazucanEdit.POST /projectslegt ein Projekt mitnamean, optional mitdescription,workspaceIdundparentProjectId(eine Ebene tief). Die Projektgrenze Ihres Tarifs gilt (PLAN_LIMIT_REACHED).GET /workspaceslistet Ihre Arbeitsbereiche.
Audio hochladen
Senden Sie multipart/form-data mit einem Feld file. Diese Felder können Sie zusätzlich mitsenden:
| Feld | Bedeutung |
|---|---|
name | Name der Aufnahme, sonst der Dateiname |
durationMs | Ein Hinweis auf die Dauer |
projectId | In dieses Projekt ablegen (Bearbeitungsrechte nötig). Der Transkriptionskontext des Projekts gilt, wenn Sie weder context noch terms senden |
workspaceId | Oder in diesen Arbeitsbereich ablegen, ohne Projekt |
languages | Bis zu drei gesprochene Sprachen als ISO-Codes, zum Beispiel de,en |
translateTo | Ein Sprachcode, in den zusätzlich übersetzt wird |
context | Worum es im Gespräch geht, bis zu 10.000 Zeichen |
terms | Namen und Begriffe, die erkannt werden sollen, getrennt durch Kommas oder Zeilenumbrüche |
curl -X POST "https://meetkalima.com/api/v1/recordings" \
-H "Authorization: Bearer kal_xxx" \
-F "file=@meeting.mp3" \
-F "name=Weekly sync" \
-F "languages=de,en"
Die Antwort (202) enthält die id der neuen Aufnahme mit dem Status processing. Fragen Sie GET /recordings/{id}?include= ab, bis der Status ready oder failed ist. Die transkribierte Dauer wird vom Transkriptionsguthaben des Kontos abgezogen.
Firma verwalten (Admin-API)
Für Firmen, die kein SCIM nutzen: Ein API-Schlüssel der Firma mit Verwaltungsrechten verwaltet Mitglieder, Teams und Richtlinien Ihrer Firma. Ein Inhaber oder Administrator erstellt ihn in der Kalima Console unter Integrationen & API, Schlüssel erstellen, im Abschnitt Verwaltung der Firma. Dort bekommt jeder Bereich keinen Zugriff, Lesen oder Lesen und ändern. Siehe Integrationen und Webhooks.
| Berechtigung | Endpunkte |
|---|---|
admin:members:read | GET /admin/members, GET /admin/members/{userId} |
admin:members:write | PATCH /admin/members/{userId}, POST /admin/invitations |
admin:teams:read | GET /admin/teams, GET /admin/teams/{teamId} |
admin:teams:write | POST /admin/teams, PATCH /admin/teams/{teamId}, POST /admin/teams/{teamId}/members, PATCH und DELETE /admin/teams/{teamId}/members/{userId} |
admin:policies:read | GET /admin/policies |
admin:policies:write | PATCH /admin/policies |
Der Schlüssel handelt als die Person, die ihn erstellt hat, mit ihrer Rolle. Sobald sie nicht mehr aktiver Inhaber oder Administrator ist, lehnen diese Pfade ihn ab (ADMIN_ROLE_REQUIRED). Es gelten dieselben Regeln wie in der Console: die Zahl der Plätze, einen Inhaber ändert nur ein Inhaber, mindestens ein aktiver Inhaber bleibt, und solange Ihr Identitätsanbieter Personen und Teams über SCIM verwaltet, sperrt er diese Personen und schaltet sie wieder frei und bestimmt, wer in diesen Teams ist und wie sie heißen (SCIM_MANAGED). Rollen und Teamleitung bleiben bei Kalima. Eine Ablehnung nennt den Grund aus der Console als code, zum Beispiel SEAT_CAP_REACHED, OWNER_PROTECTED oder LAST_OWNER. Jede Änderung steht im Audit-Log Ihrer Firma unter „API-Schlüssel“ und dem Namen des Schlüssels. Aufnahmen, Transkripte sowie Aktivität oder Nutzung einzelner Personen geben diese Pfade nie heraus. OAuth-Tokens (API_KEY_REQUIRED) und Schlüssel privater Konten (COMPANY_KEY_REQUIRED) werden abgelehnt.
- Mitglieder:
GET /admin/memberslistet aktive und gesperrte Mitglieder auf, Inhaber zuerst.statusundemailgrenzen die Liste ein, geblättert wird wie bei den anderen Listen mitcursor(limit1 bis 500, Standard 100).PATCH /admin/members/{userId}ändert pro Anfrage eine Sache:{ "role": "member" }(admin,memberoderviewer) oder{ "status": "suspended" }(oderactive). Die Inhaberschaft wechselt nur durch eine Übergabe, die die neue Person annimmt, begonnen in den Einstellungen der Console oder in der App. Wer gesperrt wird, behält jede Aufnahme dort, wo sie ist. - Einladen:
POST /admin/invitationsmitemail,roleund optionalteamId. Die Person bekommt die übliche Einladungsmail. Darin steht als einladende Person, wer den Schlüssel erstellt hat. - Teams:
POST /admin/teamsmitnameund optionaldescription,PATCH /admin/teams/{teamId}benennt es um.POST /admin/teams/{teamId}/membersmit{ "userId": "...", "role": "lead" }nimmt ein aktives Mitglied auf,PATCH /admin/teams/{teamId}/members/{userId}mit{ "role": "member" }ändert die Teamleitung, undDELETEnimmt die Person aus dem Team. Ein Team löschen Sie weiterhin in der Console. - Richtlinien:
GET /admin/policiesliefert die Abschnitte der Seite Richtlinien in der Console (data,ai,sharing,members,recording,projectSharing).PATCHnimmt dieselben Abschnitte und legt jeden über den gespeicherten Stand. Eine Einstellung, die Sie weglassen, bleibt also unverändert. Die Löschregeln ändern Sie nur in der Console, denn dort ist dafür ein zweiter Faktor nötig: Das automatische Löschen von Aufnahmen und Audio gehört nicht zum Body, und einPATCH, der Zero Data Retention ein- oder ausschalten würde, wird mitCONSOLE_ONLYabgelehnt.
Das Anfragekontingent ist dasselbe wie für alle anderen Aufrufe. Lässt Ihre Firma Kalima nur aus bestimmten Netzwerken zu, ob nur für die Console oder für alles, antworten diese Pfade von überall sonst mit NETWORK_NOT_ALLOWED. Siehe Erlaubte Netzwerke.
Bei einem Firmenkonto gelten die Regeln der Firma auch für gewöhnliche API-Schlüssel: Ist Zapier und die öffentliche API oder API-Schlüssel unter Richtlinien in der Console ausgeschaltet, werden Anfragen mit Schlüsseln von Konten dieser Firma mit 403 und ORG_POLICY_BLOCKED abgewiesen. Siehe Richtlinien.
Fehler und Grenzen
Jeder Fehler hat dieselbe Form:
{ "error": { "code": "RECORDING_NOT_FOUND", "message": "Recording not found" } }
| Status | Bedeutung |
|---|---|
400 | Ungültiger Parameter oder nicht unterstützte Audiodatei |
401 | Fehlende, ungültige oder abgelaufene Anmeldedaten oder eine entfernte Verbindung |
402 | Kein Transkriptionsguthaben mehr für einen Upload |
403 | Fehlende Berechtigung, ein Tarif ohne Zugang, eine erreichte Tarifgrenze (QUOTA_EXCEEDED, PLAN_LIMIT_REACHED), fehlende Bearbeitungsrechte in einem Projekt (PROJECT_ROLE_REQUIRED) oder eine Anfrage aus einem Netzwerk, das Ihre Firma nicht zulässt (NETWORK_NOT_ALLOWED) |
404 | Keine solche Aufnahme, kein solches Projekt oder kein solcher Arbeitsbereich für dieses Konto |
409 | Gerade nicht möglich, zum Beispiel eine Zusammenfassung für eine Aufnahme, die noch transkribiert wird |
413 | Die Datei ist zu groß |
429 | Anfragekontingent des API-Schlüssels oder OAuth-Ratenlimit erreicht, später erneut versuchen |
503 | Kurz nicht verfügbar. Versuchen Sie es gleich noch einmal. |
Widerrufen Sie einen Schlüssel sofort, wenn er in falsche Hände geraten sein könnte.