Skip to main content

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.

Base URL https://api.sally.ioVersion v1.0 current, not frozen yetHow versioning works

Lists the recording folders the caller can access (paginated, optionally filtered)​

GET/v1.0/directories/{directoryId}/folders

Merges 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 of none/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

  • directoryIdstringrequired

    Id 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

  • pagenumberoptional

    Page number, 1-based. Defaults to 1.

  • pageSizenumberoptional

    Items per page. Defaults to 25, capped at 100.

  • searchstringoptional

    Case-insensitive substring match on the folder name. The term may appear at the start, middle, or end.

  • parentRecordingFolderIdstringoptional

    Id of the parent recording folder.

  • fieldsstringoptional

    Comma-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, tags or sectionItems is returned whole or not at all; attendees.name is not supported.

    On a paged response the selection applies to the entries in items; page, pageSize, total and hasMore are 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

  • folderIdstringrequired

    Id of the folder.

  • namestringrequired

    Folder display name.

  • descriptionstringrequirednullable

    Folder description; null if unset.

  • ownerUserIdstringrequired

    Id of the user who owns the folder.

  • parentFolderIdstringrequirednullable

    Id of the parent folder; null if this is a top-level folder.

  • isOwnerbooleanrequired

    True if the caller is the owner of the folder.

  • isFavoritebooleanrequired

    True if the caller marked the folder as favorite.

  • accessLevelstringrequired

    The caller's effective access level on the folder.

    Allowed values: nonereadreadWrite
  • recordingsCountnumberrequired

    Number of recordings in the folder.

  • createdOnstringrequired

    Creation timestamp (ISO 8601).

  • modifiedOnstringrequired

    Last 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 code FUP_LIMIT_EXCEEDED or TOO_MANY_CONCURRENT_TRANSCRIPTIONS.

  • 500

    Internal server error.

POST/v1.0/directories/{directoryId}/folders/search

Searches 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, default 1): 1-based page number.
  • pageSize (number, optional, default 25): page size (max. 100).

Path parameters

  • directoryIdstringrequired

    Id 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

  • fieldsstringoptional

    Comma-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, tags or sectionItems is returned whole or not at all; attendees.name is not supported.

    On a paged response the selection applies to the entries in items; page, pageSize, total and hasMore are 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

  • searchstringoptionalnullable

    Case-insensitive substring match on the folder name. The term may appear at the start, middle, or end.

  • parentRecordingFolderIdstringoptionalnullable

    List only the direct children of this folder; omit for all folders.

  • pagenumberoptional

    Page (1-based, default 1).

  • pageSizenumberoptional

    Page size (default 25, max 100).

Response: each entry in items

  • folderIdstringrequired

    Id of the folder.

  • namestringrequired

    Folder display name.

  • descriptionstringrequirednullable

    Folder description; null if unset.

  • ownerUserIdstringrequired

    Id of the user who owns the folder.

  • parentFolderIdstringrequirednullable

    Id of the parent folder; null if this is a top-level folder.

  • isOwnerbooleanrequired

    True if the caller is the owner of the folder.

  • isFavoritebooleanrequired

    True if the caller marked the folder as favorite.

  • accessLevelstringrequired

    The caller's effective access level on the folder.

    Allowed values: nonereadreadWrite
  • recordingsCountnumberrequired

    Number of recordings in the folder.

  • createdOnstringrequired

    Creation timestamp (ISO 8601).

  • modifiedOnstringrequired

    Last 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 code FUP_LIMIT_EXCEEDED or TOO_MANY_CONCURRENT_TRANSCRIPTIONS.

  • 500

    Internal server error.

Returns a single recording folder​

GET/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 of none/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

  • directoryIdstringrequired

    Id 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.

  • folderIdstringrequired

    Id of the folder.

