Zum Hauptinhalt springen

Wie Termine, Aufnahmen und Zusammenfassungen zusammenhängen

Wenn du nur eine Grundlagen-Seite liest, dann diese. Termine, Aufnahmen und Zusammenfassungen sehen austauschbar aus, sind aber unterschiedlich geschnitten, und genau an diesem Unterschied gehen die meisten Anbindungen schief.

Diese Seite zeigt, wie jede der drei geschnitten ist, welcher Schlüssel sie eindeutig macht, wie die Antworten aussehen, und eine kopierbare Import-Schleife, die jede Zusammenfassung genau einmal speichert. Jedes Beispiel funktioniert so, wie es dasteht, sobald SALLY_TOKEN und DIRECTORY_ID gesetzt sind, siehe Schnellstart.

Schnellnavigation

  1. Einen Termin gibt es je Person
  2. Eine Aufnahme gibt es einmal
  3. Eine Zusammenfassung gibt es je Sprache
  4. Was das in der Praxis heißt
  5. Zusammenfassungen ohne Dubletten importieren
  6. Alle Entitäten im Überblick

1. Einen Termin gibt es je Person​

Jeder Teilnehmer desselben echten Meetings hat seinen eigenen Termin-Datensatz. Ein Meeting mit sechs Personen kann innerhalb eines Unternehmenskontos also bis zu sechsmal auftauchen, mit gleichem Betreff und gleicher Zeit.

Ein Termin trägt keine recordingId. Das hier ist ein Eintrag aus GET …/appointments, gekürzt auf die Felder, um die es hier geht:

200 OK
{
"appointmentId": "d4398f97-cd92-4d21-a6ec-4aab0a85441b",
"subject": "Quartalsplanung",
"startTime": "2026-09-24T09:30:00Z",
"endTime": "2026-09-24T10:00:00Z",
"icalId": "e32cc9bd-3639-442b-a946-3e99bc12da69",
"attendees": [
{
"name": "Anna Berger",
"email": "anna.berger@example.com",
"invitationStatus": "organizer",
"attendanceStatus": "attended",
"isRequired": true
}
]
}
Wichtig

Betreff plus Zeit ist keine Identität. Wer Termine zählt, zählt keine Meetings, und wer nach Betreff gruppiert, wirft zusammen, was nicht zusammengehört. Auch die icalId ist keine Identität: Sie ist innerhalb eines Unternehmenskontos nicht eindeutig, weil es je synchronisiertem Kalender eine Kopie gibt. Wenn du das Meeting brauchst, geh über die Aufnahme.

2. Eine Aufnahme gibt es einmal​

Je aufgezeichnetem Meeting gibt es innerhalb eines Unternehmenskontos genau eine Aufnahme, egal wie viele Personen dabei waren. Damit ist die Aufnahme der stabile Anker: Sie speicherst du, auf ihr entdoppelst du, über sie verknüpfst du.

curl "https://api.sally.io/v1.0/directories/$DIRECTORY_ID/recordings/$RECORDING_ID" \
-H "Authorization: Bearer $SALLY_TOKEN"
200 OK
{
"recordingId": "53e2e041-4b34-41c7-a285-634d80b3675d",
"name": "Wöchentliches Teammeeting",
"durationInSeconds": 1843,
"isManualUpload": false,
"isTranscriptionSucceeded": true,
"isTranscriptionCompleted": true,
"transcriptionCompletionReason": "succeeded",
"languageCode": "de-DE",
"createdOn": "2026-09-24T09:30:00Z",
"tags": [
{
"tagId": "18063a7e-a82b-4972-a850-f866b8b4a046",
"name": "Kunde",
"colorCode": "indigo"
}
]
}

3. Eine Zusammenfassung gibt es je Sprache​

Eine Zusammenfassung gehört zu genau einer Aufnahme, und eine Aufnahme kann mehrere Zusammenfassungen haben, je Sprache eine. Eindeutig ist eine Zusammenfassung erst über Aufnahme und languageCode. Wenn du eine bestimmte willst, nutze beides.

Alle Zusammenfassungen einer Aufnahme kommen aus einem Aufruf:

curl "https://api.sally.io/v1.0/directories/$DIRECTORY_ID/recordings/$RECORDING_ID/summaries" \
-H "Authorization: Bearer $SALLY_TOKEN"

Die Antwort ist ein einfaches Array mit einem Eintrag je Sprache. Beide Einträge teilen sich die recordingId:

