> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.meetstream.ai/guides/features/custom-storage-configurations/overview/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.meetstream.ai/_mcp/server. # Custom Object Storage > Configure and manage Amazon S3, Alibaba Cloud OSS, or Cloudflare R2 destinations in the MeetStream dashboard. # Custom Object Storage By default, MeetStream stores recordings, transcripts, screenshots, chat logs, and meeting manifests in MeetStream-managed storage. Custom object storage sends new artifacts to a bucket you control. Your existing bot and media fetch calls continue to work. **Add and manage storage destinations in the [MeetStream dashboard](https://app.meetstream.ai).** The public API and SDK do not configure storage destinations. ## Supported providers | Dashboard provider | Storage service | Credentials | | --------------------------------- | ---------------------------------- | ------------------------------ | | Amazon S3 (`aws`) | Amazon S3 or a compatible endpoint | AWS access keys or an IAM role | | Alibaba Cloud OSS (`alibaba_oss`) | OSS through its S3-compatible API | RAM AccessKey pair | | Cloudflare R2 (`cloudflare_r2`) | R2 through its S3-compatible API | R2 S3 Access Key pair | You can save up to **10 destinations**, including more than one bucket from the same provider. One destination is the default for new bots. Manage destinations and the default in the dashboard. To use another saved destination for a bot, pass its `storage_config_id` when creating the bot. ## 1. Prepare your bucket and credentials Create a bucket in your organization's storage account. Give MeetStream credentials that can write to the configured object-key prefixes. For `read_write` mode, the credentials also need object read access. * **Amazon S3:** Create an IAM access key pair or an IAM role with access to the bucket and prefixes. See the [Amazon S3 permissions example](/guides/features/custom-storage-configurations/amazon-s3#3-grant-bucket-permissions). * **Alibaba Cloud OSS:** Create a bucket in the target region and a RAM AccessKey pair with an appropriate policy. Use the OSS region ID. See the [OSS permissions example](/guides/features/custom-storage-configurations/alibaba-cloud-oss#3-grant-bucket-permissions). * **Cloudflare R2:** Create an R2 bucket and an R2 S3 API token with **Object Read & Write** permission. Save its access keys and your Cloudflare account ID. See the [Cloudflare R2 setup guide](/guides/features/custom-storage-configurations/cloudflare-r2). ## 2. Add a destination in the dashboard 1. Open **Custom Storage** in the [MeetStream dashboard](https://app.meetstream.ai). 2. Add a destination and choose Amazon S3, Alibaba Cloud OSS, or Cloudflare R2. 3. Enter the bucket details and credentials. Optionally give the destination a name, set the access mode, and choose a base prefix or separate prefixes for audio, video, transcripts, and metadata. 4. Save the destination. MeetStream validates access before saving it. The first destination becomes the default. Adding another destination keeps the current default unless you select the new destination as the default. Use the dashboard to edit a destination, change the default, or remove one. To switch an existing destination to another provider, add a new destination. | Setting | What to enter | | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | Bucket name | Your S3, OSS, or R2 bucket name. | | Region | AWS or OSS region ID. For R2, use `auto` if the dashboard asks for a region. | | Access Key ID and Secret Access Key | Required for OSS and R2, and for S3 when using access keys. | | IAM role ARN and external ID | Required when using the Amazon S3 IAM role option. | | Cloudflare account ID | Required for R2; a 32-character hexadecimal value. | | Access mode | `read_write` by default. `write_only` is available for Amazon S3 and OSS; R2 uses `read_write`. | | Base prefix | Defaults to `meetstream`. Leading and trailing slashes are removed; `..` segments are rejected. | | Category prefixes | Optional separate prefixes for `audio`, `video`, `transcript`, and `metadata`. | | Endpoint URL | Optional HTTPS override for S3-compatible endpoints and OSS. R2 derives its endpoint from the account ID and does not accept an override. | For OSS, the default compatible endpoint is `https://s3.oss-.aliyuncs.com`. For R2, MeetStream uses `https://.r2.cloudflarestorage.com`. Keep storage credentials in the dashboard; never expose them in client code. ### Access modes and validation | Mode | Uploads | MeetStream media fetches | | ------------ | ------- | -------------------------------------------------------------- | | `read_write` | Yes | Return presigned URLs or read JSON artifacts from your bucket | | `write_only` | Yes | Return `403`; retrieve objects through your own storage access | MeetStream checks credentials and access to each configured prefix before saving a destination. Invalid credentials or missing bucket permissions prevent it from being saved. Credentials must remain valid while bots run and whenever you later fetch their artifacts. Scope policies to the prefixes you configure. Amazon S3 `read_write` needs bucket access and object read/write access; OSS can validate object operations even when a prefix-scoped policy denies `HeadBucket`. Grant object deletion where possible so temporary validation objects can be cleaned up. R2 requires successful write, read, and delete probes. ## 3. Choose a saved destination for a bot Storage setup happens in the dashboard. When creating a bot through the API, you can select one of your saved destinations with `storage_config_id`: ```json { "meeting_link": "https://meet.google.com/abc-defg-hij", "bot_name": "Meeting recorder", "storage_config_id": "storage_abc" } ``` Omit `storage_config_id` to use your default destination. If you have no custom storage configured, the bot uses MeetStream-managed storage. Changing the default later affects future bots. ## 4. Find and fetch artifacts MeetStream writes artifacts under the category's effective prefix and bot ID: ```text // ``` With the default `meetstream` prefix, audio, video, metadata, screenshots, and transcripts share a bot directory. Category prefixes let you separate them. Existing artifacts stay in the bucket and prefix used when they were processed; changing a default does not move them. Your media fetch calls do not change. In `read_write` mode, MeetStream returns provider-generated presigned URLs for recordings and reads JSON artifacts from the bucket. In `write_only` mode, MeetStream fetch endpoints return `403`. Presigned URL lifetimes vary by artifact; see [Usage & Retention](/guides/features/usage-and-retention#presigned-url-lifetimes). Call the fetch endpoint again for a fresh URL. ## 5. Manage destinations Use **Custom Storage** in the dashboard to view saved destinations, change the default, update credentials, or remove a destination. Removing the default selects the oldest remaining destination. Removing the last one returns future bots to MeetStream-managed storage. Previously written objects are not deleted. If you replace a bucket or credentials, make sure the replacement credentials can still reach earlier buckets when you need to fetch older media. ## Troubleshooting * **The dashboard cannot save a destination:** Confirm the bucket, region, credentials, and object permissions. For R2-specific checks, see [Cloudflare R2 troubleshooting](/guides/features/custom-storage-configurations/cloudflare-r2#5-troubleshooting). * **An OSS bucket fails validation:** Check the OSS region ID, RAM policy, and S3-compatible endpoint. A prefix-scoped policy may deny `HeadBucket`; grant the required object operations. * **A fetch returns `403`:** Check whether the destination is `write_only`, whether the presigned URL expired, and whether credentials still have read access. For browser requests to R2, see [Cloudflare R2 troubleshooting](/guides/features/custom-storage-configurations/cloudflare-r2#5-troubleshooting). * **Files are missing from a new bucket:** Only artifacts processed after the change use the new destination. Earlier artifacts remain in their original bucket. ## Provider references * [Alibaba Cloud: AWS SDK compatibility](https://www.alibabacloud.com/help/en/oss/developer-reference/use-aws-sdks-to-access-oss) * [Cloudflare R2: S3 API compatibility](https://developers.cloudflare.com/r2/api/s3/api/) * [Cloudflare R2: API token permissions](https://developers.cloudflare.com/r2/api/tokens/) * [Cloudflare R2: Presigned URLs](https://developers.cloudflare.com/r2/api/s3/presigned-urls/) > Meeting bot API documentation for Zoom, Google Meet and Microsoft Teams: create bots, stream real-time audio, transcribe, and run in-meeting voice agents.