Query parameters

  • fieldsstringoptional

    Comma-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, tags or sectionItems is returned whole or not at all; attendees.name is not supported.

    On a paged response the selection applies to the entries in items; page, pageSize, total and hasMore are 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

  • folderIdstringrequired

    Id of the folder.

  • namestringrequired

    Folder display name.

  • descriptionstringrequirednullable

    Folder description; null if unset.

  • ownerUserIdstringrequired

    Id of the user who owns the folder.

  • parentFolderIdstringrequirednullable

    Id of the parent folder; null if this is a top-level folder.

  • isOwnerbooleanrequired

    True if the caller is the owner of the folder.

  • isFavoritebooleanrequired

    True if the caller marked the folder as favorite.

  • accessLevelstringrequired

    The caller's effective access level on the folder.

    Allowed values: nonereadreadWrite
  • recordingsCountnumberrequired

    Number of recordings in the folder.

  • createdOnstringrequired

    Creation timestamp (ISO 8601).

  • modifiedOnstringrequired

    Last 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 code FUP_LIMIT_EXCEEDED or TOO_MANY_CONCURRENT_TRANSCRIPTIONS.

  • 500

    Internal server error.

Updates a recording folder (name, description, parent)​

PATCH/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; null clears it, omit to leave unchanged.
  • parentFolderId (string, optional): id of the new parent folder to move this folder under; null makes it a top-level folder, omit to leave unchanged.

Path parameters

  • directoryIdstringrequired

    Id 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.

  • folderIdstringrequired

    Id of the folder.

Query parameters

  • fieldsstringoptional

    Comma-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, tags or sectionItems is returned whole or not at all; attendees.name is not supported.

    On a paged response the selection applies to the entries in items; page, pageSize, total and hasMore are 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

  • namestringoptional

    New folder name (omit to leave unchanged).

  • descriptionstringoptionalnullable

    New folder description; null to clear, omit to leave unchanged.

  • parentFolderIdstringoptionalnullable

    Id of the new parent folder to move this folder under; null to make it a top-level folder, omit to leave unchanged.

Response

  • folderIdstringrequired

    Id of the folder.

  • namestringrequired

    Folder display name.

  • descriptionstringrequirednullable

    Folder description; null if unset.

  • ownerUserIdstringrequired

    Id of the user who owns the folder.

  • parentFolderIdstringrequirednullable

    Id of the parent folder; null if this is a top-level folder.

  • isOwnerbooleanrequired

    True if the caller is the owner of the folder.

  • isFavoritebooleanrequired

    True if the caller marked the folder as favorite.

  • accessLevelstringrequired

    The caller's effective access level on the folder.

    Allowed values: nonereadreadWrite
  • recordingsCountnumberrequired

    Number of recordings in the folder.

  • createdOnstringrequired

    Creation timestamp (ISO 8601).

  • modifiedOnstringrequired

    Last 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 code FUP_LIMIT_EXCEEDED or TOO_MANY_CONCURRENT_TRANSCRIPTIONS.

  • 500

    Internal server error.

Returns the shares of a recording folder​

GET/v1.0/directories/{directoryId}/folders/{folderId}/shares

Direct 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 of none/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 of none/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 of none/read/readWrite): inherited access level.
    • inheritedFromFolderId (string): id of the parent folder the access is inherited from.

Path parameters

  • directoryIdstringrequired

    Id 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.

  • folderIdstringrequired

    Id of the folder.

Query parameters

  • fieldsstringoptional

    Comma-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, tags or sectionItems is returned whole or not at all; attendees.name is not supported.

    On a paged response the selection applies to the entries in items; page, pageSize, total and hasMore are always returned. An unknown name is rejected with 400 rather than ignored.

    Selectable here: inheritedShares, teamShares, userShares.

    Example: inheritedShares,teamShares

Response

  • userSharesobject[]required

    Direct user shares of the folder.

    2 child fields
    • userIdstringrequired

      Id of the user this folder is shared with.

    • accessLevelstringrequired

      Access level granted to the user.

      Allowed values: nonereadreadWrite
  • teamSharesobject[]required

    Team shares of the folder.

    2 child fields
    • teamIdstringrequired

      Id of the team this folder is shared with.

    • accessLevelstringrequired

      Access level granted to the team.

      Allowed values: nonereadreadWrite
  • inheritedSharesobject[]required

    Shares inherited from parent folders (read-only).

    3 child fields
    • userIdstringrequired

      Id of the user who inherits access.

    • accessLevelstringrequired

      Inherited access level.

      Allowed values: nonereadreadWrite
    • inheritedFromFolderIdstringrequired

      Id 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 code FUP_LIMIT_EXCEEDED or TOO_MANY_CONCURRENT_TRANSCRIPTIONS.

  • 500

    Internal server error.

