Skip to main content

Telnyx Storage: Object Storage — Full Documentation

Complete page content for Object Storage (Storage section) of the Telnyx developer docs (https://developers.telnyx.com). Root index: https://developers.telnyx.com/llms.txt · Lightweight index for this subsection: https://developers.telnyx.com/development/llms/storage-object-storage-llms-txt.md

Overview

Overview

Source: https://developers.telnyx.com/docs/cloud-storage/overview.md
S3-compatible object storage for files, media, backups, and static assets — reached over the AWS S3 API you already know, or directly from inside a Telnyx Edge Function. With Telnyx Cloud Storage, you can:
  • Use your existing S3 tooling — the AWS SDKs, AWS CLI, and third-party S3 clients work unchanged; authenticate with your Telnyx API key
  • Store data in the US, EU, or AP — buckets in us-central-1, us-east-1, us-west-1, eu-central-1, and ap-southeast-1
  • Reach buckets from Edge Compute — bind a bucket to a function and read or write objects with no S3 keys in your code
  • Control access and lifecycle — presigned URLs, public buckets, object lock and retention, SSE-C encryption, and lifecycle rules
  • Pay for what you use — a monthly free tier plus simple usage-based pricing Create a bucket, generate S3 credentials, and upload your first object Bind a bucket and read or write objects with no S3 keys in your code Copy-paste examples for Node, Python, Java, Go, Ruby, PHP, .NET, and Elixir Regional endpoints and how requests are routed

Ways to access

From inside a Telnyx Edge Function — pre-authenticated, no S3 keys Node, Python, Java, Go, Ruby, PHP, .NET, or Elixir Scripting and one-off operations from a terminal Move data at scale without code

Learn the essentials

Some behavior differs from AWS S3 — review these before going to production:

Get Started

Quick Start Guide

Source: https://developers.telnyx.com/docs/cloud-storage/quick-start.md
There are five ways to get started on Telnyx cloud storage:
  1. Cloud Storage binding — from inside a Telnyx Edge Function
  2. AWS SDK
  3. AWS CLI
  4. S3-compatible third-party tools
  5. Telnyx Mission Control Portal

Available Regions

Specify the region via the --endpoint-url flag in the AWS CLI or the equivalent SDK configuration. See API Endpoints & Organization for details on regional behavior. Some features are currently available only in US and APAC regions, including presigned URLs, public buckets, and SSL certificates. EU buckets do not support these features. See the compatibility matrix for full details.

Use a Cloud Storage binding

Bind an existing bucket to a Telnyx Edge Function 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 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, Python, Java, Go, Ruby, PHP, .NET, and Elixir.

Use the AWS CLI

Follow the procedure here. 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.
  • Inject your Telnyx API key twice, once as access key and once as secret key.
  • Leave the region as blank; regionality is specified via --endpoint-url as shown subsequently.
Validate the profile has been created successfully.
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.
List buckets Verify the buckets were created successfully.
Add objects to a bucket Upload some random objects.
List objects Verify the objects were uploaded successfully.

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.

Use the Telnyx Mission Control Portal

Follow this support article. The Mission Control Portal is not the right tool to: Use the aws s3 cp CLI command or multipart upload API for more concurrency, better reliability, and bigger throughput. Use one of the S3 compatible third party tools when moving large object counts.

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.

Additional Resources


Concepts

API Endpoints & Organization

Source: https://developers.telnyx.com/docs/cloud-storage/api-endpoints.md
There exists two suites of Storage APIs:
  • S3 compatible, and
  • JSON companion

S3 Compatible APIs

This suite of APIs is compatible with AWS S3; as a result, minimal changes to existing integration are needed for migration to Telnyx. Endpoint URL Region us-central-1.telnyxcloudstorage.com us-central-1 us-east-1.telnyxcloudstorage.com us-east-1 us-west-1.telnyxcloudstorage.com us-west-1 eu-central-1.telnyxcloudstorage.com eu-central-1 ap-southeast-1.telnyxcloudstorage.com ap-southeast-1 ListBuckets and GetBucketLocation are global: any regional endpoint returns every bucket in your account regardless of the region it is homed in. However, all other API methods need to be directed at the regional endpoint that the bucket is homed. Otherwise an error will be returned. Hence, it is advisable to query the location of the bucket first before forming the correct regional endpoint for all subsequent API operations. Supported S3 APIs are documented in this table.

JSON Companion API

This suite of APIs is an extension to the S3 API, accommodating the following functionalities: API endpoint to be used is api.telnyx.com.

Authentication

Source: https://developers.telnyx.com/docs/cloud-storage/authentication.md
API requests are authenticated with API Keys. Telnyx Storage requires passing an AWS Signature Version 4 authorization header in the API request. Telnyx Storage also requires that the Telnyx API key is substituted into the authorization header as the access-key-id. When an API request is made, Telnyx will parse the API key from the header, validate it, and then authorize the request. The remaining components of the authorization header (date, aws-region, aws-service, secret-key) are irrelevant to us. These values, as well as the generated signature from the secret key are all ignored. They only remain in the authorization header to maintain S3 compatibility. As long as you are passing an AWS Signature Version 4 authorization header, and the Telnyx API key is substituted into the header as the access-key-id, the request can be authenticated. An example is shown below, where {{your_telnyx_api_key_here}} is where you will substitute in your Telnyx API Key:
After pasting the above content, remove any new line added.

AWS CLI and S3 third party applications

A general rule of thumb when trying to use Telnyx Storage with a third party application is:
  • Access Key → substitute in the Telnyx API token
  • Secret Access Key → either leave blank, or type something random in as a placeholder, or duplicate Telnyx API tokens

Bucket Addressing

Source: https://developers.telnyx.com/docs/cloud-storage/bucket-addressing.md

Path-style requests

https://[region].telnyxcloudstorage.com/[bucketname]/[objectname]

Virtual-hosted-style requests

https://[bucketname].[region].telnyxcloudstorage.com/[objectname]

Access via S3 API

Node.js

Source: https://developers.telnyx.com/docs/cloud-storage/sdk/node.md
Recent AWS SDK v3 versions work against Cloud Storage with default checksum settings. If you hit a checksum error on an older v3 release, set all checksum calculation and validation options to WHEN_REQUIRED (as shown in the client config below). The following example shows how the AWS Node.js SDK can be used to interact with Telnyx Cloud Storage.

Python

Source: https://developers.telnyx.com/docs/cloud-storage/sdk/python.md
Recent boto3 versions (1.36+) work against Cloud Storage with default checksum settings. If you hit a checksum error, disable checksum calculation and verification with the Config shown below. The following example shows how AWS Python SDK can be used to interact with Telnyx Cloud Storage.

Java

Source: https://developers.telnyx.com/docs/cloud-storage/sdk/java.md
If you hit a checksum error with AWS SDK for Java v2 (2.30+), set request checksum calculation and response checksum validation to WHEN_REQUIRED, as shown in the client builder below. The following example shows how AWS Java SDK can be used to interact with Telnyx Cloud Storage.

Add Dependency

Create S3 Bucket

Upload an Object

List Objects

Download Object

Generate Presigned URLs for Upload and Download

In order for this part to work, we will need to add json decoding library and http client. Any libraries will do, but for this example we picked: gson and okhttp3.

Go

Source: https://developers.telnyx.com/docs/cloud-storage/sdk/golang.md
The following example shows how AWS Golang SDK can be used to interact with Telnyx Cloud Storage.
Run the program.

Ruby

Source: https://developers.telnyx.com/docs/cloud-storage/sdk/ruby.md
The following example shows how AWS Ruby SDK can be used to interact with Telnyx Cloud Storage.

PHP

Source: https://developers.telnyx.com/docs/cloud-storage/sdk/php.md
The following example shows how AWS PHP SDK can be used to interact with Telnyx Cloud Storage.

.NET

Source: https://developers.telnyx.com/docs/cloud-storage/sdk/dotnet.md
Chunk encoding is not supported by the Cloud Storage API. Please set putObjectRequest.UseChunkEncoding = false. The following example shows how AWS .Net SDK can be used to interact with Telnyx Cloud Storage.

Elixir

Source: https://developers.telnyx.com/docs/cloud-storage/sdk/elixir.md
The following example shows how AWS Elixir SDK can be used to interact with Telnyx Cloud Storage. This example requires the following dependencies be added to your mix.exs file
For generating presigned URLs, the below example requires the following additional libraries added to your mix.exs file

Third Party Applications

Source: https://developers.telnyx.com/docs/cloud-storage/third-party.md
All S3 third-party tools, applications, clients, and libraries can be used to interact with Telnyx Cloud Storage. This includes popular applications like Cyberduck, S3 Browser, Wal-G, and many others. Visit our support page to find configuration guides for many of these commonly used third-party tools. If you don’t see a guide for a particular application, please don’t hesitate to reach out to us through our contact page. We would be happy to create a configuration guide for you.

Access from Edge Compute

Edge Function Binding

Source: https://developers.telnyx.com/docs/cloud-storage/bindings.md
A Cloud Storage binding gives a Telnyx Edge Function a pre-authenticated handle to one of your buckets. You declare the binding in func.toml; the runtime resolves it to env. and injects the credential — your code holds no access key or secret key, and nothing sensitive appears in your bundle or logs. The handle is a small, focused surface — get, put, head, delete, list. It is the in-function counterpart of the S3-compatible API: same buckets, same objects, reached from inside a function instead of over HTTP. Cloud Storage bindings are TypeScript-only — the typed env handle comes from the @telnyx/edge-runtime SDK (≥ 0.5.0). Other runtimes (JS, Go, Python) don’t get a typed binding. This guide builds one complete function end to end: a small file API backed by a bucket — PUT, GET, and DELETE an object by key, and list objects by prefix.

1. Scaffold the function

Create a TypeScript function. You also need an existing bucket for it to use — the binding points at a bucket, it doesn’t create one. If you don’t have one, create it first via the Mission Control portal, the AWS CLI, or an S3 SDK.

2. Declare the binding

Add a [storage.cloudstorage.] block to the generated func.toml. The block key is a name you choose — it becomes the property on env. Here it’s ASSETS, reached as env.ASSETS:
Declare more than one bucket by adding more blocks — each [storage.cloudstorage.] becomes env..

3. Install and generate types

new-func already lists @telnyx/edge-runtime and @aws-sdk/client-s3 in package.json. Install them, then generate the typed env:
telnyx-edge types writes telnyx-env.d.ts, which types env.ASSETS as CloudStorageBucket so the calls below type-check.

4. Write the function

Replace index.ts with the complete file API. Every bucket operation — list, put, get, delete — goes through env.ASSETS; there are no credentials anywhere in the code.

5. Ship it

When the deploy finishes, get the function’s invoke URL:

6. Try it

With URL set to your function’s invoke URL:

Beyond the basics

This file API sticks to the core get/put/delete/list calls. The same binding also does ranged and conditional reads, batch delete, hierarchical (folder) listing, multipart uploads for objects past the request/response size cap, and SSE‑C customer-key encryption — all on env.. See the Binding API reference for every method, option, and object type.

Binding API Reference

Source: https://developers.telnyx.com/docs/cloud-storage/bindings/reference.md
env. (a CloudStorageBucket) is the in-function handle to a Cloud Storage bucket, declared with a [storage.cloudstorage.] block. It’s a pre-authenticated wrapper over the bucket — the runtime injects the credential, so your code holds no S3 access key or secret key. This reference tracks @telnyx/edge-runtime ≥ 0.5.0. Ranged and conditional reads, batch delete, hierarchical listing, SSE-C, and the version / writeHttpMetadata object fields need ≥ 0.4.0; multipart uploads need ≥ 0.5.0.
Key behaviors:
  • Missing keys read as nullget and head resolve to null for a key that doesn’t exist, not an error.
  • A failed conditional read returns a body-less object — when a get onlyIf precondition isn’t met, get resolves to a plain CloudStorageObject (metadata only, no body and no readers) so you can reuse your cached copy. Check for a body before reading it.
  • delete is idempotent — deleting a missing key (single or in a batch) succeeds and resolves to void.
  • put returns partial metadata — the resolved object carries key, etag, httpEtag, version, and any metadata you set, but not size or uploaded. Use head to read those after a write.
  • Custom metadata keys are lower-cased on readx-amz-meta-* header names are stored lower-cased, so customMetadata keys come back lower-cased (uploadedByuploadedby).
  • SSE-C applies to US and APAC (ap-southeast-1) region bucketsssecKey is honored for buckets in US regions.

get(key, options?)

Read an object and its body. Returns null if the key does not exist.
A successful read returns a CloudStorageObjectBody — a CloudStorageObject plus the body stream and one-shot readers arrayBuffer(), text(), json(), and blob().

Ranged reads

Pass range to fetch part of an object instead of the whole thing — byte-range streaming, reading a header, or resuming a download. The resolved object echoes the requested range.

Conditional reads

Pass onlyIf to read only when a precondition holds — cache revalidation and “only fetch if changed.” A CloudStorageConditional maps to If-Match / If-None-Match / If-Unmodified-Since / If-Modified-Since; you can also pass a Headers object directly.
Conditional writes are not supported — onlyIf applies to get/head only.

put(key, body, options?)

Write an object. Resolves to a CloudStorageObject describing the write.
The resolved object carries key, etag (unquoted MD5 for a single-part write), httpEtag (the quoted, header-ready form), version (when bucket versioning is enabled), and the metadata you set. size and uploaded are not populated on the put result — read them back with head if you need them.

head(key, options?)

Read an object’s metadata without its body. Returns null if the key does not exist. Accepts the same onlyIf preconditions as get.
Unlike put, head returns the full CloudStorageObject including size and uploaded.

delete(key | keys)

Remove one object, or many in a single call. Idempotent — deleting a missing key resolves normally.
Passing an array maps to a single S3 batch delete. Deleting more than 1000 keys splits into 1000-key batches automatically.

list(options?)

Enumerate objects (metadata only — list does not return bodies).
When truncated is true, pass the returned cursor back in list({ cursor }) to fetch the next page. By default a list entry carries only key, size, etag, and uploaded. Pass include to also populate httpMetadata and/or customMetadata on each returned object — a heavier listing, so ask for it only when you need it.

Hierarchical (“folder”) listing

Set delimiter to / to browse one level of a key hierarchy: keys below the current level collapse into delimitedPrefixes, and only keys directly at the level appear in objects.

Multipart upload

Upload a large object in parts from inside a function — for objects past the Edge Compute request/response size cap, or for parallel/resumable uploads. Available on US and APAC (ap-southeast-1) region buckets.
  • createMultipartUpload(key, options?) starts the upload and returns a handle. options takes the same httpMetadata / customMetadata / ssecKey as put.
  • uploadPart(partNumber, body, options?) uploads one part and returns its { partNumber, etag }. Parts are numbered from 1; every part except the last must be at least 5 MiB.
  • complete(parts) assembles the object. You may pass the parts in any order — they’re sorted by partNumber.
  • abort() discards an in-progress upload and its parts.
  • resumeMultipartUpload(key, uploadId, options?) rebuilds a handle for an existing uploadId (no server round-trip) so you can upload more parts or complete()/abort() from a later invocation.

Server-side encryption (SSE-C)

Pass ssecKey on get, put, and multipart calls to encrypt with a customer-provided key. The key is a 256-bit (32-byte) AES key, given as an ArrayBuffer or a 64-character hex string. Supply the same key on read that you used on write; the object exposes ssecKeyMd5 (hex) so you can identify which key encrypted it. SSE-C applies to US and APAC (ap-southeast-1) region buckets.

Object types

head and each list entry populate size and uploaded; put’s result does not. The body readers on CloudStorageObjectBody consume the stream once — call a single one per get, and bodyUsed flips to true once you do. writeHttpMetadata is handy for serving an object straight back out of a function with its stored headers:

Features

Multipart Upload

Source: https://developers.telnyx.com/docs/cloud-storage/multipart-upload.md
Large objects should be uploaded to your bucket via multipart upload.

Using AWS CLI

Assuming you have AWS CLI set up already:
where
  • ~/Projects/s3-test/testdata/10Gfile is the path to the raw bytes stored locally
  • s3://target-bucket/10Gfile is the target bucket name and the object key (aka object name)
Depending on your environment, you may achieve throughput between 20 MiB/s (locally on a home network) to upward of 100+ MiB/s (on a lab or production network in a data center.)

Using AWS API/SDK

The general procedure to use the API/SDK is as follows: Initiate the upload session with CreateMultipartUpload. Stream each chunk with UploadPart. Finalize the transfer by calling CompleteMultipartUpload.

Presigned URLs

Source: https://developers.telnyx.com/docs/cloud-storage/presigned-urls.md
This is currently supported for buckets located in the US and APAC (ap-southeast-1). We do NOT follow how AWS does authentication — hence, you MUST NOT use the existing AWS SDK or CLI to generate presigned URLs. Otherwise, you will expose your API key to the public. Please use the JSON companion API to generate ephemeral presigned URLs to allow anonymous downloads and uploads of objects to your bucket(s). In addition, creating long-lived presigned URL is a privileged action. Non-verified accounts are limited to presigned URLs with TTL no greater than 5 minutes. To verify your account, request and obtain Level 2 verification status.

Examples

Considering 8f0nh1jk8qvf as an example of a presigned URL token, you can perform the following actions:

Downloading an object using a presigned URL

Uploading an object using a presigned URL

where a-new-object.bin is the file you want to upload in my-bucket. If the object already exists, it will be overwritten.

Object Encryption

Source: https://developers.telnyx.com/docs/cloud-storage/object-encryption.md
This is supported for buckets located in the US and APAC (ap-southeast-1). On EU buckets the SSE-C headers are silently ignored: the object is stored unencrypted and can be retrieved without the key. We support SSE-C. Here is an example on how to PutObject with encryption.

PutObject with SSE-C

Don’t forget to update --sse-customer-key here.

Public Buckets

Source: https://developers.telnyx.com/docs/cloud-storage/public-buckets.md
This is currently supported for buckets located in the US and APAC (ap-southeast-1). Making a bucket public (via policy or ACL) is a privileged action. Follow the following procedure: Request and obtain Level 2 verification status. Use the CLI, API, or SDK to apply the desired policy to your bucket.

HTTPS with Custom Domain

Source: https://developers.telnyx.com/docs/cloud-storage/ssl-certificates.md
This is currently supported for buckets located in the US and APAC (ap-southeast-1).

1. Validate availability of bucket

You must ensure the subdomain is available as a bucket name. If so, you may create the bucket. In this example, we created asset.gardening-homes.com. SSL Certificate 1

2. Make the bucket public

Since the content of this bucket will be publicly accessible, you need to apply a public read policy to it. Follow the instructions here: Put Bucket Policy SSL Certificate 2

3. Configure DNS

Through your domain/DNS provider, you need to set up an alias to the bucket with virtual addressing style (Bucket Addressing) SSL Certificate 3

4. Upload Certificate and Matching Key

Select the bucket you created, under SSL/TLS, upload the certificate and matching key. SSL Certificate 4 When uploading a certificate file, please ensure the following:
  • The bucket name must match one of the certificate SNIs (Server Name Indication) exactly. If you have a wildcard SNI *.example.com, help.example.com will work, but example.com will not work.
  • If you have intermediate certificates, you must include them in the certificate file with the leaf certificate being at the top.
  • You may omit the root certificate, as we will verify known root certificates automatically. However, if you’d like to guarantee that your certificate will be accepted, it is better to include it.

5. Test

Assuming all of the above is successful and there is an object named demo-image.jpg in the bucket, you may put https://asset.gardening-homes.com/demo-image.jpg in your browser and expect the following
  • The image shows up in your browser, and
  • Your browser will show “Connection is secure” and “Certificate is valid”
SSL Certificate 5

Data Protection & Retention

Source: https://developers.telnyx.com/docs/cloud-storage/lock-and-retention.md
This is currently supported for buckets located in the US and APAC (ap-southeast-1). To enable this feature, object lock MUST be enabled at bucket creation time.
Confirm this is set properly.
Versioning is automatically enabled as a result.
Upload an object.
Now set the object retention policy.
And confirm it’s set properly.
Deleting the object produces an expected error.
For additional information, please consult S3’s API reference.

Emptying Buckets

Source: https://developers.telnyx.com/docs/cloud-storage/emptying-bucket.md
When a bucket has more than 1000 objects, it’s burdensome to empty it synchronously. The best solution is to take advantage of lifecycle rules which asynchronously operate on destination bucket. Here is a sample lifecycle rule

Sample lifecycle rule

Name that file as lifecycle.json and you can apply that to the bucket you intend to empty ---
You can verify that it’s applied correctly the following way.
Check on your bucket after 24 hours to validate it’s being cleared.

Compatibility & Migration

AWS S3 Compatibility

Source: https://developers.telnyx.com/docs/cloud-storage/aws-s3-compatibility.md
This table documents all the supported S3 APIs. When an unsupported API method is invoked, an S3-compatible, XML-formatted NotImplemented error response is returned. For the supported API methods documented, not all of the AWS S3 parameters, headers, and body XML elements are supported.

AWS S3 PutObject

For example, AWS S3 PutObject supports many headers. However, we only support what’s documented under the PutObject section. They are unsupported by default unless otherwise explicitly specified.

Compatibility Matrix

Source: https://developers.telnyx.com/docs/cloud-storage/supported.md

Migration from AWS S3

Source: https://developers.telnyx.com/docs/cloud-storage/migrating-from-aws.md
The migration API moves all data from a source AWS S3 bucket to a destination Telnyx Storage bucket without the user incurring a data egress charge by AWS. This is currently supported for buckets located in the US and APAC (ap-southeast-1).

Feature

The owner of the AWS account does not get charged by AWS on data transfer to Telnyx when this API is employed.

Achieving minimal costs

There are 3 components to this data pipeline: User’s AWS S3 bucket in AWS Region X. Telnyx’s migration engine in the same AWS Region X. Telnyx’s direct connects with AWS used to transfer the data. Cost minimization is achieved via the following billing practices by AWS. Intra-region data transfer between S3 and EC2, within the same account, or across different accounts, is free of charge. Intra-region-Data-Transfer-1 Source: AWS S3 Pricing Intra-region-Data-Transfer-2 Source: AWS S3 FAQ Hence, depending on the region of the source AWS S3 bucket, the API will select the co-located migration engines to best take advantage of this billing practice. Data Transfer Out (DTO) over AWS Direct Connect within the same geopolitical region is heavily discounted in comparison to DTO over the internet. Intra-region-Data-Transfer-3 Source: AWS Direct Connect Telnyx’s infrastructure is multi-cloud and multi-region with PoPs in multiple geopolitical regions. AWS Direct Connect is one of the components of that architecture. As a result, the migration API takes advantage of the discounted rate of DTO within the same geopolitical region to move data off AWS into Telnyx.

AWS S3 vs Telnyx Storage Costs Revisited

Assume a user has the following pattern in us-east-2 Ohio. Intra-region-Data-Transfer-4 Ignoring API operations since those costs are marginal, this is their costs breakdown. In the Appendix, you can see these costs are corroborated by AWS Cost Calculator. Intra-region-Data-Transfer-5 With the migration API, data can be moved to Telnyx without egress charge from AWS. The post migration costs are as follows. Intra-region-Data-Transfer-6 We are offering this API free of charge to users in its beta stage. In the future, we will require minimum storage duration to offset the costs we incur with AWS for DTO over Direct Connect.

API Concepts and Procedure

Coverage

This API shows you the supported AWS S3 regions. Prior to using the API for migration, ensure the AWS S3 bucket you want to migrate is among the supported regions.

Migration Sources

Only standard class is supported. Restore data in glacier before attempting migration. This API allows you to define the source bucket in AWS. In order to use this API, you need to provide it with a pair of AWS access key and secret access key. We advise you to create an IAM role with a Read Only user for this purpose.
The following errors might be possible —

Migrations

Lastly, you can create a migration. If the target bucket doesn’t exist, the API will attempt to create it for you. If the desired bucket name is not available or invalid, you will receive an error right away. In addition, you do not have to match source bucket region to target bucket region; in other words, you can migrate data from an AWS source bucket in us-west-1 to Telnyx target bucket in us-east-1. You will not be charged for DTO by AWS as the API will use a migration engine in us-west-1. When the refresh parameter is set to false, a one time migration will be created. Otherwise, the API will periodically synchronize the source and destination bucket.

Checking Migration Progress

You can periodically poll the API to see its status.
Alternatively, check in on the metric of the target bucket. When it’s reached the expected size or all the objects appear in there, the migration is complete. Intra-region-Data-Transfer-7

Platform

Limits & Quotas

Source: https://developers.telnyx.com/docs/cloud-storage/limits.md

General API limits

These limits are subject to change. If you require higher throughput, please contact support to discuss your use case.

Specific limits

  • Max count of buckets per account is 100
  • Max size of single object upload via PUT request is 5 GB
  • Max size of single part upload of a multi-part upload is 5 GB
  • Min size of single part upload of a multi-part upload is 5 MiB, except for the final part
  • Max count of parts of a multi-part upload is 10,000
  • Max size of a completed multi-part upload is 5 TiB
  • Max count of objects per bucket is 50 million

Billing & Pricing

Source: https://developers.telnyx.com/docs/cloud-storage/billing.md
You are billed on two things
  • The bytes stored
  • The count of API operations invoked

Storage billing explained

The minimum billable object size is 4 KiB. Here is an example — if you have two 11-byte objects in a bucket, they will be counted as 4 KiB each, i.e. 8 KiB in total.  Storage consumed by each bucket is billed in multiples of 4 KiB, rounded up; Metadata counts towards storage consumed.

US Storage

Every month, your first 10 GiB is free of charge. Any bytes beyond that are billed at:
  • $0.006 per GiB per month for regular storage
  • $0.60 per GiB per month for AI embedded storage

EU Storage

EU storage has no free tier and is billed at:
  • $0.025 per GiB per month for regular storage
  • $0.60 per GiB per month for AI embedded storage
Bytes stored across all buckets are recorded hourly. Usage is subsequently calculated and debited from your balance.  Here is a hypothetical example:
  • You have a $10 balance in your account.
  • At time t, you uploaded 11 GiB of objects into various buckets in your account.
  • At the next whole clock hour after time t
    • a snapshot of your total storage is recorded as 11 GiB
    • your usage is calculated as (11 GiB - 10 GiB) x ($ 0.006 / 30 days / 24 hrs)
    • that usage is then debited from your $10 balance
Lastly, free tier is not available to an account if its available credit is negative. Here is a hypothetical example:
  • You have a $10 balance in your account
  • Through usage of Voice and Messaging API, you’ve depleted your balance and resulted in a negative available credit of -0.1 USD.
  • You will not be able to create a bucket and upload objects until your available credit is restored.

API operations billing explained

API operations are classified and billed the following way —

US Storage

Categories Applicable API Ops Prices Class A PUT, COPY, POST, LIST requests Every month, the first 1 Million is free of charge, thereafter 0.50per1MillionClassBGET,SELECT,andallotherrequestEverymonth,thefirst10Millionisfreeofcharge,thereafter0.50 per 1 Million Class B GET, SELECT, and all other request Every month, the first 10 Million is free of charge, thereafter 0.04 per 1  Million

EU Storage

Categories Applicable API Ops Prices State-change operations PUT, COPY, POST, LIST requests 5.00per1MillionReadoperationsGET,SELECT,andallotherrequests5.00 per 1 Million Read operations GET, SELECT, and all other requests 0.40 per 1 Million

Account suspension and loss of data

When an account’s available credit becomes negative:
  • You will be notified via email of insufficient balance.
  • Your data is still retained in the system but API requests will fail with error message UserSuspended.
  • Access will be restored when available credit is made positive via payment.
If available credit remains negative for 30 days, your account will be abolished. As a consequence, all data will be irreversibly purged.

Relevant companion APIs

Two companion APIs exist to allow for querying of usage:
  • Bucket Snapshot is a snapshot of the bytes your bucket is taking up at the moment of query.
  • API Usage shows the stats of your API requests.

Query bucket snapshot

Example Request
Example Response

Query API usage

Example Request
Example Response

Performance Benchmarks

Source: https://developers.telnyx.com/docs/cloud-storage/performance-benchmarks.md

Storage benchmark summary

We achieved the following throughput results given the bench test setup described in the subsequent sections.
  • PutObject Aggregate: 2.029 GiB/s
  • GetObject Aggregate: 2.714 GiB/s
A few disclaimers
  • We did not exhaustively search the client configuration that produces the highest achievable throughputs.
  • This result is only indicative of what can be achieved with the available testbed hardware specifications and arrangement.
  • The test clients are not subjected to the limits outlined in the previous section.
  • As we launch new sites, we will continuously update our test results and methodology. 

Benchmark environment explained

Client hardware 

(8) of the following bare metal machines are used as clients initiating requests to one of the regional endpoints. They are located off network with 100 Gbps uplink to the public internet. Type Count of nodes CPU Mem Storage Network Type 1 4 64 2 TiB 4 x 6.4TiB NVMe 100 Gbps Type 2 4 32 2 TiB 1 x 960GiB NVMe 100 Gbps No special optimizations are made on the client OS. 

Benchmark Software

https://github.com/wasabi-tech/s3-benchmark

Client Setup

Each client bare metal reads and writes to their individual bucket.

Results

Put Object Aggregate Throughput Get Object Aggregate Throughput

API Reference (S3-Compatible)

Create bucket

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/create-bucket.md

CreateBucket

CreateBucket - Amazon Simple Storage Service

Supported headers and XML elements

✅Supported Headers x-amz-acl
  • private
  • public-read
✅Supported XML Element
  • LocationConstraint
Example request
Bucket’s location is inherited from the regional endpoint to which you sent the CreateBucket request. If LocationConstraint is specified in the request body, its value must match that of the location in the regional endpoint. Otherwise, an error will be returned.
In general, bucket names should follow domain name constraints. Bucket names
  • must be unique.
  • cannot be formatted as IP address.
  • can be between 3 and 63 characters long.
  • must not contain uppercase characters or underscores.
  • must start with a lowercase letter or number.
  • can contain a dash (-).
  • must be a series of one or more labels. Adjacent labels are separated by a single period (.). Bucket names can contain lowercase letters, numbers, and hyphens. Each label must start and end with a lowercase letter or a number.
Otherwise the following error will be returned

Delete bucket

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/delete-bucket.md

DeleteBucket

DeleteBucket - Amazon Simple Storage Service

Example DeleteBucket request


Delete bucket CORS

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/delete-bucket-cors.md

DeleteBucketCors

Example DeleteBucketCors request


Delete bucket lifecycle

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/delete-bucket-lifecycle.md

DeleteBucketLifecycle

DeleteBucketLifecycle - Amazon Simple Storage Service

Example DeleteBucketLifecycle request


Delete bucket policy

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/delete-bucket-policy.md

DeleteBucketPolicy

DeleteBucketPolicy - Amazon Simple Storage Service

Example DeleteBucketPolicy request


Delete bucket tagging

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/delete-bucket-tagging.md

DeleteBucketTagging

DeleteBucketTagging - Amazon Simple Storage Service

Example DeleteBucketTagging request


Get bucket ACL

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/get-bucket-acl.md

GetBucketAcl

GetBucketAcl - Amazon Simple Storage Service

Example GetBucketAcl request

Example GetBucketAcl Response


Get bucket CORS

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/get-bucket-cors.md

GetBucketCors

Example GetBucketCors request


Get bucket lifecycle configuration

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/get-bucket-lifecycle-configuration.md

GetBucketLifecycleConfiguration

GetBucketLifecycleConfiguration - Amazon Simple Storage Service

Example GetBucketLifecycleConfiguration request

Example GetBucketLifecycleConfiguration response


Get bucket location

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/get-bucket-location.md

GetBucketLocation

GetBucketLocation - Amazon Simple Storage Service

Example GetBucketLocation request

Example GetBucketLocation response


Get bucket policy

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/get-bucket-policy.md

GetBucketPolicy

GetBucketPolicy - Amazon Simple Storage Service

Example GetBucketPolicy request


Get bucket policy status

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/get-bucket-policy-status.md

GetBucketPolicyStatus

GetBucketPolicyStatus - Amazon Simple Storage Service

Example GetBucketPolicyStatus request


Get bucket tagging

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/get-bucket-tagging.md

GetBucketTagging

GetBucketTagging - Amazon Simple Storage Service

Example GetBucketTagging request

Example GetBucketTagging response


Get bucket versioning

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/get-bucket-versioning.md

GetBucketVersioning

GetBucketVersioning - Amazon Simple Storage Service

Example GetBucketVersioning request

Example GetBucketVersioning response


Head bucket

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/head-bucket.md

HeadBucket

HeadBucket - Amazon Simple Storage Service

Example HeadBucket request

Example HeadBucket response


List buckets

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/list-bucket.md

ListBuckets

ListBuckets - Amazon Simple Storage Service

Example ListBuckets request

Example ListBuckets response


Put bucket ACL

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/put-bucket-acl.md

PutBucketAcl

Warning: Only verified users can update bucket policy. To request KYC on your account, go to Portal Account Verifications PutBucketAcl - Amazon Simple Storage Service ✅ Supported Headers x-amz-acl
  • private
  • public-read

Example PutBucketAcl request


Put bucket CORS

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/put-bucket-cors.md

PutBucketCors

Example PutBucketCors request

Prepare a JSON file like this

Then apply it to the target bucket


Put bucket lifecycle configuration

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/put-bucket-life-cycle-configuration.md

PutBucketLifecycleConfiguration

PutBucketLifecycleConfiguration - Amazon Simple Storage Service ✅ Supported XML Elements
  • ID
  • Status
  • Prefix
  • Expiration
  • AbortIncompleteMultipartUpload

Example PutBucketLifecycleConfiguration request — Non-versioned bucket

Example PutBucketLifecycleConfiguration request - versioned bucket


Put bucket policy

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/put-bucket-policy.md

PutBucketPolicy

PutBucketPolicy - Amazon Simple Storage Service Warning: Only verified users can update bucket policy. To request KYC on your account, go to Portal Account Verifications

Example PutBucketPolicy request

Create a bucket where the objects stored in there can be read publicly without authentication Create a JSON file locally, e.g. public_read_policy.json

Prepare a JSON file like this

Then apply that to an existing bucket


Put bucket tagging

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/put-bucket-tagging.md

PutBucketTagging

PutBucketTagging - Amazon Simple Storage Service

Example PutBucketTagging request


Put bucket versioning

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/bucket-operations/put-bucket-versioning.md

PutBucketVersioning

PutBucketVersioning - Amazon Simple Storage Service ✅ Supported XML element
  • Status

Example PutBucketVersioning request


Delete object

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/object-operations/delete-object.md

DeleteObject

DeleteObject - Amazon Simple Storage Service

Example DeleteObject Request


Delete object tagging

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/object-operations/delete-object-tagging.md

DeleteObjectTagging

DeleteObjectTagging - Amazon Simple Storage Service

Example DeleteObjectTagging request


Delete objects

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/object-operations/delete-objects.md

DeleteObjects

DeleteObjects - Amazon Simple Storage Service

Example DeleteObjects request (using AWS S3 CLI)

  • Originally 3 objects exists in this bucket
  • Delete 2 objects

Get object

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/object-operations/get-object.md

GetObject

GetObject - Amazon Simple Storage Service ✅ Supported Headers
  • If-Match``If-Modified-Since
  • If-None-Match
  • If-Unmodified-Since
  • Range

Example GetObject request


Get object ACL

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/object-operations/get-object-acl.md

GetObjectAcl

GetObjectAcl - Amazon Simple Storage Service

Example GetObjectAcl request

Example GetObjectAcl response


Get object tagging

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/object-operations/get-object-tagging.md

GetObjectTagging

GetObjectTagging - Amazon Simple Storage Service

Example GetObjectTagging request

Example GetObjectTagging response


Head object

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/object-operations/head-object.md

HeadObject

HeadObject - Amazon Simple Storage Service ✅ Supported Headers
  • If-Match
  • If-Modified-Since
  • If-None-Match
  • If-Unmodified-Since
  • Range

Example HeadObject request

Example HeadObject response


List object versions

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/object-operations/list-object-versions.md

ListObjectVersions

ListObjectVersions - Amazon Simple Storage Service ✅ Supported Parameters
  • prefix
  • delimiter
  • marker 
  • max-keys

Example ListObjectVersions request

Example ListObjectVersions response


List objects

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/object-operations/list-objects.md

ListObjects

ListObjects - Amazon Simple Storage Service ✅ Supported Parameters
  • prefix
  • delimiter
  • marker 
  • max-keys

Example ListObjects request

Example ListObjects response


Put object

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/object-operations/put-object.md

PutObject

PutObject - Amazon Simple Storage Service ✅ Supported Headers x-amz-acl
  • private
  • public-read
x-amz-storage-class
  • STANDARD
x-amz-meta-* x-amz-server-side-encryption-customer-algorithm x-amz-server-side-encryption-customer-key x-amz-server-side-encryption-customer-key-MD5

Put object ACL

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/object-operations/put-object-acl.md

PutObjectACL

Warning: Only verified users can update bucket policy. To request KYC on your account, go to Portal Account Verifications PutObjectAcl - Amazon Simple Storage Service ✅ Supported Headers x-amz-acl
  • private
  • public-read
versionId

Example PutObjectACL request


Put object tagging

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/object-operations/put-object-tagging.md

PutObjectTagging

PutObjectTagging - Amazon Simple Storage Service ✅ Supported Headers
  • versionId

Example PutObjectTagging request


Abort multipart upload

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/multipart-operations/abort-multipart-upload.md

AbortMultipartUpload

AbortMultipartUpload - Amazon Simple Storage Service ✅ Supported Parameters
  • uploadId

Example AbortMultipartUpload Request


Complete multipart upload

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/multipart-operations/complete-multipart-upload.md

CompleteMultipartUpload

CompleteMultipartUpload - Amazon Simple Storage Service ✅ Supported Parameters
  • uploadId
✅ Supported XML element
  • Etag``PartNUmber

Example CompleteMultipartUpload request

Example CompleteMultipartUpload response


Create multipart upload

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/multipart-operations/create-multipart-upload.md

CreateMultipartUpload

CreateMultipartUpload - Amazon Simple Storage Service ✅ Supported Headers x-amz-acl
  • private
  • public-read
x-amz-storage-class
  • STANDARD

Example CreateMultipartUpload request

Example CreateMultipartUpload response


List multipart uploads

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/multipart-operations/list-multipart-uploads.md

ListMultipartUploads

ListMultipartUploads - Amazon Simple Storage Service ✅Supported Parameters
  • prefix
  • delimiter
  • key-marke
  • max-keys
  • max-uploads
  • upload-id-marker

Example ListMultipartUploads request

Example ListMultipartUploads response


Upload parts

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/multipart-operations/upload-part.md

UploadPart

UploadPart - Amazon Simple Storage Service ✅Supported Parameters
  • partNumber
  • uploadId

Example UploadPart request


List parts

Source: https://developers.telnyx.com/docs/cloud-storage/api-reference/multipart-operations/list-parts.md

ListParts

ListParts - Amazon Simple Storage Service ✅ Supported Parameters
  • uploadId
  • max-parts
  • part-number-marker

Example ListParts request

Example ListParts response


API Reference (Object Storage)

Presigned Object URLs

  • Create Presigned Object URL: Returns a timed and authenticated URL to download (GET) or upload (PUT) an object. This is the equivalent to AWS S3’s “presigned” URL. Please note that Telnyx…

Bucket SSL Certificate

Bucket Usage

  • Get API Usage: Returns the detail on API usage on a bucket of a particular time period, group by method category.
  • Get Bucket Usage: Returns the amount of storage space and number of files a bucket takes up.

Data Migration