Folders
A folder organizes recordings in a tree and controls who can see them. These endpoints read and update folders, manage their shares and move recordings in and out.
Every endpoint below shows its parameters and response fields in the middle and a request sample with an example response on the right.
Lists the recording folders the caller can access (paginated, optionally filtered)
/v1.0/directories/{directoryId}/foldersMerges personal, shared and team folders into one list. Pagination via ?page + ?pageSize (max. 100, applied in-memory). An optional ?search substring matches the folder name (case-insensitive). Pass ?parentRecordingFolderId to list only the direct children of a folder; omit it to list all folders.
Field overview from the specification
Response fields:
page/pageSize/total/hasMore: pagination envelope (current page, page size, total count, whether more pages follow).items(array): the folders on this page. Each item has:folderId(string): id of the folder.name(string): folder display name.description(string | null): folder description; null if unset.ownerUserId(string): id of the user who owns the folder.parentFolderId(string | null): id of the parent folder; null if this is a top-level folder.isOwner(boolean): true if the caller is the owner of the folder.isFavorite(boolean): true if the caller marked the folder as favorite.accessLevel(string, one ofnone/read/readWrite): the caller's effective access level on the folder.recordingsCount(number): number of recordings in the folder.createdOn(string): creation timestamp (ISO 8601).modifiedOn(string): last modification timestamp (ISO 8601).
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.
Query parameters
pagenumberoptionalPage number, 1-based. Defaults to 1.
pageSizenumberoptionalItems per page. Defaults to 25, capped at 100.
searchstringoptionalCase-insensitive substring match on the folder name. The term may appear at the start, middle, or end.
parentRecordingFolderIdstringoptionalId of the parent recording folder.
fieldsstringoptionalComma-separated list of the fields to return. Leave it out and you get every field — including fields added in the future, which is your call to make: name your fields if you want to be shielded from that.
Only first-level fields can be named. A nested list such as
attendees,tagsorsectionItemsis returned whole or not at all;attendees.nameis not supported.On a paged response the selection applies to the entries in
items;page,pageSize,totalandhasMoreare always returned. An unknown name is rejected with 400 rather than ignored.Selectable here:
accessLevel,createdOn,description,folderId,isFavorite,isOwner,modifiedOn,name,ownerUserId,parentFolderId,recordingsCount.Example:accessLevel,createdOn
Response: each entry in items
folderIdstringrequiredId of the folder.
namestringrequiredFolder display name.
descriptionstringrequirednullableFolder description; null if unset.
ownerUserIdstringrequiredId of the user who owns the folder.
parentFolderIdstringrequirednullableId of the parent folder; null if this is a top-level folder.
isOwnerbooleanrequiredTrue if the caller is the owner of the folder.
isFavoritebooleanrequiredTrue if the caller marked the folder as favorite.
accessLevelstringrequiredThe caller's effective access level on the folder.
Allowed values:nonereadreadWriterecordingsCountnumberrequiredNumber of recordings in the folder.
createdOnstringrequiredCreation timestamp (ISO 8601).
modifiedOnstringrequiredLast modification timestamp (ISO 8601).
Every page also carries page, pageSize, total, hasMore.
Status codes
- 200Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.
Searches recording folders (parameters in the body)
/v1.0/directories/{directoryId}/folders/searchSearches recording folders. Merges personal, shared and team folders into one list and paginates in-memory.
Field overview from the specification
Body fields:
search(string, optional): case-insensitive substring on the folder name.parentRecordingFolderId(string, optional): list only the direct children of that folder; omit for all folders.page(number, optional, default1): 1-based page number.pageSize(number, optional, default25): page size (max. 100).
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.
Query parameters
fieldsstringoptionalComma-separated list of the fields to return. Leave it out and you get every field — including fields added in the future, which is your call to make: name your fields if you want to be shielded from that.
Only first-level fields can be named. A nested list such as
attendees,tagsorsectionItemsis returned whole or not at all;attendees.nameis not supported.On a paged response the selection applies to the entries in
items;page,pageSize,totalandhasMoreare always returned. An unknown name is rejected with 400 rather than ignored.Selectable here:
accessLevel,createdOn,description,folderId,isFavorite,isOwner,modifiedOn,name,ownerUserId,parentFolderId,recordingsCount.Example:accessLevel,createdOn
Request body application/json
searchstringoptionalnullableCase-insensitive substring match on the folder name. The term may appear at the start, middle, or end.
parentRecordingFolderIdstringoptionalnullableList only the direct children of this folder; omit for all folders.
pagenumberoptionalPage (1-based, default 1).
pageSizenumberoptionalPage size (default 25, max 100).
Response: each entry in items
folderIdstringrequiredId of the folder.
namestringrequiredFolder display name.
descriptionstringrequirednullableFolder description; null if unset.
ownerUserIdstringrequiredId of the user who owns the folder.
parentFolderIdstringrequirednullableId of the parent folder; null if this is a top-level folder.
isOwnerbooleanrequiredTrue if the caller is the owner of the folder.
isFavoritebooleanrequiredTrue if the caller marked the folder as favorite.
accessLevelstringrequiredThe caller's effective access level on the folder.
Allowed values:nonereadreadWriterecordingsCountnumberrequiredNumber of recordings in the folder.
createdOnstringrequiredCreation timestamp (ISO 8601).
modifiedOnstringrequiredLast modification timestamp (ISO 8601).
Every page also carries page, pageSize, total, hasMore.
Status codes
- 200Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 403
Forbidden (insufficient permissions).
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.
Returns a single recording folder
/v1.0/directories/{directoryId}/folders/{folderId}The caller must be a member of the directory and have at least read access to the folder — otherwise 404/403. accessLevel reflects the effective access of the caller.
Field overview from the specification
Response fields:
folderId(string): id of the folder.name(string): folder display name.description(string | null): folder description; null if unset.ownerUserId(string): id of the user who owns the folder.parentFolderId(string | null): id of the parent folder; null if this is a top-level folder.isOwner(boolean): true if the caller is the owner of the folder.isFavorite(boolean): true if the caller marked the folder as favorite.accessLevel(string, one ofnone/read/readWrite): the caller's effective access level on the folder.recordingsCount(number): number of recordings in the folder.createdOn(string): creation timestamp (ISO 8601).modifiedOn(string): last modification timestamp (ISO 8601).
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.folderIdstringrequiredId of the folder.
Query parameters
fieldsstringoptionalComma-separated list of the fields to return. Leave it out and you get every field — including fields added in the future, which is your call to make: name your fields if you want to be shielded from that.
Only first-level fields can be named. A nested list such as
attendees,tagsorsectionItemsis returned whole or not at all;attendees.nameis not supported.On a paged response the selection applies to the entries in
items;page,pageSize,totalandhasMoreare always returned. An unknown name is rejected with 400 rather than ignored.Selectable here:
accessLevel,createdOn,description,folderId,isFavorite,isOwner,modifiedOn,name,ownerUserId,parentFolderId,recordingsCount.Example:accessLevel,createdOn
Response
folderIdstringrequiredId of the folder.
namestringrequiredFolder display name.
descriptionstringrequirednullableFolder description; null if unset.
ownerUserIdstringrequiredId of the user who owns the folder.
parentFolderIdstringrequirednullableId of the parent folder; null if this is a top-level folder.
isOwnerbooleanrequiredTrue if the caller is the owner of the folder.
isFavoritebooleanrequiredTrue if the caller marked the folder as favorite.
accessLevelstringrequiredThe caller's effective access level on the folder.
Allowed values:nonereadreadWriterecordingsCountnumberrequiredNumber of recordings in the folder.
createdOnstringrequiredCreation timestamp (ISO 8601).
modifiedOnstringrequiredLast modification timestamp (ISO 8601).
Status codes
- 200Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.
Updates a recording folder (name, description, parent)
/v1.0/directories/{directoryId}/folders/{folderId}Updates the folder metadata. Only the provided fields are changed (partial); the shares are left untouched (use PUT .../folders/{folderId}/shares for those). Requires read-write access to the folder. Returns the updated folder.
Field overview from the specification
Body fields:
name(string, optional): new folder name; omit to leave unchanged.description(string, optional): new description;nullclears it, omit to leave unchanged.parentFolderId(string, optional): id of the new parent folder to move this folder under;nullmakes it a top-level folder, omit to leave unchanged.
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.folderIdstringrequiredId of the folder.
Query parameters
fieldsstringoptionalComma-separated list of the fields to return. Leave it out and you get every field — including fields added in the future, which is your call to make: name your fields if you want to be shielded from that.
Only first-level fields can be named. A nested list such as
attendees,tagsorsectionItemsis returned whole or not at all;attendees.nameis not supported.On a paged response the selection applies to the entries in
items;page,pageSize,totalandhasMoreare always returned. An unknown name is rejected with 400 rather than ignored.Selectable here:
accessLevel,createdOn,description,folderId,isFavorite,isOwner,modifiedOn,name,ownerUserId,parentFolderId,recordingsCount.Example:accessLevel,createdOn
Request body application/json
namestringoptionalNew folder name (omit to leave unchanged).
descriptionstringoptionalnullableNew folder description; null to clear, omit to leave unchanged.
parentFolderIdstringoptionalnullableId of the new parent folder to move this folder under; null to make it a top-level folder, omit to leave unchanged.
Response
folderIdstringrequiredId of the folder.
namestringrequiredFolder display name.
descriptionstringrequirednullableFolder description; null if unset.
ownerUserIdstringrequiredId of the user who owns the folder.
parentFolderIdstringrequirednullableId of the parent folder; null if this is a top-level folder.
isOwnerbooleanrequiredTrue if the caller is the owner of the folder.
isFavoritebooleanrequiredTrue if the caller marked the folder as favorite.
accessLevelstringrequiredThe caller's effective access level on the folder.
Allowed values:nonereadreadWriterecordingsCountnumberrequiredNumber of recordings in the folder.
createdOnstringrequiredCreation timestamp (ISO 8601).
modifiedOnstringrequiredLast modification timestamp (ISO 8601).
Status codes
- 200Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 403
Forbidden (insufficient permissions).
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.
Returns the shares of a recording folder
/v1.0/directories/{directoryId}/folders/{folderId}/sharesDirect user shares, team shares and inherited shares (from parent folders). Each share carries only ids + access level; resolve user/team details via the membership/team endpoints.
Field overview from the specification
Response fields:
userShares(array): direct user shares of the folder. Each item has:userId(string): id of the user this folder is shared with.accessLevel(string, one ofnone/read/readWrite): access level granted to the user.
teamShares(array): team shares of the folder. Each item has:teamId(string): id of the team this folder is shared with.accessLevel(string, one ofnone/read/readWrite): access level granted to the team.
inheritedShares(array): shares inherited from parent folders (read-only). Each item has:userId(string): id of the user who inherits access.accessLevel(string, one ofnone/read/readWrite): inherited access level.inheritedFromFolderId(string): id of the parent folder the access is inherited from.
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.folderIdstringrequiredId of the folder.
Query parameters
fieldsstringoptionalComma-separated list of the fields to return. Leave it out and you get every field — including fields added in the future, which is your call to make: name your fields if you want to be shielded from that.
Only first-level fields can be named. A nested list such as
attendees,tagsorsectionItemsis returned whole or not at all;attendees.nameis not supported.On a paged response the selection applies to the entries in
items;page,pageSize,totalandhasMoreare always returned. An unknown name is rejected with 400 rather than ignored.Selectable here:
inheritedShares,teamShares,userShares.Example:inheritedShares,teamShares
Response
userSharesobject[]requiredDirect user shares of the folder.
2 child fields
userIdstringrequiredId of the user this folder is shared with.
accessLevelstringrequiredAccess level granted to the user.
Allowed values:nonereadreadWrite
teamSharesobject[]requiredTeam shares of the folder.
2 child fields
teamIdstringrequiredId of the team this folder is shared with.
accessLevelstringrequiredAccess level granted to the team.
Allowed values:nonereadreadWrite
inheritedSharesobject[]requiredShares inherited from parent folders (read-only).
3 child fields
userIdstringrequiredId of the user who inherits access.
accessLevelstringrequiredInherited access level.
Allowed values:nonereadreadWriteinheritedFromFolderIdstringrequiredId of the parent folder the access is inherited from.
Status codes
- 200Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.
Sets the shares of a recording folder (replace-set)
/v1.0/directories/{directoryId}/folders/{folderId}/sharesReplaces the direct user shares and team shares of the folder with the provided sets (inherited shares are read-only and cannot be set). Only the folder owner may change shares. Returns the resulting shares.
Field overview from the specification
Body fields:
userShares(array, required): direct user shares to apply, each{ userId (string), accessLevel (none/read/readWrite) }. The resulting set replaces the current one.teamShares(array, required): team shares to apply, each{ teamId (string), accessLevel (none/read/readWrite) }. The resulting set replaces the current one.
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.folderIdstringrequiredId of the folder.
Query parameters
fieldsstringoptionalComma-separated list of the fields to return. Leave it out and you get every field — including fields added in the future, which is your call to make: name your fields if you want to be shielded from that.
Only first-level fields can be named. A nested list such as
attendees,tagsorsectionItemsis returned whole or not at all;attendees.nameis not supported.On a paged response the selection applies to the entries in
items;page,pageSize,totalandhasMoreare always returned. An unknown name is rejected with 400 rather than ignored.Selectable here:
inheritedShares,teamShares,userShares.Example:inheritedShares,teamShares
Request body application/json
userSharesobject[]requiredDirect user shares to apply. The resulting set replaces the current one.
2 child fields
userIdstringrequiredId of the user this folder is shared with.
accessLevelstringrequiredAccess level granted to the user.
Allowed values:nonereadreadWrite
teamSharesobject[]requiredTeam shares to apply. The resulting set replaces the current one.
2 child fields
teamIdstringrequiredId of the team this folder is shared with.
accessLevelstringrequiredAccess level granted to the team.
Allowed values:nonereadreadWrite
Response
userSharesobject[]requiredDirect user shares of the folder.
2 child fields
userIdstringrequiredId of the user this folder is shared with.
accessLevelstringrequiredAccess level granted to the user.
Allowed values:nonereadreadWrite
teamSharesobject[]requiredTeam shares of the folder.
2 child fields
teamIdstringrequiredId of the team this folder is shared with.
accessLevelstringrequiredAccess level granted to the team.
Allowed values:nonereadreadWrite
inheritedSharesobject[]requiredShares inherited from parent folders (read-only).
3 child fields
userIdstringrequiredId of the user who inherits access.
accessLevelstringrequiredInherited access level.
Allowed values:nonereadreadWriteinheritedFromFolderIdstringrequiredId of the parent folder the access is inherited from.
Status codes
- 200Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 403
Forbidden (insufficient permissions).
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.
Lists the recordings in a folder (paginated)
/v1.0/directories/{directoryId}/folders/{folderId}/recordingsPass ?includeSubfolders=true to also include the recordings of all accessible subfolders (recursive, deduplicated). Sorted by creation date descending. Pagination via ?page + ?pageSize (max. 100, applied in-memory). Each item references the recording by recordingId; fetch full details via GET .../recordings/{recordingId}.
Field overview from the specification
Response fields:
page/pageSize/total/hasMore: pagination envelope (current page, page size, total count, whether more pages follow).items(array): the recordings on this page. Each item has:recordingId(string): id of the recording.durationInSeconds(number | null): duration in seconds; null if unknown.isManualUpload(boolean): true if manually uploaded (no meeting bot).appointmentId(string | null): id of the caller's own appointment linked to the recording; null if none.createdOn(string): creation timestamp (ISO 8601, UTC).
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.folderIdstringrequiredId of the folder.
Query parameters
includeSubfoldersbooleanoptionalWhen
true, recordings of all nested subfolders are included as well. When omitted orfalse, only the recordings placed directly in this folder are returned.pagenumberoptionalPage number, 1-based. Defaults to 1.
pageSizenumberoptionalItems per page. Defaults to 25, capped at 100.
fieldsstringoptionalComma-separated list of the fields to return. Leave it out and you get every field — including fields added in the future, which is your call to make: name your fields if you want to be shielded from that.
Only first-level fields can be named. A nested list such as
attendees,tagsorsectionItemsis returned whole or not at all;attendees.nameis not supported.On a paged response the selection applies to the entries in
items;page,pageSize,totalandhasMoreare always returned. An unknown name is rejected with 400 rather than ignored.Selectable here:
appointmentId,createdOn,durationInSeconds,isManualUpload,recordingId.Example:appointmentId,createdOn
Response: each entry in items
recordingIdstringrequiredId of the recording.
durationInSecondsnumberrequirednullableDuration in seconds; null if unknown.
isManualUploadbooleanrequiredTrue if manually uploaded (no meeting bot).
appointmentIdstringrequirednullableId of the caller's own appointment linked to the recording; null if none.
createdOnstringrequiredCreation timestamp (ISO 8601, UTC).
Every page also carries page, pageSize, total, hasMore.
Status codes
- 200Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.
Adds a recording to a folder
/v1.0/directories/{directoryId}/folders/{folderId}/recordings/{recordingId}Idempotent. Requires read-write access to the folder. 404 if the recording does not exist in the directory.
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.folderIdstringrequiredId of the folder.
recordingIdstringrequiredId of the recording.
Status codes
- 204Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 403
Forbidden (insufficient permissions).
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.
Removes a recording from a folder
/v1.0/directories/{directoryId}/folders/{folderId}/recordings/{recordingId}Requires read-write access to the folder.
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.folderIdstringrequiredId of the folder.
recordingIdstringrequiredId of the recording.
Status codes
- 204Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 403
Forbidden (insufficient permissions).
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.