Sets the shares of a recording folder (replace-set)​

PUT/v1.0/directories/{directoryId}/folders/{folderId}/shares

Replaces 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

  • directoryIdstringrequired

    Id 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.

  • folderIdstringrequired

    Id of the folder.

Query parameters

  • fieldsstringoptional

    Comma-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, tags or sectionItems is returned whole or not at all; attendees.name is not supported.

    On a paged response the selection applies to the entries in items; page, pageSize, total and hasMore are 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[]required

    Direct user shares to apply. The resulting set replaces the current one.

    2 child fields
    • userIdstringrequired

      Id of the user this folder is shared with.

    • accessLevelstringrequired

      Access level granted to the user.

      Allowed values: nonereadreadWrite
  • teamSharesobject[]required

    Team shares to apply. The resulting set replaces the current one.

    2 child fields
    • teamIdstringrequired

      Id of the team this folder is shared with.

    • accessLevelstringrequired

      Access level granted to the team.

      Allowed values: nonereadreadWrite

Response

  • userSharesobject[]required

    Direct user shares of the folder.

    2 child fields
    • userIdstringrequired

      Id of the user this folder is shared with.

    • accessLevelstringrequired

      Access level granted to the user.

      Allowed values: nonereadreadWrite
  • teamSharesobject[]required

    Team shares of the folder.

    2 child fields
    • teamIdstringrequired

      Id of the team this folder is shared with.

    • accessLevelstringrequired

      Access level granted to the team.

      Allowed values: nonereadreadWrite
  • inheritedSharesobject[]required

    Shares inherited from parent folders (read-only).

    3 child fields
    • userIdstringrequired

      Id of the user who inherits access.

    • accessLevelstringrequired

      Inherited access level.

      Allowed values: nonereadreadWrite
    • inheritedFromFolderIdstringrequired

      Id 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 code FUP_LIMIT_EXCEEDED or TOO_MANY_CONCURRENT_TRANSCRIPTIONS.

  • 500

    Internal server error.

Lists the recordings in a folder (paginated)​

GET/v1.0/directories/{directoryId}/folders/{folderId}/recordings

Pass ?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

  • directoryIdstringrequired

    Id 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.

  • folderIdstringrequired

    Id of the folder.

Query parameters

  • includeSubfoldersbooleanoptional

    When true, recordings of all nested subfolders are included as well. When omitted or false, only the recordings placed directly in this folder are returned.

  • pagenumberoptional

    Page number, 1-based. Defaults to 1.

  • pageSizenumberoptional

    Items per page. Defaults to 25, capped at 100.

  • fieldsstringoptional

    Comma-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, tags or sectionItems is returned whole or not at all; attendees.name is not supported.

    On a paged response the selection applies to the entries in items; page, pageSize, total and hasMore are 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

  • recordingIdstringrequired

    Id of the recording.

  • durationInSecondsnumberrequirednullable

    Duration in seconds; null if unknown.

  • isManualUploadbooleanrequired

    True if manually uploaded (no meeting bot).

  • appointmentIdstringrequirednullable

    Id of the caller's own appointment linked to the recording; null if none.

  • createdOnstringrequired

    Creation 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 code FUP_LIMIT_EXCEEDED or TOO_MANY_CONCURRENT_TRANSCRIPTIONS.

  • 500

    Internal server error.

Adds a recording to a folder​

PUT/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

  • directoryIdstringrequired

    Id 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.

  • folderIdstringrequired

    Id of the folder.

  • recordingIdstringrequired

    Id 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 code FUP_LIMIT_EXCEEDED or TOO_MANY_CONCURRENT_TRANSCRIPTIONS.

  • 500

    Internal server error.

Removes a recording from a folder​

DELETE/v1.0/directories/{directoryId}/folders/{folderId}/recordings/{recordingId}

Requires read-write access to the folder.

Path parameters

  • directoryIdstringrequired

    Id 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.

  • folderIdstringrequired

    Id of the folder.

  • recordingIdstringrequired

    Id 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 code FUP_LIMIT_EXCEEDED or TOO_MANY_CONCURRENT_TRANSCRIPTIONS.

  • 500

    Internal server error.