Zum Hauptinhalt springen

Wie du Aufnahmen mit Ordnern und Tags organisierst

Ordner und Tags sorgen dafür, dass eine wachsende Zahl von Aufnahmen auffindbar bleibt, und über Ordner entscheidest du, wer was sieht. Diese Anleitung zeigt, wie du Ordner findest, Aufnahmen einsortierst, Ordner für Nutzer und Teams freigibst und Aufnahmen und Termine mit Tags kennzeichnest. Am Ende steht ein komplettes Skript.

Jedes Beispiel funktioniert so, wie es dasteht, sobald SALLY_TOKEN und DIRECTORY_ID gesetzt sind, siehe Schnellstart. Wähl deine Sprache einmal, alle Beispiele im API-Bereich folgen ihr.

Schnellnavigation

  1. Ordner finden
  2. Aufnahmen hinzufügen und entfernen
  3. Aufnahmen eines Ordners auflisten
  4. Ordner umbenennen oder verschieben
  5. Ordner freigeben
  6. Tags
  7. Komplettes Skript
  8. Endpunkte im Überblick

1. Ordner finden​

Ordner bilden einen Baum: Ein Ordner kann einen übergeordneten Ordner haben (parentFolderId), und eine Aufnahme lässt sich einem Ordner hinzufügen und wieder daraus entfernen. GET/v1.0/directories/{directoryId}/folders liefert deine persönlichen, geteilten und Team-Ordner in einer geblätterten Liste.

ParameterTypStandardBeschreibung
searchstringTeilstring-Suche im Ordnernamen, ohne Beachtung der Groß- und Kleinschreibung.
parentRecordingFolderIdstringNur die direkten Unterordner dieses Ordners. Weglassen für alle Ordner.
pageinteger1Seitennummer, beginnend bei 1.
pageSizeinteger25Einträge je Seite, höchstens 100.

Diese Anfrage sucht Ordner, deren Name „sales" enthält:

curl "https://api.sally.io/v1.0/directories/$DIRECTORY_ID/folders?search=sales" \
-H "Authorization: Bearer $SALLY_TOKEN"
200 OK
{
"page": 1,
"pageSize": 25,
"total": 1,
"hasMore": false,
"items": [
{
"folderId": "f0186448-90aa-4df8-a13d-17a832c35c28",
"name": "Sales calls",
"description": "Kundengespräche des Vertriebsteams",
"ownerUserId": "eece96ba-87a6-4f16-a07d-a7720d671312",
"parentFolderId": null,
"isOwner": true,
"isFavorite": false,
"accessLevel": "readWrite",
"recordingsCount": 3,
"createdOn": "2026-09-24T09:30:00Z",
"modifiedOn": "2026-09-24T09:30:00Z"
}
]
}
FeldTypBedeutung
folderIdstringId des Ordners.
namestringAnzeigename des Ordners.
descriptionstring oder nullBeschreibung, null, wenn nicht gesetzt.
ownerUserIdstringId der Person, der der Ordner gehört.
parentFolderIdstring oder nullId des übergeordneten Ordners, null bei einem Ordner auf oberster Ebene.
isOwnerbooleantrue, wenn dir der Ordner gehört.
isFavoritebooleantrue, wenn du den Ordner als Favorit markiert hast.
accessLevelstringDein tatsächlicher Zugriff: none, read oder readWrite.
recordingsCountnumberAnzahl der Aufnahmen im Ordner.
createdOnstringZeitpunkt der Erstellung (ISO 8601).
modifiedOnstringZeitpunkt der letzten Änderung (ISO 8601).
Hinweis

POST/v1.0/directories/{directoryId}/folders/search nimmt dieselben Filter (search, parentRecordingFolderId, page, pageSize) im Request-Body, siehe Such-Endpunkte.

2. Aufnahmen hinzufügen und entfernen​

