media server logo
Toggle documentation navigation
Callaba home
Command-first documentation

Search the module, then move faster through the API

Find the exact module, copy the working request shape, and move from product workflow to API call without getting buried in the tree.

AI workflow helperDescribe what you want to buildOptional tool

Write the workflow in plain language. We will turn it into a GPT-ready brief you can use to generate requests, module order, and starter payloads.

Storages

On this page

Find an endpoint

6 endpoints
Search by endpoint name, HTTP verb, or URL, then jump straight to its request.

Storages

Use Storages to define where finished media should go after it leaves local disk. This is the module for external buckets and archive targets used by recordings, copied files, and exported assets.

In production, a storage object gives your team a reusable destination with a stable id. Downstream jobs can reference that object instead of repeating bucket URLs and credentials in every workflow.

What this module solves

  • Moves archive and delivery planning out of individual media jobs.
  • Provides a single, reusable destination for recordings and file copy workflows.
  • Supports separate storage policies for archive, exchange, and customer delivery.
  • Keeps secrets out of read APIs after initial configuration.

Key operations

  • create and update register or change a storage target.
  • getAll and getCount support inventory and audits.
  • getById returns one configured destination.
  • remove detaches a target that is no longer needed.

Operational notes

  • Treat access_key and secret_key as write-only inputs. They are supplied on create or update and are not returned later.
  • Use one storage object per operational destination. Do not mix archive, handoff, and delivery policies into a single bucket unless that is intentional.
  • Validate a new or updated destination with a low-risk workflow before routing production media to it.

Example targets

The examples below cover the two most common object storage setups used in production.

AWS S3 archive

Typical choice for long-term retention and shared media libraries.

{
  "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": {}
}

Backblaze B2 archive

Typical choice for cost-sensitive archive and off-instance retention.

{
  "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": {}
}

Production workflows

Register archive storage before recording depends on it

Create the storage object before enabling recording or export workflows for an event. That way, operators are not entering bucket details during a live production window and every job can point to a known-good destination.

Separate archive, editorial handoff, and customer delivery

Different buckets usually exist for different reasons: long-term archive, short-term editorial exchange, or final customer delivery. Model those as separate storage objects so permissions, lifecycle rules, and operational ownership stay clear.

Rotate credentials without changing downstream references

When keys or endpoint details change, update the storage object and run a small validation transfer before the next show. Read APIs will confirm the destination exists, but they will not return stored secrets for review.

Operator guidance

  • Name storage objects by purpose, not just by vendor.
  • Keep metadata minimal and meaningful so inventory stays easy to audit.
  • Remove unused targets when projects end or retention policies change.
POST
/api/storages/create

Use this method before any recording, archive, or file-transfer workflow is pointed at external storage.

It registers the target, validates bucket and metadata settings, and makes the destination available for production use. The preset examples are the fastest path for common S3-compatible providers such as AWS S3 or Backblaze.

AWS S3 storage target

Use this preset when recordings or copied assets should land in an AWS S3 bucket.

AWS S3 storage target
Copy code
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": {}
}'
Backblaze storage target

Use this preset when the storage backend is Backblaze and the bucket URL follows the S3-compatible Backblaze endpoint pattern.

Backblaze storage target
Copy code
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": {}
}'
Request body parameters
Identity
name
string
Copy direct link

Dashboard label: Storage Name.

The unique storage name. The backend validates a constrained name pattern and length before creating the storage object.

Location
type
string
Copy direct link

Dashboard label: Location.

Real product values include STORAGE_TYPE_S3, STORAGE_TYPE_BACKBLAZE, and an internal-disk type used as a model default.

bucket_url
string
Copy direct link

Dashboard label: Bucket URL.

Full bucket URL for the storage target.

Credentials
access_key
string
Copy direct link

Dashboard label: Access key (Key ID).

Write-only credential field used when the storage is created or updated.

secret_key
string
Copy direct link

Dashboard label: Secret key (App key).

Write-only credential field used when the storage is created or updated.

Metadata backend
redis_meta_data_url
string
Copy direct link

Dashboard label: Metadata URL.

Redis metadata backend used by the storage mounting layer.

meta_data
object
Copy direct link

Optional metadata object stored with the storage target.

Create storage
Copy code
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": {}
}'
Response
Identity
_id / id / name
mixed
Copy direct link

Storage object identifiers and the saved storage name.

Location
type / bucket_url / folder_name
mixed
Copy direct link

Storage type, bucket URL, and the normalized folder name derived from the storage name.

Metadata backend
redis_meta_data_url / meta_data
mixed
Copy direct link

Saved metadata backend fields for the storage object.

Runtime
created
string
Copy direct link

Creation timestamp managed by the backend.

Security
credential material
not returned in later lookups
Copy direct link

The create and update flows accept credentials, but list and lookup methods intentionally avoid returning the secret fields back to the client.

Response: Create storage
JSON
Copy code
{
"_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
}
POST
/api/storages/getCount
POST
/api/storages/getAll
POST
/api/storages/getById
POST
/api/storages/update
DELETE
/api/storages/remove