Skip to navigation

Amazon S3 Custom Object Storage

View as Markdown

MeetStream Guide: Amazon S3 Custom Object Storage

By default, MeetStream stores bot media—audio, video, transcripts, screenshots, chat logs, and meeting manifests—in a MeetStream-managed bucket. Fetch endpoints return presigned download URLs for those files.

Custom object storage lets you send those artifacts directly to your own storage account while keeping the same MeetStream bot and fetch APIs.

For Cloudflare R2, multiple destinations, and selecting a saved destination with storage_config_id, see Custom Object Storage.

Use the aws provider for Amazon S3 or another S3-compatible endpoint. Authenticate with an AWS access key pair or IAM role.

Configure your storage destination in the MeetStream dashboard. Artifacts written before a configuration change remain in their original bucket and prefix.

Custom storage is useful for compliance, regional data storage, lifecycle control, or direct ingestion into your data platform.


1) Prerequisites

To set up Amazon S3, you need:

  1. A bucket owned by your organization.
  2. Credentials that can write to the prefix you configure.
  3. Access to the MeetStream dashboard.

For read_write access, the credentials also need to read uploaded objects so MeetStream can generate download URLs and retrieve JSON artifacts.

Create an IAM user access key or an IAM role that has access to your bucket and configured prefix.


2) Configure custom storage

Open Custom Storage in the MeetStream dashboard, add an Amazon S3 destination, and enter your bucket, region, and credentials. Choose the access mode and object-key prefixes you need, then save the destination. Configure, update, and remove storage destinations in the dashboard; storage configuration is not available through the public API or SDK.

Dashboard settings

SettingRequiredDescription
providerYes"aws".
bucket_nameYesName of your S3 bucket.
regionYesAWS region.
access_key_idConditionalRequired with auth_method: "access_keys".
secret_keyConditionalRequired with auth_method: "access_keys".
auth_methodNo"access_keys" (default) or "iam_role".
role_arnConditionalRequired only with auth_method: "iam_role".
external_idConditionalRequired only with auth_method: "iam_role".
access_modeNo"read_write" (default) or "write_only". See Access modes.
prefixNoBase object-key prefix. Defaults to "meetstream". Leading/trailing slashes are removed and .. is rejected.
prefixesNoPer-category overrides for audio, video, transcript, and metadata. A missing category inherits prefix.
endpoint_urlNoHTTPS endpoint override that can target another S3-compatible endpoint.

Enter credentials only in the dashboard. Do not put storage secrets in client-side code.

Dashboard walkthrough

1

Open storage settings

In the dashboard, open Integrations (1), select Storage (2), and click Add Storage (3).

Storage tab with Add Storage highlighted
Integrations, Storage, and Add Storage
2

Choose Amazon S3

Select Amazon S3 from the provider picker.

Storage provider picker with Amazon S3 highlighted
Choose Amazon S3
3

Enter bucket details

Enter the bucket name (1), region (2), optional S3-compatible endpoint (3), and base prefix (4). Leave the endpoint empty for Amazon S3.

Amazon S3 storage details form
Bucket, region, endpoint, and prefix fields
4

Choose access and authentication

Set category prefixes if needed, select Read + write or Write only, and choose an IAM role or access keys. With an IAM role, enter its ARN and an external ID. A category without an override inherits the base prefix.

Amazon S3 prefixes, access mode, and IAM role fields
Prefixes, access mode, and authentication fields
5

Save the destination

If using an IAM role, copy the trust policy shown in your dashboard into that role before saving. The policy contains your external ID and MeetStream’s AWS principal. Save the destination; MeetStream validates access before accepting it.

IAM role trust policy and Save storage button
Trust policy and Save storage button

3) Grant bucket permissions

Scope policies to the configured prefix. If you use distinct category prefixes, include one object resource for each distinct prefix.

For a read_write configuration using the meetstream prefix:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::your-s3-bucket"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::your-s3-bucket/meetstream/*"
}
]
}

For write_only, remove s3:ListBucket and s3:GetObject. s3:PutObject is required; s3:DeleteObject is recommended so validation probes can be cleaned up.


4) Access modes

ModeMeetStream uploads to your bucketMeetStream fetch APIs
read_write (default)YesReturn presigned URLs or read JSON artifacts from your bucket
write_onlyYesReturn 403; retrieve objects directly through your own storage access

Use write_only when you want MeetStream to deliver files to your bucket but do not want it to read them back.

Configuration validation

MeetStream validates credentials before saving them:

  • Amazon S3 read_write configurations require HeadBucket and validate object write/read access under each configured prefix.
  • write_only configurations validate write access under each configured prefix.

Successful probes are cleaned up on a best-effort basis. Grant DeleteObject to prevent a failed cleanup from leaving a probe object behind.


5) File layout in your bucket

MeetStream writes every artifact below the resolved prefix for its category, followed by the bot ID:

<category-prefix>/<bot_id>/<artifact>

With the default prefix: "meetstream" and no per-category overrides:

meetstream/
abc123/
audio.wav
meeting_recording.mp4
manifest.json
participants.json
chats.json
screenshot/
transcription/

The provider, bucket, and category prefix used for each processed artifact are recorded with the bot or transcript. Keep credentials for earlier buckets available if you need to retrieve older media after changing a destination.


6) Fetch media after configuration

Your MeetStream API calls do not change when custom storage is enabled. With read_write, the API returns a presigned URL generated by the configured provider.

Endpointread_writewrite_only
GET /api/v1/bots/{bot_id}/get_audioPresigned mixed-audio URL403
GET /api/v1/bots/{bot_id}/get_videoPresigned recording URL403
GET /api/v1/bots/{bot_id}/get_audio_streamsPer-participant audio URLs, when requested for the bot403
GET /api/v1/bots/{bot_id}/get_recording_streamsPer-participant video URLs, when requested for the bot403
Screenshot, chat, participant, manifest, and transcript fetch endpointsRead from the configured bucket403

Presigned URL lifetimes vary by artifact; see Usage & Retention. Call the fetch endpoint again for a fresh URL.


7) View, change, or delete configuration

Use Custom Storage in the MeetStream dashboard to view, change, or remove a destination. Removing a configuration affects future processing; it does not delete objects already written to your bucket.


8) Troubleshooting

A fetch endpoint returns 403 with "access_mode": "write_only"

The configured provider is intentionally write-only. Download the object through your own storage workflow, or update it to read_write with read permissions.

A presigned URL returns 403

  • It may have expired; fetch a new one from MeetStream.
  • Verify the configured credentials still have object read access.

Files are not in the newly configured bucket

Only artifacts processed after a configuration change use the new destination. Existing artifacts remain in their original bucket.