200 OK
[
{
"recordingSummaryId": "731180f9-257a-46cf-a7e3-8ca508fb9c35",
"recordingId": "53e2e041-4b34-41c7-a285-634d80b3675d",
"appointmentId": "d4398f97-cd92-4d21-a6ec-4aab0a85441b",
"languageCode": "de-DE",
"summary": "Wir haben den Rollout-Plan für Oktober beschlossen.",
"isSummarizationCompleted": true,
"isSummarizationSucceeded": true,
"summarizationCompletionReason": "succeeded",
"createdOn": "2026-09-24T09:30:00Z",
"sectionItems": null
},
{
"recordingSummaryId": "0f5d2a51-6c1e-4b8e-9d7a-2e4c3b1a9f60",
"recordingId": "53e2e041-4b34-41c7-a285-634d80b3675d",
"appointmentId": "d4398f97-cd92-4d21-a6ec-4aab0a85441b",
"languageCode": "en-US",
"summary": "We agreed on the rollout plan for October.",
"isSummarizationCompleted": true,
"isSummarizationSucceeded": true,
"summarizationCompletionReason": "succeeded",
"createdOn": "2026-09-24T09:30:00Z",
"sectionItems": null
}
]
FeldBedeutung
recordingSummaryIdId dieser einen Zusammenfassung, für GET …/summaries/{recordingSummaryId}.
recordingIdDie Aufnahme, aus der die Zusammenfassung erzeugt wurde. Dein Schlüssel zum Verknüpfen.
languageCodeSprache der Zusammenfassung als IETF-Tag, etwa de-DE oder en-US.
appointmentIdDein eigener Termin, der mit der Aufnahme verknüpft ist, oder null, wenn es keinen gibt.
sectionItemsHier null. Mit ?includeDetails=true kommen die strukturierten Abschnittseinträge mit.

4. Was das in der Praxis heißt​

EntitätGibt esEindeutiger Schlüssel
TerminEinmal je TeilnehmerappointmentId
AufnahmeEinmal je aufgezeichnetem Meeting im UnternehmenskontorecordingId
ZusammenfassungEinmal je Aufnahme und SpracherecordingId + languageCode, oder recordingSummaryId
  • Speichere die recordingId als Fremdschlüssel, nicht den Termin.
  • Wenn du einem Nutzer ein Meeting zeigst, nimm den Termin dieses Nutzers, denn er trägt dessen Sicht auf das Meeting.
  • Wenn du Zusammenfassungen importierst, lauf über Aufnahmen und wähle die gewünschte Sprache, statt über Termine zu laufen und dasselbe Meeting mehrfach zu importieren.
VorgehenSechs Kollegen, Zusammenfassungen auf Deutsch und EnglischErgebnis
Schlüssel ist der Termin6 TermineSechs Einträge für ein Meeting
Schlüssel ist die Aufnahme1 AufnahmeEin Eintrag je Meeting
Schlüssel ist Aufnahme plus Sprache2 ZusammenfassungenEin Eintrag je Meeting und Sprache
Beispiel

Sechs Kollegen sitzen im selben Wochenmeeting. Im Unternehmenskonto liegen sechs Termine, eine Aufnahme und, wenn es Zusammenfassungen auf Deutsch und Englisch gibt, zwei Zusammenfassungen. Ein Import, der auf den Termin schlüsselt, legt für ein Meeting sechs Einträge an.

5. Zusammenfassungen ohne Dubletten importieren​

Diese Schleife läuft über die Aufnahmen, holt zu jeder die Zusammenfassungen und speichert die deutsche unter dem Schlüssel recordingId + languageCode. Läuft sie zweimal, aktualisiert sie dieselben Einträge, statt neue anzulegen. Wie das Blättern funktioniert, steht unter Paginierung und Suche.

# Deutsche Zusammenfassung einer Aufnahme, Schlüssel ist recordingId + languageCode
curl -s "https://api.sally.io/v1.0/directories/$DIRECTORY_ID/recordings/$RECORDING_ID/summaries" \
-H "Authorization: Bearer $SALLY_TOKEN" \
| jq '.[] | select(.languageCode == "de-DE") | {key: "\(.recordingId):\(.languageCode)", summary}'
Empfehlung

Prüf isSummarizationSucceeded, bevor du eine Zusammenfassung speicherst. Ein Lauf über eine Aufnahme ohne Transkript wird auch fertig, dann steht summarizationCompletionReason auf noTranscript. Das ist ein erwartetes Ergebnis, kein Fehler.

6. Alle Entitäten im Überblick​

Die meisten Ressourcen liegen unter einem Unternehmenskonto: /v1.0/directories/{directoryId}/….

EntitätWas sie ist
DirectoryEin Sally-Unternehmenskonto und die oberste Ebene. Jede andere Ressource gehört zu genau einem Directory.
User / MembershipEine Person und die Verbindung eines Nutzers mit einem Unternehmenskonto, samt Rolle und Lizenz.
Role / LicenseNachschlagelisten, auf die eine Mitgliedschaft verweist.
TeamEine benannte Gruppe von Nutzern in einem Unternehmenskonto.
AppointmentEin Kalendertermin mit seinen Teilnehmern, einmal je Nutzer gespeichert.
RecordingEine Audio- oder Videoaufnahme eines Meetings samt Transkript.
Recording summaryDie KI-Zusammenfassung einer Aufnahme, eine je Sprache, aufgebaut aus Abschnittseinträgen.
Meeting templateLegt die Abschnitte fest, in die eine Zusammenfassung gegliedert wird (nur lesend).
Folder / TagOrdnen Aufnahmen in einem Baum und kennzeichnen Termine und Aufnahmen.
TaskEine Aufgabe, oft aus einem Meeting abgeleitet.
VocabularyBegriffe, die die Transkription verbessern.
WebhookEin ausgehendes Abonnement, das Ereignisse an deine URL schickt.
FileEin binärer Inhalt wie ein Profilbild, per Id abrufbar.

Die Endpunkte für die drei Entitäten dieser Seite: