The Storages section covers the API endpoints used to register and manage external storage targets in Callaba Engine. This is the layer you use when recorded files, copied media, or archived assets should live in an object storage backend rather than only on the local server.
Compared with file-oriented modules, a storage object is the place where your media should end up when local disk is not the final home. It tells the engine which bucket or storage target should receive completed assets and gives operations one durable destination to plan around.
The control methods complete that lifecycle. Use create and update to register the storage target, getAll and getCount for listings, getById when you need one storage object, and remove when the storage should be detached and cleaned up.
This module is operationally sensitive: secrets are provided on create and update, but are intentionally not returned later through listing and lookup methods. The point is to manage the destination safely, not to turn the API into a place where credentials are read back out later.
The most useful presets here are storage target families rather than transport families. In practice, the common paths are an AWS S3-compatible target, a Backblaze target, and the metadata strategy that goes with them.
{
"name": "AWS media archive",
"type": "STORAGE_TYPE_S3",
"bucket_url": "https://my-media-bucket.s3.us-east-1.amazonaws.com",
"access_key": "AWS_ACCESS_KEY_ID",
"secret_key": "AWS_SECRET_ACCESS_KEY",
"redis_meta_data_url": "redis://localhost:6379/2",
"meta_data": {}
}
{
"name": "Backblaze media archive",
"type": "STORAGE_TYPE_BACKBLAZE",
"bucket_url": "https://s3.us-east-005.backblazeb2.com/my-media-bucket",
"access_key": "B2_KEY_ID",
"secret_key": "B2_APPLICATION_KEY",
"redis_meta_data_url": "redis://localhost:6379/2",
"meta_data": {}
}
These scenarios frame why a storage object exists in production, not only how the request body is shaped.
Use a storage object when recordings, copied files, or exported assets should land in a managed external bucket rather than stay only on the local machine.
Different buckets often serve different business goals: long-term archive, short-term exchange, or per-project delivery. Defining them as separate storage objects keeps downstream recording and transfer workflows easier to reason about.
Access keys and secret keys are supplied when the storage is created or updated, but later lookup methods focus on the storage target itself rather than exposing those credentials again.
Create a new storage target in Callaba Engine.
This method registers the storage location, validates the bucket and metadata parameters, prepares the mount layer, and persists the storage object. In practice it is the method you use before recordings or file transfers should rely on a cloud archive target.
Examples by preset are especially useful here because most real setups are one of a few recognizable storage families, such as AWS S3 or Backblaze.
Use this preset when recordings or copied assets should land in an AWS S3 bucket.
curl --request POST \--url http://localhost/api/storages/create \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"name": "AWS media archive","type": "STORAGE_TYPE_S3","bucket_url": "https://my-media-bucket.s3.us-east-1.amazonaws.com","access_key": "AWS_ACCESS_KEY_ID","secret_key": "AWS_SECRET_ACCESS_KEY","redis_meta_data_url": "redis://localhost:6379/2","meta_data": {}}'
Use this preset when the storage backend is Backblaze and the bucket URL follows the S3-compatible Backblaze endpoint pattern.
curl --request POST \--url http://localhost/api/storages/create \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"name": "Backblaze media archive","type": "STORAGE_TYPE_BACKBLAZE","bucket_url": "https://s3.us-east-005.backblazeb2.com/my-media-bucket","access_key": "B2_KEY_ID","secret_key": "B2_APPLICATION_KEY","redis_meta_data_url": "redis://localhost:6379/2","meta_data": {}}'
Dashboard label: Storage Name.
The unique storage name. The backend validates a constrained name pattern and length before creating the storage object.
Dashboard label: Location.
Real product values include STORAGE_TYPE_S3, STORAGE_TYPE_BACKBLAZE, and an internal-disk type used as a model default.
Dashboard label: Bucket URL.
Full bucket URL for the storage target.
Dashboard label: Access key (Key ID).
Write-only credential field used when the storage is created or updated.
Dashboard label: Secret key (App key).
Write-only credential field used when the storage is created or updated.
Dashboard label: Metadata URL.
Redis metadata backend used by the storage mounting layer.
Optional metadata object stored with the storage target.
curl --request POST \--url http://localhost/api/storages/create \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"name": "AWS media archive","type": "STORAGE_TYPE_S3","bucket_url": "https://my-media-bucket.s3.us-east-1.amazonaws.com","access_key": "AWS_ACCESS_KEY_ID","secret_key": "AWS_SECRET_ACCESS_KEY","redis_meta_data_url": "redis://localhost:6379/2","meta_data": {}}'
Storage object identifiers and the saved storage name.
Storage type, bucket URL, and the normalized folder name derived from the storage name.
Saved metadata backend fields for the storage object.
Creation timestamp managed by the backend.
The create and update flows accept credentials, but list and lookup methods intentionally avoid returning the secret fields back to the client.
{"_id": "6a0011223344556677889900","id": "6a0011223344556677889900","name": "AWS media archive","type": "STORAGE_TYPE_S3","bucket_url": "https://my-media-bucket.s3.us-east-1.amazonaws.com","redis_meta_data_url": "redis://localhost:6379/2","meta_data": {},"folder_name": "aws-media-archive","created": "2026-03-24T18:00:00.000Z","success": true}
Return the total number of storage targets visible to the authenticated user.
Use this with paginated listings when a control panel needs the current count before fetching storage objects.
curl --request POST \--url http://localhost/api/storages/getCount \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"filter": {}}'
Total number of storage targets currently visible to the authenticated user.
{"count": 1}
Return the list of storage targets for the current user.
This is the normal control-plane listing method for storage management. It returns non-secret storage fields such as the name, type, bucket URL, and metadata object.
Optional page size for the list query.
Optional offset for paginated listing.
Optional sort descriptor. The dashboard store defaults to { created: 1 }.
Optional filter object forwarded to the backend query.
curl --request POST \--url http://localhost/api/storages/getAll \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"limit": 10,"skip": 0,"sort": {"created": 1},"filter": {}}'
The backend returns a bare array of non-secret storage objects.
[{"_id": "6a0011223344556677889900","id": "6a0011223344556677889900","name": "AWS media archive","type": "STORAGE_TYPE_S3","bucket_url": "https://my-media-bucket.s3.us-east-1.amazonaws.com","redis_meta_data_url": "redis://localhost:6379/2","meta_data": {},"folder_name": "aws-media-archive","created": "2026-03-24T18:00:00.000Z","success": true}]
Load one storage target by its id.
Use this when an operator opens the storage editor or when another management view needs the saved non-secret details of one configured target.
Identifier of the storage target you want to load.
curl --request POST \--url http://localhost/api/storages/getById \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"id": "STORAGE_ID"}'
The backend returns the saved non-secret storage fields for the requested target.
{"_id": "6a0011223344556677889900","id": "6a0011223344556677889900","name": "AWS media archive","type": "STORAGE_TYPE_S3","bucket_url": "https://my-media-bucket.s3.us-east-1.amazonaws.com","redis_meta_data_url": "redis://localhost:6379/2","meta_data": {},"folder_name": "aws-media-archive","created": "2026-03-24T18:00:00.000Z","success": true}
Update an existing storage target.
The update contract mirrors the create path closely. In practice this is where you adjust the bucket URL, metadata backend URL, or replace credentials for the storage target.
Identifier of the storage target being updated.
The update contract mirrors create. In practice this is where you change the bucket URL, metadata URL, or credentials.
curl --request POST \--url http://localhost/api/storages/update \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"id": "STORAGE_ID","name": "AWS media archive updated","type": "STORAGE_TYPE_S3","bucket_url": "https://my-media-bucket.s3.us-east-1.amazonaws.com","access_key": "AWS_ACCESS_KEY_ID","secret_key": "AWS_SECRET_ACCESS_KEY","redis_meta_data_url": "redis://localhost:6379/2","meta_data": {}}'
The backend returns the updated storage object.
{"_id": "6a0011223344556677889900","id": "6a0011223344556677889900","name": "AWS media archive updated","type": "STORAGE_TYPE_S3","bucket_url": "https://my-media-bucket.s3.us-east-1.amazonaws.com","redis_meta_data_url": "redis://localhost:6379/2","meta_data": {},"folder_name": "aws-media-archive","created": "2026-03-24T18:00:00.000Z","success": true}
Remove a storage target by id.
This detaches the configured storage target from the control plane and runs the cleanup path behind it. Use remove when the storage should no longer be available as a destination for recordings or file transfer workflows.
Identifier of the storage target to delete.
curl --request DELETE \--url http://localhost/api/storages/remove \--header 'x-access-token: <your_api_token>' \--header 'Content-Type: application/json' \--data '{"id": "STORAGE_ID"}'
The remove endpoint responds with a success-shaped result after the cleanup path finishes.
{"success": true}