PUT/v1.0/directories/{directoryId}/folders/{folderId}/recordings/{recordingId} legt eine Aufnahme in einen Ordner, DELETE/v1.0/directories/{directoryId}/folders/{folderId}/recordings/{recordingId} nimmt sie wieder heraus. Beide brauchen Schreibzugriff auf den Ordner und antworten mit 204 ohne Body. Das Hinzufügen ist idempotent, ein doppelter Aufruf schadet also nicht. Gibt es die Aufnahme im Unternehmenskonto nicht, bekommst du 404.

# Hinzufügen
curl -X PUT "https://api.sally.io/v1.0/directories/$DIRECTORY_ID/folders/$FOLDER_ID/recordings/$RECORDING_ID" \
-H "Authorization: Bearer $SALLY_TOKEN"

# Entfernen
curl -X DELETE "https://api.sally.io/v1.0/directories/$DIRECTORY_ID/folders/$FOLDER_ID/recordings/$RECORDING_ID" \
-H "Authorization: Bearer $SALLY_TOKEN"

3. Aufnahmen eines Ordners auflisten​

GET/v1.0/directories/{directoryId}/folders/{folderId}/recordings liefert die Aufnahmen eines Ordners, die neueste zuerst. Mit includeSubfolders=true kommen auch die Aufnahmen aller zugänglichen Unterordner dazu, ohne Duplikate.

ParameterTypStandardBeschreibung
includeSubfoldersbooleanfalsetrue schließt die Aufnahmen aller verschachtelten Unterordner ein.
pageinteger1Seitennummer, beginnend bei 1.
pageSizeinteger25Einträge je Seite, höchstens 100.
curl "https://api.sally.io/v1.0/directories/$DIRECTORY_ID/folders/$FOLDER_ID/recordings?includeSubfolders=true&pageSize=100" \
-H "Authorization: Bearer $SALLY_TOKEN"
200 OK
{
"page": 1,
"pageSize": 100,
"total": 3,
"hasMore": false,
"items": [
{
"recordingId": "53e2e041-4b34-41c7-a285-634d80b3675d",
"durationInSeconds": 1843,
"isManualUpload": false,
"appointmentId": "d4398f97-cd92-4d21-a6ec-4aab0a85441b",
"createdOn": "2026-09-24T09:30:00Z"
}
]
}
FeldTypBedeutung
recordingIdstringId der Aufnahme. Details holst du mit GET …/recordings/{recordingId}.
durationInSecondsnumber oder nullDauer in Sekunden, null, wenn unbekannt.
isManualUploadbooleantrue, wenn die Aufnahme manuell hochgeladen wurde (ohne Meeting-Bot).
appointmentIdstring oder nullDein eigener Termin zur Aufnahme, null, wenn es keinen gibt.
createdOnstringZeitpunkt der Erstellung (ISO 8601, UTC).

4. Ordner umbenennen oder verschieben​

PATCH/v1.0/directories/{directoryId}/folders/{folderId} ändert Namen, Beschreibung oder die Position eines Ordners im Baum. Geändert werden nur die Felder, die du mitschickst, die Freigaben bleiben unberührt. Du brauchst Schreibzugriff auf den Ordner.

FeldTypBeschreibung
namestringNeuer Ordnername.
descriptionstring oder nullNeue Beschreibung. null leert sie.
parentFolderIdstring oder nullVerschiebt den Ordner unter diesen übergeordneten Ordner. null macht ihn zu einem Ordner auf oberster Ebene.
curl -X PATCH "https://api.sally.io/v1.0/directories/$DIRECTORY_ID/folders/$FOLDER_ID" \
-H "Authorization: Bearer $SALLY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"parentFolderId": "bf7cd0f0-3c69-4690-a956-9c30b123ab30"}'

Die Antwort ist der geänderte Ordner, in derselben Form wie die Einträge unter Ordner finden.

5. Ordner freigeben​

Freigegeben wird auf Ordnerebene, an einzelne Nutzer oder an ganze Teams. Das ist der praktische Weg, einer Abteilung eine Reihe von Meetings zu öffnen, ohne jede Aufnahme einzeln anzufassen. PUT/v1.0/directories/{directoryId}/folders/{folderId}/shares setzt die Freigaben und ersetzt dabei die komplette Liste. Nur der Owner des Ordners darf Freigaben ändern.

