> ## Documentation Index
> Fetch the complete documentation index at: https://developers.telnyx.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Cloud Storage quick start

> Quickstart for Telnyx Cloud Storage — create a bucket, generate S3-compatible credentials, and upload your first object using the AWS CLI or any S3 client.

There are five ways to get started on Telnyx cloud storage:

1. [Cloud Storage binding](/docs/cloud-storage/bindings) — from inside a Telnyx Edge Function
2. [AWS SDK](#use-the-aws-sdk)
3. [AWS CLI](#use-the-aws-cli)
4. [S3-compatible third-party tools](#use-s3-compatible-third-party-tools)
5. [Telnyx Mission Control Portal](#use-the-telnyx-mission-control-portal)

## Available Regions

| Region       | Endpoint                            |
| ------------ | ----------------------------------- |
| us-central-1 | us-central-1.telnyxcloudstorage.com |
| us-east-1    | us-east-1.telnyxcloudstorage.com    |
| us-west-1    | us-west-1.telnyxcloudstorage.com    |
| eu-central-1 | eu-central-1.telnyxcloudstorage.com |

Specify the region via the `--endpoint-url` flag in the AWS CLI or the equivalent SDK configuration. See [API Endpoints & Organization](/docs/cloud-storage/api-endpoints) for details on regional behavior.

<Note>
  Some features are currently US-only, including presigned URLs, public buckets, and SSL certificates. See the [compatibility matrix](/docs/cloud-storage/supported) for full details.
</Note>

## Use a Cloud Storage binding

Bind an existing bucket to a [Telnyx Edge Function](/docs/edge-compute/overview) and read, write, and list objects through a pre-authenticated `env` binding — the runtime injects the credential, so your code holds no S3 keys. This is the fastest path if your code already runs on Telnyx Edge Compute.

See [Use a bucket from an Edge Function](/docs/cloud-storage/bindings) to declare the binding and call `env.MY_BUCKET.get/put/head/delete/list`.

## Use the AWS SDK

Telnyx Cloud Storage is S3-compatible, so the AWS SDKs work against it. See the ready-to-run examples for [Node](/docs/cloud-storage/sdk/node), [Python](/docs/cloud-storage/sdk/python), [Java](/docs/cloud-storage/sdk/java), [Go](/docs/cloud-storage/sdk/golang), [Ruby](/docs/cloud-storage/sdk/ruby), [PHP](/docs/cloud-storage/sdk/php), [.NET](/docs/cloud-storage/sdk/dotnet), and [Elixir](/docs/cloud-storage/sdk/elixir).

## Use the AWS CLI

<Steps>
  <Step title="Install AWS CLI locally">
    Follow the procedure [here](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

    <Note>
      Use a recent AWS CLI v2. The Cloud Storage endpoint accepts the AWS CLI's default checksums (CRC64NVME) on both `put-object` and `aws s3 cp` multipart uploads.
    </Note>
  </Step>

  <Step title="Configure CLI">
    * Inject your Telnyx [API key](https://portal.telnyx.com/#/api-keys) twice, once as access key and once as secret key.
    * Leave the region as blank; regionality is specified via `--endpoint-url` as shown subsequently.

    ```json theme={null}
    user@localhost ~ % aws configure --profile mytelnyxprofile 
    AWS Access Key ID [None]: XXX
    AWS Secret Access Key [None]: XXX
    Default region name [None]: 
    Default output format [None]: json
    ```

    Validate the profile has been created successfully.

    ```json theme={null}
    user@localhost ~ % aws configure list-profiles
    mytelnyxprofile
    ```
  </Step>

  <Step title="Validate CLI configuration">
    Perform the following validation procedure to ensure everything is working as expected.

    **Create 2 buckets**

    Bucket names must be universally unique. Hence, `BucketAlreadyExists` error is expected on first attempt.

    ```json theme={null}
    user@localhost ~ % aws s3api create-bucket --bucket demo-bucket --profile mytelnyxprofile --endpoint-url https://us-east-1.telnyxcloudstorage.com
    An error occurred (BucketAlreadyExists) when calling the CreateBucket operation: Unknown
    user@localhost ~ % aws s3api create-bucket --bucket demo-bucket-n1 --profile mytelnyxprofile --endpoint-url https://us-east-1.telnyxcloudstorage.com
    user@localhost ~ % aws s3api create-bucket --bucket demo-bucket-n2 --profile mytelnyxprofile --endpoint-url https://us-east-1.telnyxcloudstorage.com
    ```

    **List buckets**

    Verify the buckets were created successfully.

    ```json theme={null}
    user@localhost ~ % aws s3api list-buckets --profile mytelnyxprofile --endpoint-url https://us-east-1.telnyxcloudstorage.com
    {
        "Buckets": [
            
            {
                "Name": "demo-bucket-n1",
                "CreationDate": "2024-07-26T17:31:14.888000+00:00"
            },
            {
                "Name": "demo-bucket-n2",
                "CreationDate": "2024-07-26T17:31:25.225000+00:00"
            }
        ],
        "Owner": {
            "DisplayName": "XXX",
            "ID": "XXX"
        }
    }
    ```

    **Add objects to a bucket**

    Upload some random objects.

    ```json theme={null}
    user@localhost ~ % aws s3api put-object --key demo-obj-101 --body ~/Downloads/IMG_1752.mov --bucket demo-bucket-n1 --profile mytelnyxprofile --endpoint-url https://us-east-1.telnyxcloudstorage.com
    {
        "ETag": "\"bc864c2bc4549d72abadb0a5d44ee788\""
    }

    user@localhost ~ % aws s3api put-object --key demo-obj-202 --body ~/Downloads/IMG_1753.mov --bucket demo-bucket-n1 --profile mytelnyxprofile --endpoint-url https://us-east-1.telnyxcloudstorage.com
    {
        "ETag": "\"bc864c2bc4549d72babdb0a5d44ee988\""
    }
    ```

    **List objects**

    Verify the objects were uploaded successfully.

    ```json theme={null}
    user@localhost ~ % aws s3api list-objects-v2 --bucket demo-bucket-n1 --profile mytelnyxprofile --endpoint-url https://us-east-1.telnyxcloudstorage.com 
    {
        "Contents": [
            {
                "Key": "demo-obj-101",
                "LastModified": "2024-07-26T17:34:52.428000+00:00",
                "ETag": "\"bc864c2bc4549d72abadb0a5d44ee788\"",
                "Size": 136994934,
                "StorageClass": "STANDARD"
            },
            {
                "Key": "demo-obj-202",
                "LastModified": "2024-07-26T17:36:31.799000+00:00",
                "ETag": "\"bc864c2bc4549d72babdb0a5d44ee988\"",
                "Size": 136994934,
                "StorageClass": "STANDARD"
            }
        ],
        "RequestCharged": null
    }
    ```
  </Step>
</Steps>

## Use S3-compatible third-party tools

Many excellent tools exist to upload data at scale without any code. You can find the configuration guides [here](https://support.telnyx.com/en/collections/3840515-telnyx-storage).

## Use the Telnyx Mission Control Portal

Follow [this support article](https://support.telnyx.com/en/articles/8344129-get-started-with-telnyx-storage-inference-guide).

<warning>
  The Mission Control Portal is not the right tool to:

  <Steps>
    <Step title="Handle uploads larger than 200 MiB">
      Use the `aws s3 cp` CLI command or [multipart upload API](/docs/cloud-storage/multipart-upload) for more concurrency, better reliability, and bigger throughput.
    </Step>

    <Step title="Move 1000+ objects efficiently">
      Use one of the S3 compatible [third party tools](https://support.telnyx.com/en/collections/3840515-telnyx-storage) when moving large object counts.
    </Step>
  </Steps>
</warning>

## Read these documentations

Some key differences exist between Telnyx cloud storage and AWS S3. It's advisable that they are reviewed and comprehended prior to Telnyx cloud storage is put into production.

* Understand [API endpoints & organizations](/docs/cloud-storage/api-endpoints)
* Review [supported API methods](/docs/cloud-storage/supported)
* Heed the [warning on presigned URL](/docs/cloud-storage/presigned-urls)
* Pay attention to [billing](/docs/cloud-storage/billing)
* Know the [restrictions on policy and ACL](/docs/cloud-storage/public-buckets)

## Additional Resources

* All available [AWS S3 CLI Commands](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/index.html)
