API v2/PUT

Set your storage configuration

Point MeetingBaas at object storage you own.

From the next bot onwards, every artifact we produce for you — recording, audio chunks, raw and diarized transcripts, screenshots and bot logs — is written to your buckets with your credentials. Nothing lands in MeetingBaas storage.

Verified before it is accepted. The ingest key writes a small marker object into each bucket and the service key reads, writes and deletes it — each operation exercised with the credential that will really perform it, which also catches two key pairs that point at different buckets. Ingest upload receives recordings; service upload writes transcripts and reconciled artifacts; read serves artifacts; and delete enforces data retention. If any step fails the request returns 400 with the reason and your existing configuration is left untouched.

Settings: endpoint, region and force_path_style are the same knobs as a self-hosted deployment. Any S3-compatible provider works; enable force_path_style for MinIO, Ceph and most self-hosted gateways. The three buckets may all be the same bucket — keys are prefixed with the bot id regardless.

Two credentials. The ingest key is write-only (s3:PutObject, s3:PutObjectTagging, s3:AbortMultipartUpload) and is the only one that leaves our infrastructure — it is handed to the recording bot, which runs a browser inside your meeting. Scoped this way, a compromised bot can add objects and nothing else. The service key (s3:GetObject, s3:ListBucket, s3:PutObject, s3:DeleteObject) stays in our API and does everything else: serving your recordings back, writing transcripts, and deleting artifacts when your retention period expires.

Keep the buckets private — artifacts are served through short-lived signed URLs — but they must be reachable from the public internet, because transcription providers fetch audio directly from a signed URL.

Data residency. By default (allow_transient_spill: false) nothing you record ever rests on MeetingBaas storage: if an upload to your bucket fails and retries are exhausted, the artifact is reported as failed and lost rather than parked on our infrastructure. Set it to true if you would rather we hold a copy until the upload can be retried.

Replacing a configuration is safe. Calling this again supersedes the previous configuration for new bots only. Bots recorded earlier keep resolving to the storage they were written to, so their artifacts stay readable and deletable — nothing is migrated or re-pointed.

Returns 200 with the stored configuration.

PUT
/v2/storage-config

Authorization

ApiKeyAuth
x-meeting-baas-api-key<token>

Your Meeting BaaS API key. Get one from your account settings.

In: header

Request Body

application/json

Point MeetingBaas at object storage you own.

Every artifact produced for your bots from this point on — recordings, audio chunks, transcripts, screenshots and logs — is written to these buckets instead of ours.

Two credentials are required, scoped by where they end up. The ingest key is write-only and is the only one that leaves our infrastructure: it is handed to the recording bot, which runs a browser inside your meeting. The service key stays in our API and does everything else — serving your recordings back, writing transcripts, and deleting artifacts when your retention period expires.

Both are verified before the configuration is accepted: the ingest key writes a marker object and the service key reads, writes and deletes it.

Bots recorded before this call keep reading from wherever they were written, so setting, changing or removing a configuration never breaks existing artifacts.

allow_transient_spill?boolean

Whether MeetingBaas may hold a recording on its own storage when an upload to your buckets fails, until it can be retried.

Defaults to false: nothing you record ever rests outside your account, and an upload that exhausts its retries is reported as failed and lost. Set true only if you would rather keep the recording than hold that guarantee.

Defaultfalse
artifacts_bucket*string

The bucket to store recordings and transcripts in.

May be the same as the other buckets — object keys are prefixed with the bot id either way.

Length1 <= length <= 255
audio_chunks_bucket*string

The bucket to store audio chunks in.

May be the same as the other buckets — object keys are prefixed with the bot id either way.

Length1 <= length <= 255
endpoint*string

The S3(-compatible) endpoint to upload to.

Include the scheme. For AWS this is the regional endpoint (https://s3.<region>.amazonaws.com); for other providers use the one they document.

Formaturi
force_path_style?boolean

Use path-style addressing (https://endpoint/bucket/key) instead of virtual-hosted style (https://bucket.endpoint/key).

AWS and Scaleway work with the default; MinIO, Ceph and most self-hosted gateways require this to be true.

Defaultfalse
ingest_access_key_id*string

The access key ID of the ingest credential (needs PutObject, PutObjectTagging and AbortMultipartUpload — no read, no delete).

Length1 <= length <= 256
ingest_secret_access_key*string

The matching secret for the ingest credential.

Stored encrypted and never returned by this API — read the configuration back and you get the access key IDs only.

Length1 <= length <= 512
logs_bucket*string

The bucket to store bot logs in.

May be the same as the other buckets — object keys are prefixed with the bot id either way.

Length1 <= length <= 255
region*string

The region the buckets live in.

Length1 <= length <= 64
service_access_key_id*string

The access key ID of the service credential (needs GetObject, ListBucket, PutObject and DeleteObject).

Length1 <= length <= 256
service_secret_access_key*string

The matching secret for the service credential.

Stored encrypted and never returned by this API — read the configuration back and you get the access key IDs only.

Length1 <= length <= 512

Response Body

application/json

application/json

application/json

application/json

curl -X PUT "https://api.meetingbaas.com/v2/storage-config" \  -H "Content-Type: application/json" \  -d '{    "artifacts_bucket": "acme-meeting-artifacts",    "audio_chunks_bucket": "acme-meeting-audio-chunks",    "endpoint": "https://s3.eu-west-3.amazonaws.com",    "ingest_access_key_id": "AKIAIOSFODNN7EXAMPLE",    "ingest_secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",    "logs_bucket": "acme-meeting-logs",    "region": "eu-west-3",    "service_access_key_id": "AKIAI44QH8DHBEXAMPLE",    "service_secret_access_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"  }'
{
  "data": {
    "allow_transient_spill": true,
    "artifacts_bucket": "string",
    "audio_chunks_bucket": "string",
    "created_at": "string",
    "enabled": true,
    "endpoint": "string",
    "force_path_style": true,
    "ingest_access_key_id": "string",
    "last_error_at": "string",
    "last_error_message": "string",
    "last_verified_at": "string",
    "logs_bucket": "string",
    "region": "string",
    "service_access_key_id": "string",
    "storage_config_id": "string",
    "updated_at": "string"
  },
  "success": true
}
{
  "code": "string",
  "error": "string",
  "message": "string",
  "statusCode": 9007199254740991,
  "success": false
}
{
  "code": "string",
  "details": "string",
  "error": "string",
  "message": "string",
  "retryAfter": 9007199254740991,
  "statusCode": 9007199254740991,
  "success": false
}
{
  "code": "string",
  "details": "string",
  "error": "string",
  "message": "string",
  "statusCode": 9007199254740991,
  "success": false
}