FeldTypBeschreibung
userSharesarrayPflicht. Direkte Freigaben an Nutzer, jeweils {"userId": "…", "accessLevel": "…"}.
teamSharesarrayPflicht. Freigaben an Teams, jeweils {"teamId": "…", "accessLevel": "…"}.

accessLevel ist none, read oder readWrite. Um eine Freigabe hinzuzufügen, ohne die anderen zu verlieren, lies zuerst die aktuellen Freigaben mit GET/v1.0/directories/{directoryId}/folders/{folderId}/shares, ergänz deine und schick beide Listen zurück.

Diese Anfrage gibt einem Team Lesezugriff und einer Person Schreibzugriff:

curl -X PUT "https://api.sally.io/v1.0/directories/$DIRECTORY_ID/folders/$FOLDER_ID/shares" \
-H "Authorization: Bearer $SALLY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"userShares": [
{"userId": "11f967df-7dd1-4719-a9aa-46530940c443", "accessLevel": "readWrite"}
],
"teamShares": [
{"teamId": "3c35d421-a578-4ce7-aebb-c5add21907bd", "accessLevel": "read"}
]
}'

Die Antwort enthält die resultierenden Freigaben und dazu die Freigaben, die der Ordner von übergeordneten Ordnern erbt:

200 OK
{
"userShares": [
{"userId": "11f967df-7dd1-4719-a9aa-46530940c443", "accessLevel": "readWrite"}
],
"teamShares": [
{"teamId": "3c35d421-a578-4ce7-aebb-c5add21907bd", "accessLevel": "read"}
],
"inheritedShares": [
{
"userId": "11f967df-7dd1-4719-a9aa-46530940c443",
"accessLevel": "read",
"inheritedFromFolderId": "a1ae243c-6bc2-4da4-a5d7-d70c50ba1acc"
}
]
}
Hinweis

inheritedShares stammen aus übergeordneten Ordnern und sind nur lesbar, hier kannst du sie nicht setzen. Freigaben enthalten nur Ids. Nutzer löst du über die Mitgliedschafts-Endpunkte auf, Teams über die Team-Endpunkte.

6. Tags​

Tags sind Etiketten an Terminen und Aufnahmen. Sie werden einmal je Unternehmenskonto im Tag-Katalog angelegt, tragen eine Farbe aus einer festen Palette (zum Beispiel blue oder green) und werden danach per Id zugewiesen. Den Katalog verwalten Admins und Owner.

GET/v1.0/directories/{directoryId}/tags liefert alle aktiven Tags des Katalogs, die meistgenutzten zuerst:

200 OK
{
"items": [
{"tagId": "18063a7e-a82b-4972-a850-f866b8b4a046", "name": "Kunde", "colorCode": "indigo"}
]
}

POST/v1.0/directories/{directoryId}/tags legt einen Tag im Katalog an. Namen werden ohne Beachtung der Groß- und Kleinschreibung dedupliziert.

FeldTypBeschreibung
namestringPflicht. Anzeigename, höchstens 100 Zeichen.
colorCodestring oder nullEin Farbname aus der Palette, kein Hex-Wert: indigo, purple, fuchsia, pink, rose, red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, slate, gray, zinc, stone oder neutral. Ein unbekannter Schlüssel erscheint in der neutralen Standardfarbe. GET/v1.0/directories/{directoryId}/tags/colors listet die Palette.

PUT/v1.0/directories/{directoryId}/recordings/{recordingId}/tags und PUT/v1.0/directories/{directoryId}/appointments/{appointmentId}/tags weisen Tags mit einem Body aus tagIds zu:

# Tag anlegen (Admin oder Owner)
curl -X POST "https://api.sally.io/v1.0/directories/$DIRECTORY_ID/tags" \
-H "Authorization: Bearer $SALLY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Kunde", "colorCode": "indigo"}'

# Einer Aufnahme zuweisen
curl -X PUT "https://api.sally.io/v1.0/directories/$DIRECTORY_ID/recordings/$RECORDING_ID/tags" \
-H "Authorization: Bearer $SALLY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tagIds": ["18063a7e-a82b-4972-a850-f866b8b4a046"]}'

Die Zuweisung antwortet mit den Tags als Array:

200 OK
[
{"tagId": "18063a7e-a82b-4972-a850-f866b8b4a046", "name": "Kunde", "colorCode": "indigo"}
]
Wichtig

Beim Zuweisen wird die komplette Tag-Liste ersetzt, und es werden nur Ids vorhandener Tags angenommen. Leg einen fehlenden Tag also zuerst an und weise ihn dann zu. Eine Aufnahme oder ein Termin kann bis zu 20 eigene Tags tragen.

Eine Aufnahme kann außerdem Tags von ihren verknüpften Terminen und deren Serien erben. Diese bleiben dynamisch, der Aufruf an der Aufnahme setzt nur ihre direkten Tags. Serien-Tags liegen am Serienmaster und werden nicht an einem einzelnen Termin gesetzt. Das Feld tags einer Aufnahme listet ihre wirksamen Tags, eigene und geerbte. Bau die Liste, die du zuweist, deshalb aus deinen eigenen Daten, statt dieses Feld zu kopieren.

7. Komplettes Skript​

Dieses Skript sortiert eine Aufnahme per Ordnername in einen Ordner und gibt ihr eine Reihe von Tags per Name. Es findet den Ordner über eine Suche, schlägt jeden Tag ohne Beachtung der Groß- und Kleinschreibung im Katalog nach, legt fehlende Tags an (dieser Teil braucht einen Token von Admin oder Owner) und weist dann die komplette Liste zu. Setz vor dem Start RECORDING_ID, FOLDER_NAME und TAG_NAMES (kommagetrennt).

#!/usr/bin/env bash
# Braucht SALLY_TOKEN, DIRECTORY_ID, RECORDING_ID, FOLDER_NAME, TAG_NAMES sowie jq.
set -euo pipefail
BASE="https://api.sally.io/v1.0/directories/$DIRECTORY_ID"
AUTH="Authorization: Bearer $SALLY_TOKEN"

# 1. Ordner über den exakten Namen finden (ohne Groß- und Kleinschreibung) und Aufnahme einsortieren.
folder_id=$(curl -s -G "$BASE/folders" -H "$AUTH" --data-urlencode "search=$FOLDER_NAME" \
| jq -r --arg n "$FOLDER_NAME" '.items[] | select((.name | ascii_downcase) == ($n | ascii_downcase)) | .folderId' | head -n1)
[ -n "$folder_id" ] || { echo "Ordner nicht gefunden: $FOLDER_NAME" >&2; exit 1; }
curl -s -X PUT "$BASE/folders/$folder_id/recordings/$RECORDING_ID" -H "$AUTH"

# 2. Tag-Namen in Ids auflösen, fehlende Tags anlegen.
catalog=$(curl -s "$BASE/tags" -H "$AUTH")
tag_ids=()
IFS=',' read -ra names <<< "$TAG_NAMES"
for name in "${names[@]}"; do
id=$(echo "$catalog" | jq -r --arg n "$name" '.items[] | select((.name | ascii_downcase) == ($n | ascii_downcase)) | .tagId' | head -n1)
if [ -z "$id" ]; then
id=$(curl -s -X POST "$BASE/tags" -H "$AUTH" -H "Content-Type: application/json" \
-d "$(jq -n --arg n "$name" '{name: $n}')" | jq -r '.tagId')
fi
tag_ids+=("$id")
done

# 3. Komplette Liste zuweisen.
curl -s -X PUT "$BASE/recordings/$RECORDING_ID/tags" -H "$AUTH" -H "Content-Type: application/json" \
-d "$(printf '%s\n' "${tag_ids[@]}" | jq -R . | jq -s '{tagIds: .}')" | jq .

8. Endpunkte im Überblick​

Jeder Eintrag führt zur Referenz, wo du die Anfrage mit deinem eigenen Token senden kannst.

Ordner

Tags