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

# S3

> S3 APIs with Cloud Adapter.

This page describes how S3 maps to services in the environment where the application runs, including backend choices, supported operations and service-specific behavior.

## Supported environments

* Azure
* DigitalOcean
* Google Cloud
* OCI
* Private Kubernetes
* Scaleway

Check the operation and capability tables for the behavior your application depends on. A supported environment does not imply that every operation of the origin service is available.

## How the backends compare

Each row compares a capability of S3 with its adaptation on each backend.
A dash means this profile does not state the capability for that backend.

### Cloud Adapter

| Capability | S3 | Azure | DigitalOcean | Google Cloud | OCI | Private Kubernetes | Scaleway |
| - | - | - | - | - | - | - | - |
| Read consistency · after write | strong read-after-write | strong read-after-write | not documented | strong read-after-write | strong read-after-write | strict read-after-write + list-after-write | - |
| Durability · designed-for | 11 nines (3 AZs) | up to 16 nines (GRS) | - | 11 nines (erasure-coded, all classes) | 11 nines (3 ADs / 3 FDs) | - | - |
| Bucket model · structural | the bucket is the unit of configuration | two-level account → container → blob | - | - | - | - | - |
| Versioning | Yes | Yes - blob versioning (enabled on the account) | Partial - API-managed only (absent from the DO control panel) | Yes - object versioning (noncurrent versions retained) | Yes - bucket versioning (Enabled / Suspended) | Yes - bucket versioning (Enabled / Suspended) | Yes - version ids, delete markers and ListObjectVersions all verified live |
| Lifecycle policies | Yes - tier transitions + expiration + noncurrent + abort-incomplete-multipart | Partial - tier transitions + expiration + noncurrent, but no abort-incomplete-multipart rule | - | - | - | - | - |
| Event notifications | Yes - one config fans out to SNS / SQS / Lambda / EventBridge | Yes - one Event Grid subscription → Queue / Function / Event Hub / Service Bus / webhook | - | Partial - one Pub/Sub topic per notification config | Partial - bucket object-events → an OCI Events rule → ONS / Streaming / Functions | Partial - bucket events to webhook / Kafka / AMQP / NATS / Redis / PostgreSQL / MySQL / Elasticsearch targets | - |
| Server-side encryption | Yes - SSE-S3 / SSE-KMS / SSE-C / DSSE-KMS + Bucket Keys | Partial - SSE-S3 requests accepted; SSE-KMS and SSE-C requests rejected; Key Vault CMK and double encryption set on the account | - | - | - | - | - |
| Replication | Yes | Yes - object replication (async, container → container) | No | - | Yes - cross-region replication policy | - | - |
| Object lock / WORM | Yes - GOVERNANCE / COMPLIANCE modes + independent legal hold | Partial - native container immutability; runtime S3 retention/legal-hold calls are not served; legal-hold is not Terraform-settable | - | Yes - native Bucket Lock retention and holds; runtime S3 retention/legal-hold calls are not served | Partial - native lockable retention rules; runtime S3 retention/legal-hold calls are not served | - | - |
| Storage tiers | Yes - per-object classes (Standard … Deep Archive) + Intelligent-Tiering + One-Zone | Partial - Hot / Cool / Cold / Archive access tiers; no One-Zone (single-AZ) analog | - | - | - | - | - |
| CORS | Yes | Yes - native account-level Blob CORS; runtime S3 CORS calls are not served; no CORS on the website endpoint | Yes - up to 100 rules | Yes - native per-bucket CORS configuration; runtime S3 CORS calls are not served | No - fixed allow-all, not configurable | No - Enterprise / AIStor-gated; Community returns NotImplemented | - |
| Static website hosting | Yes | Partial - index / error documents on the account; no request-routing rules, no CORS | - | Partial - index / 404 website config, but no S3-style per-bucket website endpoint host | No | No | - |
| Requester pays | Yes | No | - | Yes - native Requester Pays flag; runtime S3 request-payment configuration is not served | No | No | - |
| Object tagging · granularity | per-object tags (Terraform-settable, usable in lifecycle / IAM conditions) | blob index tags (filter / query only; not Terraform-settable) | - | - | - | - | - |
| Integrity / ETag · translator ceiling | ETag = content-MD5 for single-part uploads | same: content-MD5, synthesized and persisted | - | - | - | - | - |
| Multipart upload | Yes | Yes - parts stored as hidden blobs, joined with Put Block List | Yes | Partial - served by compose-staging; ListMultipartUploads and UploadPartCopy decline | - | Yes | Yes - create/upload/complete/abort, ListParts and UploadPartCopy all verified live, with S3's composite ETag form |
| Presigned access · time-boxed URLs | presigned URLs (SDK) | S3 presigned URLs checked by the adapter; Azure SAS tokens out of band | S3 presigned URLs checked by the adapter; Spaces SigV2/V4 signed URLs out of band | S3 presigned URLs checked by the adapter; GCS V4 signed URLs out of band | - | S3 presigned URLs checked by the adapter; MinIO presign / `mc share` out of band | - |
| API coverage | full | partial | partial | partial | partial | partial (Forwarded API surface; deployment qualification must identify the MinIO server image, Max SIP revision, chart, erasure configuration and any KES/key-management dependencies separately. Existing chart selection 5.2.0 is not the MinIO server version; registry version 1.0.0 is not either version. No exact installed server version or deployment durability guarantee is established by this profile.) | high |
| Durability · designed-for | 11 nines (3 AZs) | - | no published figure | - | - | deployment-specific erasure-coding protection | - |
| Lifecycle policies | Yes | - | Partial - expiration + noncurrent expiration + abort-incomplete-multipart; no class transitions, no tag rules | Partial - prefix-scoped expiration by relative age; transitions only to STANDARD\_IA / ONEZONE\_IA | Yes - archive / infrequent-access transitions, delete, and abort-incomplete-multipart | Yes - expiration, noncurrent-version expiration, and abort-incomplete-multipart | - |
| Event notifications | Yes - SNS / SQS / Lambda / EventBridge fan-out | - | No | - | - | - | - |
| Server-side encryption | Yes - SSE-S3 / SSE-KMS / SSE-C / DSSE-KMS | - | Partial - SSE-S3 and the AWS-managed KMS key accepted (Spaces encrypts every object); a customer KMS key and SSE-C rejected | Partial - SSE-S3 requests accepted (Google encrypts every object); SSE-KMS and SSE-C requests rejected | Partial - SSE-S3 and the AWS-managed KMS key accepted (OCI encrypts every object); a customer KMS key and SSE-C rejected | No - SSE requests rejected; at-rest encryption is MinIO's own KMS (KES) setting | Partial - SSE-S3 and the AWS-managed KMS key accepted (stored as SSE-S3); a customer KMS key and SSE-C rejected (501) |
| Object lock / WORM | Yes | - | No | - | - | - | - |
| Storage tiers | Yes - per-object classes (Standard … Deep Archive) + Intelligent-Tiering | - | Partial - no per-object tiering; Cold Storage is a separate bucket type chosen at creation | Yes - Standard / Nearline / Coldline / Archive + Autoclass | - | No | - |
| Object tagging · granularity | per-object tags | - | none | - | - | - | - |
| Replication | Yes - SRR / CRR rule engine, asynchronous cross-bucket copy | - | - | Partial - dual / multi-region placement + turbo-replication RPO; no per-rule engine | - | - | - |
| Object tagging · granularity | per-object tags (usable in lifecycle / IAM conditions) | - | - | stored in reserved object metadata | no object tagging; native defined/freeform tags apply only to buckets | - | - |
| Presigned access · time-boxed URLs | presigned URLs (SDK, 7-day max) | - | - | - | S3 presigned URLs checked by the adapter; OCI Pre-Authenticated Requests out of band | - | - |
| Replication | Yes - same-region and cross-region bucket replication rules | - | - | - | - | Yes - active-active bucket replication + site replication (whole deployment, incl. IAM / users / policies) | - |
| Object lock / WORM | Yes - GOVERNANCE / COMPLIANCE modes + retention + independent legal hold | - | - | - | - | Partial - native to MinIO, but the adapter does not forward the runtime retention / legal-hold verbs | - |
| Object tagging | Yes | - | - | - | - | Yes - true per-object tags (get / put / delete) | - |
| Content-MD5 request validation · corrupt-upload rejection, restored by the adapter | wrong digest → 400 BadDigest | - | - | - | - | - | wrong digest → 400 BadDigest, checked by the adapter |

## On Azure

### Blob Storage

| Capability | Area | Support | Operations | Notes |
| - | - | - | - | - |
| Bucket policy, CORS, website, notification and replication APIs | Bucket config | Out of scope | - | These runtime S3 configuration APIs are outside the listed endpoint. Native backend configuration and deployment mappings are described separately. |
| Bucket versioning, tagging, lifecycle and encryption | Bucket config | Partial | - | With Cloud Adapter, runtime S3 calls retain bucket settings and apply supported backend mappings. Lifecycle filters, storage classes and account-level settings retain the limits described below. Simpler request forwarding configures these settings at deployment. |
| Presigned URLs | Other features | Supported | - | A presigned URL signed for the adapter's endpoint is checked by the adapter: its SigV4 signature, and an expiry of 1 second to 7 days, as on S3. The adapter then re-signs the request to the backend. A URL presigned for AWS's own endpoint does not reach the adapter. |

| Operation | Area | Support | Depth | Notes |
| - | - | - | - | - |
| GetObjectAcl | Access control | Out of scope | Full surface | Object ACL requests are rejected. Configure access through backend permissions or deployment configuration. |
| PutObjectAcl | Access control | Out of scope | Full surface | Object ACL requests are rejected. Configure access through backend permissions or deployment configuration. |
| CreateBucket | Bucket config | Supported | Most usage | creates the container, marked as created by the adapter; a name already taken by another container returns BucketAlreadyExists |
| DeleteBucket | Bucket config | Supported | Most usage | deletes only an empty container the adapter created; a non-empty one returns BucketNotEmpty |
| HeadBucket | Bucket config | Supported | Most usage | reads the container's properties; a missing one returns NoSuchBucket |
| AbortMultipartUpload | Multipart | Supported | Most usage | deletes the upload and removes its parts in the background; ListParts on the upload then returns 404 |
| CompleteMultipartUpload | Multipart | Supported | Most usage | checks that each named part was stored with the ETag the client gives, then joins the parts with one Put Block List; the object reports Azure's ETag below Max |
| CreateMultipartUpload | Multipart | Supported | Most usage | records the upload beside the key; nothing is written at the key until completion |
| ListMultipartUploads | Multipart | Out of scope | Most usage | Azure has no UploadId / cross-blob in-progress-upload listing, so the adapter returns 501 |
| ListParts | Multipart | Supported | Most usage | each part's number, LastModified, ETag and size, paged by max-parts and part-number-marker |
| UploadPart | Multipart | Supported | Most usage | each part is stored as its own hidden blob |
| GetObjectLegalHold | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| GetObjectRetention | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| PutObjectLegalHold | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| PutObjectRetention | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| CopyObject | Objects | Partial | Most usage | download-then-upload, not server-side; x-amz-copy-source-if-match and -if-none-match are checked and return 412 when they fail; the date-based copy-source conditions and copying a named source version are not supported |
| DeleteObject | Objects | Supported | Common | idempotent |
| DeleteObjects | Objects | Partial | Common | the batch form is served as per-key deletes (N round-trips) |
| GetObject | Objects | Supported | Common | bodies stream; start, open-ended and suffix byte ranges are honored; a request naming several ranges returns the whole object |
| HeadObject | Objects | Supported | Common | metadata / size / ETag without a body |
| ListObjectVersions | Objects | Partial | Most usage | Native Blob versions use timestamp identifiers and continuation markers, and a request with a delimiter is rejected. Max adds S3 version metadata and delete-marker behavior; native account-level versioning settings still apply. |
| ListObjects | Objects | Supported | Common | the v1 listing form |
| ListObjectsV2 | Objects | Supported | Common | prefix + paging; a delimiter works, with the adapter grouping keys into CommonPrefixes over Azure's flat listing; each key includes its ETag |
| PutObject | Objects | Supported | Common | one Put Blob; the adapter holds the body in memory while it writes, so its memory limits a single PutObject. If-Match and If-None-Match: \* are sent to Azure as a condition on the write, so two writers racing to create a key cannot both succeed; a conditional write above 5000 MiB is rejected. The ETag a single-part write returns is S3's: the hex MD5 of the body, computed on the write and persisted as the blob's native Content-MD5 so reads render the same value. Azure's own blob ETag is an opaque change-counter and is deliberately not what a client sees |
| GetObjectAttributes | Other features | Out of scope | Full surface | the ?attributes query is not served; use HeadObject |
| RestoreObject | Other features | Out of scope | Full surface | the ?restore query is rejected |
| SelectObjectContent | Other features | Out of scope | Full surface | the ?select query is rejected |
| DeleteObjectTagging | Tagging | Adapter-served | Most usage | via Blob Index Tags |
| GetObjectTagging | Tagging | Adapter-served | Most usage | via Blob Index Tags |
| PutObjectTagging | Tagging | Adapter-served | Most usage | via Blob Index Tags; rejects @ / non-ASCII per Azure's tag charset |

#### S3 requests in the target environment

The application continues using the S3 API. The Tensor9 adapter runs in the target environment and sends object requests to Azure Blob Storage. It also serves bucket creation, deletion, listing, and configuration through a persistent bucket store. Azure Blob Storage stores the objects; Tensor9 operates the adapter and its bucket-management service.

#### Request flow

Object requests use the backend storage service. Bucket settings persist separately and are applied to the backend resource.

![The S3 application calls the Tensor9 adapter. Object requests go to the backend object store. Bucket settings persist in the adapter's store and a configuration worker applies them to the backend.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjI4OCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDI4OCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgUzMgYXBwbGljYXRpb24gY2FsbHMgdGhlIFRlbnNvcjkgYWRhcHRlci4gT2JqZWN0IHJlcXVlc3RzIGdvIHRvIHRoZSBiYWNrZW5kIG9iamVjdCBzdG9yZS4gQnVja2V0IHNldHRpbmdzIHBlcnNpc3QgaW4gdGhlIGFkYXB0ZXIncyBzdG9yZSBhbmQgYSBjb25maWd1cmF0aW9uIHdvcmtlciBhcHBsaWVzIHRoZW0gdG8gdGhlIGJhY2tlbmQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CiAgPGRlZnM+PG1hcmtlciBpZD0iczMtbWF4LWFycm93IiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSI0IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wLDAgTDgsNCBMMCw4IFoiIHN0eWxlPSJmaWxsOiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+CiAgPHJlY3QgeD0iMjQiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNlZWYyZmY7c3Ryb2tlOiNjN2QyZmUiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNlY2ZkZjU7c3Ryb2tlOiNhN2YzZDAiLz4KICA8cmVjdCB4PSI1OTYiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNmOGZhZmM7c3Ryb2tlOiNjYmQ1ZTEiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjE4NCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI2OCIgcng9IjEwIiBzdHlsZT0iZmlsbDojZWNmZGY1O3N0cm9rZTojYTdmM2QwIi8+CiAgPHJlY3QgeD0iNTk2IiB5PSIxODQiIHdpZHRoPSIyMjAiIGhlaWdodD0iNjgiIHJ4PSIxMCIgc3R5bGU9ImZpbGw6I2Y4ZmFmYztzdHJva2U6I2NiZDVlMSIvPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZpbGw6IzBmMTcyYSI+CiAgICA8dGV4dCB4PSIxMzQiIHk9IjcwIj5BcHBsaWNhdGlvbjwvdGV4dD48dGV4dCB4PSIxMzQiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5TMyBTREs8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjcwIj5UZW5zb3I5IFMzIGFkYXB0ZXI8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSI5NiIgZm9udC1zaXplPSIxNCI+T2JqZWN0IGFuZCBidWNrZXQgQVBJczwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iNzAiPkF6dXJlIEJsb2IgU3RvcmFnZTwvdGV4dD48dGV4dCB4PSI3MDYiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5PYmplY3RzIGFuZCBzdG9yYWdlPC90ZXh0PgogICAgPHRleHQgeD0iNDIwIiB5PSIyMTIiPlBlcnNpc3RlbnQgYnVja2V0IHN0b3JlPC90ZXh0Pjx0ZXh0IHg9IjQyMCIgeT0iMjM2IiBmb250LXNpemU9IjE0Ij5OYW1lcyBhbmQgY29uZmlndXJhdGlvbjwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iMjI0Ij5Db25maWd1cmF0aW9uIHdvcmtlcjwvdGV4dD4KICA8L2c+CiAgPGcgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIiBtYXJrZXItZW5kPSJ1cmwoI3MzLW1heC1hcnJvdykiIHN0eWxlPSJzdHJva2U6Izk0YTNiOCI+CiAgICA8cGF0aCBkPSJNMjQ0IDc4IEgzMDYiLz48cGF0aCBkPSJNNTMwIDc4IEg1OTIiLz48cGF0aCBkPSJNNDIwIDEyMCBWMTgwIi8+CiAgICA8cGF0aCBkPSJNNTMwIDIxOCBINTkyIi8+PHBhdGggZD0iTTcwNiAxODQgVjEyNCIvPgogIDwvZz4KICA8ZyBmb250LWZhbWlseT0ic3lzdGVtLXVpLHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIHN0eWxlPSJmaWxsOiMzMzQxNTUiPgogICAgPHRleHQgeD0iNDMyIiB5PSIxNTMiPkJ1Y2tldCBzZXR0aW5nczwvdGV4dD48dGV4dCB4PSI3MTgiIHk9IjE1NCI+QXBwbHk8L3RleHQ+CiAgPC9nPgo8L3N2Zz4=)

![The S3 application calls the Tensor9 adapter. Object requests go to the backend object store. Bucket settings persist in the adapter's store and a configuration worker applies them to the backend.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjI4OCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDI4OCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgUzMgYXBwbGljYXRpb24gY2FsbHMgdGhlIFRlbnNvcjkgYWRhcHRlci4gT2JqZWN0IHJlcXVlc3RzIGdvIHRvIHRoZSBiYWNrZW5kIG9iamVjdCBzdG9yZS4gQnVja2V0IHNldHRpbmdzIHBlcnNpc3QgaW4gdGhlIGFkYXB0ZXIncyBzdG9yZSBhbmQgYSBjb25maWd1cmF0aW9uIHdvcmtlciBhcHBsaWVzIHRoZW0gdG8gdGhlIGJhY2tlbmQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CiAgPGRlZnM+PG1hcmtlciBpZD0iczMtbWF4LWFycm93IiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSI0IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wLDAgTDgsNCBMMCw4IFoiIHN0eWxlPSJmaWxsOiM2NDc0OGIiLz48L21hcmtlcj48L2RlZnM+CiAgPHJlY3QgeD0iMjQiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMxZTFiNGI7c3Ryb2tlOiMzNzMwYTMiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMwNjRlM2I7c3Ryb2tlOiMwNDc4NTciLz4KICA8cmVjdCB4PSI1OTYiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMwZjE3MmE7c3Ryb2tlOiM0NzU1NjkiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjE4NCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI2OCIgcng9IjEwIiBzdHlsZT0iZmlsbDojMDY0ZTNiO3N0cm9rZTojMDQ3ODU3Ii8+CiAgPHJlY3QgeD0iNTk2IiB5PSIxODQiIHdpZHRoPSIyMjAiIGhlaWdodD0iNjgiIHJ4PSIxMCIgc3R5bGU9ImZpbGw6IzBmMTcyYTtzdHJva2U6IzQ3NTU2OSIvPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZpbGw6I2YxZjVmOSI+CiAgICA8dGV4dCB4PSIxMzQiIHk9IjcwIj5BcHBsaWNhdGlvbjwvdGV4dD48dGV4dCB4PSIxMzQiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5TMyBTREs8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjcwIj5UZW5zb3I5IFMzIGFkYXB0ZXI8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSI5NiIgZm9udC1zaXplPSIxNCI+T2JqZWN0IGFuZCBidWNrZXQgQVBJczwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iNzAiPkF6dXJlIEJsb2IgU3RvcmFnZTwvdGV4dD48dGV4dCB4PSI3MDYiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5PYmplY3RzIGFuZCBzdG9yYWdlPC90ZXh0PgogICAgPHRleHQgeD0iNDIwIiB5PSIyMTIiPlBlcnNpc3RlbnQgYnVja2V0IHN0b3JlPC90ZXh0Pjx0ZXh0IHg9IjQyMCIgeT0iMjM2IiBmb250LXNpemU9IjE0Ij5OYW1lcyBhbmQgY29uZmlndXJhdGlvbjwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iMjI0Ij5Db25maWd1cmF0aW9uIHdvcmtlcjwvdGV4dD4KICA8L2c+CiAgPGcgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIiBtYXJrZXItZW5kPSJ1cmwoI3MzLW1heC1hcnJvdykiIHN0eWxlPSJzdHJva2U6IzY0NzQ4YiI+CiAgICA8cGF0aCBkPSJNMjQ0IDc4IEgzMDYiLz48cGF0aCBkPSJNNTMwIDc4IEg1OTIiLz48cGF0aCBkPSJNNDIwIDEyMCBWMTgwIi8+CiAgICA8cGF0aCBkPSJNNTMwIDIxOCBINTkyIi8+PHBhdGggZD0iTTcwNiAxODQgVjEyNCIvPgogIDwvZz4KICA8ZyBmb250LWZhbWlseT0ic3lzdGVtLXVpLHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIHN0eWxlPSJmaWxsOiNjYmQ1ZTEiPgogICAgPHRleHQgeD0iNDMyIiB5PSIxNTMiPkJ1Y2tldCBzZXR0aW5nczwvdGV4dD48dGV4dCB4PSI3MTgiIHk9IjE1NCI+QXBwbHk8L3RleHQ+CiAgPC9nPgo8L3N2Zz4=)

#### Object requests

Azure Blob uses its own API, so the adapter translates S3 requests, headers, XML results and errors into Blob operations. It streams reads and writes, maps object tags to Blob Index Tags, and handles batch deletion as individual blob deletes. CopyObject downloads and uploads the object rather than using a server-side copy. Listing supports prefixes and pagination, and the adapter groups keys into CommonPrefixes itself when a request includes a delimiter.

#### Bucket creation and configuration

Each S3 bucket has a durable record containing its name, owner, requested configuration, and backend reference. For a bucket named `bucket-name`, the S3-facing identifier is `arn:aws:s3:::bucket-name`; the backend resource is a Blob container in a selected storage account. `ListBuckets` returns the caller's buckets, and configuration reads use the stored request state.

A configuration worker applies the stored settings to the backend. `CreateBucket` waits for the backend bucket to be ready before returning success, so an immediate object write does not race bucket creation. `DeleteBucket` waits for removal and returns `BucketNotEmpty` if objects prevent deletion. A lifecycle update also waits for the backend to apply it. For other configuration changes, a successful read of the new setting describes stored configuration; it does not imply every backend-side change has already completed.

#### Versions and multipart uploads

A multipart upload stores each part as its own hidden blob. CompleteMultipartUpload checks each named part's ETag, then joins the parts into the object with one Put Block List. Cloud Adapter retains the part checksums and S3 version metadata needed for composite multipart ETags, S3 version IDs and delete markers. The simpler request-translation path uses Azure's native version and completion-ETag behavior instead. Single-part writes compute the content MD5 and persist it as Blob Content-MD5. Azure tag-character restrictions still apply, including rejection of @ and non-ASCII characters.

#### Backend configuration

The adapter stores per-bucket configuration and reconciles each bucket to a container. Several Azure settings belong to the storage account, including region, redundancy, native versioning and default encryption; a container cannot independently choose them. Shared-account configuration must be planned for all buckets using that account. S3 lifecycle settings use the supported backend mappings, and unsupported conditions must not change retention behavior silently. Max supplies S3 metadata where native account-level behavior alone is insufficient.

#### Placement and operation

Azure provides strong consistency. Its documented durability depends on redundancy: 11 nines for LRS, 12 for ZRS, and 16 for GRS or GZRS. Choose the account region and redundancy to meet the customer's placement and recovery needs. A bucket's S3 location field does not relocate the storage account. Tensor9 operates the adapter and persistent bucket state; Microsoft operates Blob Storage.

#### Compatibility limits

Bucket policy remains unsupported. Date-based copy-source conditions, copying a named source version, ListObjectVersions with a delimiter and ListMultipartUploads are not supported, and a request naming several byte ranges returns the whole object. A conditional PutObject (If-Match or If-None-Match) above 5000 MiB is rejected, and an unconditional PutObject is held in memory while it is written. Azure has no S3 Requester Pays or direct One Zone storage-class equivalent. Object retention and legal-hold capabilities must be evaluated separately from the runtime APIs this mapping serves.

#### Migration and leaving the adapter

A newly provisioned backend bucket starts empty. Copy existing objects and required versions with a migration tool or a coordinated dual-write, then verify object data and application reads before switching. Preserve version history through the S3 API when the application depends on S3 version identifiers or delete markers.

Leaving the service adapter requires moving bucket configuration as well as object data. Apply the retained settings to native backend resources, resolve any S3-specific version metadata, and move clients to the backend's own API. Keep the adapter and its persistent state until the application no longer depends on those S3 behaviors.

#### Example monthly charges

This Tensor9 Cloud Adapter scenario estimates service charges for the named origin and target services. Adapter hosting and commercial Tensor9 fees need separate allocations. [How Tensor9 estimates costs](https://docs.tensor9.com/cloud-adapter-early-access/costs/overview.md) explains the method and what the estimates include.

##### S3 Standard · Stored data

Feature: S3 Standard.

Estimated monthly service charges by Stored data. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: eastus; currency: USD.

![S3 Standard · Stored data: monthly service charges by Stored data. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/91c3ace00c814b56b912a6a41e93dd1e8967c5abcf08482291bb1e1d2bb9a601-light.svg)

![S3 Standard · Stored data: monthly service charges by Stored data. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/e84b18fc5d0b6092ac22bfa205588c50687e4102cd05b7c3f9fbd5540997b6d1-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Stored data (GiB-month) | S3 | Blob Storage | Difference |
| -: | -: | -: | -: |
| 0 | 0.00 | 0.00 | 0.00 |
| 10 | 0.23 | 0.21 | -0.02 |
| 100 | 2.30 | 2.08 | -0.22 |
| 1,000 | 23.00 | 20.80 | -2.20 |
| 10,000 | 230.00 | 208.00 | -22.00 |
| 100,000 | 2,300.00 | 2,039.40 | -260.60 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target list price · read | 0.0000004 | USD/read |
| Target list price · write | 0.000005 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.0208 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.087 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · network GiB | 100 | network GiB |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |

* Request meters remain at their independently authored defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → eastus, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Object storage bills stored GiB-months, read and write requests and internet egress. Hot LRS block blobs in East US; storage and egress use Azure's graduated tiers, and the first 100 GB of monthly egress is free. Cool, Cold and Archive tiers are not selected: a Glacier origin is billed at Hot rates.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* Azure Retail Prices API: [https://prices.azure.com/api/retail/prices](https://prices.azure.com/api/retail/prices)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-44731a93a6adc52a5b2db23ce41fd580a9d12f15` / `2026-10-22.planning.2`. Curve: `workload-1`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Azure Retail Prices API](https://prices.azure.com/api/retail/prices).

##### S3 Standard · Object writes

Feature: S3 Standard.

Estimated monthly service charges by Object writes. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: eastus; currency: USD.

![S3 Standard · Object writes: monthly service charges by Object writes. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/cef33b161dadc1da8712c78516273345966dc838c15687d97b373cf0bb40e77b-light.svg)

![S3 Standard · Object writes: monthly service charges by Object writes. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/1ed47bc8292b89585d7e67757dd196c34d460262face5c454156efa7726bf8b6-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Object writes (per second) | S3 | Blob Storage | Difference |
| -: | -: | -: | -: |
| 0 | 0.00 | 0.00 | 0.00 |
| 1 | 13.14 | 13.14 | 0.00 |
| 10 | 131.40 | 131.40 | 0.00 |
| 100 | 1,314.00 | 1,314.00 | 0.00 |
| 1,000 | 13,140.00 | 13,140.00 | 0.00 |
| 10,000 | 131,400.00 | 131,400.00 | 0.00 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target list price · read | 0.0000004 | USD/read |
| Target list price · write | 0.000005 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.0208 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.087 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · network GiB | 100 | network GiB |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |

* Stored GiB and reads stay at independent defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → eastus, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Object storage bills stored GiB-months, read and write requests and internet egress. Hot LRS block blobs in East US; storage and egress use Azure's graduated tiers, and the first 100 GB of monthly egress is free. Cool, Cold and Archive tiers are not selected: a Glacier origin is billed at Hot rates.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* Azure Retail Prices API: [https://prices.azure.com/api/retail/prices](https://prices.azure.com/api/retail/prices)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-44731a93a6adc52a5b2db23ce41fd580a9d12f15` / `2026-10-22.planning.2`. Curve: `workload-2`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Azure Retail Prices API](https://prices.azure.com/api/retail/prices).

##### S3 Standard · Object reads

Feature: S3 Standard.

Estimated monthly service charges by Object reads. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: eastus; currency: USD.

![S3 Standard · Object reads: monthly service charges by Object reads. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/55dc7dd0a85033c5ba6cbfcb6b7b8b85e8b21a78a3a816cee291b090358acfb2-light.svg)

![S3 Standard · Object reads: monthly service charges by Object reads. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/c3570aea90b3769c440a7083a23073d93070b9eab019452c5c1aeefad1f398a8-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Object reads (per second) | S3 | Blob Storage | Difference |
| -: | -: | -: | -: |
| 0 | 0.00 | 0.00 | 0.00 |
| 1 | 1.05 | 1.05 | 0.00 |
| 10 | 10.51 | 10.51 | 0.00 |
| 100 | 105.12 | 105.12 | 0.00 |
| 1,000 | 1,051.20 | 1,051.20 | 0.00 |
| 10,000 | 10,512.00 | 10,512.00 | 0.00 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target list price · read | 0.0000004 | USD/read |
| Target list price · write | 0.000005 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.0208 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.087 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · network GiB | 100 | network GiB |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |

* Stored GiB and writes stay at independent defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → eastus, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Object storage bills stored GiB-months, read and write requests and internet egress. Hot LRS block blobs in East US; storage and egress use Azure's graduated tiers, and the first 100 GB of monthly egress is free. Cool, Cold and Archive tiers are not selected: a Glacier origin is billed at Hot rates.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* Azure Retail Prices API: [https://prices.azure.com/api/retail/prices](https://prices.azure.com/api/retail/prices)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-44731a93a6adc52a5b2db23ce41fd580a9d12f15` / `2026-10-22.planning.2`. Curve: `workload-3`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Azure Retail Prices API](https://prices.azure.com/api/retail/prices).

**S3 Standard → Blob Storage: Authored native-usage planning example.** Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts.

Scenario source region: us-east-1. Scenario target region: eastus. Currency: USD.

| Monthly component | USD |
| - | -: |
| Origin: Stored object data | 0.00 |
| Origin: Object writes | 0.00 |
| Origin: Object reads | 0.00 |
| Origin: Billable origin network transfer | 0.00 |
| Target: Target read operations | 0.00 |
| Target: Target write operations | 0.00 |
| Target: Target retained physical data | 0.00 |
| Target: Additional broker replica storage | 0.00 |
| Target: Execution or worker CPU | 0.00 |
| Target: Execution or worker RAM | 0.00 |
| Target: Selected billable network after 100 included | 0.00 |
| Target: Independent native resources | 0.00 |
| Target: Independent native resources | 0.00 |
| **Origin service subtotal** | **0.00** |
| **Target service subtotal** | **0.00** |

Unestimated components: Adapter hosting, Tensor9 fees. A modeled adapted total and savings require these costs.

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

**Scenario assumptions**

| Input | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target list price · read | 0.0000004 | USD/read |
| Target list price · write | 0.000005 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.0208 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.087 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · network GiB | 100 | network GiB |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |
| Stored object data | 0 | GiB-month |
| Object writes | 0 | requests |
| Object reads | 0 | requests |
| Billable origin network transfer | 0 | GiB |

* Translated reads: 0 operations.

* Translated writes: 0 operations.

* Translated resident physical data: 0 GiB-month.

* Native provider operations: 0 operations.

* Published payload: 0 GiB.

* Delivered payload: 0 GiB.

* Allocated execution CPU: 0 vCPU-hour.

* Allocated execution RAM: 0 GiB-hour.

* Independent resource allocation: 0 resource-hour.

* Independent inventory: 0 resource-month.

* Input tokens: 0 tokens.

* Output tokens: 0 tokens.

* Billable network: 0 GiB.

* Dependent object sink retained data: 0 GiB-month.

* Dependent object sink writes: 0 writes.

* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.

* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.

* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.

* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.

* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.

* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.

* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.

* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.

* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.

* Object storage bills stored GiB-months, read and write requests and internet egress. Hot LRS block blobs in East US; storage and egress use Azure's graduated tiers, and the first 100 GB of monthly egress is free. Cool, Cold and Archive tiers are not selected: a Glacier origin is billed at Hot rates.

List prices read: 2026-10-22. Model: `plan-44731a93a6adc52a5b2db23ce41fd580a9d12f15` / `2026-10-22.planning.2`. Scenario: `planning-example`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Azure Retail Prices API](https://prices.azure.com/api/retail/prices).

## On DigitalOcean

### DigitalOcean Spaces

| Capability | Area | Support | Operations | Notes |
| - | - | - | - | - |
| Bucket policy, CORS, website, notification and replication APIs | Bucket config | Out of scope | - | These runtime S3 configuration APIs are outside the listed endpoint. Native backend configuration and deployment mappings are described separately. |
| Bucket versioning, tagging, lifecycle and encryption | Bucket config | Partial | - | With Cloud Adapter, runtime S3 calls retain bucket settings and apply supported backend mappings. Lifecycle filters, storage classes and account-level settings retain the limits described below. Simpler request forwarding configures these settings at deployment. |
| Presigned URLs | Other features | Supported | - | A presigned URL signed for the adapter's endpoint is checked by the adapter: its SigV4 signature, and an expiry of 1 second to 7 days, as on S3. The adapter then re-signs the request to the backend. A URL presigned for AWS's own endpoint does not reach the adapter. |

| Operation | Area | Support | Depth | Notes |
| - | - | - | - | - |
| GetObjectAcl | Access control | Out of scope | Full surface | Object ACL requests are rejected. Configure access through backend permissions or deployment configuration. |
| PutObjectAcl | Access control | Out of scope | Full surface | Object ACL requests are rejected. Configure access through backend permissions or deployment configuration. |
| CreateBucket | Bucket config | Supported | Most usage | The adapter serves this bucket operation. |
| DeleteBucket | Bucket config | Supported | Most usage | The adapter serves this bucket operation. |
| HeadBucket | Bucket config | Supported | Most usage | The adapter serves this bucket operation. |
| AbortMultipartUpload | Multipart | Supported | Most usage | - |
| CompleteMultipartUpload | Multipart | Supported | Most usage | - |
| CreateMultipartUpload | Multipart | Supported | Most usage | - |
| ListMultipartUploads | Multipart | Supported | Most usage | - |
| ListParts | Multipart | Supported | Most usage | - |
| UploadPart | Multipart | Supported | Most usage | - |
| GetObjectLegalHold | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| GetObjectRetention | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| PutObjectLegalHold | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| PutObjectRetention | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| CopyObject | Objects | Supported | Most usage | server-side copy via x-amz-copy-source |
| DeleteObject | Objects | Supported | Common | - |
| DeleteObjects | Objects | Supported | Common | batch delete |
| GetObject | Objects | Supported | Common | bodies + byte ranges |
| HeadObject | Objects | Supported | Common | - |
| ListObjectVersions | Objects | Supported | Most usage | Spaces supports bucket versioning and list-object-versions |
| ListObjects | Objects | Supported | Common | the v1 listing form |
| ListObjectsV2 | Objects | Supported | Common | - |
| PutObject | Objects | Supported | Common | - |
| GetObjectAttributes | Other features | Out of scope | Full surface | the ?attributes query is not served; use HeadObject |
| RestoreObject | Other features | Out of scope | Full surface | the ?restore query is rejected |
| SelectObjectContent | Other features | Out of scope | Full surface | the ?select query is rejected |
| DeleteObjectTagging | Tagging | Out of scope | Most usage | Spaces returns NotImplemented for object tagging |
| GetObjectTagging | Tagging | Out of scope | Most usage | Spaces returns NotImplemented for object tagging |
| PutObjectTagging | Tagging | Out of scope | Most usage | Spaces returns NotImplemented for object tagging |

#### S3 requests in the target environment

The application continues using the S3 API. The Tensor9 adapter runs in the target environment and sends object requests to DigitalOcean Spaces. It also serves bucket creation, deletion, listing, and configuration through a persistent bucket store. DigitalOcean Spaces stores the objects; Tensor9 operates the adapter and its bucket-management service.

#### Request flow

Object requests use the backend storage service. Bucket settings persist separately and are applied to the backend resource.

![The S3 application calls the Tensor9 adapter. Object requests go to the backend object store. Bucket settings persist in the adapter's store and a configuration worker applies them to the backend.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjI4OCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDI4OCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgUzMgYXBwbGljYXRpb24gY2FsbHMgdGhlIFRlbnNvcjkgYWRhcHRlci4gT2JqZWN0IHJlcXVlc3RzIGdvIHRvIHRoZSBiYWNrZW5kIG9iamVjdCBzdG9yZS4gQnVja2V0IHNldHRpbmdzIHBlcnNpc3QgaW4gdGhlIGFkYXB0ZXIncyBzdG9yZSBhbmQgYSBjb25maWd1cmF0aW9uIHdvcmtlciBhcHBsaWVzIHRoZW0gdG8gdGhlIGJhY2tlbmQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CiAgPGRlZnM+PG1hcmtlciBpZD0iczMtbWF4LWFycm93IiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSI0IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wLDAgTDgsNCBMMCw4IFoiIHN0eWxlPSJmaWxsOiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+CiAgPHJlY3QgeD0iMjQiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNlZWYyZmY7c3Ryb2tlOiNjN2QyZmUiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNlY2ZkZjU7c3Ryb2tlOiNhN2YzZDAiLz4KICA8cmVjdCB4PSI1OTYiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNmOGZhZmM7c3Ryb2tlOiNjYmQ1ZTEiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjE4NCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI2OCIgcng9IjEwIiBzdHlsZT0iZmlsbDojZWNmZGY1O3N0cm9rZTojYTdmM2QwIi8+CiAgPHJlY3QgeD0iNTk2IiB5PSIxODQiIHdpZHRoPSIyMjAiIGhlaWdodD0iNjgiIHJ4PSIxMCIgc3R5bGU9ImZpbGw6I2Y4ZmFmYztzdHJva2U6I2NiZDVlMSIvPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZpbGw6IzBmMTcyYSI+CiAgICA8dGV4dCB4PSIxMzQiIHk9IjcwIj5BcHBsaWNhdGlvbjwvdGV4dD48dGV4dCB4PSIxMzQiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5TMyBTREs8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjcwIj5UZW5zb3I5IFMzIGFkYXB0ZXI8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSI5NiIgZm9udC1zaXplPSIxNCI+T2JqZWN0IGFuZCBidWNrZXQgQVBJczwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iNzAiPkRpZ2l0YWxPY2VhbiBTcGFjZXM8L3RleHQ+PHRleHQgeD0iNzA2IiB5PSI5NiIgZm9udC1zaXplPSIxNCI+T2JqZWN0cyBhbmQgc3RvcmFnZTwvdGV4dD4KICAgIDx0ZXh0IHg9IjQyMCIgeT0iMjEyIj5QZXJzaXN0ZW50IGJ1Y2tldCBzdG9yZTwvdGV4dD48dGV4dCB4PSI0MjAiIHk9IjIzNiIgZm9udC1zaXplPSIxNCI+TmFtZXMgYW5kIGNvbmZpZ3VyYXRpb248L3RleHQ+CiAgICA8dGV4dCB4PSI3MDYiIHk9IjIyNCI+Q29uZmlndXJhdGlvbiB3b3JrZXI8L3RleHQ+CiAgPC9nPgogIDxnIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0ibm9uZSIgbWFya2VyLWVuZD0idXJsKCNzMy1tYXgtYXJyb3cpIiBzdHlsZT0ic3Ryb2tlOiM5NGEzYjgiPgogICAgPHBhdGggZD0iTTI0NCA3OCBIMzA2Ii8+PHBhdGggZD0iTTUzMCA3OCBINTkyIi8+PHBhdGggZD0iTTQyMCAxMjAgVjE4MCIvPgogICAgPHBhdGggZD0iTTUzMCAyMTggSDU5MiIvPjxwYXRoIGQ9Ik03MDYgMTg0IFYxMjQiLz4KICA8L2c+CiAgPGcgZm9udC1mYW1pbHk9InN5c3RlbS11aSxzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBzdHlsZT0iZmlsbDojMzM0MTU1Ij4KICAgIDx0ZXh0IHg9IjQzMiIgeT0iMTUzIj5CdWNrZXQgc2V0dGluZ3M8L3RleHQ+PHRleHQgeD0iNzE4IiB5PSIxNTQiPkFwcGx5PC90ZXh0PgogIDwvZz4KPC9zdmc+)

![The S3 application calls the Tensor9 adapter. Object requests go to the backend object store. Bucket settings persist in the adapter's store and a configuration worker applies them to the backend.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjI4OCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDI4OCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgUzMgYXBwbGljYXRpb24gY2FsbHMgdGhlIFRlbnNvcjkgYWRhcHRlci4gT2JqZWN0IHJlcXVlc3RzIGdvIHRvIHRoZSBiYWNrZW5kIG9iamVjdCBzdG9yZS4gQnVja2V0IHNldHRpbmdzIHBlcnNpc3QgaW4gdGhlIGFkYXB0ZXIncyBzdG9yZSBhbmQgYSBjb25maWd1cmF0aW9uIHdvcmtlciBhcHBsaWVzIHRoZW0gdG8gdGhlIGJhY2tlbmQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CiAgPGRlZnM+PG1hcmtlciBpZD0iczMtbWF4LWFycm93IiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSI0IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wLDAgTDgsNCBMMCw4IFoiIHN0eWxlPSJmaWxsOiM2NDc0OGIiLz48L21hcmtlcj48L2RlZnM+CiAgPHJlY3QgeD0iMjQiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMxZTFiNGI7c3Ryb2tlOiMzNzMwYTMiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMwNjRlM2I7c3Ryb2tlOiMwNDc4NTciLz4KICA8cmVjdCB4PSI1OTYiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMwZjE3MmE7c3Ryb2tlOiM0NzU1NjkiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjE4NCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI2OCIgcng9IjEwIiBzdHlsZT0iZmlsbDojMDY0ZTNiO3N0cm9rZTojMDQ3ODU3Ii8+CiAgPHJlY3QgeD0iNTk2IiB5PSIxODQiIHdpZHRoPSIyMjAiIGhlaWdodD0iNjgiIHJ4PSIxMCIgc3R5bGU9ImZpbGw6IzBmMTcyYTtzdHJva2U6IzQ3NTU2OSIvPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZpbGw6I2YxZjVmOSI+CiAgICA8dGV4dCB4PSIxMzQiIHk9IjcwIj5BcHBsaWNhdGlvbjwvdGV4dD48dGV4dCB4PSIxMzQiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5TMyBTREs8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjcwIj5UZW5zb3I5IFMzIGFkYXB0ZXI8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSI5NiIgZm9udC1zaXplPSIxNCI+T2JqZWN0IGFuZCBidWNrZXQgQVBJczwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iNzAiPkRpZ2l0YWxPY2VhbiBTcGFjZXM8L3RleHQ+PHRleHQgeD0iNzA2IiB5PSI5NiIgZm9udC1zaXplPSIxNCI+T2JqZWN0cyBhbmQgc3RvcmFnZTwvdGV4dD4KICAgIDx0ZXh0IHg9IjQyMCIgeT0iMjEyIj5QZXJzaXN0ZW50IGJ1Y2tldCBzdG9yZTwvdGV4dD48dGV4dCB4PSI0MjAiIHk9IjIzNiIgZm9udC1zaXplPSIxNCI+TmFtZXMgYW5kIGNvbmZpZ3VyYXRpb248L3RleHQ+CiAgICA8dGV4dCB4PSI3MDYiIHk9IjIyNCI+Q29uZmlndXJhdGlvbiB3b3JrZXI8L3RleHQ+CiAgPC9nPgogIDxnIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0ibm9uZSIgbWFya2VyLWVuZD0idXJsKCNzMy1tYXgtYXJyb3cpIiBzdHlsZT0ic3Ryb2tlOiM2NDc0OGIiPgogICAgPHBhdGggZD0iTTI0NCA3OCBIMzA2Ii8+PHBhdGggZD0iTTUzMCA3OCBINTkyIi8+PHBhdGggZD0iTTQyMCAxMjAgVjE4MCIvPgogICAgPHBhdGggZD0iTTUzMCAyMTggSDU5MiIvPjxwYXRoIGQ9Ik03MDYgMTg0IFYxMjQiLz4KICA8L2c+CiAgPGcgZm9udC1mYW1pbHk9InN5c3RlbS11aSxzYW5zLXNlcmlmIiBmb250LXNpemU9IjEyIiBzdHlsZT0iZmlsbDojY2JkNWUxIj4KICAgIDx0ZXh0IHg9IjQzMiIgeT0iMTUzIj5CdWNrZXQgc2V0dGluZ3M8L3RleHQ+PHRleHQgeD0iNzE4IiB5PSIxNTQiPkFwcGx5PC90ZXh0PgogIDwvZz4KPC9zdmc+)

#### Object requests

Spaces speaks the S3 protocol. The adapter changes the endpoint and signs with a Spaces access key, while the service handles objects, ranges, copies, batch deletion and paginated listing in both the v1 and v2 listing forms. The endpoint uses the selected region, such as nyc3.digitaloceanspaces.com. The adapter still provides the S3 endpoint expected by the application.

#### Bucket creation and configuration

Each S3 bucket has a durable record containing its name, owner, requested configuration, and backend reference. For a bucket named `bucket-name`, the S3-facing identifier is `arn:aws:s3:::bucket-name`; the backend resource is a DigitalOcean Spaces bucket. `ListBuckets` returns the caller's buckets, and configuration reads use the stored request state.

A configuration worker applies the stored settings to the backend. `CreateBucket` waits for the backend bucket to be ready before returning success, so an immediate object write does not race bucket creation. `DeleteBucket` waits for removal and returns `BucketNotEmpty` if objects prevent deletion. A lifecycle update also waits for the backend to apply it. For other configuration changes, a successful read of the new setting describes stored configuration; it does not imply every backend-side change has already completed.

#### Versions and multipart uploads

Spaces supplies bucket versioning, ListObjectVersions and the full multipart set natively: CreateMultipartUpload, UploadPart, ListParts, ListMultipartUploads, CompleteMultipartUpload and AbortMultipartUpload. Cloud Adapter retains those provider behaviors and adds the persistent bucket-management service on top of them.

#### Backend configuration

The service adapter stores bucket ownership and requested configuration, then reconciles that state to Spaces. Bucket creation, deletion and head already have native operations the adapter serves at the baseline tier; the persistent record gives the application the same management model used with the other backends.

#### Placement and operation

DigitalOcean operates the object store; Tensor9 operates the S3 adapter and its persistent bucket-management service. The Spaces key pair is not the DigitalOcean API token: Spaces mints its own, and both the object and bucket planes sign with that same Spaces pair.

#### Compatibility limits

Object tagging is unsupported upstream: GetObjectTagging, PutObjectTagging and DeleteObjectTagging return NotImplemented from Spaces, and object tagging is not served on this edge. Bucket versioning is the one configuration the adapter applies to Spaces; bucket tagging, lifecycle and encryption settings are held by the management service and answered from that record, and do not reach the provider. Read-after-write consistency is not documented by the provider. Bucket policy, CORS, website, notification and replication remain outside this mapping. The Max management service does not by itself remove these operation-level differences.

#### Migration and leaving the adapter

A newly provisioned backend bucket starts empty. Copy existing objects and required versions with a migration tool or a coordinated dual-write, then verify object data and application reads before switching. Preserve version history through the S3 API when the application depends on S3 version identifiers or delete markers.

Leaving the service adapter requires moving bucket configuration as well as object data. Apply the retained settings to native backend resources, resolve any S3-specific version metadata, and move clients to the backend's own API. Keep the adapter and its persistent state until the application no longer depends on those S3 behaviors.

#### Example monthly charges

This Tensor9 Cloud Adapter scenario estimates service charges for the named origin and target services. Adapter hosting and commercial Tensor9 fees need separate allocations. [How Tensor9 estimates costs](https://docs.tensor9.com/cloud-adapter-early-access/costs/overview.md) explains the method and what the estimates include.

##### S3 Standard · Stored data

Feature: S3 Standard.

Estimated monthly service charges by Stored data. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: nyc3; currency: USD.

![S3 Standard · Stored data: monthly service charges by Stored data. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/3880ae954a94a699f276a00ec1b1c05cfe148772f060497e314725bc8d152da7-light.svg)

![S3 Standard · Stored data: monthly service charges by Stored data. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/a35bad7f89811ae0a6d95f78961103f88f403db5d8c5fe18414fb803c65b5437-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Stored data (GiB-month) | S3 | DigitalOcean Spaces | Difference |
| -: | -: | -: | -: |
| 0 | 0.00 | 5.00 | 5.00 |
| 10 | 0.23 | 5.00 | 4.77 |
| 100 | 2.30 | 5.00 | 2.70 |
| 1,000 | 23.00 | 20.00 | -3.00 |
| 10,000 | 230.00 | 200.00 | -30.00 |
| 100,000 | 2,300.00 | 2,000.00 | -300.00 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target price guess · read | 0 | USD/read |
| Target price guess · write | 0 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.02 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.01 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · GiB-month | 250 | GiB-month |
| Included before billing · network GiB | 1,024 | network GiB |
| Target monthly base charge · list price | 5 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |

* Request meters remain at their independently authored defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → nyc3, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Object storage bills stored GiB-months, read and write requests and internet egress. Spaces is a USD 5 monthly subscription that includes 250 GiB stored and 1,024 GiB of outbound transfer, with no request charges. Spaces has no storage classes in this mapping, so a Glacier origin is billed as Standard storage; Spaces Cold Storage (USD 0.007 per GiB-month) is not selected.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* Spaces pricing: [https://docs.digitalocean.com/products/spaces/details/pricing/](https://docs.digitalocean.com/products/spaces/details/pricing/)
* Bandwidth billing: [https://docs.digitalocean.com/platform/billing/bandwidth/](https://docs.digitalocean.com/platform/billing/bandwidth/)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-5a635d5f9916e3082336de94407a063e6d5c3c42` / `2026-10-22.planning.2`. Curve: `workload-1`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Spaces pricing](https://docs.digitalocean.com/products/spaces/details/pricing/), [Bandwidth billing](https://docs.digitalocean.com/platform/billing/bandwidth/).

##### S3 Standard · Object writes

Feature: S3 Standard.

Estimated monthly service charges by Object writes. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: nyc3; currency: USD.

![S3 Standard · Object writes: monthly service charges by Object writes. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/bf6c7dd276b2e2561491eef1f7b1c807ea5c5aced147931c680375e4559344b7-light.svg)

![S3 Standard · Object writes: monthly service charges by Object writes. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/35316550c346902432b4e1656e4b619c14597d05338356fbbb52475824af60a4-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Object writes (per second) | S3 | DigitalOcean Spaces | Difference |
| -: | -: | -: | -: |
| 0 | 0.00 | 5.00 | 5.00 |
| 1 | 13.14 | 5.00 | -8.14 |
| 10 | 131.40 | 5.00 | -126.40 |
| 100 | 1,314.00 | 5.00 | -1,309.00 |
| 1,000 | 13,140.00 | 5.00 | -13,135.00 |
| 10,000 | 131,400.00 | 5.00 | -131,395.00 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target price guess · read | 0 | USD/read |
| Target price guess · write | 0 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.02 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.01 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · GiB-month | 250 | GiB-month |
| Included before billing · network GiB | 1,024 | network GiB |
| Target monthly base charge · list price | 5 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |

* Stored GiB and reads stay at independent defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → nyc3, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Object storage bills stored GiB-months, read and write requests and internet egress. Spaces is a USD 5 monthly subscription that includes 250 GiB stored and 1,024 GiB of outbound transfer, with no request charges. Spaces has no storage classes in this mapping, so a Glacier origin is billed as Standard storage; Spaces Cold Storage (USD 0.007 per GiB-month) is not selected.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* Spaces pricing: [https://docs.digitalocean.com/products/spaces/details/pricing/](https://docs.digitalocean.com/products/spaces/details/pricing/)
* Bandwidth billing: [https://docs.digitalocean.com/platform/billing/bandwidth/](https://docs.digitalocean.com/platform/billing/bandwidth/)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-5a635d5f9916e3082336de94407a063e6d5c3c42` / `2026-10-22.planning.2`. Curve: `workload-2`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Spaces pricing](https://docs.digitalocean.com/products/spaces/details/pricing/), [Bandwidth billing](https://docs.digitalocean.com/platform/billing/bandwidth/).

##### S3 Standard · Object reads

Feature: S3 Standard.

Estimated monthly service charges by Object reads. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: nyc3; currency: USD.

![S3 Standard · Object reads: monthly service charges by Object reads. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/0d4caf43b02746babc1ebfa226c963bcb7d0fec55074cd082dfa40ebd7e94537-light.svg)

![S3 Standard · Object reads: monthly service charges by Object reads. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/70a7cb17cb6a3cd7bdd3c68b505aa0e3cc00c040c1a5f9915eee475c3eae91f2-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Object reads (per second) | S3 | DigitalOcean Spaces | Difference |
| -: | -: | -: | -: |
| 0 | 0.00 | 5.00 | 5.00 |
| 1 | 1.05 | 5.00 | 3.95 |
| 10 | 10.51 | 5.00 | -5.51 |
| 100 | 105.12 | 5.00 | -100.12 |
| 1,000 | 1,051.20 | 5.00 | -1,046.20 |
| 10,000 | 10,512.00 | 5.00 | -10,507.00 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target price guess · read | 0 | USD/read |
| Target price guess · write | 0 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.02 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.01 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · GiB-month | 250 | GiB-month |
| Included before billing · network GiB | 1,024 | network GiB |
| Target monthly base charge · list price | 5 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |

* Stored GiB and writes stay at independent defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → nyc3, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Object storage bills stored GiB-months, read and write requests and internet egress. Spaces is a USD 5 monthly subscription that includes 250 GiB stored and 1,024 GiB of outbound transfer, with no request charges. Spaces has no storage classes in this mapping, so a Glacier origin is billed as Standard storage; Spaces Cold Storage (USD 0.007 per GiB-month) is not selected.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* Spaces pricing: [https://docs.digitalocean.com/products/spaces/details/pricing/](https://docs.digitalocean.com/products/spaces/details/pricing/)
* Bandwidth billing: [https://docs.digitalocean.com/platform/billing/bandwidth/](https://docs.digitalocean.com/platform/billing/bandwidth/)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-5a635d5f9916e3082336de94407a063e6d5c3c42` / `2026-10-22.planning.2`. Curve: `workload-3`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Spaces pricing](https://docs.digitalocean.com/products/spaces/details/pricing/), [Bandwidth billing](https://docs.digitalocean.com/platform/billing/bandwidth/).

**S3 Standard → DigitalOcean Spaces: Authored native-usage planning example.** Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts.

Scenario source region: us-east-1. Scenario target region: nyc3. Currency: USD.

| Monthly component | USD |
| - | -: |
| Origin: Stored object data | 0.00 |
| Origin: Object writes | 0.00 |
| Origin: Object reads | 0.00 |
| Origin: Billable origin network transfer | 0.00 |
| Target: Target read operations | 0.00 |
| Target: Target write operations | 0.00 |
| Target: Target retained physical data after 250 included | 0.00 |
| Target: Additional broker replica storage | 0.00 |
| Target: Execution or worker CPU | 0.00 |
| Target: Execution or worker RAM | 0.00 |
| Target: Selected billable network after 1024 included | 0.00 |
| Target: Independent native resources | 0.00 |
| Target: Independent native resources | 0.00 |
| Target: Target monthly base charge | 5.00 |
| **Origin service subtotal** | **0.00** |
| **Target service subtotal** | **5.00** |

Unestimated components: Adapter hosting, Tensor9 fees. A modeled adapted total and savings require these costs.

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

**Scenario assumptions**

| Input | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target price guess · read | 0 | USD/read |
| Target price guess · write | 0 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.02 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.01 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · GiB-month | 250 | GiB-month |
| Included before billing · network GiB | 1,024 | network GiB |
| Target monthly base charge · list price | 5 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |
| Stored object data | 0 | GiB-month |
| Object writes | 0 | requests |
| Object reads | 0 | requests |
| Billable origin network transfer | 0 | GiB |

* Translated reads: 0 operations.

* Translated writes: 0 operations.

* Translated resident physical data: 0 GiB-month.

* Native provider operations: 0 operations.

* Published payload: 0 GiB.

* Delivered payload: 0 GiB.

* Allocated execution CPU: 0 vCPU-hour.

* Allocated execution RAM: 0 GiB-hour.

* Independent resource allocation: 0 resource-hour.

* Independent inventory: 0 resource-month.

* Input tokens: 0 tokens.

* Output tokens: 0 tokens.

* Billable network: 0 GiB.

* Dependent object sink retained data: 0 GiB-month.

* Dependent object sink writes: 0 writes.

* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.

* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.

* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.

* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.

* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.

* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.

* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.

* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.

* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.

* Object storage bills stored GiB-months, read and write requests and internet egress. Spaces is a USD 5 monthly subscription that includes 250 GiB stored and 1,024 GiB of outbound transfer, with no request charges. Spaces has no storage classes in this mapping, so a Glacier origin is billed as Standard storage; Spaces Cold Storage (USD 0.007 per GiB-month) is not selected.

List prices read: 2026-10-22. Model: `plan-5a635d5f9916e3082336de94407a063e6d5c3c42` / `2026-10-22.planning.2`. Scenario: `planning-example`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Spaces pricing](https://docs.digitalocean.com/products/spaces/details/pricing/), [Bandwidth billing](https://docs.digitalocean.com/platform/billing/bandwidth/).

## On Google Cloud

### Cloud Storage

| Capability | Area | Support | Operations | Notes |
| - | - | - | - | - |
| Bucket policy, CORS, website, notification and replication APIs | Bucket config | Out of scope | - | These runtime S3 configuration APIs are outside the listed endpoint. Native backend configuration and deployment mappings are described separately. |
| Bucket versioning, tagging, lifecycle and encryption | Bucket config | Partial | - | With Cloud Adapter, runtime S3 calls retain bucket settings and apply supported backend mappings. Lifecycle filters, storage classes and account-level settings retain the limits described below. Simpler request forwarding configures these settings at deployment. |
| Presigned URLs | Other features | Supported | - | A presigned URL signed for the adapter's endpoint is checked by the adapter: its SigV4 signature, and an expiry of 1 second to 7 days, as on S3. The adapter then re-signs the request to the backend. A URL presigned for AWS's own endpoint does not reach the adapter. |

| Operation | Area | Support | Depth | Notes |
| - | - | - | - | - |
| GetObjectAcl | Access control | Out of scope | Full surface | Object ACL requests are rejected. Configure access through backend permissions or deployment configuration. |
| PutObjectAcl | Access control | Out of scope | Full surface | Object ACL requests are rejected. Configure access through backend permissions or deployment configuration. |
| CreateBucket | Bucket config | Supported | Most usage | The adapter serves this bucket operation. |
| DeleteBucket | Bucket config | Supported | Most usage | The adapter serves this bucket operation. |
| HeadBucket | Bucket config | Supported | Most usage | The adapter serves this bucket operation. |
| AbortMultipartUpload | Multipart | Supported | Most usage | served by compose-staging rather than by forwarding, because GCS's own XML multipart wire is not S3-identical: each part streams to a temp object and CompleteMultipartUpload composes them with the GCS JSON compose API, so an unmodified SDK's multipart upload works end to end |
| CompleteMultipartUpload | Multipart | Supported | Most usage | served by compose-staging rather than by forwarding, because GCS's own XML multipart wire is not S3-identical: each part streams to a temp object and CompleteMultipartUpload composes them with the GCS JSON compose API, so an unmodified SDK's multipart upload works end to end |
| CreateMultipartUpload | Multipart | Supported | Most usage | served by compose-staging rather than by forwarding, because GCS's own XML multipart wire is not S3-identical: each part streams to a temp object and CompleteMultipartUpload composes them with the GCS JSON compose API, so an unmodified SDK's multipart upload works end to end |
| ListMultipartUploads | Multipart | Out of scope | Most usage | compose-staging keys an upload's parts under a per-key prefix and keeps no bucket-wide uploadId registry, so a bucket's in-progress uploads cannot be enumerated; the Azure translator declines it for the same reason |
| ListParts | Multipart | Supported | Most usage | served by compose-staging rather than by forwarding, because GCS's own XML multipart wire is not S3-identical: each part streams to a temp object and CompleteMultipartUpload composes them with the GCS JSON compose API, so an unmodified SDK's multipart upload works end to end |
| UploadPart | Multipart | Supported | Most usage | served by compose-staging rather than by forwarding, because GCS's own XML multipart wire is not S3-identical: each part streams to a temp object and CompleteMultipartUpload composes them with the GCS JSON compose API, so an unmodified SDK's multipart upload works end to end |
| UploadPartCopy | Multipart | Out of scope | Full surface | the copy-source range form is declined on this backend |
| GetObjectLegalHold | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| GetObjectRetention | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| PutObjectLegalHold | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| PutObjectRetention | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| CopyObject | Objects | Supported | Most usage | server-side copy via x-amz-copy-source |
| DeleteObject | Objects | Supported | Common | - |
| DeleteObjects | Objects | Supported | Common | batch delete is served: GCS has no \<Delete> batch endpoint, so the adapter fans the key list out to per-key deletes under a time budget and renders the S3 \<Deleted>/\<Error> result rows; a missing key is a success, matching S3's own idempotency |
| GetObject | Objects | Supported | Common | - |
| HeadObject | Objects | Supported | Common | - |
| ListObjectVersions | Objects | Supported | Most usage | The adapter renders S3 version listings from the GCS JSON API. VersionId identifies the native generation; delete markers record versionless deletes on versioned buckets. |
| ListObjects | Objects | Supported | Common | the v1 listing form |
| ListObjectsV2 | Objects | Supported | Common | - |
| PutObject | Objects | Supported | Common | - |
| GetObjectAttributes | Other features | Out of scope | Full surface | the ?attributes query is not served; use HeadObject |
| RestoreObject | Other features | Out of scope | Full surface | the ?restore query is rejected |
| SelectObjectContent | Other features | Out of scope | Full surface | the ?select query is rejected |
| DeleteObjectTagging | Tagging | Adapter-served | Most usage | Cloud Storage has no object-tag primitive of its own, so the tag set is stored in reserved custom metadata on the object and rendered back as an S3 tagging document on read. Put replaces the whole set, matching S3. Version-addressed tagging requests are declined; native lifecycle and IAM conditions cannot use these reserved metadata tags |
| GetObjectTagging | Tagging | Adapter-served | Most usage | Cloud Storage has no object-tag primitive of its own, so the tag set is stored in reserved custom metadata on the object and rendered back as an S3 tagging document on read. Put replaces the whole set, matching S3. Version-addressed tagging requests are declined; native lifecycle and IAM conditions cannot use these reserved metadata tags |
| PutObjectTagging | Tagging | Adapter-served | Most usage | Cloud Storage has no object-tag primitive of its own, so the tag set is stored in reserved custom metadata on the object and rendered back as an S3 tagging document on read. Put replaces the whole set, matching S3. Version-addressed tagging requests are declined; native lifecycle and IAM conditions cannot use these reserved metadata tags |

#### S3 requests in the target environment

The application continues using the S3 API. The Tensor9 adapter runs in the target environment and sends object requests to Google Cloud Storage. It also serves bucket creation, deletion, listing, and configuration through a persistent bucket store. Google Cloud Storage stores the objects; Tensor9 operates the adapter and its bucket-management service.

#### Request flow

Object requests use the backend storage service. Bucket settings persist separately and are applied to the backend resource.

![The S3 application calls the Tensor9 adapter. Object requests go to the backend object store. Bucket settings persist in the adapter's store and a configuration worker applies them to the backend.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjI4OCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDI4OCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgUzMgYXBwbGljYXRpb24gY2FsbHMgdGhlIFRlbnNvcjkgYWRhcHRlci4gT2JqZWN0IHJlcXVlc3RzIGdvIHRvIHRoZSBiYWNrZW5kIG9iamVjdCBzdG9yZS4gQnVja2V0IHNldHRpbmdzIHBlcnNpc3QgaW4gdGhlIGFkYXB0ZXIncyBzdG9yZSBhbmQgYSBjb25maWd1cmF0aW9uIHdvcmtlciBhcHBsaWVzIHRoZW0gdG8gdGhlIGJhY2tlbmQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CiAgPGRlZnM+PG1hcmtlciBpZD0iczMtbWF4LWFycm93IiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSI0IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wLDAgTDgsNCBMMCw4IFoiIHN0eWxlPSJmaWxsOiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+CiAgPHJlY3QgeD0iMjQiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNlZWYyZmY7c3Ryb2tlOiNjN2QyZmUiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNlY2ZkZjU7c3Ryb2tlOiNhN2YzZDAiLz4KICA8cmVjdCB4PSI1OTYiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNmOGZhZmM7c3Ryb2tlOiNjYmQ1ZTEiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjE4NCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI2OCIgcng9IjEwIiBzdHlsZT0iZmlsbDojZWNmZGY1O3N0cm9rZTojYTdmM2QwIi8+CiAgPHJlY3QgeD0iNTk2IiB5PSIxODQiIHdpZHRoPSIyMjAiIGhlaWdodD0iNjgiIHJ4PSIxMCIgc3R5bGU9ImZpbGw6I2Y4ZmFmYztzdHJva2U6I2NiZDVlMSIvPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZpbGw6IzBmMTcyYSI+CiAgICA8dGV4dCB4PSIxMzQiIHk9IjcwIj5BcHBsaWNhdGlvbjwvdGV4dD48dGV4dCB4PSIxMzQiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5TMyBTREs8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjcwIj5UZW5zb3I5IFMzIGFkYXB0ZXI8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSI5NiIgZm9udC1zaXplPSIxNCI+T2JqZWN0IGFuZCBidWNrZXQgQVBJczwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iNzAiPkdvb2dsZSBDbG91ZCBTdG9yYWdlPC90ZXh0Pjx0ZXh0IHg9IjcwNiIgeT0iOTYiIGZvbnQtc2l6ZT0iMTQiPk9iamVjdHMgYW5kIHN0b3JhZ2U8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjIxMiI+UGVyc2lzdGVudCBidWNrZXQgc3RvcmU8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSIyMzYiIGZvbnQtc2l6ZT0iMTQiPk5hbWVzIGFuZCBjb25maWd1cmF0aW9uPC90ZXh0PgogICAgPHRleHQgeD0iNzA2IiB5PSIyMjQiPkNvbmZpZ3VyYXRpb24gd29ya2VyPC90ZXh0PgogIDwvZz4KICA8ZyBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiIG1hcmtlci1lbmQ9InVybCgjczMtbWF4LWFycm93KSIgc3R5bGU9InN0cm9rZTojOTRhM2I4Ij4KICAgIDxwYXRoIGQ9Ik0yNDQgNzggSDMwNiIvPjxwYXRoIGQ9Ik01MzAgNzggSDU5MiIvPjxwYXRoIGQ9Ik00MjAgMTIwIFYxODAiLz4KICAgIDxwYXRoIGQ9Ik01MzAgMjE4IEg1OTIiLz48cGF0aCBkPSJNNzA2IDE4NCBWMTI0Ii8+CiAgPC9nPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgc3R5bGU9ImZpbGw6IzMzNDE1NSI+CiAgICA8dGV4dCB4PSI0MzIiIHk9IjE1MyI+QnVja2V0IHNldHRpbmdzPC90ZXh0Pjx0ZXh0IHg9IjcxOCIgeT0iMTU0Ij5BcHBseTwvdGV4dD4KICA8L2c+Cjwvc3ZnPg==)

![The S3 application calls the Tensor9 adapter. Object requests go to the backend object store. Bucket settings persist in the adapter's store and a configuration worker applies them to the backend.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjI4OCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDI4OCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgUzMgYXBwbGljYXRpb24gY2FsbHMgdGhlIFRlbnNvcjkgYWRhcHRlci4gT2JqZWN0IHJlcXVlc3RzIGdvIHRvIHRoZSBiYWNrZW5kIG9iamVjdCBzdG9yZS4gQnVja2V0IHNldHRpbmdzIHBlcnNpc3QgaW4gdGhlIGFkYXB0ZXIncyBzdG9yZSBhbmQgYSBjb25maWd1cmF0aW9uIHdvcmtlciBhcHBsaWVzIHRoZW0gdG8gdGhlIGJhY2tlbmQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CiAgPGRlZnM+PG1hcmtlciBpZD0iczMtbWF4LWFycm93IiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSI0IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wLDAgTDgsNCBMMCw4IFoiIHN0eWxlPSJmaWxsOiM2NDc0OGIiLz48L21hcmtlcj48L2RlZnM+CiAgPHJlY3QgeD0iMjQiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMxZTFiNGI7c3Ryb2tlOiMzNzMwYTMiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMwNjRlM2I7c3Ryb2tlOiMwNDc4NTciLz4KICA8cmVjdCB4PSI1OTYiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMwZjE3MmE7c3Ryb2tlOiM0NzU1NjkiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjE4NCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI2OCIgcng9IjEwIiBzdHlsZT0iZmlsbDojMDY0ZTNiO3N0cm9rZTojMDQ3ODU3Ii8+CiAgPHJlY3QgeD0iNTk2IiB5PSIxODQiIHdpZHRoPSIyMjAiIGhlaWdodD0iNjgiIHJ4PSIxMCIgc3R5bGU9ImZpbGw6IzBmMTcyYTtzdHJva2U6IzQ3NTU2OSIvPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZpbGw6I2YxZjVmOSI+CiAgICA8dGV4dCB4PSIxMzQiIHk9IjcwIj5BcHBsaWNhdGlvbjwvdGV4dD48dGV4dCB4PSIxMzQiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5TMyBTREs8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjcwIj5UZW5zb3I5IFMzIGFkYXB0ZXI8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSI5NiIgZm9udC1zaXplPSIxNCI+T2JqZWN0IGFuZCBidWNrZXQgQVBJczwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iNzAiPkdvb2dsZSBDbG91ZCBTdG9yYWdlPC90ZXh0Pjx0ZXh0IHg9IjcwNiIgeT0iOTYiIGZvbnQtc2l6ZT0iMTQiPk9iamVjdHMgYW5kIHN0b3JhZ2U8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjIxMiI+UGVyc2lzdGVudCBidWNrZXQgc3RvcmU8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSIyMzYiIGZvbnQtc2l6ZT0iMTQiPk5hbWVzIGFuZCBjb25maWd1cmF0aW9uPC90ZXh0PgogICAgPHRleHQgeD0iNzA2IiB5PSIyMjQiPkNvbmZpZ3VyYXRpb24gd29ya2VyPC90ZXh0PgogIDwvZz4KICA8ZyBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiIG1hcmtlci1lbmQ9InVybCgjczMtbWF4LWFycm93KSIgc3R5bGU9InN0cm9rZTojNjQ3NDhiIj4KICAgIDxwYXRoIGQ9Ik0yNDQgNzggSDMwNiIvPjxwYXRoIGQ9Ik01MzAgNzggSDU5MiIvPjxwYXRoIGQ9Ik00MjAgMTIwIFYxODAiLz4KICAgIDxwYXRoIGQ9Ik01MzAgMjE4IEg1OTIiLz48cGF0aCBkPSJNNzA2IDE4NCBWMTI0Ii8+CiAgPC9nPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgc3R5bGU9ImZpbGw6I2NiZDVlMSI+CiAgICA8dGV4dCB4PSI0MzIiIHk9IjE1MyI+QnVja2V0IHNldHRpbmdzPC90ZXh0Pjx0ZXh0IHg9IjcxOCIgeT0iMTU0Ij5BcHBseTwvdGV4dD4KICA8L2c+Cjwvc3ZnPg==)

#### Object requests

Core GetObject, HeadObject, PutObject, CopyObject, DeleteObject, and listing requests use GCS's S3-interoperable XML endpoint with backend credentials. Batch deletion sends per-object deletes and returns S3 Deleted/Error entries. Object tags are encoded in reserved GCS object metadata and reconstructed as S3 tagging documents. The object data stays in GCS; the bucket store does not hold object bodies.

#### Bucket creation and configuration

Each S3 bucket has a durable record containing its name, owner, requested configuration, and backend reference. For a bucket named `bucket-name`, the S3-facing identifier is `arn:aws:s3:::bucket-name`; the backend resource is a GCS bucket. `ListBuckets` returns the caller's buckets, and configuration reads use the stored request state.

A configuration worker applies the stored settings to the backend. `CreateBucket` waits for the backend bucket to be ready before returning success, so an immediate object write does not race bucket creation. `DeleteBucket` waits for removal and returns `BucketNotEmpty` if objects prevent deletion. A lifecycle update also waits for the backend to apply it. For other configuration changes, a successful read of the new setting describes stored configuration; it does not imply every backend-side change has already completed.

#### Versions and multipart uploads

GCS multipart uploads use temporary objects for individual parts. Completion calls the GCS JSON compose API to form the final object. With Cloud Adapter, the adapter retains part checksums to supply S3's composite multipart ETag and maintains the S3 version history and delete markers that differ from native GCS generations. A deployment that only forwards object requests instead exposes the native generation model and compose ETag. ListMultipartUploads and UploadPartCopy remain outside the listed mapping.

#### Backend configuration

Bucket versioning, tagging, lifecycle and encryption settings are managed through runtime S3 calls. Lifecycle translation supports the rules listed in the feature comparison: prefix-scoped, relative-age expiration and transitions to STANDARD\_IA or ONEZONE\_IA, both mapped to Nearline. Unsupported date, filter, noncurrent-version and archival-transition forms return an error rather than a different retention or cost policy. Encryption uses Google-managed keys, Cloud KMS customer-managed keys or customer-supplied keys as applicable; DSSE-KMS and S3 Bucket Keys have no direct equivalent.

#### Placement and operation

GCS provides strong read-after-write consistency and designs for 99.999999999% annual durability. Region, dual-region or multi-region placement controls where the provider stores the data. Cross-bucket replication uses Storage Transfer Service rather than the S3 replication-rule engine. Object notifications go to Pub/Sub; routing to other destination types requires downstream integration. Tensor9 operates the bucket-management adapter, while Google operates object storage.

#### Compatibility limits

Bucket policy is unsupported at every adaptation tier. Object ACL, retention/legal-hold, S3 Select and RestoreObject APIs remain outside the listed S3 endpoint. Native GCS features such as Bucket Lock, Requester Pays and Autoclass must be assessed with their own configuration and semantics; native availability does not turn them into unrestricted S3 API equivalents.

#### Migration and leaving the adapter

A newly provisioned backend bucket starts empty. Copy existing objects and required versions with a migration tool or a coordinated dual-write, then verify object data and application reads before switching. Preserve version history through the S3 API when the application depends on S3 version identifiers or delete markers.

Leaving the service adapter requires moving bucket configuration as well as object data. Apply the retained settings to native backend resources, resolve any S3-specific version metadata, and move clients to the backend's own API. Keep the adapter and its persistent state until the application no longer depends on those S3 behaviors.

#### Example monthly charges

This Tensor9 Cloud Adapter scenario estimates service charges for the named origin and target services. Adapter hosting and commercial Tensor9 fees need separate allocations. [How Tensor9 estimates costs](https://docs.tensor9.com/cloud-adapter-early-access/costs/overview.md) explains the method and what the estimates include.

##### Monthly cost by retained S3 Standard data

Feature: Retained S3 Standard objects.

Reference monthly service charges by Retained source data. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: us-central1; currency: USD.

![Monthly cost by retained S3 Standard data: monthly service charges by Retained source data. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/45bde8e52ba8fdb6ebbf2abdc278e42eca7b81fb1a7aa02f900d145245532e83-light.svg)

![Monthly cost by retained S3 Standard data: monthly service charges by Retained source data. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/960308708baac1fa67fe84291efc81ca548706d69b34defa9ce4a7b2bfd26147-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Retained source data (GiB-month) | S3 | Cloud Storage (Standard) | Difference |
| -: | -: | -: | -: |
| 0 | 9.00 | 9.00 | 0.00 |
| 10 | 9.23 | 9.20 | -0.03 |
| 100 | 11.30 | 11.00 | -0.30 |
| 1,024 | 32.55 | 29.48 | -3.07 |
| 10,240 | 244.52 | 213.80 | -30.72 |
| 51,200 | 1,186.60 | 1,033.00 | -153.60 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Target retained bytes / source retained bytes | 1 | multiplier |
| Additional GCS Class A operations per PUT | 0 | operations/PUT |
| Additional GCS Class B operations per PUT | 0 | operations/PUT |
| Additional GCS Class B operations per GET | 0 | operations/GET |

* Ordinary requests stay at 1 million PUTs and 10 million GETs/month. Equal source/target billed bytes and no extra target operations are an idealized simple-operation baseline; S3 Standard first 50 TiB only.
* Monthly AWS source usage in us-east-1, priced at the 2026-10-18 reference list rates before free allowances, discounts, credits and tax; not the uploaded invoice total. Rates as of 2026-10-18: us-east-1 → us-central1, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* S3 Standard first 50 TiB; GCS Standard regional bucket with flat namespace. Ordinary GET/PUT scenario only.
* Zero additional operations is an idealized baseline. Conditional requests, multipart staging and compose/list/HEAD paths require explicit extra operations and retained-byte assumptions.
* Source usage is priced at reference rates; source lines are not actual invoice charges. Free or discounted usage still consumes target resources.
* S3 Standard pricing: [https://aws.amazon.com/s3/pricing/](https://aws.amazon.com/s3/pricing/)
* Regional GCS Standard pricing: [https://cloud.google.com/storage/pricing/](https://cloud.google.com/storage/pricing/)

Cost scope: Modeled monthly service usage and selected database allocation; adapter hosting and Tensor9 fees only when explicitly supplied.

Excluded costs and workload features:

* Free allowances, negotiated discounts, credits, tax and one-time migration charges.
* Charges not listed in the breakdown, including additional network transfer, backups and encryption/KMS.
* Application compute changes, operational labor and portfolio-wide sharing or deduplication of infrastructure.
* Other storage classes, multipart lifecycle, LIST/DELETE requests, replication and retrieval charges not explicitly supplied.

Rate snapshot: 2026-10-18. Model: `s3-gcs` / `2026-10-18.4`. Curve: `retained-data`.

Sources: [S3 Standard pricing](https://aws.amazon.com/s3/pricing/), [Regional GCS Standard pricing](https://cloud.google.com/storage/pricing/).

##### Monthly cost by ordinary S3 request rate

Feature: Ordinary S3 GET and PUT requests.

Reference monthly service charges by GET operations/s. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: us-central1; currency: USD.

![Monthly cost by ordinary S3 request rate: monthly service charges by GET operations/s. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/308610e13fca27b5ede8410dd384cb44043b66aac964d46771e820a9a6177f23-light.svg)

![Monthly cost by ordinary S3 request rate: monthly service charges by GET operations/s. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/ef12217f874cb6e914e496dbd4babfcc80dbc8f406d54ccdeec28cbd52220d3c-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| GET operations/s (GET/s) | S3 | Cloud Storage (Standard) | Difference |
| -: | -: | -: | -: |
| 0 | 235.52 | 204.80 | -30.72 |
| 1 | 237.89 | 207.17 | -30.72 |
| 10 | 259.17 | 228.45 | -30.72 |
| 100 | 472.04 | 441.32 | -30.72 |
| 1,000 | 2,600.72 | 2,570.00 | -30.72 |
| 10,000 | 23,887.52 | 23,856.80 | -30.72 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Target retained bytes / source retained bytes | 1 | multiplier |
| Additional GCS Class A operations per PUT | 0 | operations/PUT |
| Additional GCS Class B operations per PUT | 0 | operations/PUT |
| Additional GCS Class B operations per GET | 0 | operations/GET |

* One ordinary PUT per ten GETs; 730 hours/month. Source retained data stays at 10 TiB. Equal source/target billed bytes and no extra GCS operations are an idealized baseline; multipart, LIST, conditional and metadata paths need additional assumptions.
* Monthly AWS source usage in us-east-1, priced at the 2026-10-18 reference list rates before free allowances, discounts, credits and tax; not the uploaded invoice total. Rates as of 2026-10-18: us-east-1 → us-central1, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* S3 Standard first 50 TiB; GCS Standard regional bucket with flat namespace. Ordinary GET/PUT scenario only.
* Zero additional operations is an idealized baseline. Conditional requests, multipart staging and compose/list/HEAD paths require explicit extra operations and retained-byte assumptions.
* Source usage is priced at reference rates; source lines are not actual invoice charges. Free or discounted usage still consumes target resources.
* S3 Standard pricing: [https://aws.amazon.com/s3/pricing/](https://aws.amazon.com/s3/pricing/)
* Regional GCS Standard pricing: [https://cloud.google.com/storage/pricing/](https://cloud.google.com/storage/pricing/)

Cost scope: Modeled monthly service usage and selected database allocation; adapter hosting and Tensor9 fees only when explicitly supplied.

Excluded costs and workload features:

* Free allowances, negotiated discounts, credits, tax and one-time migration charges.
* Charges not listed in the breakdown, including additional network transfer, backups and encryption/KMS.
* Application compute changes, operational labor and portfolio-wide sharing or deduplication of infrastructure.
* Other storage classes, multipart lifecycle, LIST/DELETE requests, replication and retrieval charges not explicitly supplied.

Rate snapshot: 2026-10-18. Model: `s3-gcs` / `2026-10-18.4`. Curve: `get-rate`.

Sources: [S3 Standard pricing](https://aws.amazon.com/s3/pricing/), [Regional GCS Standard pricing](https://cloud.google.com/storage/pricing/).

**S3 → Google Cloud Storage: Reference monthly workload.** Monthly AWS usage charges at the 2026-10-18 reference list rates in us-east-1, before free allowances, discounts, credits and tax.

Scenario source region: us-east-1. Scenario target region: us-central1. Currency: USD.

| Monthly component | USD |
| - | -: |
| Origin: S3 Standard storage | 235.52 |
| Origin: S3 PUT requests | 5.00 |
| Origin: S3 GET requests | 4.00 |
| Target: GCS Standard retained data | 204.80 |
| Target: GCS Class A operations | 5.00 |
| Target: GCS Class B operations | 4.00 |
| **Origin service subtotal** | **244.52** |
| **Target service subtotal** | **213.80** |

Unestimated components: Allocated adapter hosting, Allocated Tensor9 fees. A modeled adapted total and savings require these costs.

Cost scope: Modeled monthly service usage and selected database allocation; adapter hosting and Tensor9 fees only when explicitly supplied.

Excluded costs and workload features:

* Free allowances, negotiated discounts, credits, tax and one-time migration charges.
* Charges not listed in the breakdown, including additional network transfer, backups and encryption/KMS.
* Application compute changes, operational labor and portfolio-wide sharing or deduplication of infrastructure.
* Other storage classes, multipart lifecycle, LIST/DELETE requests, replication and retrieval charges not explicitly supplied.

**Scenario assumptions**

| Input | Value | Unit |
| - | -: | - |
| S3 Standard storage | 235.52 | USD/month |
| S3 PUT requests | 5 | USD/month |
| S3 GET requests | 4 | USD/month |
| Target retained bytes / source retained bytes | 1 | multiplier |
| Additional GCS Class A operations per PUT | 0 | operations/PUT |
| Additional GCS Class B operations per PUT | 0 | operations/PUT |
| Additional GCS Class B operations per GET | 0 | operations/GET |

* Origin retained data: 10,240 GiB-month.

* Inferred ordinary PUTs: 1,000,000 requests/month.

* Inferred ordinary GETs: 10,000,000 requests/month.

* S3 Standard first 50 TiB; GCS Standard regional bucket with flat namespace. Ordinary GET/PUT scenario only.

* Zero additional operations is an idealized baseline. Conditional requests, multipart staging and compose/list/HEAD paths require explicit extra operations and retained-byte assumptions.

Rate snapshot: 2026-10-18. Model: `s3-gcs` / `2026-10-18.4`. Scenario: `s3-gcs-reference`.

Sources: [S3 Standard pricing](https://aws.amazon.com/s3/pricing/), [Regional GCS Standard pricing](https://cloud.google.com/storage/pricing/).

## On OCI

### OCI Object Storage

| Capability | Area | Support | Operations | Notes |
| - | - | - | - | - |
| Bucket policy, CORS, website, notification and replication APIs | Bucket config | Out of scope | - | These runtime S3 configuration APIs are outside the listed endpoint. Native backend configuration and deployment mappings are described separately. |
| Bucket versioning, tagging, lifecycle and encryption | Bucket config | Partial | - | With Cloud Adapter, runtime S3 calls retain bucket settings and apply supported backend mappings. Lifecycle filters, storage classes and account-level settings retain the limits described below. Simpler request forwarding configures these settings at deployment. |
| Presigned URLs | Other features | Supported | - | A presigned URL signed for the adapter's endpoint is checked by the adapter: its SigV4 signature, and an expiry of 1 second to 7 days, as on S3. The adapter then re-signs the request to the backend. A URL presigned for AWS's own endpoint does not reach the adapter. |

| Operation | Area | Support | Depth | Notes |
| - | - | - | - | - |
| GetObjectAcl | Access control | Out of scope | Full surface | Object ACL requests are rejected. Configure access through backend permissions or deployment configuration. |
| PutObjectAcl | Access control | Out of scope | Full surface | Object ACL requests are rejected. Configure access through backend permissions or deployment configuration. |
| CreateBucket | Bucket config | Supported | Most usage | The adapter serves this bucket operation. |
| DeleteBucket | Bucket config | Supported | Most usage | The adapter serves this bucket operation. |
| HeadBucket | Bucket config | Supported | Most usage | The adapter serves this bucket operation. |
| AbortMultipartUpload | Multipart | Supported | Most usage | - |
| CompleteMultipartUpload | Multipart | Supported | Most usage | - |
| CreateMultipartUpload | Multipart | Supported | Most usage | - |
| ListMultipartUploads | Multipart | Supported | Most usage | - |
| ListParts | Multipart | Supported | Most usage | - |
| UploadPart | Multipart | Supported | Most usage | - |
| GetObjectLegalHold | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| GetObjectRetention | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| PutObjectLegalHold | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| PutObjectRetention | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| CopyObject | Objects | Supported | Most usage | server-side copy via x-amz-copy-source |
| DeleteObject | Objects | Supported | Common | - |
| DeleteObjects | Objects | Supported | Common | batch delete (OCI BulkDelete) |
| GetObject | Objects | Supported | Common | bodies + byte ranges |
| HeadObject | Objects | Supported | Common | - |
| ListObjectVersions | Objects | Out of scope | Most usage | Version-addressed reads and deletes are supported, but ListObjectVersions is outside this mapping, including at Max. |
| ListObjects | Objects | Supported | Common | the v1 listing form |
| ListObjectsV2 | Objects | Supported | Common | - |
| PutObject | Objects | Supported | Common | - |
| GetObjectAttributes | Other features | Out of scope | Full surface | the ?attributes query is not served; use HeadObject |
| RestoreObject | Other features | Out of scope | Full surface | the ?restore query is rejected |
| SelectObjectContent | Other features | Out of scope | Full surface | the ?select query is rejected |
| DeleteObjectTagging | Tagging | Out of scope | Most usage | OCI's S3-compat API has only bucket tagging, not object tagging |
| GetObjectTagging | Tagging | Out of scope | Most usage | OCI's S3-compat API has only bucket tagging, not object tagging |
| PutObjectTagging | Tagging | Out of scope | Most usage | OCI's S3-compat API has only bucket tagging, not object tagging |

#### S3 requests in the target environment

The application continues using the S3 API. The Tensor9 adapter runs in the target environment and sends object requests to OCI Object Storage. It also serves bucket creation, deletion, listing, and configuration through a persistent bucket store. OCI Object Storage stores the objects; Tensor9 operates the adapter and its bucket-management service.

#### Request flow

Object requests use the backend storage service. Bucket settings persist separately and are applied to the backend resource.

![The S3 application calls the Tensor9 adapter. Object requests go to the backend object store. Bucket settings persist in the adapter's store and a configuration worker applies them to the backend.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjI4OCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDI4OCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgUzMgYXBwbGljYXRpb24gY2FsbHMgdGhlIFRlbnNvcjkgYWRhcHRlci4gT2JqZWN0IHJlcXVlc3RzIGdvIHRvIHRoZSBiYWNrZW5kIG9iamVjdCBzdG9yZS4gQnVja2V0IHNldHRpbmdzIHBlcnNpc3QgaW4gdGhlIGFkYXB0ZXIncyBzdG9yZSBhbmQgYSBjb25maWd1cmF0aW9uIHdvcmtlciBhcHBsaWVzIHRoZW0gdG8gdGhlIGJhY2tlbmQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CiAgPGRlZnM+PG1hcmtlciBpZD0iczMtbWF4LWFycm93IiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSI0IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wLDAgTDgsNCBMMCw4IFoiIHN0eWxlPSJmaWxsOiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+CiAgPHJlY3QgeD0iMjQiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNlZWYyZmY7c3Ryb2tlOiNjN2QyZmUiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNlY2ZkZjU7c3Ryb2tlOiNhN2YzZDAiLz4KICA8cmVjdCB4PSI1OTYiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNmOGZhZmM7c3Ryb2tlOiNjYmQ1ZTEiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjE4NCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI2OCIgcng9IjEwIiBzdHlsZT0iZmlsbDojZWNmZGY1O3N0cm9rZTojYTdmM2QwIi8+CiAgPHJlY3QgeD0iNTk2IiB5PSIxODQiIHdpZHRoPSIyMjAiIGhlaWdodD0iNjgiIHJ4PSIxMCIgc3R5bGU9ImZpbGw6I2Y4ZmFmYztzdHJva2U6I2NiZDVlMSIvPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZpbGw6IzBmMTcyYSI+CiAgICA8dGV4dCB4PSIxMzQiIHk9IjcwIj5BcHBsaWNhdGlvbjwvdGV4dD48dGV4dCB4PSIxMzQiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5TMyBTREs8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjcwIj5UZW5zb3I5IFMzIGFkYXB0ZXI8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSI5NiIgZm9udC1zaXplPSIxNCI+T2JqZWN0IGFuZCBidWNrZXQgQVBJczwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iNzAiPk9DSSBPYmplY3QgU3RvcmFnZTwvdGV4dD48dGV4dCB4PSI3MDYiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5PYmplY3RzIGFuZCBzdG9yYWdlPC90ZXh0PgogICAgPHRleHQgeD0iNDIwIiB5PSIyMTIiPlBlcnNpc3RlbnQgYnVja2V0IHN0b3JlPC90ZXh0Pjx0ZXh0IHg9IjQyMCIgeT0iMjM2IiBmb250LXNpemU9IjE0Ij5OYW1lcyBhbmQgY29uZmlndXJhdGlvbjwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iMjI0Ij5Db25maWd1cmF0aW9uIHdvcmtlcjwvdGV4dD4KICA8L2c+CiAgPGcgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIiBtYXJrZXItZW5kPSJ1cmwoI3MzLW1heC1hcnJvdykiIHN0eWxlPSJzdHJva2U6Izk0YTNiOCI+CiAgICA8cGF0aCBkPSJNMjQ0IDc4IEgzMDYiLz48cGF0aCBkPSJNNTMwIDc4IEg1OTIiLz48cGF0aCBkPSJNNDIwIDEyMCBWMTgwIi8+CiAgICA8cGF0aCBkPSJNNTMwIDIxOCBINTkyIi8+PHBhdGggZD0iTTcwNiAxODQgVjEyNCIvPgogIDwvZz4KICA8ZyBmb250LWZhbWlseT0ic3lzdGVtLXVpLHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIHN0eWxlPSJmaWxsOiMzMzQxNTUiPgogICAgPHRleHQgeD0iNDMyIiB5PSIxNTMiPkJ1Y2tldCBzZXR0aW5nczwvdGV4dD48dGV4dCB4PSI3MTgiIHk9IjE1NCI+QXBwbHk8L3RleHQ+CiAgPC9nPgo8L3N2Zz4=)

![The S3 application calls the Tensor9 adapter. Object requests go to the backend object store. Bucket settings persist in the adapter's store and a configuration worker applies them to the backend.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjI4OCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDI4OCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgUzMgYXBwbGljYXRpb24gY2FsbHMgdGhlIFRlbnNvcjkgYWRhcHRlci4gT2JqZWN0IHJlcXVlc3RzIGdvIHRvIHRoZSBiYWNrZW5kIG9iamVjdCBzdG9yZS4gQnVja2V0IHNldHRpbmdzIHBlcnNpc3QgaW4gdGhlIGFkYXB0ZXIncyBzdG9yZSBhbmQgYSBjb25maWd1cmF0aW9uIHdvcmtlciBhcHBsaWVzIHRoZW0gdG8gdGhlIGJhY2tlbmQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CiAgPGRlZnM+PG1hcmtlciBpZD0iczMtbWF4LWFycm93IiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSI0IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wLDAgTDgsNCBMMCw4IFoiIHN0eWxlPSJmaWxsOiM2NDc0OGIiLz48L21hcmtlcj48L2RlZnM+CiAgPHJlY3QgeD0iMjQiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMxZTFiNGI7c3Ryb2tlOiMzNzMwYTMiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMwNjRlM2I7c3Ryb2tlOiMwNDc4NTciLz4KICA8cmVjdCB4PSI1OTYiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMwZjE3MmE7c3Ryb2tlOiM0NzU1NjkiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjE4NCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI2OCIgcng9IjEwIiBzdHlsZT0iZmlsbDojMDY0ZTNiO3N0cm9rZTojMDQ3ODU3Ii8+CiAgPHJlY3QgeD0iNTk2IiB5PSIxODQiIHdpZHRoPSIyMjAiIGhlaWdodD0iNjgiIHJ4PSIxMCIgc3R5bGU9ImZpbGw6IzBmMTcyYTtzdHJva2U6IzQ3NTU2OSIvPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZpbGw6I2YxZjVmOSI+CiAgICA8dGV4dCB4PSIxMzQiIHk9IjcwIj5BcHBsaWNhdGlvbjwvdGV4dD48dGV4dCB4PSIxMzQiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5TMyBTREs8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjcwIj5UZW5zb3I5IFMzIGFkYXB0ZXI8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSI5NiIgZm9udC1zaXplPSIxNCI+T2JqZWN0IGFuZCBidWNrZXQgQVBJczwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iNzAiPk9DSSBPYmplY3QgU3RvcmFnZTwvdGV4dD48dGV4dCB4PSI3MDYiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5PYmplY3RzIGFuZCBzdG9yYWdlPC90ZXh0PgogICAgPHRleHQgeD0iNDIwIiB5PSIyMTIiPlBlcnNpc3RlbnQgYnVja2V0IHN0b3JlPC90ZXh0Pjx0ZXh0IHg9IjQyMCIgeT0iMjM2IiBmb250LXNpemU9IjE0Ij5OYW1lcyBhbmQgY29uZmlndXJhdGlvbjwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iMjI0Ij5Db25maWd1cmF0aW9uIHdvcmtlcjwvdGV4dD4KICA8L2c+CiAgPGcgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIiBtYXJrZXItZW5kPSJ1cmwoI3MzLW1heC1hcnJvdykiIHN0eWxlPSJzdHJva2U6IzY0NzQ4YiI+CiAgICA8cGF0aCBkPSJNMjQ0IDc4IEgzMDYiLz48cGF0aCBkPSJNNTMwIDc4IEg1OTIiLz48cGF0aCBkPSJNNDIwIDEyMCBWMTgwIi8+CiAgICA8cGF0aCBkPSJNNTMwIDIxOCBINTkyIi8+PHBhdGggZD0iTTcwNiAxODQgVjEyNCIvPgogIDwvZz4KICA8ZyBmb250LWZhbWlseT0ic3lzdGVtLXVpLHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTIiIHN0eWxlPSJmaWxsOiNjYmQ1ZTEiPgogICAgPHRleHQgeD0iNDMyIiB5PSIxNTMiPkJ1Y2tldCBzZXR0aW5nczwvdGV4dD48dGV4dCB4PSI3MTgiIHk9IjE1NCI+QXBwbHk8L3RleHQ+CiAgPC9nPgo8L3N2Zz4=)

#### Object requests

Object requests use OCI's Amazon S3 Compatibility endpoint. The adapter changes the endpoint and signs with the customer's OCI S3-compatible access and secret keys. Core reads, writes, copies, deletes and multipart uploads use the provider API. Object bodies remain in OCI Object Storage, while the adapter stores bucket configuration separately.

#### Bucket creation and configuration

Each S3 bucket has a durable record containing its name, owner, requested configuration, and backend reference. For a bucket named `bucket-name`, the S3-facing identifier is `arn:aws:s3:::bucket-name`; the backend resource is an OCI Object Storage bucket. `ListBuckets` returns the caller's buckets, and configuration reads use the stored request state.

A configuration worker applies the stored settings to the backend. `CreateBucket` waits for the backend bucket to be ready before returning success, so an immediate object write does not race bucket creation. `DeleteBucket` waits for removal and returns `BucketNotEmpty` if objects prevent deletion. A lifecycle update also waits for the backend to apply it. For other configuration changes, a successful read of the new setting describes stored configuration; it does not imply every backend-side change has already completed.

#### Versions and multipart uploads

OCI provides native multipart uploads and accepts a versionId on object reads, metadata reads and deletion. Its compatibility endpoint does not provide the S3 version-listing behavior used by the application. With Cloud Adapter, the adapter retains the version and deletion metadata needed by S3-addressed object operations. ListObjectVersions remains outside this mapping; maintaining version metadata does not add that API. Native multipart operations retain the provider's behavior.

#### Backend configuration

Runtime bucket configuration is stored by the adapter and applied through the backend bucket-management design. Native OCI bucket settings provide lifecycle, encryption, replication and retention. Encryption can use provider-managed, Vault-managed or customer-supplied keys; DSSE-KMS and S3 Bucket Keys have no direct equivalent. OCI tags apply to buckets; object tagging is outside the listed mapping. Retention rules combine time-based retention with optional locking and do not provide an independent S3 legal-hold object.

#### Placement and operation

OCI provides strong read-after-write consistency and designs for eleven-nines durability. It replicates across three availability domains, or three fault domains in a single-domain region. Cross-region replication targets a preexisting destination bucket. Object events use OCI Events. Tensor9 operates the bucket-management adapter, and Oracle operates the object store.

#### Compatibility limits

Bucket policy is unsupported at every tier. OCI's compatibility endpoint has no configurable CORS; its fixed response is not an S3 CORS rule set. Website hosting and Requester Pays have no direct OCI Object Storage equivalent. Presigned access uses OCI Pre-Authenticated Requests outside this S3 adapter path. The API table identifies operations that remain unavailable despite native storage features.

#### Migration and leaving the adapter

A newly provisioned backend bucket starts empty. Copy existing objects and required versions with a migration tool or a coordinated dual-write, then verify object data and application reads before switching. Preserve version history through the S3 API when the application depends on S3 version identifiers or delete markers.

Leaving the service adapter requires moving bucket configuration as well as object data. Apply the retained settings to native backend resources, resolve any S3-specific version metadata, and move clients to the backend's own API. Keep the adapter and its persistent state until the application no longer depends on those S3 behaviors.

#### Example monthly charges

This Tensor9 Cloud Adapter scenario estimates service charges for the named origin and target services. Adapter hosting and commercial Tensor9 fees need separate allocations. [How Tensor9 estimates costs](https://docs.tensor9.com/cloud-adapter-early-access/costs/overview.md) explains the method and what the estimates include.

##### S3 Standard · Stored data

Feature: S3 Standard.

Estimated monthly service charges by Stored data. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: us-ashburn-1; currency: USD.

![S3 Standard · Stored data: monthly service charges by Stored data. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/cdfb0d9270280d79be8ef0684af3c42162fbe6fef40f70e7308c98efb58a6a38-light.svg)

![S3 Standard · Stored data: monthly service charges by Stored data. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/39c5dac06ff74316428e30e2f6629e192809ee5b5ecd188a1abdd972d0c79751-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Stored data (GiB-month) | S3 | OCI Object Storage | Difference |
| -: | -: | -: | -: |
| 0 | 0.00 | 0.00 | 0.00 |
| 10 | 0.23 | 0.00 | -0.23 |
| 100 | 2.30 | 2.30 | -0.01 |
| 1,000 | 23.00 | 25.25 | 2.25 |
| 10,000 | 230.00 | 254.75 | 24.75 |
| 100,000 | 2,300.00 | 2,549.75 | 249.75 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target list price · read | 0.00000034 | USD/read |
| Target list price · write | 0.00000034 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.0255 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.0085 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · GiB-month | 10 | GiB-month |
| Included before billing · read | 50,000 | read |
| Included before billing · network GiB | 10,240 | network GiB |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |

* Request meters remain at their independently authored defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → us-ashburn-1, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Object storage bills stored GiB-months, read and write requests and internet egress. OCI Object Storage Standard tier: the first 10 GB stored, 50,000 requests and 10 TB of egress each month are free, and reads and writes share one request rate (its allowance is applied to reads). Infrequent Access (USD 0.01 per GB-month) and Archive (0.0026, where the S3 mapping places GLACIER data, with a 90-day minimum retention) are not selected.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* OCI price list API: [https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?currencyCode=USD](https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?currencyCode=USD)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-5de6ed33269cd5af6c0a009d579d867d2f37ab5f` / `2026-10-22.planning.2`. Curve: `workload-1`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [OCI price list API](https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?currencyCode=USD).

##### S3 Standard · Object writes

Feature: S3 Standard.

Estimated monthly service charges by Object writes. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: us-ashburn-1; currency: USD.

![S3 Standard · Object writes: monthly service charges by Object writes. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/7f2fbbd7988e93d257d20aa0ed3b0422fad9efbb724b3f3e40d1287985e9e8ea-light.svg)

![S3 Standard · Object writes: monthly service charges by Object writes. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/56b041705468fa1d32aaf5ebe2dfae2e0948b1f30c8330f5795d2a7d3afbf7b2-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Object writes (per second) | S3 | OCI Object Storage | Difference |
| -: | -: | -: | -: |
| 0 | 0.00 | 0.00 | 0.00 |
| 1 | 13.14 | 0.89 | -12.25 |
| 10 | 131.40 | 8.94 | -122.46 |
| 100 | 1,314.00 | 89.35 | -1,224.65 |
| 1,000 | 13,140.00 | 893.52 | -12,246.48 |
| 10,000 | 131,400.00 | 8,935.20 | -122,464.80 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target list price · read | 0.00000034 | USD/read |
| Target list price · write | 0.00000034 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.0255 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.0085 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · GiB-month | 10 | GiB-month |
| Included before billing · read | 50,000 | read |
| Included before billing · network GiB | 10,240 | network GiB |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |

* Stored GiB and reads stay at independent defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → us-ashburn-1, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Object storage bills stored GiB-months, read and write requests and internet egress. OCI Object Storage Standard tier: the first 10 GB stored, 50,000 requests and 10 TB of egress each month are free, and reads and writes share one request rate (its allowance is applied to reads). Infrequent Access (USD 0.01 per GB-month) and Archive (0.0026, where the S3 mapping places GLACIER data, with a 90-day minimum retention) are not selected.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* OCI price list API: [https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?currencyCode=USD](https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?currencyCode=USD)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-5de6ed33269cd5af6c0a009d579d867d2f37ab5f` / `2026-10-22.planning.2`. Curve: `workload-2`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [OCI price list API](https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?currencyCode=USD).

##### S3 Standard · Object reads

Feature: S3 Standard.

Estimated monthly service charges by Object reads. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: us-ashburn-1; currency: USD.

![S3 Standard · Object reads: monthly service charges by Object reads. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/b76abf11c2e4d2ec65deda44a87803746661d5df33c5d9888cd493a7be7a247c-light.svg)

![S3 Standard · Object reads: monthly service charges by Object reads. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/50d7a333d32a027c9d384978da312041f4e34e166e4a924ca9b1c515fe416e1a-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Object reads (per second) | S3 | OCI Object Storage | Difference |
| -: | -: | -: | -: |
| 0 | 0.00 | 0.00 | 0.00 |
| 1 | 1.05 | 0.88 | -0.17 |
| 10 | 10.51 | 8.92 | -1.59 |
| 100 | 105.12 | 89.34 | -15.79 |
| 1,000 | 1,051.20 | 893.50 | -157.70 |
| 10,000 | 10,512.00 | 8,935.18 | -1,576.82 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target list price · read | 0.00000034 | USD/read |
| Target list price · write | 0.00000034 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.0255 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.0085 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · GiB-month | 10 | GiB-month |
| Included before billing · read | 50,000 | read |
| Included before billing · network GiB | 10,240 | network GiB |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |

* Stored GiB and writes stay at independent defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → us-ashburn-1, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Object storage bills stored GiB-months, read and write requests and internet egress. OCI Object Storage Standard tier: the first 10 GB stored, 50,000 requests and 10 TB of egress each month are free, and reads and writes share one request rate (its allowance is applied to reads). Infrequent Access (USD 0.01 per GB-month) and Archive (0.0026, where the S3 mapping places GLACIER data, with a 90-day minimum retention) are not selected.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* OCI price list API: [https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?currencyCode=USD](https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?currencyCode=USD)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-5de6ed33269cd5af6c0a009d579d867d2f37ab5f` / `2026-10-22.planning.2`. Curve: `workload-3`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [OCI price list API](https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?currencyCode=USD).

**S3 Standard → OCI Object Storage: Authored native-usage planning example.** Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts.

Scenario source region: us-east-1. Scenario target region: us-ashburn-1. Currency: USD.

| Monthly component | USD |
| - | -: |
| Origin: Stored object data | 0.00 |
| Origin: Object writes | 0.00 |
| Origin: Object reads | 0.00 |
| Origin: Billable origin network transfer | 0.00 |
| Target: Target read operations after 50000 included | 0.00 |
| Target: Target write operations | 0.00 |
| Target: Target retained physical data after 10 included | 0.00 |
| Target: Additional broker replica storage | 0.00 |
| Target: Execution or worker CPU | 0.00 |
| Target: Execution or worker RAM | 0.00 |
| Target: Selected billable network after 10240 included | 0.00 |
| Target: Independent native resources | 0.00 |
| Target: Independent native resources | 0.00 |
| **Origin service subtotal** | **0.00** |
| **Target service subtotal** | **0.00** |

Unestimated components: Adapter hosting, Tensor9 fees. A modeled adapted total and savings require these costs.

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

**Scenario assumptions**

| Input | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target list price · read | 0.00000034 | USD/read |
| Target list price · write | 0.00000034 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.0255 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.0085 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · GiB-month | 10 | GiB-month |
| Included before billing · read | 50,000 | read |
| Included before billing · network GiB | 10,240 | network GiB |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |
| Stored object data | 0 | GiB-month |
| Object writes | 0 | requests |
| Object reads | 0 | requests |
| Billable origin network transfer | 0 | GiB |

* Translated reads: 0 operations.

* Translated writes: 0 operations.

* Translated resident physical data: 0 GiB-month.

* Native provider operations: 0 operations.

* Published payload: 0 GiB.

* Delivered payload: 0 GiB.

* Allocated execution CPU: 0 vCPU-hour.

* Allocated execution RAM: 0 GiB-hour.

* Independent resource allocation: 0 resource-hour.

* Independent inventory: 0 resource-month.

* Input tokens: 0 tokens.

* Output tokens: 0 tokens.

* Billable network: 0 GiB.

* Dependent object sink retained data: 0 GiB-month.

* Dependent object sink writes: 0 writes.

* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.

* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.

* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.

* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.

* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.

* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.

* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.

* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.

* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.

* Object storage bills stored GiB-months, read and write requests and internet egress. OCI Object Storage Standard tier: the first 10 GB stored, 50,000 requests and 10 TB of egress each month are free, and reads and writes share one request rate (its allowance is applied to reads). Infrequent Access (USD 0.01 per GB-month) and Archive (0.0026, where the S3 mapping places GLACIER data, with a 90-day minimum retention) are not selected.

List prices read: 2026-10-22. Model: `plan-5de6ed33269cd5af6c0a009d579d867d2f37ab5f` / `2026-10-22.planning.2`. Scenario: `planning-example`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [OCI price list API](https://apexapps.oracle.com/pls/apex/cetools/api/v1/products/?currencyCode=USD).

## On Private Kubernetes

### MinIO Storage

| Capability | Area | Support | Operations | Notes |
| - | - | - | - | - |
| Bucket sub-resources (versioning / lifecycle / encryption / policy / CORS / website / notification / replication) | Bucket config | Out of scope | - | provisioned at deploy time, not served as runtime S3 control calls |
| Presigned URLs | Other features | Supported | - | A presigned URL signed for the adapter's endpoint is checked by the adapter: its SigV4 signature, and an expiry of 1 second to 7 days, as on S3. The adapter then re-signs the request to the backend. A URL presigned for AWS's own endpoint does not reach the adapter. |

| Operation | Area | Support | Depth | Notes |
| - | - | - | - | - |
| GetObjectAcl | Access control | Out of scope | Full surface | Object ACL requests are rejected. Configure access through backend permissions or deployment configuration. |
| PutObjectAcl | Access control | Out of scope | Full surface | Object ACL requests are rejected. Configure access through backend permissions or deployment configuration. |
| CreateBucket | Bucket config | Supported | Most usage | The adapter serves this bucket operation. |
| DeleteBucket | Bucket config | Supported | Most usage | The adapter serves this bucket operation. |
| HeadBucket | Bucket config | Supported | Most usage | The adapter serves this bucket operation. |
| AbortMultipartUpload | Multipart | Supported | Most usage | - |
| CompleteMultipartUpload | Multipart | Supported | Most usage | - |
| CreateMultipartUpload | Multipart | Supported | Most usage | - |
| ListMultipartUploads | Multipart | Supported | Most usage | - |
| ListParts | Multipart | Supported | Most usage | - |
| UploadPart | Multipart | Supported | Most usage | - |
| GetObjectLegalHold | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| GetObjectRetention | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| PutObjectLegalHold | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| PutObjectRetention | Object lock | Out of scope | Full surface | the object-lock sub-resources are rejected |
| CopyObject | Objects | Supported | Most usage | server-side copy via x-amz-copy-source |
| DeleteObject | Objects | Supported | Common | - |
| DeleteObjects | Objects | Supported | Common | batch delete |
| GetObject | Objects | Supported | Common | - |
| HeadObject | Objects | Supported | Common | - |
| ListObjectVersions | Objects | Supported | Most usage | when bucket versioning is enabled |
| ListObjects | Objects | Supported | Common | the v1 listing form |
| ListObjectsV2 | Objects | Supported | Common | - |
| PutObject | Objects | Supported | Common | - |
| GetObjectAttributes | Other features | Out of scope | Full surface | the ?attributes query is not served; use HeadObject |
| RestoreObject | Other features | Out of scope | Full surface | the ?restore query is rejected |
| SelectObjectContent | Other features | Out of scope | Full surface | the ?select query is rejected |
| DeleteObjectTagging | Tagging | Supported | Most usage | - |
| GetObjectTagging | Tagging | Supported | Most usage | - |
| PutObjectTagging | Tagging | Supported | Most usage | - |

#### How it works

Your application keeps its S3 client and sends its requests to the Tensor9 adapter. The adapter signs each supported request with the customer's MinIO credentials and sends it to MinIO's S3 endpoint. Tensor9 deploys and operates MinIO inside the Cloud Adapter deployment, including in disconnected environments. Objects stay on the customer's disks.

![Your application sends S3 requests to the Tensor9 adapter, which signs them for MinIO and sends them on. MinIO stores the objects on the customer's disks.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjE3MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDE3MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJZb3VyIGFwcGxpY2F0aW9uIHNlbmRzIFMzIHJlcXVlc3RzIHRvIHRoZSBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNpZ25zIHRoZW0gZm9yIE1pbklPIGFuZCBzZW5kcyB0aGVtIG9uLiBNaW5JTyBzdG9yZXMgdGhlIG9iamVjdHMgb24gdGhlIGN1c3RvbWVyJ3MgZGlza3MuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CiAgPGRlZnM+PG1hcmtlciBpZD0ibWluaW8tcmVxdWVzdC1hcnJvdyIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iOCIgcmVmWD0iNyIgcmVmWT0iNCIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCwwIEw4LDQgTDAsOCBaIiBzdHlsZT0iZmlsbDojNjQ3NDhiIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxnIHN0eWxlPSJzdHJva2U6Izk0YTNiOCI+PHJlY3QgeD0iMjAiIHk9IjQwIiB3aWR0aD0iMjEwIiBoZWlnaHQ9Ijk1IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNmOGZhZmMiLz48cmVjdCB4PSIzMTUiIHk9IjQwIiB3aWR0aD0iMjEwIiBoZWlnaHQ9Ijk1IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNmOGZhZmMiLz48cmVjdCB4PSI2MTAiIHk9IjQwIiB3aWR0aD0iMjEwIiBoZWlnaHQ9Ijk1IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNmOGZhZmMiLz48L2c+CiAgPGcgZm9udC1mYW1pbHk9InN5c3RlbS11aSxzYW5zLXNlcmlmIiBmb250LXNpemU9IjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZmlsbDojMGYxNzJhIj48dGV4dCB4PSIxMjUiIHk9Ijc3Ij5Zb3VyIGFwcGxpY2F0aW9uPC90ZXh0Pjx0ZXh0IHg9IjQyMCIgeT0iNzciPlRlbnNvcjkgYWRhcHRlcjwvdGV4dD48dGV4dCB4PSI3MTUiIHk9Ijc3Ij5NaW5JTzwvdGV4dD48L2c+CiAgPGcgZm9udC1mYW1pbHk9InN5c3RlbS11aSxzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZmlsbDojMzM0MTU1Ij48dGV4dCB4PSIxMjUiIHk9IjEwNiI+UzMgY2xpZW50PC90ZXh0Pjx0ZXh0IHg9IjQyMCIgeT0iMTA2Ij5TaWducyBhbmQgc2VuZHMgb248L3RleHQ+PHRleHQgeD0iNzE1IiB5PSIxMDYiPk9iamVjdHMgb24geW91ciBkaXNrczwvdGV4dD48L2c+CiAgPGcgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI21pbmlvLXJlcXVlc3QtYXJyb3cpIiBzdHlsZT0ic3Ryb2tlOiM2NDc0OGIiPjxwYXRoIGQ9Ik0yMzAgODggSDMxMCIvPjxwYXRoIGQ9Ik01MjUgODggSDYwNSIvPjwvZz4KPC9zdmc+)

![Your application sends S3 requests to the Tensor9 adapter, which signs them for MinIO and sends them on. MinIO stores the objects on the customer's disks.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjE3MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDE3MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJZb3VyIGFwcGxpY2F0aW9uIHNlbmRzIFMzIHJlcXVlc3RzIHRvIHRoZSBUZW5zb3I5IGFkYXB0ZXIsIHdoaWNoIHNpZ25zIHRoZW0gZm9yIE1pbklPIGFuZCBzZW5kcyB0aGVtIG9uLiBNaW5JTyBzdG9yZXMgdGhlIG9iamVjdHMgb24gdGhlIGN1c3RvbWVyJ3MgZGlza3MuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CiAgPGRlZnM+PG1hcmtlciBpZD0ibWluaW8tcmVxdWVzdC1hcnJvdyIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iOCIgcmVmWD0iNyIgcmVmWT0iNCIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCwwIEw4LDQgTDAsOCBaIiBzdHlsZT0iZmlsbDojOTRhM2I4Ii8+PC9tYXJrZXI+PC9kZWZzPgogIDxnIHN0eWxlPSJzdHJva2U6IzY0NzQ4YiI+PHJlY3QgeD0iMjAiIHk9IjQwIiB3aWR0aD0iMjEwIiBoZWlnaHQ9Ijk1IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMwZjE3MmEiLz48cmVjdCB4PSIzMTUiIHk9IjQwIiB3aWR0aD0iMjEwIiBoZWlnaHQ9Ijk1IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMwZjE3MmEiLz48cmVjdCB4PSI2MTAiIHk9IjQwIiB3aWR0aD0iMjEwIiBoZWlnaHQ9Ijk1IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMwZjE3MmEiLz48L2c+CiAgPGcgZm9udC1mYW1pbHk9InN5c3RlbS11aSxzYW5zLXNlcmlmIiBmb250LXNpemU9IjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZmlsbDojZjFmNWY5Ij48dGV4dCB4PSIxMjUiIHk9Ijc3Ij5Zb3VyIGFwcGxpY2F0aW9uPC90ZXh0Pjx0ZXh0IHg9IjQyMCIgeT0iNzciPlRlbnNvcjkgYWRhcHRlcjwvdGV4dD48dGV4dCB4PSI3MTUiIHk9Ijc3Ij5NaW5JTzwvdGV4dD48L2c+CiAgPGcgZm9udC1mYW1pbHk9InN5c3RlbS11aSxzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZmlsbDojY2JkNWUxIj48dGV4dCB4PSIxMjUiIHk9IjEwNiI+UzMgY2xpZW50PC90ZXh0Pjx0ZXh0IHg9IjQyMCIgeT0iMTA2Ij5TaWducyBhbmQgc2VuZHMgb248L3RleHQ+PHRleHQgeD0iNzE1IiB5PSIxMDYiPk9iamVjdHMgb24geW91ciBkaXNrczwvdGV4dD48L2c+CiAgPGcgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI21pbmlvLXJlcXVlc3QtYXJyb3cpIiBzdHlsZT0ic3Ryb2tlOiM5NGEzYjgiPjxwYXRoIGQ9Ik0yMzAgODggSDMxMCIvPjxwYXRoIGQ9Ik01MjUgODggSDYwNSIvPjwvZz4KPC9zdmc+)

#### Object operations

The adapter passes through reads, writes, listings, deletes, server-side copies and multipart uploads. Versioned buckets also support version listing. Object tags are stored as MinIO object tags, so MinIO can use them in its lifecycle and access-policy conditions.

MinIO supports more of the S3 API than this endpoint accepts. The adapter rejects object ACL requests, bucket-policy requests, S3 Select, Glacier restore and runtime retention or legal-hold calls. MinIO does implement Object Lock, including GOVERNANCE and COMPLIANCE retention and independent legal holds; configure those directly on MinIO.

#### Consistency and recovery

MinIO provides strict read-after-write and list-after-write consistency. A completed write is visible to the next read and listing.

MinIO splits each object into data and parity pieces (shards) spread across drives. Parity lets it rebuild missing or damaged shards while enough drives remain available. How many failures it tolerates depends on the configured parity and on how drives are placed across nodes. Reads and writes need different numbers of drives online, so being able to recover data after an outage does not mean writes keep working during it.

MinIO checks reads with HighwayHash and can repair corruption it detects from the surviving shards. Tensor9 operates recovery and monitors the deployment; durability depends on its hardware and layout. MinIO publishes no durability percentage or availability SLA to stand in for that design. See [MinIO's erasure-coding documentation](https://min.io/docs/minio/linux/operations/concepts/erasure-coding.html) for parity and quorum requirements.

![Example erasure-coding layout: four data shards and two parity shards. Two missing shards can be rebuilt from the four that remain. In production, recovery and write availability depend on the configured parity and drive placement.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjE5MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDE5MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJFeGFtcGxlIGVyYXN1cmUtY29kaW5nIGxheW91dDogZm91ciBkYXRhIHNoYXJkcyBhbmQgdHdvIHBhcml0eSBzaGFyZHMuIFR3byBtaXNzaW5nIHNoYXJkcyBjYW4gYmUgcmVidWlsdCBmcm9tIHRoZSBmb3VyIHRoYXQgcmVtYWluLiBJbiBwcm9kdWN0aW9uLCByZWNvdmVyeSBhbmQgd3JpdGUgYXZhaWxhYmlsaXR5IGRlcGVuZCBvbiB0aGUgY29uZmlndXJlZCBwYXJpdHkgYW5kIGRyaXZlIHBsYWNlbWVudC4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KICA8dGV4dCB4PSIyNCIgeT0iMzAiIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNyIgc3R5bGU9ImZpbGw6IzBmMTcyYSI+RXhhbXBsZTogZm91ciBkYXRhIHNoYXJkcyBhbmQgdHdvIHBhcml0eSBzaGFyZHM8L3RleHQ+CiAgPGcgc3R5bGU9InN0cm9rZTojYzdkMmZlIj48cmVjdCB4PSIyNCIgeT0iNTQiIHdpZHRoPSIxMTIiIGhlaWdodD0iNjYiIHJ4PSI4IiBzdHlsZT0iZmlsbDojZWVmMmZmIi8+PHJlY3QgeD0iMTYwIiB5PSI1NCIgd2lkdGg9IjExMiIgaGVpZ2h0PSI2NiIgcng9IjgiIHN0eWxlPSJmaWxsOiNlZWYyZmYiLz48cmVjdCB4PSIyOTYiIHk9IjU0IiB3aWR0aD0iMTEyIiBoZWlnaHQ9IjY2IiByeD0iOCIgc3R5bGU9ImZpbGw6I2VlZjJmZiIvPjxyZWN0IHg9IjQzMiIgeT0iNTQiIHdpZHRoPSIxMTIiIGhlaWdodD0iNjYiIHJ4PSI4IiBzdHlsZT0iZmlsbDojZWVmMmZmIi8+PC9nPgogIDxnIHN0eWxlPSJzdHJva2U6I2E3ZjNkMCI+PHJlY3QgeD0iNTY4IiB5PSI1NCIgd2lkdGg9IjExMiIgaGVpZ2h0PSI2NiIgcng9IjgiIHN0eWxlPSJmaWxsOiNlY2ZkZjUiLz48cmVjdCB4PSI3MDQiIHk9IjU0IiB3aWR0aD0iMTEyIiBoZWlnaHQ9IjY2IiByeD0iOCIgc3R5bGU9ImZpbGw6I2VjZmRmNSIvPjwvZz4KICA8ZyBmb250LWZhbWlseT0ic3lzdGVtLXVpLHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmaWxsOiMwZjE3MmEiPjx0ZXh0IHg9IjgwIiB5PSI5MyI+RGF0YSAxPC90ZXh0Pjx0ZXh0IHg9IjIxNiIgeT0iOTMiPkRhdGEgMjwvdGV4dD48dGV4dCB4PSIzNTIiIHk9IjkzIj5EYXRhIDM8L3RleHQ+PHRleHQgeD0iNDg4IiB5PSI5MyI+RGF0YSA0PC90ZXh0Pjx0ZXh0IHg9IjYyNCIgeT0iOTMiPlBhcml0eSAxPC90ZXh0Pjx0ZXh0IHg9Ijc2MCIgeT0iOTMiPlBhcml0eSAyPC90ZXh0PjwvZz4KICA8dGV4dCB4PSIyNCIgeT0iMTU3IiBmb250LWZhbWlseT0ic3lzdGVtLXVpLHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTYiIHN0eWxlPSJmaWxsOiMzMzQxNTUiPlJlYnVpbGRpbmcgbmVlZHMgZm91ciBzdXJ2aXZpbmcgc2hhcmRzIGluIHRoaXMgZXhhbXBsZS48L3RleHQ+Cjwvc3ZnPg==)

![Example erasure-coding layout: four data shards and two parity shards. Two missing shards can be rebuilt from the four that remain. In production, recovery and write availability depend on the configured parity and drive placement.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjE5MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDE5MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJFeGFtcGxlIGVyYXN1cmUtY29kaW5nIGxheW91dDogZm91ciBkYXRhIHNoYXJkcyBhbmQgdHdvIHBhcml0eSBzaGFyZHMuIFR3byBtaXNzaW5nIHNoYXJkcyBjYW4gYmUgcmVidWlsdCBmcm9tIHRoZSBmb3VyIHRoYXQgcmVtYWluLiBJbiBwcm9kdWN0aW9uLCByZWNvdmVyeSBhbmQgd3JpdGUgYXZhaWxhYmlsaXR5IGRlcGVuZCBvbiB0aGUgY29uZmlndXJlZCBwYXJpdHkgYW5kIGRyaXZlIHBsYWNlbWVudC4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KICA8dGV4dCB4PSIyNCIgeT0iMzAiIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNyIgc3R5bGU9ImZpbGw6I2YxZjVmOSI+RXhhbXBsZTogZm91ciBkYXRhIHNoYXJkcyBhbmQgdHdvIHBhcml0eSBzaGFyZHM8L3RleHQ+CiAgPGcgc3R5bGU9InN0cm9rZTojMzczMGEzIj48cmVjdCB4PSIyNCIgeT0iNTQiIHdpZHRoPSIxMTIiIGhlaWdodD0iNjYiIHJ4PSI4IiBzdHlsZT0iZmlsbDojMWUxYjRiIi8+PHJlY3QgeD0iMTYwIiB5PSI1NCIgd2lkdGg9IjExMiIgaGVpZ2h0PSI2NiIgcng9IjgiIHN0eWxlPSJmaWxsOiMxZTFiNGIiLz48cmVjdCB4PSIyOTYiIHk9IjU0IiB3aWR0aD0iMTEyIiBoZWlnaHQ9IjY2IiByeD0iOCIgc3R5bGU9ImZpbGw6IzFlMWI0YiIvPjxyZWN0IHg9IjQzMiIgeT0iNTQiIHdpZHRoPSIxMTIiIGhlaWdodD0iNjYiIHJ4PSI4IiBzdHlsZT0iZmlsbDojMWUxYjRiIi8+PC9nPgogIDxnIHN0eWxlPSJzdHJva2U6IzA0Nzg1NyI+PHJlY3QgeD0iNTY4IiB5PSI1NCIgd2lkdGg9IjExMiIgaGVpZ2h0PSI2NiIgcng9IjgiIHN0eWxlPSJmaWxsOiMwNjRlM2IiLz48cmVjdCB4PSI3MDQiIHk9IjU0IiB3aWR0aD0iMTEyIiBoZWlnaHQ9IjY2IiByeD0iOCIgc3R5bGU9ImZpbGw6IzA2NGUzYiIvPjwvZz4KICA8ZyBmb250LWZhbWlseT0ic3lzdGVtLXVpLHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmaWxsOiNmMWY1ZjkiPjx0ZXh0IHg9IjgwIiB5PSI5MyI+RGF0YSAxPC90ZXh0Pjx0ZXh0IHg9IjIxNiIgeT0iOTMiPkRhdGEgMjwvdGV4dD48dGV4dCB4PSIzNTIiIHk9IjkzIj5EYXRhIDM8L3RleHQ+PHRleHQgeD0iNDg4IiB5PSI5MyI+RGF0YSA0PC90ZXh0Pjx0ZXh0IHg9IjYyNCIgeT0iOTMiPlBhcml0eSAxPC90ZXh0Pjx0ZXh0IHg9Ijc2MCIgeT0iOTMiPlBhcml0eSAyPC90ZXh0PjwvZz4KICA8dGV4dCB4PSIyNCIgeT0iMTU3IiBmb250LWZhbWlseT0ic3lzdGVtLXVpLHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iMTYiIHN0eWxlPSJmaWxsOiNjYmQ1ZTEiPlJlYnVpbGRpbmcgbmVlZHMgZm91ciBzdXJ2aXZpbmcgc2hhcmRzIGluIHRoaXMgZXhhbXBsZS48L3RleHQ+Cjwvc3ZnPg==)

#### Bucket configuration

Configure bucket features at deployment or directly on MinIO; the adapter does not pass runtime S3 bucket-configuration requests through. MinIO supports versioning, expiration of current and noncurrent objects, and cleanup of incomplete multipart uploads. Encryption supports SSE-S3, SSE-C and SSE-KMS through the KES key server.

Bucket replication copies objects between configured buckets. Site replication also replicates buckets and identity configuration, including users, groups and policies, across MinIO deployments. Choose the replication mode and recovery destinations your application needs.

MinIO can send object events to webhooks, Kafka, AMQP, NATS, Redis and several databases. Configure these destinations on MinIO.

#### Limitations

* **Runtime bucket configuration is not supported.** Bucket-configuration requests, including `PutBucketNotificationConfiguration`, are rejected. Set bucket features at deployment or on MinIO.
* **DSSE-KMS and S3 Bucket Keys are not supported.** MinIO has no equivalent for either in this mapping.
* **Storage classes behave differently: they choose parity, not price.** MinIO's `STANDARD` and `REDUCED_REDUNDANCY` classes select erasure-coding parity, not cost tiers. Lifecycle rules can move data to an external object store, but there is no on-cluster Glacier-style class.
* **Requester Pays is not supported.** This mapping has no requester billing mode.
* **Configurable CORS is not supported on the Community server.** Check support in the MinIO edition you deploy.
* **S3 static website hosting is not supported.** MinIO has no index or error-document website mode. A web server or reverse proxy can serve static content from the bucket.
* **Analytics, inventory, Intelligent-Tiering and metrics configurations are not supported.** They are outside this mapping.
* **The adapter does not check S3 presigned URLs.** It does not enforce their signatures or expiry. Use MinIO's own presigning or `mc share` for time-limited direct access.

#### Other considerations

* **Before going live.** The customer supplies the disks and nodes, and Tensor9 operates the store as part of the Cloud Adapter deployment. Size usable capacity after parity and replication, and plan expansion and recovery around the actual drive and node layout.
* **Moving from AWS.** New buckets start empty. Copy existing S3 objects and the versions you need before switching clients, then check reads and any version-dependent behaviour. MinIO site replication can seed another MinIO deployment, including its identity configuration.
* **Moving off the adapter.** Change client endpoints and credentials, and keep the bucket settings your application uses.

#### Example monthly charges

This Tensor9 Cloud Adapter scenario estimates service charges for the named origin and target services. Adapter hosting and commercial Tensor9 fees need separate allocations. [How Tensor9 estimates costs](https://docs.tensor9.com/cloud-adapter-early-access/costs/overview.md) explains the method and what the estimates include.

##### S3 Standard · Stored data

Feature: S3 Standard.

Estimated monthly service charges by Stored data. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: us-central1; currency: USD.

![S3 Standard · Stored data: monthly service charges by Stored data. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/0ba943c345f8441cf564f7f0279d2afe2abf81ae6cae7e6a1735c083a2cfad39-light.svg)

![S3 Standard · Stored data: monthly service charges by Stored data. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/701f442b4eafc965b2ea3c2c18f46f01dea7a279c634c5a6b0a1bbf607db1a01-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Stored data (GiB-month) | S3 | Target scenario | MinIO Storage | Difference |
| -: | -: | - | -: | -: |
| 0 | 0.00 | MinIO Storage (one copy) | 80.90 | 80.90 |
| 0 | 0.00 | MinIO Storage (two copies) | 161.79 | 161.79 |
| 10 | 0.23 | MinIO Storage (one copy) | 80.90 | 80.67 |
| 10 | 0.23 | MinIO Storage (two copies) | 161.79 | 161.56 |
| 100 | 2.30 | MinIO Storage (one copy) | 85.90 | 83.60 |
| 100 | 2.30 | MinIO Storage (two copies) | 171.79 | 169.49 |
| 1,000 | 23.00 | MinIO Storage (one copy) | 198.40 | 175.40 |
| 1,000 | 23.00 | MinIO Storage (two copies) | 396.79 | 373.79 |
| 10,000 | 230.00 | MinIO Storage (one copy) | 1,323.40 | 1,093.40 |
| 10,000 | 230.00 | MinIO Storage (two copies) | 2,646.79 | 2,416.79 |
| 100,000 | 2,300.00 | MinIO Storage (one copy) | 12,786.38 | 10,486.38 |
| 100,000 | 2,300.00 | MinIO Storage (two copies) | 25,572.77 | 23,272.77 |

Estimated allocation, not benchmark calibrated: sized from 2 vCPU, 8 GiB memory and 100 GiB SSD at 0 GiB-month to 4 nodes of 2 vCPU, 8 GiB memory and 31,257 GiB SSD each at 100,000 GiB-month.

**Curve assumptions**

| Target scenario | Assumption | Value | Unit |
| - | - | -: | - |
| MinIO Storage (one copy) | Origin list price · Stored object data | 0.023 | USD/GiB-month |
| MinIO Storage (one copy) | Origin list price · Object writes | 0.000005 | USD/requests |
| MinIO Storage (one copy) | Origin list price · Object reads | 0.0000004 | USD/requests |
| MinIO Storage (one copy) | Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| MinIO Storage (one copy) | Representative transferred object size | 1,048,576 | bytes |
| MinIO Storage (one copy) | Target requests per write | 1 | requests |
| MinIO Storage (one copy) | Target requests per read | 1 | requests |
| MinIO Storage (one copy) | Target price guess · read | 0 | USD/read |
| MinIO Storage (one copy) | Target price guess · write | 0 | USD/write |
| MinIO Storage (one copy) | Target price guess · provider operation | 0 | USD/provider operation |
| MinIO Storage (one copy) | Target list price · GiB-month | 0.1 | USD/GiB-month |
| MinIO Storage (one copy) | Target price guess · published GiB | 0 | USD/published GiB |
| MinIO Storage (one copy) | Target price guess · delivered GiB | 0 | USD/delivered GiB |
| MinIO Storage (one copy) | Target list price · network GiB | 0.12 | USD/network GiB |
| MinIO Storage (one copy) | Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| MinIO Storage (one copy) | Target list price · vCPU-hour | 0.031611 | USD/vCPU-hour |
| MinIO Storage (one copy) | Target list price · GiB-hour | 0.004237 | USD/GiB-hour |
| MinIO Storage (one copy) | Target price guess · resource-hour | 0 | USD/resource-hour |
| MinIO Storage (one copy) | Target price guess · resource-month | 0 | USD/resource-month |
| MinIO Storage (one copy) | Target price guess · input token | 0 | USD/input token |
| MinIO Storage (one copy) | Target price guess · output token | 0 | USD/output token |
| MinIO Storage (one copy) | Target monthly base charge | 0 | USD/month |
| MinIO Storage (one copy) | Approximate target service minimum | 0 | USD/month |
| MinIO Storage (one copy) | Minimum primary CPU | 2 | vCPU |
| MinIO Storage (one copy) | Minimum primary RAM | 8 | GiB |
| MinIO Storage (one copy) | Minimum primary disk | 100 | GiB |
| MinIO Storage (one copy) | Additional full-price standby copy | 0 | 0 or 1 |
| MinIO Storage (one copy) | Allocated share of provisioned cost | 1 | fraction |
| MinIO Storage (one copy) | Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| MinIO Storage (one copy) | Planning peak / mean work | 2 | multiplier |
| MinIO Storage (one copy) | Planning primary CPU utilization | 0.7 | fraction |
| MinIO Storage (one copy) | Resident state reserved in RAM | 0.1 | fraction |
| MinIO Storage (one copy) | Planning disk utilization | 0.8 | fraction |
| MinIO Storage (one copy) | Maintenance and log disk reserve | 20 | GiB |
| MinIO Storage (one copy) | Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| MinIO Storage (one copy) | Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| MinIO Storage (one copy) | Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| MinIO Storage (one copy) | Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| MinIO Storage (one copy) | Dependent object sink write price guess | 0.000005 | USD/write |
| MinIO Storage (two copies) | Origin list price · Stored object data | 0.023 | USD/GiB-month |
| MinIO Storage (two copies) | Origin list price · Object writes | 0.000005 | USD/requests |
| MinIO Storage (two copies) | Origin list price · Object reads | 0.0000004 | USD/requests |
| MinIO Storage (two copies) | Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| MinIO Storage (two copies) | Representative transferred object size | 1,048,576 | bytes |
| MinIO Storage (two copies) | Target requests per write | 1 | requests |
| MinIO Storage (two copies) | Target requests per read | 1 | requests |
| MinIO Storage (two copies) | Target price guess · read | 0 | USD/read |
| MinIO Storage (two copies) | Target price guess · write | 0 | USD/write |
| MinIO Storage (two copies) | Target price guess · provider operation | 0 | USD/provider operation |
| MinIO Storage (two copies) | Target list price · GiB-month | 0.1 | USD/GiB-month |
| MinIO Storage (two copies) | Target price guess · published GiB | 0 | USD/published GiB |
| MinIO Storage (two copies) | Target price guess · delivered GiB | 0 | USD/delivered GiB |
| MinIO Storage (two copies) | Target list price · network GiB | 0.12 | USD/network GiB |
| MinIO Storage (two copies) | Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| MinIO Storage (two copies) | Target list price · vCPU-hour | 0.031611 | USD/vCPU-hour |
| MinIO Storage (two copies) | Target list price · GiB-hour | 0.004237 | USD/GiB-hour |
| MinIO Storage (two copies) | Target price guess · resource-hour | 0 | USD/resource-hour |
| MinIO Storage (two copies) | Target price guess · resource-month | 0 | USD/resource-month |
| MinIO Storage (two copies) | Target price guess · input token | 0 | USD/input token |
| MinIO Storage (two copies) | Target price guess · output token | 0 | USD/output token |
| MinIO Storage (two copies) | Target monthly base charge | 0 | USD/month |
| MinIO Storage (two copies) | Approximate target service minimum | 0 | USD/month |
| MinIO Storage (two copies) | Minimum primary CPU | 2 | vCPU |
| MinIO Storage (two copies) | Minimum primary RAM | 8 | GiB |
| MinIO Storage (two copies) | Minimum primary disk | 100 | GiB |
| MinIO Storage (two copies) | Additional full-price standby copy | 1 | 0 or 1 |
| MinIO Storage (two copies) | Allocated share of provisioned cost | 1 | fraction |
| MinIO Storage (two copies) | Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| MinIO Storage (two copies) | Planning peak / mean work | 2 | multiplier |
| MinIO Storage (two copies) | Planning primary CPU utilization | 0.7 | fraction |
| MinIO Storage (two copies) | Resident state reserved in RAM | 0.1 | fraction |
| MinIO Storage (two copies) | Planning disk utilization | 0.8 | fraction |
| MinIO Storage (two copies) | Maintenance and log disk reserve | 20 | GiB |
| MinIO Storage (two copies) | Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| MinIO Storage (two copies) | Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| MinIO Storage (two copies) | Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| MinIO Storage (two copies) | Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| MinIO Storage (two copies) | Dependent object sink write price guess | 0.000005 | USD/write |

* Request meters remain at their independently authored defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → us-central1, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Self-hosted target: MinIO community server (GNU AGPL v3, [https://github.com/minio/minio/blob/master/LICENSE](https://github.com/minio/minio/blob/master/LICENSE)); erasure-coding overhead belongs in the family's physical-work translation. Selected CPU, RAM and physical disk allocation grow with workload; no per-operation price is assumed. No vendor charge: the target runs on the customer's Kubernetes nodes, so CPU, RAM and disk bill at the Kubernetes node reference rates, Compute Engine N2 in us-central1 (USD 0.031611/vCPU-hour, 0.004237/GiB-hour) with pd-balanced disk (0.10/GiB-month) and Premium Tier egress. The cost-optimized E2 series lists 0.02181159/vCPU-hour and 0.00292353/GiB-hour; AWS m6i/r6i and Azure D2s v5/E2s v5 both decompose to 0.033/vCPU-hour and 0.00375/GiB-hour. Requested CPU and RAM are billed; node bin-packing waste, system reservations and the cluster control-plane fee are not.
* Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1\_0\_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
* Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing ([https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size](https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size)): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
* Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)). The 20 GiB reserve exceeds PostgreSQL's 1 GB default max\_wal\_size; the remainder of that reserve is unmeasured.
* CPU tiers double from 2 vCPUs to the target's largest node at 4 GiB per vCPU; each target's documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
* No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
* Node bounds: Planning MinIO node of 32 vCPUs, 128 GiB and one 64 TiB Persistent Disk; a distributed deployment runs at least 4 nodes. Objects are served from disk, so no stored data is reserved in RAM; nodes scale to a 1,000-node planning bound.
* Stored GiB already includes the origin family's physical footprint assumptions; no second storage amplification is applied.
* The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
* Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* Compute Engine general-purpose machine pricing: [https://cloud.google.com/products/compute/pricing/general-purpose](https://cloud.google.com/products/compute/pricing/general-purpose)
* Disk and image pricing: [https://cloud.google.com/compute/disks-image-pricing](https://cloud.google.com/compute/disks-image-pricing)
* Network pricing: [https://cloud.google.com/vpc/network-pricing](https://cloud.google.com/vpc/network-pricing)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-01e62f79eb4fdd8f6e4171e0e49ff6906876cbd4` / `2026-10-22.planning.2`. Curve: `workload-1`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Compute Engine general-purpose machine pricing](https://cloud.google.com/products/compute/pricing/general-purpose), [Disk and image pricing](https://cloud.google.com/compute/disks-image-pricing), [Network pricing](https://cloud.google.com/vpc/network-pricing).

##### S3 Standard · Object writes

Feature: S3 Standard.

Estimated monthly service charges by Object writes. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: us-central1; currency: USD.

![S3 Standard · Object writes: monthly service charges by Object writes. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/a751c7bd874d6f13e1fcd17d1b2bfdf937d49eeb6bac63d02d2c38e1a3dccb93-light.svg)

![S3 Standard · Object writes: monthly service charges by Object writes. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/8be4a652af19d4471c545d2c9133f94086a0e6d8586fc51ad2f529af62f9add2-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Object writes (per second) | S3 | Target scenario | MinIO Storage | Difference |
| -: | -: | - | -: | -: |
| 0 | 0.00 | MinIO Storage (one copy) | 80.90 | 80.90 |
| 0 | 0.00 | MinIO Storage (two copies) | 161.79 | 161.79 |
| 1 | 13.14 | MinIO Storage (one copy) | 80.90 | 67.76 |
| 1 | 13.14 | MinIO Storage (two copies) | 161.79 | 148.65 |
| 10 | 131.40 | MinIO Storage (one copy) | 80.90 | -50.50 |
| 10 | 131.40 | MinIO Storage (two copies) | 161.79 | 30.39 |
| 100 | 1,314.00 | MinIO Storage (one copy) | 80.90 | -1,233.10 |
| 100 | 1,314.00 | MinIO Storage (two copies) | 161.79 | -1,152.21 |
| 1,000 | 13,140.00 | MinIO Storage (one copy) | 80.90 | -13,059.10 |
| 1,000 | 13,140.00 | MinIO Storage (two copies) | 161.79 | -12,978.21 |
| 10,000 | 131,400.00 | MinIO Storage (one copy) | 1,144.34 | -130,255.66 |
| 10,000 | 131,400.00 | MinIO Storage (two copies) | 2,288.68 | -129,111.32 |

Estimated allocation, not benchmark calibrated: sized from 2 vCPU, 8 GiB memory and 100 GiB SSD at 0 per second to 32 vCPU, 128 GiB memory and 100 GiB SSD at 10,000 per second.

**Curve assumptions**

| Target scenario | Assumption | Value | Unit |
| - | - | -: | - |
| MinIO Storage (one copy) | Origin list price · Stored object data | 0.023 | USD/GiB-month |
| MinIO Storage (one copy) | Origin list price · Object writes | 0.000005 | USD/requests |
| MinIO Storage (one copy) | Origin list price · Object reads | 0.0000004 | USD/requests |
| MinIO Storage (one copy) | Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| MinIO Storage (one copy) | Representative transferred object size | 1,048,576 | bytes |
| MinIO Storage (one copy) | Target requests per write | 1 | requests |
| MinIO Storage (one copy) | Target requests per read | 1 | requests |
| MinIO Storage (one copy) | Target price guess · read | 0 | USD/read |
| MinIO Storage (one copy) | Target price guess · write | 0 | USD/write |
| MinIO Storage (one copy) | Target price guess · provider operation | 0 | USD/provider operation |
| MinIO Storage (one copy) | Target list price · GiB-month | 0.1 | USD/GiB-month |
| MinIO Storage (one copy) | Target price guess · published GiB | 0 | USD/published GiB |
| MinIO Storage (one copy) | Target price guess · delivered GiB | 0 | USD/delivered GiB |
| MinIO Storage (one copy) | Target list price · network GiB | 0.12 | USD/network GiB |
| MinIO Storage (one copy) | Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| MinIO Storage (one copy) | Target list price · vCPU-hour | 0.031611 | USD/vCPU-hour |
| MinIO Storage (one copy) | Target list price · GiB-hour | 0.004237 | USD/GiB-hour |
| MinIO Storage (one copy) | Target price guess · resource-hour | 0 | USD/resource-hour |
| MinIO Storage (one copy) | Target price guess · resource-month | 0 | USD/resource-month |
| MinIO Storage (one copy) | Target price guess · input token | 0 | USD/input token |
| MinIO Storage (one copy) | Target price guess · output token | 0 | USD/output token |
| MinIO Storage (one copy) | Target monthly base charge | 0 | USD/month |
| MinIO Storage (one copy) | Approximate target service minimum | 0 | USD/month |
| MinIO Storage (one copy) | Minimum primary CPU | 2 | vCPU |
| MinIO Storage (one copy) | Minimum primary RAM | 8 | GiB |
| MinIO Storage (one copy) | Minimum primary disk | 100 | GiB |
| MinIO Storage (one copy) | Additional full-price standby copy | 0 | 0 or 1 |
| MinIO Storage (one copy) | Allocated share of provisioned cost | 1 | fraction |
| MinIO Storage (one copy) | Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| MinIO Storage (one copy) | Planning peak / mean work | 2 | multiplier |
| MinIO Storage (one copy) | Planning primary CPU utilization | 0.7 | fraction |
| MinIO Storage (one copy) | Resident state reserved in RAM | 0.1 | fraction |
| MinIO Storage (one copy) | Planning disk utilization | 0.8 | fraction |
| MinIO Storage (one copy) | Maintenance and log disk reserve | 20 | GiB |
| MinIO Storage (one copy) | Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| MinIO Storage (one copy) | Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| MinIO Storage (one copy) | Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| MinIO Storage (one copy) | Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| MinIO Storage (one copy) | Dependent object sink write price guess | 0.000005 | USD/write |
| MinIO Storage (two copies) | Origin list price · Stored object data | 0.023 | USD/GiB-month |
| MinIO Storage (two copies) | Origin list price · Object writes | 0.000005 | USD/requests |
| MinIO Storage (two copies) | Origin list price · Object reads | 0.0000004 | USD/requests |
| MinIO Storage (two copies) | Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| MinIO Storage (two copies) | Representative transferred object size | 1,048,576 | bytes |
| MinIO Storage (two copies) | Target requests per write | 1 | requests |
| MinIO Storage (two copies) | Target requests per read | 1 | requests |
| MinIO Storage (two copies) | Target price guess · read | 0 | USD/read |
| MinIO Storage (two copies) | Target price guess · write | 0 | USD/write |
| MinIO Storage (two copies) | Target price guess · provider operation | 0 | USD/provider operation |
| MinIO Storage (two copies) | Target list price · GiB-month | 0.1 | USD/GiB-month |
| MinIO Storage (two copies) | Target price guess · published GiB | 0 | USD/published GiB |
| MinIO Storage (two copies) | Target price guess · delivered GiB | 0 | USD/delivered GiB |
| MinIO Storage (two copies) | Target list price · network GiB | 0.12 | USD/network GiB |
| MinIO Storage (two copies) | Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| MinIO Storage (two copies) | Target list price · vCPU-hour | 0.031611 | USD/vCPU-hour |
| MinIO Storage (two copies) | Target list price · GiB-hour | 0.004237 | USD/GiB-hour |
| MinIO Storage (two copies) | Target price guess · resource-hour | 0 | USD/resource-hour |
| MinIO Storage (two copies) | Target price guess · resource-month | 0 | USD/resource-month |
| MinIO Storage (two copies) | Target price guess · input token | 0 | USD/input token |
| MinIO Storage (two copies) | Target price guess · output token | 0 | USD/output token |
| MinIO Storage (two copies) | Target monthly base charge | 0 | USD/month |
| MinIO Storage (two copies) | Approximate target service minimum | 0 | USD/month |
| MinIO Storage (two copies) | Minimum primary CPU | 2 | vCPU |
| MinIO Storage (two copies) | Minimum primary RAM | 8 | GiB |
| MinIO Storage (two copies) | Minimum primary disk | 100 | GiB |
| MinIO Storage (two copies) | Additional full-price standby copy | 1 | 0 or 1 |
| MinIO Storage (two copies) | Allocated share of provisioned cost | 1 | fraction |
| MinIO Storage (two copies) | Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| MinIO Storage (two copies) | Planning peak / mean work | 2 | multiplier |
| MinIO Storage (two copies) | Planning primary CPU utilization | 0.7 | fraction |
| MinIO Storage (two copies) | Resident state reserved in RAM | 0.1 | fraction |
| MinIO Storage (two copies) | Planning disk utilization | 0.8 | fraction |
| MinIO Storage (two copies) | Maintenance and log disk reserve | 20 | GiB |
| MinIO Storage (two copies) | Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| MinIO Storage (two copies) | Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| MinIO Storage (two copies) | Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| MinIO Storage (two copies) | Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| MinIO Storage (two copies) | Dependent object sink write price guess | 0.000005 | USD/write |

* Stored GiB and reads stay at independent defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → us-central1, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Self-hosted target: MinIO community server (GNU AGPL v3, [https://github.com/minio/minio/blob/master/LICENSE](https://github.com/minio/minio/blob/master/LICENSE)); erasure-coding overhead belongs in the family's physical-work translation. Selected CPU, RAM and physical disk allocation grow with workload; no per-operation price is assumed. No vendor charge: the target runs on the customer's Kubernetes nodes, so CPU, RAM and disk bill at the Kubernetes node reference rates, Compute Engine N2 in us-central1 (USD 0.031611/vCPU-hour, 0.004237/GiB-hour) with pd-balanced disk (0.10/GiB-month) and Premium Tier egress. The cost-optimized E2 series lists 0.02181159/vCPU-hour and 0.00292353/GiB-hour; AWS m6i/r6i and Azure D2s v5/E2s v5 both decompose to 0.033/vCPU-hour and 0.00375/GiB-hour. Requested CPU and RAM are billed; node bin-packing waste, system reservations and the cluster control-plane fee are not.
* Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1\_0\_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
* Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing ([https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size](https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size)): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
* Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)). The 20 GiB reserve exceeds PostgreSQL's 1 GB default max\_wal\_size; the remainder of that reserve is unmeasured.
* CPU tiers double from 2 vCPUs to the target's largest node at 4 GiB per vCPU; each target's documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
* No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
* Node bounds: Planning MinIO node of 32 vCPUs, 128 GiB and one 64 TiB Persistent Disk; a distributed deployment runs at least 4 nodes. Objects are served from disk, so no stored data is reserved in RAM; nodes scale to a 1,000-node planning bound.
* Stored GiB already includes the origin family's physical footprint assumptions; no second storage amplification is applied.
* The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
* Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* Compute Engine general-purpose machine pricing: [https://cloud.google.com/products/compute/pricing/general-purpose](https://cloud.google.com/products/compute/pricing/general-purpose)
* Disk and image pricing: [https://cloud.google.com/compute/disks-image-pricing](https://cloud.google.com/compute/disks-image-pricing)
* Network pricing: [https://cloud.google.com/vpc/network-pricing](https://cloud.google.com/vpc/network-pricing)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-01e62f79eb4fdd8f6e4171e0e49ff6906876cbd4` / `2026-10-22.planning.2`. Curve: `workload-2`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Compute Engine general-purpose machine pricing](https://cloud.google.com/products/compute/pricing/general-purpose), [Disk and image pricing](https://cloud.google.com/compute/disks-image-pricing), [Network pricing](https://cloud.google.com/vpc/network-pricing).

##### S3 Standard · Object reads

Feature: S3 Standard.

Estimated monthly service charges by Object reads. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: us-central1; currency: USD.

![S3 Standard · Object reads: monthly service charges by Object reads. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/d0610da9071480dc3cee8808d222cee6222e6159fb904a99646a1b8fc230497f-light.svg)

![S3 Standard · Object reads: monthly service charges by Object reads. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/1c843419b1ce5724e0090b9065b208597b8d8d5cfb7389bc24d3c69065c7347a-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Object reads (per second) | S3 | Target scenario | MinIO Storage | Difference |
| -: | -: | - | -: | -: |
| 0 | 0.00 | MinIO Storage (one copy) | 80.90 | 80.90 |
| 0 | 0.00 | MinIO Storage (two copies) | 161.79 | 161.79 |
| 1 | 1.05 | MinIO Storage (one copy) | 80.90 | 79.84 |
| 1 | 1.05 | MinIO Storage (two copies) | 161.79 | 160.74 |
| 10 | 10.51 | MinIO Storage (one copy) | 80.90 | 70.38 |
| 10 | 10.51 | MinIO Storage (two copies) | 161.79 | 151.28 |
| 100 | 105.12 | MinIO Storage (one copy) | 80.90 | -24.22 |
| 100 | 105.12 | MinIO Storage (two copies) | 161.79 | 56.67 |
| 1,000 | 1,051.20 | MinIO Storage (one copy) | 80.90 | -970.30 |
| 1,000 | 1,051.20 | MinIO Storage (two copies) | 161.79 | -889.41 |
| 10,000 | 10,512.00 | MinIO Storage (one copy) | 1,144.34 | -9,367.66 |
| 10,000 | 10,512.00 | MinIO Storage (two copies) | 2,288.68 | -8,223.32 |

Estimated allocation, not benchmark calibrated: sized from 2 vCPU, 8 GiB memory and 100 GiB SSD at 0 per second to 32 vCPU, 128 GiB memory and 100 GiB SSD at 10,000 per second.

**Curve assumptions**

| Target scenario | Assumption | Value | Unit |
| - | - | -: | - |
| MinIO Storage (one copy) | Origin list price · Stored object data | 0.023 | USD/GiB-month |
| MinIO Storage (one copy) | Origin list price · Object writes | 0.000005 | USD/requests |
| MinIO Storage (one copy) | Origin list price · Object reads | 0.0000004 | USD/requests |
| MinIO Storage (one copy) | Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| MinIO Storage (one copy) | Representative transferred object size | 1,048,576 | bytes |
| MinIO Storage (one copy) | Target requests per write | 1 | requests |
| MinIO Storage (one copy) | Target requests per read | 1 | requests |
| MinIO Storage (one copy) | Target price guess · read | 0 | USD/read |
| MinIO Storage (one copy) | Target price guess · write | 0 | USD/write |
| MinIO Storage (one copy) | Target price guess · provider operation | 0 | USD/provider operation |
| MinIO Storage (one copy) | Target list price · GiB-month | 0.1 | USD/GiB-month |
| MinIO Storage (one copy) | Target price guess · published GiB | 0 | USD/published GiB |
| MinIO Storage (one copy) | Target price guess · delivered GiB | 0 | USD/delivered GiB |
| MinIO Storage (one copy) | Target list price · network GiB | 0.12 | USD/network GiB |
| MinIO Storage (one copy) | Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| MinIO Storage (one copy) | Target list price · vCPU-hour | 0.031611 | USD/vCPU-hour |
| MinIO Storage (one copy) | Target list price · GiB-hour | 0.004237 | USD/GiB-hour |
| MinIO Storage (one copy) | Target price guess · resource-hour | 0 | USD/resource-hour |
| MinIO Storage (one copy) | Target price guess · resource-month | 0 | USD/resource-month |
| MinIO Storage (one copy) | Target price guess · input token | 0 | USD/input token |
| MinIO Storage (one copy) | Target price guess · output token | 0 | USD/output token |
| MinIO Storage (one copy) | Target monthly base charge | 0 | USD/month |
| MinIO Storage (one copy) | Approximate target service minimum | 0 | USD/month |
| MinIO Storage (one copy) | Minimum primary CPU | 2 | vCPU |
| MinIO Storage (one copy) | Minimum primary RAM | 8 | GiB |
| MinIO Storage (one copy) | Minimum primary disk | 100 | GiB |
| MinIO Storage (one copy) | Additional full-price standby copy | 0 | 0 or 1 |
| MinIO Storage (one copy) | Allocated share of provisioned cost | 1 | fraction |
| MinIO Storage (one copy) | Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| MinIO Storage (one copy) | Planning peak / mean work | 2 | multiplier |
| MinIO Storage (one copy) | Planning primary CPU utilization | 0.7 | fraction |
| MinIO Storage (one copy) | Resident state reserved in RAM | 0.1 | fraction |
| MinIO Storage (one copy) | Planning disk utilization | 0.8 | fraction |
| MinIO Storage (one copy) | Maintenance and log disk reserve | 20 | GiB |
| MinIO Storage (one copy) | Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| MinIO Storage (one copy) | Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| MinIO Storage (one copy) | Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| MinIO Storage (one copy) | Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| MinIO Storage (one copy) | Dependent object sink write price guess | 0.000005 | USD/write |
| MinIO Storage (two copies) | Origin list price · Stored object data | 0.023 | USD/GiB-month |
| MinIO Storage (two copies) | Origin list price · Object writes | 0.000005 | USD/requests |
| MinIO Storage (two copies) | Origin list price · Object reads | 0.0000004 | USD/requests |
| MinIO Storage (two copies) | Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| MinIO Storage (two copies) | Representative transferred object size | 1,048,576 | bytes |
| MinIO Storage (two copies) | Target requests per write | 1 | requests |
| MinIO Storage (two copies) | Target requests per read | 1 | requests |
| MinIO Storage (two copies) | Target price guess · read | 0 | USD/read |
| MinIO Storage (two copies) | Target price guess · write | 0 | USD/write |
| MinIO Storage (two copies) | Target price guess · provider operation | 0 | USD/provider operation |
| MinIO Storage (two copies) | Target list price · GiB-month | 0.1 | USD/GiB-month |
| MinIO Storage (two copies) | Target price guess · published GiB | 0 | USD/published GiB |
| MinIO Storage (two copies) | Target price guess · delivered GiB | 0 | USD/delivered GiB |
| MinIO Storage (two copies) | Target list price · network GiB | 0.12 | USD/network GiB |
| MinIO Storage (two copies) | Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| MinIO Storage (two copies) | Target list price · vCPU-hour | 0.031611 | USD/vCPU-hour |
| MinIO Storage (two copies) | Target list price · GiB-hour | 0.004237 | USD/GiB-hour |
| MinIO Storage (two copies) | Target price guess · resource-hour | 0 | USD/resource-hour |
| MinIO Storage (two copies) | Target price guess · resource-month | 0 | USD/resource-month |
| MinIO Storage (two copies) | Target price guess · input token | 0 | USD/input token |
| MinIO Storage (two copies) | Target price guess · output token | 0 | USD/output token |
| MinIO Storage (two copies) | Target monthly base charge | 0 | USD/month |
| MinIO Storage (two copies) | Approximate target service minimum | 0 | USD/month |
| MinIO Storage (two copies) | Minimum primary CPU | 2 | vCPU |
| MinIO Storage (two copies) | Minimum primary RAM | 8 | GiB |
| MinIO Storage (two copies) | Minimum primary disk | 100 | GiB |
| MinIO Storage (two copies) | Additional full-price standby copy | 1 | 0 or 1 |
| MinIO Storage (two copies) | Allocated share of provisioned cost | 1 | fraction |
| MinIO Storage (two copies) | Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| MinIO Storage (two copies) | Planning peak / mean work | 2 | multiplier |
| MinIO Storage (two copies) | Planning primary CPU utilization | 0.7 | fraction |
| MinIO Storage (two copies) | Resident state reserved in RAM | 0.1 | fraction |
| MinIO Storage (two copies) | Planning disk utilization | 0.8 | fraction |
| MinIO Storage (two copies) | Maintenance and log disk reserve | 20 | GiB |
| MinIO Storage (two copies) | Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| MinIO Storage (two copies) | Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| MinIO Storage (two copies) | Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| MinIO Storage (two copies) | Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| MinIO Storage (two copies) | Dependent object sink write price guess | 0.000005 | USD/write |

* Stored GiB and writes stay at independent defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → us-central1, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Self-hosted target: MinIO community server (GNU AGPL v3, [https://github.com/minio/minio/blob/master/LICENSE](https://github.com/minio/minio/blob/master/LICENSE)); erasure-coding overhead belongs in the family's physical-work translation. Selected CPU, RAM and physical disk allocation grow with workload; no per-operation price is assumed. No vendor charge: the target runs on the customer's Kubernetes nodes, so CPU, RAM and disk bill at the Kubernetes node reference rates, Compute Engine N2 in us-central1 (USD 0.031611/vCPU-hour, 0.004237/GiB-hour) with pd-balanced disk (0.10/GiB-month) and Premium Tier egress. The cost-optimized E2 series lists 0.02181159/vCPU-hour and 0.00292353/GiB-hour; AWS m6i/r6i and Azure D2s v5/E2s v5 both decompose to 0.033/vCPU-hour and 0.00375/GiB-hour. Requested CPU and RAM are billed; node bin-packing waste, system reservations and the cluster control-plane fee are not.
* Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1\_0\_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
* Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing ([https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size](https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size)): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
* Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)). The 20 GiB reserve exceeds PostgreSQL's 1 GB default max\_wal\_size; the remainder of that reserve is unmeasured.
* CPU tiers double from 2 vCPUs to the target's largest node at 4 GiB per vCPU; each target's documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
* No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
* Node bounds: Planning MinIO node of 32 vCPUs, 128 GiB and one 64 TiB Persistent Disk; a distributed deployment runs at least 4 nodes. Objects are served from disk, so no stored data is reserved in RAM; nodes scale to a 1,000-node planning bound.
* Stored GiB already includes the origin family's physical footprint assumptions; no second storage amplification is applied.
* The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
* Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* Compute Engine general-purpose machine pricing: [https://cloud.google.com/products/compute/pricing/general-purpose](https://cloud.google.com/products/compute/pricing/general-purpose)
* Disk and image pricing: [https://cloud.google.com/compute/disks-image-pricing](https://cloud.google.com/compute/disks-image-pricing)
* Network pricing: [https://cloud.google.com/vpc/network-pricing](https://cloud.google.com/vpc/network-pricing)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-01e62f79eb4fdd8f6e4171e0e49ff6906876cbd4` / `2026-10-22.planning.2`. Curve: `workload-3`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Compute Engine general-purpose machine pricing](https://cloud.google.com/products/compute/pricing/general-purpose), [Disk and image pricing](https://cloud.google.com/compute/disks-image-pricing), [Network pricing](https://cloud.google.com/vpc/network-pricing).

**S3 Standard → MinIO Storage: Authored native-usage planning example.** Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts.

Scenario source region: us-east-1. Scenario target region: us-central1. Currency: USD.

| Monthly component | USD |
| - | -: |
| Origin: Stored object data | 0.00 |
| Origin: Object writes | 0.00 |
| Origin: Object reads | 0.00 |
| Origin: Billable origin network transfer | 0.00 |
| Target: Provisioned primary CPU | 46.15 |
| Target: Provisioned primary RAM | 24.74 |
| Target: Provisioned primary disk | 10.00 |
| Target: Selected billable network | 0.00 |
| Target: Independent provisioned resources | 0.00 |
| Target: Independent managed resources | 0.00 |
| **Origin service subtotal** | **0.00** |
| **Target service subtotal** | **80.90** |

Estimated allocation, not benchmark calibrated: sized at 2 vCPU, 8 GiB memory and 100 GiB SSD for this scenario.

Unestimated components: Adapter hosting, Tensor9 fees. A modeled adapted total and savings require these costs.

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

**Scenario assumptions**

| Input | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target price guess · read | 0 | USD/read |
| Target price guess · write | 0 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.1 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.12 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target list price · vCPU-hour | 0.031611 | USD/vCPU-hour |
| Target list price · GiB-hour | 0.004237 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |
| Stored object data | 0 | GiB-month |
| Object writes | 0 | requests |
| Object reads | 0 | requests |
| Billable origin network transfer | 0 | GiB |

* Translated reads: 0 operations.

* Translated writes: 0 operations.

* Translated resident physical data: 0 GiB-month.

* Native provider operations: 0 operations.

* Published payload: 0 GiB.

* Delivered payload: 0 GiB.

* Allocated execution CPU: 0 vCPU-hour.

* Allocated execution RAM: 0 GiB-hour.

* Independent resource allocation: 0 resource-hour.

* Independent inventory: 0 resource-month.

* Input tokens: 0 tokens.

* Output tokens: 0 tokens.

* Billable network: 0 GiB.

* Dependent object sink retained data: 0 GiB-month.

* Dependent object sink writes: 0 writes.

* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.

* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.

* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.

* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.

* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.

* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.

* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.

* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.

* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.

* Self-hosted target: MinIO community server (GNU AGPL v3, [https://github.com/minio/minio/blob/master/LICENSE](https://github.com/minio/minio/blob/master/LICENSE)); erasure-coding overhead belongs in the family's physical-work translation. Selected CPU, RAM and physical disk allocation grow with workload; no per-operation price is assumed. No vendor charge: the target runs on the customer's Kubernetes nodes, so CPU, RAM and disk bill at the Kubernetes node reference rates, Compute Engine N2 in us-central1 (USD 0.031611/vCPU-hour, 0.004237/GiB-hour) with pd-balanced disk (0.10/GiB-month) and Premium Tier egress. The cost-optimized E2 series lists 0.02181159/vCPU-hour and 0.00292353/GiB-hour; AWS m6i/r6i and Azure D2s v5/E2s v5 both decompose to 0.033/vCPU-hour and 0.00375/GiB-hour. Requested CPU and RAM are billed; node bin-packing waste, system reservations and the cluster control-plane fee are not.

* Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1\_0\_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.

* Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing ([https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size](https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size)): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.

* Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full ([https://docs.cloud.google.com/sql/docs/postgres/instance-settings](https://docs.cloud.google.com/sql/docs/postgres/instance-settings)). The 20 GiB reserve exceeds PostgreSQL's 1 GB default max\_wal\_size; the remainder of that reserve is unmeasured.

* CPU tiers double from 2 vCPUs to the target's largest node at 4 GiB per vCPU; each target's documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.

* No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.

* Node bounds: Planning MinIO node of 32 vCPUs, 128 GiB and one 64 TiB Persistent Disk; a distributed deployment runs at least 4 nodes. Objects are served from disk, so no stored data is reserved in RAM; nodes scale to a 1,000-node planning bound.

* Stored GiB already includes the origin family's physical footprint assumptions; no second storage amplification is applied.

* The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.

* Copies and allocation fractions change cost only; they do not increase modeled primary capacity.

List prices read: 2026-10-22. Model: `plan-01e62f79eb4fdd8f6e4171e0e49ff6906876cbd4` / `2026-10-22.planning.2`. Scenario: `planning-example`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Compute Engine general-purpose machine pricing](https://cloud.google.com/products/compute/pricing/general-purpose), [Disk and image pricing](https://cloud.google.com/compute/disks-image-pricing), [Network pricing](https://cloud.google.com/vpc/network-pricing).

## On Scaleway

### Scaleway Object Storage

| Capability | Area | Support | Operations | Notes |
| - | - | - | - | - |
| SSE-C (customer key) | Encryption | Out of scope | - | rejected with NotImplemented (501): the adapter does not pass a customer-provided key on to Scaleway |
| SSE-KMS | Encryption | Partial | - | a write naming the AWS-managed `aws/s3` key is stored with Scaleway's SSE-S3 encryption; any other KMS key, an encryption context or DSSE-KMS returns NotImplemented (501), since Scaleway has no SSE-KMS |
| SSE-S3 (AES256) | Encryption | Supported | - | YOUR OBJECTS ARE ENCRYPTED AT REST AND THE RESPONSES SAY SO, as on S3. S3 encrypts every object and answers x-amz-server-side-encryption: AES256 on put, get and head whether or not you ask; Scaleway does neither unless the request asks. So the adapter ASKS -- it adds the SSE-S3 request to every object write where you did not specify encryption yourself -- and Scaleway then encrypts the object and reports the header on writes and reads alike. The header you read is the STORE's own statement, not the adapter's claim about someone else's storage; that distinction is why this is done on the request rather than synthesized on the response. A write that sets your OWN encryption choice is never overridden. Measured on a live drive 2026-09-14: with the request added, all nineteen certification cells match S3 exactly, and without it five of them diverged on this header alone. |
| Content-MD5 validation | Integrity | Supported | - | THE ADAPTER VALIDATES IT, which the raw Scaleway wire does not: a PutObject carrying a wrong Content-MD5 is answered 400 BadDigest in S3's own wording, and a correct one is accepted. Measured on the raw wire twice in August 2026, Scaleway ACCEPTS the wrong digest with 200 and returns an ETag of the actual body, so a client sending a digest for integrity gets none and cannot tell -- which is why this check is in the adapter. This row read OutOfScope until 2026-09-14, describing the wire rather than the product. |
| Flexible checksum (CRC32) | Integrity | Partial | - | the adapter ACCEPTS the aws-chunked trailer and VERIFIES it against the bytes as they decode, refusing an upload whose payload contradicts its declared checksum. It does NOT echo one: measured 2026-09-14, the response carries no x-amz-checksum-\* and no x-amz-checksum-type where S3 answers both. The adapter removes the client's algorithm request when it de-frames the upload -- Scaleway refuses a request declaring a trailer that is no longer there -- so the store is never asked to compute one. A client that reads back the checksum its store recorded gets nothing. This row said 'accepted and echoed' until the first live drive measured the reply. |
| GetObject (x-amz-te: append-md5) | Integrity | Out of scope | - | S3 honours this request header -- answering x-amz-transfer-encoding: append-md5 and a body 16 bytes longer, so a client can verify the bytes in flight. Scaleway does not implement it and the adapter does not emulate it: the object arrives with no appended digest and no answering header, and the content length is the object's own. Measured 2026-09-14 with both legs asked the same way. |
| GetObject (If-Modified-Since) | Objects | Supported | - | 304 Not Modified |
| GetObject (Range) | Objects | Supported | - | 206 Partial Content |
| GetObject (missing key) | Objects | Supported | - | 404 NoSuchKey, in the S3 error envelope |
| ListObjectsV2 (response framing) | Objects | Partial | - | the listing itself matches; its HTTP framing does not. S3 streams the XML chunked with no Content-Length, Scaleway sends a Content-Length, and the adapter relays the store rather than re-chunking to match. A client that reads the listing through an SDK sees no difference; one that reads framing does. Measured 2026-09-14. |
| PutObject (If-None-Match) | Objects | Supported | - | 412 PreconditionFailed, as S3 |
| User metadata + Content-Type | Objects | Supported | - | arbitrary keys and casing round-trip through PUT → HEAD |
| Bucket versioning | Versioning | Supported | - | version ids minted |
| Delete markers | Versioning | Supported | - | - |

| Operation | Area | Support | Depth | Notes |
| - | - | - | - | - |
| DeleteBucketPolicy | Access control | Out of scope | Most usage | refused with its Put sibling; see PutBucketPolicy |
| GetBucketAcl | Access control | Out of scope | Most usage | refused with its Put sibling; see PutBucketAcl |
| GetBucketPolicy | Access control | Out of scope | Most usage | refused with its Put sibling; see PutBucketPolicy |
| GetObjectAcl | Access control | Out of scope | Full surface | the ?acl sub-resource is refused; configure access through Scaleway's permissions |
| GetPublicAccessBlock | Access control | Out of scope | Most usage | refused with its Put sibling; see PutPublicAccessBlock |
| PutBucketAcl | Access control | Out of scope | Most usage | MEASURED 501 - and real S3 refuses it too on a bucket created today, 400 AccessControlListNotSupported, because new buckets default to bucket-owner-enforced ownership. Both sides decline; only the code differs. Configure access through Scaleway's own permissions. |
| PutBucketOwnershipControls | Access control | Out of scope | Full surface | the ?ownershipControls sub-resource is refused |
| PutBucketPolicy | Access control | Out of scope | Most usage | MEASURED 501: the adapter compiles no request-time policy evaluation in v1 and refuses rather than accept a policy it would never enforce - a policy accepted and unenforced would tell your application its access controls are in force when nothing evaluates them. Scaleway Object Storage DOES support bucket policy natively, so this is a gap in the adapter and not in the store. |
| PutObjectAcl | Access control | Out of scope | Full surface | the ?acl sub-resource is refused; configure access through Scaleway's permissions |
| PutPublicAccessBlock | Access control | Out of scope | Most usage | MEASURED 501. This is a SAFETY control - you set it to guarantee no object can become public, and your next action is to trust it - so accepting it without enforcing it would be the most dangerous silent success on this surface. It fails loud instead. |
| CreateBucket | Bucket config | Supported | Most usage | - |
| DeleteBucket | Bucket config | Supported | Most usage | - |
| GetBucketLocation | Bucket config | Supported | Most usage | echoes the Scaleway region (fr-par), not an AWS one |
| HeadBucket | Bucket config | Supported | Most usage | - |
| AbortMultipartUpload | Multipart | Supported | Most usage | aborted upload is then NoSuchUpload, as S3 |
| CompleteMultipartUpload | Multipart | Supported | Most usage | composite ETag matches S3's -N form |
| CreateMultipartUpload | Multipart | Supported | Most usage | - |
| ListParts | Multipart | Supported | Most usage | - |
| UploadPart | Multipart | Supported | Most usage | data integrity verified end to end |
| UploadPartCopy | Multipart | Supported | Most usage | - |
| GetObjectLegalHold | Object lock | Out of scope | Full surface | the object-lock sub-resources are refused |
| GetObjectRetention | Object lock | Out of scope | Full surface | the object-lock sub-resources are refused |
| PutObjectLegalHold | Object lock | Out of scope | Full surface | the object-lock sub-resources are refused |
| PutObjectRetention | Object lock | Out of scope | Full surface | the object-lock sub-resources are refused |
| CopyObject | Objects | Supported | Most usage | server-side copy with metadata REPLACE |
| DeleteObjects | Objects | Supported | Common | batch delete |
| GetObject | Objects | Supported | Common | read-after-write returned the exact bytes |
| HeadObject | Objects | Supported | Common | - |
| ListObjectsV2 | Objects | Supported | Common | pagination honoured |
| PutObject | Objects | Supported | Common | single-part ETag is the content MD5, matching S3 |
| GetBucketNotificationConfiguration | Other features | Out of scope | Most usage | refused with its Put sibling; see PutBucketNotificationConfiguration |
| GetBucketWebsite | Other features | Out of scope | Most usage | refused with its Put sibling; see PutBucketWebsite |
| GetObjectAttributes | Other features | Out of scope | Full surface | the ?attributes query is not served; use HeadObject |
| PutBucketAccelerateConfiguration | Other features | Out of scope | Full surface | the ?accelerate sub-resource is refused |
| PutBucketAnalyticsConfiguration | Other features | Out of scope | Full surface | the ?analytics sub-resource is refused |
| PutBucketIntelligentTieringConfiguration | Other features | Out of scope | Full surface | the ?intelligent-tiering sub-resource is refused |
| PutBucketInventoryConfiguration | Other features | Out of scope | Full surface | the ?inventory sub-resource is refused |
| PutBucketLogging | Other features | Out of scope | Full surface | the ?logging sub-resource is refused |
| PutBucketMetricsConfiguration | Other features | Out of scope | Full surface | the ?metrics sub-resource is refused |
| PutBucketNotificationConfiguration | Other features | Out of scope | Most usage | MEASURED 501: event notification is served by neither plane, so a configuration accepted here would leave your application waiting on events nobody will send - a silence that looks like an empty bucket rather than a failure. |
| PutBucketReplication | Other features | Out of scope | Full surface | the ?replication sub-resource is refused |
| PutBucketWebsite | Other features | Out of scope | Most usage | MEASURED 501: website hosting changes how the bucket answers ANONYMOUS reads at an endpoint this adapter does not front, so a configuration accepted here would describe a site nobody serves. |
| RestoreObject | Other features | Out of scope | Full surface | the ?restore query is refused |
| SelectObjectContent | Other features | Out of scope | Full surface | the ?select query is refused |
| ListObjectVersions | Versioning | Supported | Most usage | - |

#### S3 requests in the target environment

The application continues using the S3 API. The Tensor9 adapter runs in the target environment and sends object requests to Scaleway Object Storage. It also serves bucket creation, deletion, listing, and configuration through a persistent bucket store. Scaleway Object Storage stores the objects; Tensor9 operates the adapter and its bucket-management service.

#### Request flow

Object requests use the backend storage service. Bucket settings persist separately and are applied to the backend resource.

![The S3 application calls the Tensor9 adapter. Object requests go to the backend object store. Bucket settings persist in the adapter's store and a configuration worker applies them to the backend.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjI4OCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDI4OCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgUzMgYXBwbGljYXRpb24gY2FsbHMgdGhlIFRlbnNvcjkgYWRhcHRlci4gT2JqZWN0IHJlcXVlc3RzIGdvIHRvIHRoZSBiYWNrZW5kIG9iamVjdCBzdG9yZS4gQnVja2V0IHNldHRpbmdzIHBlcnNpc3QgaW4gdGhlIGFkYXB0ZXIncyBzdG9yZSBhbmQgYSBjb25maWd1cmF0aW9uIHdvcmtlciBhcHBsaWVzIHRoZW0gdG8gdGhlIGJhY2tlbmQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CiAgPGRlZnM+PG1hcmtlciBpZD0iczMtbWF4LWFycm93IiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSI0IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wLDAgTDgsNCBMMCw4IFoiIHN0eWxlPSJmaWxsOiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+CiAgPHJlY3QgeD0iMjQiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNlZWYyZmY7c3Ryb2tlOiNjN2QyZmUiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNlY2ZkZjU7c3Ryb2tlOiNhN2YzZDAiLz4KICA8cmVjdCB4PSI1OTYiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiNmOGZhZmM7c3Ryb2tlOiNjYmQ1ZTEiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjE4NCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI2OCIgcng9IjEwIiBzdHlsZT0iZmlsbDojZWNmZGY1O3N0cm9rZTojYTdmM2QwIi8+CiAgPHJlY3QgeD0iNTk2IiB5PSIxODQiIHdpZHRoPSIyMjAiIGhlaWdodD0iNjgiIHJ4PSIxMCIgc3R5bGU9ImZpbGw6I2Y4ZmFmYztzdHJva2U6I2NiZDVlMSIvPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZpbGw6IzBmMTcyYSI+CiAgICA8dGV4dCB4PSIxMzQiIHk9IjcwIj5BcHBsaWNhdGlvbjwvdGV4dD48dGV4dCB4PSIxMzQiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5TMyBTREs8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjcwIj5UZW5zb3I5IFMzIGFkYXB0ZXI8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSI5NiIgZm9udC1zaXplPSIxNCI+T2JqZWN0IGFuZCBidWNrZXQgQVBJczwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iNzAiPlNjYWxld2F5IE9iamVjdCBTdG9yYWdlPC90ZXh0Pjx0ZXh0IHg9IjcwNiIgeT0iOTYiIGZvbnQtc2l6ZT0iMTQiPk9iamVjdHMgYW5kIHN0b3JhZ2U8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjIxMiI+UGVyc2lzdGVudCBidWNrZXQgc3RvcmU8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSIyMzYiIGZvbnQtc2l6ZT0iMTQiPk5hbWVzIGFuZCBjb25maWd1cmF0aW9uPC90ZXh0PgogICAgPHRleHQgeD0iNzA2IiB5PSIyMjQiPkNvbmZpZ3VyYXRpb24gd29ya2VyPC90ZXh0PgogIDwvZz4KICA8ZyBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiIG1hcmtlci1lbmQ9InVybCgjczMtbWF4LWFycm93KSIgc3R5bGU9InN0cm9rZTojOTRhM2I4Ij4KICAgIDxwYXRoIGQ9Ik0yNDQgNzggSDMwNiIvPjxwYXRoIGQ9Ik01MzAgNzggSDU5MiIvPjxwYXRoIGQ9Ik00MjAgMTIwIFYxODAiLz4KICAgIDxwYXRoIGQ9Ik01MzAgMjE4IEg1OTIiLz48cGF0aCBkPSJNNzA2IDE4NCBWMTI0Ii8+CiAgPC9nPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgc3R5bGU9ImZpbGw6IzMzNDE1NSI+CiAgICA8dGV4dCB4PSI0MzIiIHk9IjE1MyI+QnVja2V0IHNldHRpbmdzPC90ZXh0Pjx0ZXh0IHg9IjcxOCIgeT0iMTU0Ij5BcHBseTwvdGV4dD4KICA8L2c+Cjwvc3ZnPg==)

![The S3 application calls the Tensor9 adapter. Object requests go to the backend object store. Bucket settings persist in the adapter's store and a configuration worker applies them to the backend.](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODQwIiBoZWlnaHQ9IjI4OCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgODQwIDI4OCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgUzMgYXBwbGljYXRpb24gY2FsbHMgdGhlIFRlbnNvcjkgYWRhcHRlci4gT2JqZWN0IHJlcXVlc3RzIGdvIHRvIHRoZSBiYWNrZW5kIG9iamVjdCBzdG9yZS4gQnVja2V0IHNldHRpbmdzIHBlcnNpc3QgaW4gdGhlIGFkYXB0ZXIncyBzdG9yZSBhbmQgYSBjb25maWd1cmF0aW9uIHdvcmtlciBhcHBsaWVzIHRoZW0gdG8gdGhlIGJhY2tlbmQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CiAgPGRlZnM+PG1hcmtlciBpZD0iczMtbWF4LWFycm93IiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI4IiByZWZYPSI3IiByZWZZPSI0IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wLDAgTDgsNCBMMCw4IFoiIHN0eWxlPSJmaWxsOiM2NDc0OGIiLz48L21hcmtlcj48L2RlZnM+CiAgPHJlY3QgeD0iMjQiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMxZTFiNGI7c3Ryb2tlOiMzNzMwYTMiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMwNjRlM2I7c3Ryb2tlOiMwNDc4NTciLz4KICA8cmVjdCB4PSI1OTYiIHk9IjM2IiB3aWR0aD0iMjIwIiBoZWlnaHQ9Ijg0IiByeD0iMTAiIHN0eWxlPSJmaWxsOiMwZjE3MmE7c3Ryb2tlOiM0NzU1NjkiLz4KICA8cmVjdCB4PSIzMTAiIHk9IjE4NCIgd2lkdGg9IjIyMCIgaGVpZ2h0PSI2OCIgcng9IjEwIiBzdHlsZT0iZmlsbDojMDY0ZTNiO3N0cm9rZTojMDQ3ODU3Ii8+CiAgPHJlY3QgeD0iNTk2IiB5PSIxODQiIHdpZHRoPSIyMjAiIGhlaWdodD0iNjgiIHJ4PSIxMCIgc3R5bGU9ImZpbGw6IzBmMTcyYTtzdHJva2U6IzQ3NTU2OSIvPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZpbGw6I2YxZjVmOSI+CiAgICA8dGV4dCB4PSIxMzQiIHk9IjcwIj5BcHBsaWNhdGlvbjwvdGV4dD48dGV4dCB4PSIxMzQiIHk9Ijk2IiBmb250LXNpemU9IjE0Ij5TMyBTREs8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjcwIj5UZW5zb3I5IFMzIGFkYXB0ZXI8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSI5NiIgZm9udC1zaXplPSIxNCI+T2JqZWN0IGFuZCBidWNrZXQgQVBJczwvdGV4dD4KICAgIDx0ZXh0IHg9IjcwNiIgeT0iNzAiPlNjYWxld2F5IE9iamVjdCBTdG9yYWdlPC90ZXh0Pjx0ZXh0IHg9IjcwNiIgeT0iOTYiIGZvbnQtc2l6ZT0iMTQiPk9iamVjdHMgYW5kIHN0b3JhZ2U8L3RleHQ+CiAgICA8dGV4dCB4PSI0MjAiIHk9IjIxMiI+UGVyc2lzdGVudCBidWNrZXQgc3RvcmU8L3RleHQ+PHRleHQgeD0iNDIwIiB5PSIyMzYiIGZvbnQtc2l6ZT0iMTQiPk5hbWVzIGFuZCBjb25maWd1cmF0aW9uPC90ZXh0PgogICAgPHRleHQgeD0iNzA2IiB5PSIyMjQiPkNvbmZpZ3VyYXRpb24gd29ya2VyPC90ZXh0PgogIDwvZz4KICA8ZyBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiIG1hcmtlci1lbmQ9InVybCgjczMtbWF4LWFycm93KSIgc3R5bGU9InN0cm9rZTojNjQ3NDhiIj4KICAgIDxwYXRoIGQ9Ik0yNDQgNzggSDMwNiIvPjxwYXRoIGQ9Ik01MzAgNzggSDU5MiIvPjxwYXRoIGQ9Ik00MjAgMTIwIFYxODAiLz4KICAgIDxwYXRoIGQ9Ik01MzAgMjE4IEg1OTIiLz48cGF0aCBkPSJNNzA2IDE4NCBWMTI0Ii8+CiAgPC9nPgogIDxnIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIgZm9udC1zaXplPSIxMiIgc3R5bGU9ImZpbGw6I2NiZDVlMSI+CiAgICA8dGV4dCB4PSI0MzIiIHk9IjE1MyI+QnVja2V0IHNldHRpbmdzPC90ZXh0Pjx0ZXh0IHg9IjcxOCIgeT0iMTU0Ij5BcHBseTwvdGV4dD4KICA8L2c+Cjwvc3ZnPg==)

#### Object requests

Scaleway speaks the S3 protocol. The adapter changes the endpoint and signs with a Scaleway API key, while the service handles objects, ranges, conditional requests, copies, batch deletion and paginated listing. The endpoint uses the selected Scaleway region, such as s3.fr-par.scw\.cloud. The adapter still provides the S3 endpoint expected by the application.

#### Bucket creation and configuration

Each S3 bucket has a durable record containing its name, owner, requested configuration, and backend reference. For a bucket named `bucket-name`, the S3-facing identifier is `arn:aws:s3:::bucket-name`; the backend resource is a Scaleway Object Storage bucket. `ListBuckets` returns the caller's buckets, and configuration reads use the stored request state.

A configuration worker applies the stored settings to the backend. `CreateBucket` waits for the backend bucket to be ready before returning success, so an immediate object write does not race bucket creation. `DeleteBucket` waits for removal and returns `BucketNotEmpty` if objects prevent deletion. A lifecycle update also waits for the backend to apply it. For other configuration changes, a successful read of the new setting describes stored configuration; it does not imply every backend-side change has already completed.

#### Versions and multipart uploads

Scaleway supplies multipart upload, ListParts, UploadPartCopy, composite ETags, version IDs and delete markers natively. Max therefore retains those provider behaviors while adding the persistent bucket-management service. Multipart completion keeps the S3 part-count ETag form, and version listing exposes the provider's version history.

#### Backend configuration

The service adapter stores bucket ownership and requested configuration, then reconciles that state to Scaleway. Bucket creation, deletion and versioning already have native S3 operations on the provider; the persistent record gives the application the same management model used with the other backends. Storage-class translation is separate from API compatibility and must retain the selected class and region constraints.

#### Placement and operation

Scaleway operates the object store; Tensor9 operates the S3 adapter and its persistent bucket-management service. The recorded August 20, 2026 fidelity run verified object reads and writes, byte ranges, conditional responses, copy, batch delete, pagination, metadata, multipart operations and versioning. These are compatibility results, not a throughput, latency or durability measurement.

#### Compatibility limits

SSE-S3 and customer-supplied-key encryption are supported, and objects are encrypted at rest with the responses reporting it as S3 does, because the adapter requests SSE-S3 on every write that does not carry your own choice; SSE-KMS is outside this mapping. Content-MD5 IS validated by the adapter, answering 400 BadDigest as S3 does, which the raw Scaleway wire does not. Bucket notification and bucket policy APIs are unsupported. The Max management service does not by itself remove these operation-level differences.

#### Migration and leaving the adapter

A newly provisioned backend bucket starts empty. Copy existing objects and required versions with a migration tool or a coordinated dual-write, then verify object data and application reads before switching. Preserve version history through the S3 API when the application depends on S3 version identifiers or delete markers.

Leaving the service adapter requires moving bucket configuration as well as object data. Apply the retained settings to native backend resources, resolve any S3-specific version metadata, and move clients to the backend's own API. Keep the adapter and its persistent state until the application no longer depends on those S3 behaviors.

#### Example monthly charges

This Tensor9 Cloud Adapter scenario estimates service charges for the named origin and target services. Adapter hosting and commercial Tensor9 fees need separate allocations. [How Tensor9 estimates costs](https://docs.tensor9.com/cloud-adapter-early-access/costs/overview.md) explains the method and what the estimates include.

##### S3 Standard · Stored data

Feature: S3 Standard.

Estimated monthly service charges by Stored data. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: fr-par; currency: USD.

![S3 Standard · Stored data: monthly service charges by Stored data. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/8bfc0c905c8789c9f1c305f0be94fd71ff3d319bc2608887235939c7577e3262-light.svg)

![S3 Standard · Stored data: monthly service charges by Stored data. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/0bc552fc124c7a20f65a8effdbd6b43a341e37b5c85b48cd9c4f110d4737da0f-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Stored data (GiB-month) | S3 | Scaleway Object Storage | Difference |
| -: | -: | -: | -: |
| 0 | 0.00 | 0.00 | 0.00 |
| 10 | 0.23 | 0.18 | -0.05 |
| 100 | 2.30 | 1.80 | -0.50 |
| 1,000 | 23.00 | 18.00 | -5.00 |
| 10,000 | 230.00 | 179.95 | -50.05 |
| 100,000 | 2,300.00 | 1,799.52 | -500.48 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target price guess · read | 0 | USD/read |
| Target price guess · write | 0 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.0179952 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.011205 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · network GiB | 75 | network GiB |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |

* Request meters remain at their independently authored defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → fr-par, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Object storage bills stored GiB-months, read and write requests and internet egress. Scaleway Object Storage includes requests and 75 GB of monthly egress, and lists prices in EUR. Standard Multi-AZ class; Standard One Zone lists EUR 0.00803 per GB-month.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* Scaleway storage pricing: [https://www.scaleway.com/en/pricing/storage/](https://www.scaleway.com/en/pricing/storage/)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-ff2fdfec20e73d66108a57dc8fe974f9a85fc76b` / `2026-10-22.planning.2`. Curve: `workload-1`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Scaleway storage pricing](https://www.scaleway.com/en/pricing/storage/).

##### S3 Standard · Object writes

Feature: S3 Standard.

Estimated monthly service charges by Object writes. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: fr-par; currency: USD.

![S3 Standard · Object writes: monthly service charges by Object writes. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/2713a0282e3b32277b4362d9117b9c46c7fe438ee7660a5532f1a28180f0549c-light.svg)

![S3 Standard · Object writes: monthly service charges by Object writes. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/d4904ba11039df91f967c31b4dcf4b6c1ff30000c3aac17107b8d059472ba344-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Object writes (per second) | S3 | Scaleway Object Storage | Difference |
| -: | -: | -: | -: |
| 0 | 0.00 | 0.00 | 0.00 |
| 1 | 13.14 | 0.00 | -13.14 |
| 10 | 131.40 | 0.00 | -131.40 |
| 100 | 1,314.00 | 0.00 | -1,314.00 |
| 1,000 | 13,140.00 | 0.00 | -13,140.00 |
| 10,000 | 131,400.00 | 0.00 | -131,400.00 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target price guess · read | 0 | USD/read |
| Target price guess · write | 0 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.0179952 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.011205 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · network GiB | 75 | network GiB |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |

* Stored GiB and reads stay at independent defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → fr-par, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Object storage bills stored GiB-months, read and write requests and internet egress. Scaleway Object Storage includes requests and 75 GB of monthly egress, and lists prices in EUR. Standard Multi-AZ class; Standard One Zone lists EUR 0.00803 per GB-month.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* Scaleway storage pricing: [https://www.scaleway.com/en/pricing/storage/](https://www.scaleway.com/en/pricing/storage/)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-ff2fdfec20e73d66108a57dc8fe974f9a85fc76b` / `2026-10-22.planning.2`. Curve: `workload-2`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Scaleway storage pricing](https://www.scaleway.com/en/pricing/storage/).

##### S3 Standard · Object reads

Feature: S3 Standard.

Estimated monthly service charges by Object reads. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: fr-par; currency: USD.

![S3 Standard · Object reads: monthly service charges by Object reads. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/0d980f024bc3fc978ceab49f9f572d749cd0b3c4f3bfa935115dac8df8230f98-light.svg)

![S3 Standard · Object reads: monthly service charges by Object reads. Exact values are in the following table.](https://docs.tensor9.com/images/cloud-adapter-early-access/diagrams/service-cost/f4f97e93768f0aef63615d8987f0a0db0673680af4027b06ef6d8d3dcc74e880-dark.svg)

Comparison pills describe all sampled scale points; amounts beside each service are for the named workload. Costs The Same means within 20% at every point. Costs Depend includes mixed results and unpriced samples.

Sampled monthly charges in USD, rounded to cents. Difference means target minus origin; a positive difference means the target costs more.

| Object reads (per second) | S3 | Scaleway Object Storage | Difference |
| -: | -: | -: | -: |
| 0 | 0.00 | 0.00 | 0.00 |
| 1 | 1.05 | 0.00 | -1.05 |
| 10 | 10.51 | 0.00 | -10.51 |
| 100 | 105.12 | 0.00 | -105.12 |
| 1,000 | 1,051.20 | 0.00 | -1,051.20 |
| 10,000 | 10,512.00 | 0.00 | -10,512.00 |

**Curve assumptions**

| Assumption | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target price guess · read | 0 | USD/read |
| Target price guess · write | 0 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.0179952 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.011205 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · network GiB | 75 | network GiB |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |

* Stored GiB and writes stay at independent defaults. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
* Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → fr-par, USD/month.
* Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
* Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
* Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve's workload note.
* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.
* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.
* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.
* Object storage bills stored GiB-months, read and write requests and internet egress. Scaleway Object Storage includes requests and 75 GB of monthly egress, and lists prices in EUR. Standard Multi-AZ class; Standard One Zone lists EUR 0.00803 per GB-month.
* AWS Price List API, AmazonS3 offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json)
* AWS Price List API, AWSDataTransfer offer: [https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json)
* Scaleway storage pricing: [https://www.scaleway.com/en/pricing/storage/](https://www.scaleway.com/en/pricing/storage/)

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

List prices read: 2026-10-22. Model: `plan-ff2fdfec20e73d66108a57dc8fe974f9a85fc76b` / `2026-10-22.planning.2`. Curve: `workload-3`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Scaleway storage pricing](https://www.scaleway.com/en/pricing/storage/).

**S3 Standard → Scaleway Object Storage: Authored native-usage planning example.** Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts.

Scenario source region: us-east-1. Scenario target region: fr-par. Currency: USD.

| Monthly component | USD |
| - | -: |
| Origin: Stored object data | 0.00 |
| Origin: Object writes | 0.00 |
| Origin: Object reads | 0.00 |
| Origin: Billable origin network transfer | 0.00 |
| Target: Target read operations | 0.00 |
| Target: Target write operations | 0.00 |
| Target: Target retained physical data | 0.00 |
| Target: Additional broker replica storage | 0.00 |
| Target: Execution or worker CPU | 0.00 |
| Target: Execution or worker RAM | 0.00 |
| Target: Selected billable network after 75 included | 0.00 |
| Target: Independent native resources | 0.00 |
| Target: Independent native resources | 0.00 |
| **Origin service subtotal** | **0.00** |
| **Target service subtotal** | **0.00** |

Unestimated components: Adapter hosting, Tensor9 fees. A modeled adapted total and savings require these costs.

Cost scope: Modeled target native service and explicitly modeled state allocation; hosting and Tensor9 fees only when supplied.

Excluded costs and workload features:

* Additional network transfer, backups, KMS, one-time migration and operational labor unless an explicit meter includes them.
* Destination application execution and separately billed downstream services; supply those allocations separately.
* Replication beyond the selected target policy; archive classes and their minimum-duration/retrieval charges need a separate profile.
* Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
* Unmodeled dependent services, task execution and operations outside the selected workload family.

**Scenario assumptions**

| Input | Value | Unit |
| - | -: | - |
| Origin list price · Stored object data | 0.023 | USD/GiB-month |
| Origin list price · Object writes | 0.000005 | USD/requests |
| Origin list price · Object reads | 0.0000004 | USD/requests |
| Origin list price · Billable origin network transfer | 0.09 | USD/GiB |
| Representative transferred object size | 1,048,576 | bytes |
| Target requests per write | 1 | requests |
| Target requests per read | 1 | requests |
| Target price guess · read | 0 | USD/read |
| Target price guess · write | 0 | USD/write |
| Target price guess · provider operation | 0 | USD/provider operation |
| Target list price · GiB-month | 0.0179952 | USD/GiB-month |
| Target price guess · published GiB | 0 | USD/published GiB |
| Target price guess · delivered GiB | 0 | USD/delivered GiB |
| Target list price · network GiB | 0.011205 | USD/network GiB |
| Target price guess · replica GiB-month | 0 | USD/replica GiB-month |
| Target price guess · vCPU-hour | 0 | USD/vCPU-hour |
| Target price guess · GiB-hour | 0 | USD/GiB-hour |
| Target price guess · resource-hour | 0 | USD/resource-hour |
| Target price guess · resource-month | 0 | USD/resource-month |
| Target price guess · input token | 0 | USD/input token |
| Target price guess · output token | 0 | USD/output token |
| Included before billing · network GiB | 75 | network GiB |
| Target monthly base charge | 0 | USD/month |
| Approximate target service minimum | 0 | USD/month |
| Minimum primary CPU | 2 | vCPU |
| Minimum primary RAM | 8 | GiB |
| Minimum primary disk | 100 | GiB |
| Additional full-price standby copy | 0 | 0 or 1 |
| Allocated share of provisioned cost | 1 | fraction |
| Read/write work per vCPU-second | 1,500 | operations/vCPU-second |
| Planning peak / mean work | 2 | multiplier |
| Planning primary CPU utilization | 0.7 | fraction |
| Resident state reserved in RAM | 0.1 | fraction |
| Planning disk utilization | 0.8 | fraction |
| Maintenance and log disk reserve | 20 | GiB |
| Staging database CPU unit-price guess | 0.0413 | USD/vCPU-hour |
| Staging database RAM unit-price guess | 0.007 | USD/GiB-hour |
| Staging database disk unit-price guess | 0.17 | USD/GiB-month |
| Dependent object sink storage price guess | 0.023 | USD/GiB-month |
| Dependent object sink write price guess | 0.000005 | USD/write |
| Stored object data | 0 | GiB-month |
| Object writes | 0 | requests |
| Object reads | 0 | requests |
| Billable origin network transfer | 0 | GiB |

* Translated reads: 0 operations.

* Translated writes: 0 operations.

* Translated resident physical data: 0 GiB-month.

* Native provider operations: 0 operations.

* Published payload: 0 GiB.

* Delivered payload: 0 GiB.

* Allocated execution CPU: 0 vCPU-hour.

* Allocated execution RAM: 0 GiB-hour.

* Independent resource allocation: 0 resource-hour.

* Independent inventory: 0 resource-month.

* Input tokens: 0 tokens.

* Output tokens: 0 tokens.

* Billable network: 0 GiB.

* Dependent object sink retained data: 0 GiB-month.

* Dependent object sink writes: 0 writes.

* Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.

* Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.

* Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.

* Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.

* A declared adapter mapping and cost model do not establish implementation availability or service equivalence.

* This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.

* Authored planning assumptions, not measured adapter capacity. Origin rates are cited first-tier list prices, before free allowances and discounts.

* A cost scenario does not establish backend availability, protocol fidelity or production readiness. Registry serving status remains independent.

* Storage, request throughput and network are independent dimensions; a storage-only curve does not estimate a request mix.

* Object storage bills stored GiB-months, read and write requests and internet egress. Scaleway Object Storage includes requests and 75 GB of monthly egress, and lists prices in EUR. Standard Multi-AZ class; Standard One Zone lists EUR 0.00803 per GB-month.

List prices read: 2026-10-22. Model: `plan-ff2fdfec20e73d66108a57dc8fe974f9a85fc76b` / `2026-10-22.planning.2`. Scenario: `planning-example`.

Sources: [AWS Price List API, AmazonS3 offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json), [AWS Price List API, AWSDataTransfer offer](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AWSDataTransfer/current/us-east-1/index.json), [Scaleway storage pricing](https://www.scaleway.com/en/pricing/storage/).

## Costs

Estimated monthly service charges for each backend with a published cost model, at one sampled workload from that model's cost curve. Adapter hosting and Tensor9 fees are excluded. [How Tensor9 estimates costs](https://docs.tensor9.com/cloud-adapter-early-access/costs/overview.md) explains the method, what the estimates include and how to read their qualifications.

| Backend | Sampled workload | Price basis | Origin USD/month | Backend USD/month | Difference | Mapping |
| - | - | - | -: | -: | -: | - |
| Blob Storage | Stored data: 1,000 GiB-month | Cited list prices, 2026-10-22 | 23.00 | 20.80 | -2.20 | Service adapter |
| Cloud Storage | Retained source data: 1,024 GiB-month; Standard | Reference rates, 2026-10-18 | 32.55 | 29.48 | -3.07 | Service adapter |
| DigitalOcean Spaces | Stored data: 1,000 GiB-month | Cited list prices, 2026-10-22 | 23.00 | 20.00 | -3.00 | Service adapter |
| MinIO Storage | Stored data: 1,000 GiB-month; one copy | Cited list prices, 2026-10-22 | 23.00 | 198.40 | +175.40 | Service adapter |
| OCI Object Storage | Stored data: 1,000 GiB-month | Cited list prices, 2026-10-22 | 23.00 | 25.25 | +2.25 | Service adapter |
| Scaleway Object Storage | Stored data: 1,000 GiB-month | Cited list prices, 2026-10-22 | 23.00 | 18.00 | -5.00 | Service adapter |

Difference means backend minus origin; a positive difference means the backend costs more. Workloads and target configurations differ by model, so compare each row's difference at its stated workload rather than charges across rows.
Cost curves across workload sizes, with every assumption and exclusion: [Amazon S3 costs](https://docs.tensor9.com/cloud-adapter-early-access/costs/s3.md).

## Service level agreements

> [!WARNING]
>
> These tables show Tensor9's standard service levels and adapters whose standard terms are still being defined. Your signed agreement determines the SLAs, covered adapters and operations, limits, remedies and support terms that apply to your deployment.

Listed terms cover requests sent through this service adapter. They do not cover direct connections to the target service or replace the cloud provider's own SLA. Each origin-to-target pair has its own terms or an explicit pending status.

See the [SLA tables](https://docs.tensor9.com/cloud-adapter-early-access/support/service-adapter-slas.md), [measurement rules](https://docs.tensor9.com/cloud-adapter-early-access/support/service-levels.md), and [scaling conditions](https://docs.tensor9.com/cloud-adapter-early-access/support/scaling-and-limits.md).

### S3 to Azure Blob Storage

| SLA | Service level | What is covered | Conditions |
| - | - | - | - |
| Endpoint reachability | 99.9% per calendar month | Adapter endpoint reachability | Tests whether the endpoint can be reached, separately from whether requests complete correctly. |
| GetObject, PutObject adapter-added latency | +1 ms monthly p99 | `aws::1.0.0::s3`: `GetObject`, `PutObject` | Object ≤64 KiB; request metadata ≤8 KiB; bucket versioning disabled. Count all bytes the adapter reads or transfers, not just those returned to the application. Version bookkeeping needs a separate class. |
| HeadObject, DeleteObject adapter-added latency | +1 ms monthly p99 | `aws::1.0.0::s3`: `HeadObject`, `DeleteObject` | Request and response metadata ≤8 KiB; delete targets an unversioned bucket and creates no delete marker. This limit does not restrict the stored object size. |
| ListObjects, ListObjectsV2, ListObjectVersions, ListParts adapter-added latency | +5 ms monthly p99 | `aws::1.0.0::s3`: `ListObjects`, `ListObjectsV2`, `ListObjectVersions`, `ListParts` | One page with ≤1,000 entries or parts and ≤1 MiB of response data. The adapter's documented listing and version limits still apply. |
| DeleteObjects adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::s3`: `DeleteObjects` | ≤1,000 keys. Record the result for each key, including failures. |
| CompleteMultipartUpload adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::s3`: `CompleteMultipartUpload` | ≤1,000 parts. Measure the time Azure spends committing blocks separately. |
| Saving objects correctly | Save all required data before returning success | `aws::1.0.0::s3`: `PutObject`, `UploadPart`, `CompleteMultipartUpload`, `CopyObject`, `DeleteObject`, `DeleteObjects`, `CreateMultipartUpload`, `AbortMultipartUpload`, `PutObjectTagging`, `DeleteObjectTagging` | Keep object bytes, part order and required metadata intact. Reject unsupported request options and preserve the previous saved object if replacement fails. The provider's own data-durability guarantee is separate. |
| Adapter autoscaling and limits | Automatic scaling within agreed traffic and deployment limits | Adapter behavior across requests | Agree limits for memory per request, bytes being transferred, copy bandwidth, work per object key, traffic growth and bursts, and spare capacity for failures. Adding adapter processes does not reduce the memory needed by one request. The standard service level promises no fixed request rate, reserved throughput or unlimited scaling. Backend capacity is separate. Adapter scaling delays still count toward the SLA while traffic stays within the agreed limits. |

**Adapter-added latency.** A + prefix marks time added by the adapter, not the total time your application waits. Total request time includes adapter processing, backend service time and network time. The backend provider's SLA applies independently. Only separately measured target-service wait may be subtracted, and only when your agreement permits it; internal metadata, coordination and retry processing still count. For one request, 12 ms of adapter processing plus 90 ms waiting for the backend means at least 102 ms total. This example does not add monthly p99 values.

**What Tensor9 covers.** Latency targets measure the time Tensor9's adapter adds to backend processing, not the application's total elapsed time. They do not replace the backend provider's SLA. Adapter time covers permission checks, deciding whether to accept a request, time waiting inside the adapter, request handling, coordination, retries, internal storage and response handling. Waiting for the backend service is excluded only when that wait is measured separately and the agreement allows the exclusion. Your agreement must name the covered deployment, operations, request limits and traffic limits. Unlisted operations are not automatically covered. Correct data and authorization behavior is required for every supported request; endpoint reachability does not excuse incorrect results.

**S3 operations without latency targets.** These supported operations have no latency target here: `UploadPart`, `CopyObject`, `CreateMultipartUpload`, `AbortMultipartUpload`, `GetObjectTagging`, `PutObjectTagging`, `DeleteObjectTagging`, `CreateBucket`, `DeleteBucket` and `HeadBucket`. `ListMultipartUploads` and `UploadPartCopy` are not covered. Azure's documented listing and version limits still apply; delimiter/`CommonPrefixes` requests are unsupported. A small range read must also fit the byte limit for all data the adapter reads or transfers.

**Scaling limits.** Tensor9 automatically adds adapter capacity within the traffic growth, burst size and infrastructure limits in your agreement. The standard service level does not promise a fixed request rate or unlimited scaling. Capacity depends on request sizes and types, how traffic is distributed across keys or message groups, backend configuration and spare capacity for failures. More adapter processes cannot speed up every shared or sequential step. You remain responsible for backend-service capacity; failures caused independently by the provider are outside this SLA.

**Read the details.** Each linked service page lists the covered operations, request limits, measurement rules, data guarantees, scaling limits and examples. This summary does not add coverage beyond those terms. Your signed agreement determines the service levels that apply to your deployment.

#### Adapter and scope

| Origin | Backend |
| - | - |
| `aws::1.0.0::s3` | `azure::1.0.0::blob-storage` |

These standard terms cover supported S3 operations implemented against Azure Blob Storage. They use the same small-request latency classes as the Google Cloud Storage adapter, but those equal targets do not mean the implementations have identical performance or request shapes.

#### Why these latency targets differ

The 1 ms small-object and metadata targets budget bounded parsing, header translation, checksum work and response handling. They apply to the listed unversioned request shapes; writes or deletes that maintain version records need a separate class. A large object does not qualify merely because its first response byte arrives quickly.

A listing has a 5 ms target because up to 1,000 entries and 1 MiB of XML must be parsed or rendered. The 20 ms multi-delete target allows for constructing and scheduling up to 1,000 individual deletes and assembling their outcomes. The 20 ms multipart-completion target allows for validation, ordering and bookkeeping for up to 1,000 parts. These are distinct budgets, not a claim that every operation costs the same amount.

Backend object-store waits are excluded only when measured separately as the agreement requires. Work between backend calls still counts, including local retries and adapter-owned metadata storage. In particular, a multipart compose or block-commit request does not make all completion time external. Production qualification must verify the complete measured path under the agreed traffic mix.

#### Operation terms

The size and count limits in these tables do not override stricter API or adapter limits. A supported request that exceeds a row's limits has no latency guarantee from that row. The adapter must still return the complete result.

For `GetObject`, measure bytes returned **and** bytes the adapter loads or transfers. A small range response does not qualify for the small-object class if serving it requires a larger full-object transfer through the adapter. `PutObject` uses uploaded object bytes. For `HeadObject` and `DeleteObject`, measure metadata size; these operations do not read the object body.

##### Operations without a latency target

These supported operations have no numerical request-latency target in these standard terms:

`UploadPart`, `CopyObject`, `CreateMultipartUpload`, `AbortMultipartUpload`, `GetObjectTagging`, `PutObjectTagging`, `DeleteObjectTagging`, `CreateBucket`, `DeleteBucket`, `HeadBucket`.

The adapter must preserve documented behavior for these operations and supported large-object requests that exceed the small-object latency limits. No request-correctness percentage is offered. The adapter's documented limits still apply, including limits on partially supported operations.

Other supported operations are not covered just because they use the same S3 endpoint. In particular, these standard terms do not include `ListMultipartUploads` or `UploadPartCopy`. An operation can be supported without having a numerical SLA.

#### Multipart, listing and batch accounting

An SDK paginator making ten list calls produces ten separate API calls. It is not a single one-page operation. Multipart completion can make several native calls; all adapter work between those calls still counts toward adapter latency. If backend calls overlap, count the shared waiting time only once when excluding backend wait.

For `DeleteObjects`, retain the overall response and every per-key outcome. A valid partial result does not mean every key was deleted. Track origin calls, submitted keys, completed keys and native calls separately when measuring throughput or investigating failures.

#### Which request options are covered

Read the Azure adapter's documentation alongside the operation table. `ListObjectVersions` and `ListParts` keep their documented partial-support limits. The `ListObjectsV2` latency service level does not include the profile's unsupported delimiter/`CommonPrefixes` form.

Tagging, version-addressed requests and copy behavior retain their backend-specific limits. `CopyObject` has no small-object or bulk-throughput latency promise under these standard terms. Copy can involve downloading and uploading data through the adapter, so its cost cannot be inferred from the size of the request headers.

#### Acknowledgment and object integrity

Return successful writes only after the required native commit and adapter metadata work completes. Multipart completion must preserve the submitted part order and object bytes through Azure block commit. Unsupported metadata or copy behavior must not be silently accepted as if it were implemented.

If a write or replacement fails, preserve the distinction between the previous committed object, unfinished work and a successfully committed replacement. A backend commit followed by an adapter response failure is a write whose outcome the caller cannot know yet. The adapter must not invent a success response or repeat the write without checking whether it is safe.

Backend storage durability is a separate provider obligation. The adapter remains responsible for premature acknowledgment, corrupt bytes or metadata, and incorrect cleanup under its supported behavior. These obligations apply to every supported request.

#### Scaling considerations

Measure object size and in-flight bytes as well as request rate. One request's memory use can limit request size and the number of requests the adapter can handle at once; additional replicas do not reduce the memory required by that one request. Large copies also consume transfer bandwidth.

Batch deletion needs separate measurement of keys and native calls. More workers can serve independent batches, but that alone does not speed up the sequence of per-key work inside one batch. Multipart commits and metadata operations have their own coordination costs.

The standard terms contain no numerical maximum request rate or bulk-transfer guarantee. To set a supported limit, test the exact operation mix, all bytes transferred or loaded by the adapter, simultaneous requests, spare capacity for failures, and the part of the system that limits throughput. A native Azure quota and a Tensor9 adapter limit are distinct constraints.

#### Example: completing an upload

An application uploads parts for `media/training-recording.mp4`, then submits `CompleteMultipartUpload` with 200 parts. The finalization class covers at most 1,000 parts, using request options supported by the adapter.

Separate local validation and part/metadata coordination from Azure's block-commit execution. Return the S3 completion response only after the required commit. The multipart-completion service level concerns p99 local adapter processing, not a promise that Azure will commit the object or the entire multipart upload will finish within that adapter latency target.

#### Example: memory pressure before Azure sees the request

A workload switches from small objects to large concurrent uploads. Azure metrics show spare capacity, but local memory pressure increases and requests wait or fail before native execution starts.

This is not evidence that Azure is slow. Inspect the adapter's request queueing, per-request memory, concurrent transfers and scaling state. Within the agreement's traffic and request-size limits, Tensor9 remains responsible for adapter processing and delays in adding capacity. If the workload exceeds those limits, work with Tensor9 to adjust the deployment and transfer pattern. More adapter instances cannot reduce the memory needed by a single request.

#### Example: a mixed delete result

`DeleteObjects` submits 500 keys. Some deletions succeed while others return errors. Preserve each key's result and correlate native request IDs. The whole batch is not 500 successful deletions merely because an S3 response was returned. Retrying every key can obscure the original outcome and repeat work unnecessarily.

#### Evidence for support

Record object and metadata sizes, copy source/destination, part or key counts, concurrent transfers, local memory/queue pressure, response and per-entry results. Keep Azure request IDs and metrics alongside adapter request IDs and available Explain evidence. Redact credentials and sensitive object names before sharing.

### S3 to DigitalOcean Spaces

| SLA | Service level | What is covered | Conditions |
| - | - | - | - |
| Small object and metadata requests adapter-added latency | +1 ms monthly p99 | `aws::1.0.0::s3`: `DeleteObject`, `GetObject`, `HeadBucket`, `HeadObject`, `PutObject` | One object; complete request and response bodies each at most 64 KiB, metadata at most 8 KiB. No archive restore or multipart completion. Larger streaming bodies need a byte-rate and completion budget in the agreement. |
| Bounded object copy adapter-added latency | +3 ms monthly p99 | `aws::1.0.0::s3`: `CopyObject` | One source and destination, object at most 64 KiB, metadata at most 8 KiB. Only supported source conditions and ranges are covered. |
| Bounded object and multipart listing adapter-added latency | +3 ms monthly p99 | `aws::1.0.0::s3`: `ListMultipartUploads`, `ListObjectVersions`, `ListObjects`, `ListObjectsV2`, `ListParts` | One page with at most 1,000 returned entries and 1 MiB of encoded response. No implicit traversal of later pages. |
| Bounded multi-object deletion adapter-added latency | +10 ms monthly p99 | `aws::1.0.0::s3`: `DeleteObjects` | At most 100 keys per request and at most 128 KiB of request and response metadata. Every key retains its individual success or error result. |
| Multipart setup, parts and completion adapter-added latency | +5 ms monthly p99 | `aws::1.0.0::s3`: `AbortMultipartUpload`, `CompleteMultipartUpload`, `CreateMultipartUpload`, `UploadPart` | At most 100 parts at completion; a part request is at most 64 KiB for this latency class. The target's supported multipart limits still apply. Larger parts are covered by a separately agreed streaming budget. |
| Bucket configuration requests adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::s3`: `CreateBucket`, `DeleteBucket` | One bucket; at most 32 KiB configuration and 50 policy or rule entries. Measures the API response, not asynchronous replication, lifecycle transitions or data migration. |
| Documented adapter behavior | Preserve the supported behavior documented for this adapter | `aws::1.0.0::s3`: `DeleteObject`, `GetObject`, `HeadBucket`, `HeadObject`, `PutObject`, `CopyObject`, `ListMultipartUploads`, `ListObjectVersions`, `ListObjects`, `ListObjectsV2`, `ListParts`, `DeleteObjects`, `AbortMultipartUpload`, `CompleteMultipartUpload`, `CreateMultipartUpload`, `UploadPart`, `CreateBucket`, `DeleteBucket` | A successful write must preserve the accepted bytes and supported metadata; a failed replacement must not be reported as successful. Version IDs, delete markers, conditional requests, ACLs and retention follow this directed profile, not an assumed universal S3 contract. Target storage durability remains the provider's responsibility; Tensor9 is responsible for corrupting, misrouting or prematurely acknowledging a request in its own code. |
| Endpoint reachability | 99.9% per calendar month | Adapter endpoint reachability | The agreed production deployment has healthy target connectivity and receives a valid adapter health probe. This measures the adapter endpoint, not the target provider's service. |
| Adapter autoscaling and limits | Automatic scaling within the workload and deployment limits in your agreement | Adapter behavior across requests | Your agreement states the maximum request rate, burst size, request and response sizes, concurrency, and target calls per request. Tensor9 maintains adapter capacity inside that envelope. Target-service quotas and capacity are separate. |

**Adapter-added latency.** A + prefix marks time added by the adapter, not the total time your application waits. Total request time includes adapter processing, backend service time and network time. The backend provider's SLA applies independently. Only separately measured target-service wait may be subtracted, and only when your agreement permits it; internal metadata, coordination and retry processing still count. For one request, 12 ms of adapter processing plus 90 ms waiting for the backend means at least 102 ms total. This example does not add monthly p99 values.

**What Tensor9 covers.** These service levels cover the adapter between the origin API and target API. They do not replace the target provider's SLA.

**How latency is counted.** Adapter work, including metadata and coordination, counts. Only separately measured permitted target waits are excluded.

**Which terms apply.** Your signed agreement names the covered operations, workload limits, remedies, and final service levels for your deployment.

#### What this adapter does

For `digitalocean::1.0.0::spaces`, The S3-compatible target stores and serves object bytes. The adapter still authenticates, selects the bucket binding, handles permitted headers and errors, and applies the profile's versioning and multipart rules. Native API similarity does not waive these responsibilities. The small-object SLA is not a promise to transfer an arbitrarily large object in 1 ms. The body-size condition bounds checksum, encoding and buffering work on both directions.

#### How the latency targets were chosen

**Small object and metadata requests: +1 ms monthly p99 (adapter-added).** `DeleteObject`, `GetObject`, `HeadBucket`, `HeadObject`, `PutObject`. Bounded header translation, identity lookup, and checksum/body handling; target object-store waits are separate. A 1 ms target is an engineering objective, not a measured percentile.

**Bounded object copy: +3 ms monthly p99 (adapter-added).** `CopyObject`. A copy may require source metadata and result translation in addition to the copy request.

**Bounded object and multipart listing: +3 ms monthly p99 (adapter-added).** `ListMultipartUploads`, `ListObjectVersions`, `ListObjects`, `ListObjectsV2`, `ListParts`. Listing work grows with parsed entries and encoded XML; Azure must reconstruct the S3 listing from Blob XML.

**Bounded multi-object deletion: +10 ms monthly p99 (adapter-added).** `DeleteObjects`. GCS and Azure can fan out into per-key requests; request construction, scheduling, result aggregation and retries count as adapter work.

**Multipart setup, parts and completion: +5 ms monthly p99 (adapter-added).** `AbortMultipartUpload`, `CompleteMultipartUpload`, `CreateMultipartUpload`, `UploadPart`. Multipart identity, part-list validation and target block/part list translation add bounded work.

**Bucket configuration requests: +20 ms monthly p99 (adapter-added).** `CreateBucket`, `DeleteBucket`. Configuration validation and logical bucket/policy state can require adapter-owned storage. Those waits remain fabric time.

Your signed agreement sets the terms for your deployment. A target does not add an operation or option that the compatibility tables mark unavailable.

#### What counts toward latency

For a request-response row, measure from the agreed ingress boundary to dispatch of the complete response. A row that explicitly names a first response chunk ends at that chunk; its number does not cover the rest of the stream. A long-poll row names the intentional wait and when adapter delay starts. Include parsing, authorization, admission, translation, serialization, adapter-owned storage and coordination, retries and response handling. Subtract only separately measured target-workload waits and external network segments allowed by the measurement rules. The adapter's own response handling and dispatch remain covered. A database used for adapter metadata is still adapter work, even if a cloud provider hosts it.

For concurrent calls, exclude the union of permitted wait intervals, not the sum of overlapping spans. Calculate each request's adapter duration first, then the monthly p99. Do not subtract one service's p99 from another's. Known adapter timeouts are over-budget samples; failed or incomplete requests cannot disappear to improve the percentile. Missing measurements do not become zero latency. An SDK call span alone does not prove how much of its duration can be excluded.

#### Endpoint reachability and request failures

The endpoint-reachability target measures adapter health checks. Correctly forwarding a target quota or permission error is different from producing that error because the adapter sent the wrong request. Adapter-caused failures remain Tensor9's responsibility even when the target is healthy.

Correctness and data-integrity requirements apply to every supported request. Endpoint reachability does not measure request correctness or grant an allowance for incorrect results.

#### Scaling and target-service capacity

Scale on bytes per second, active streams and metadata requests separately. A few large uploads can exhaust memory or egress while request count stays low; listing and multi-delete amplify work per request. Tensor9 scales the adapter within the agreed concurrency, byte-rate, page-size and fan-out limits. The customer sizes the object-store account and checks provider throttling. Multipart completion needs enough headroom for its composition and cleanup work.

Tell Tensor9 the expected steady rate, bursts, concurrency, payload sizes and operation mix. Tensor9 sizes and scales the adapter for the agreed load; you choose and monitor the target service's capacity with Tensor9's help. A latency budget is not a requests-per-second rating. Larger requests and higher rates need explicit terms, not silent inheritance of a small-request SLA.

#### Data and behavior guarantees

A successful write must preserve the accepted bytes and supported metadata; a failed replacement must not be reported as successful. Version IDs, delete markers, conditional requests, ACLs and retention follow this directed profile, not an assumed universal S3 contract. Target storage durability remains the provider's responsibility; Tensor9 is responsible for corrupting, misrouting or prematurely acknowledging a request in its own code.

#### Example and diagnosis

For `GetObject` of `reports/invoice.json`, a 32 KiB body and 2 KiB metadata use the small-object row. A 500 MiB download does not. For a multi-delete of 80 keys, use the multi-delete row and retain every per-key error. If the native object-store wait grows while adapter time remains within target, investigate the target account or network; if XML translation or checksum work grows, investigate the adapter.

Use `tensor9 explain` and the documented explain headers to understand the selected adapter and its behavior. Correlate available request diagnostics with the target provider's latency, throttling and capacity metrics. An explain report helps diagnose a request; it is not by itself a qualified SLA timing measurement. Share the operation, request shape, timestamps and request identifiers with support, with credentials and customer payloads removed.

### S3 to Google Cloud Storage

| SLA | Service level | What is covered | Conditions |
| - | - | - | - |
| Endpoint reachability | 99.9% per calendar month | Adapter endpoint reachability | Tests whether the endpoint can be reached, separately from whether requests complete correctly. |
| GetObject, PutObject adapter-added latency | +1 ms monthly p99 | `aws::1.0.0::s3`: `GetObject`, `PutObject` | Object ≤64 KiB; request metadata ≤8 KiB; bucket versioning disabled. Count all bytes the adapter reads or transfers, not just those returned to the application. Version bookkeeping needs a separate class. |
| HeadObject, DeleteObject adapter-added latency | +1 ms monthly p99 | `aws::1.0.0::s3`: `HeadObject`, `DeleteObject` | Request and response metadata ≤8 KiB; delete targets an unversioned bucket and creates no delete marker. This limit does not restrict the stored object size. |
| ListObjects, ListObjectsV2, ListObjectVersions, ListParts adapter-added latency | +5 ms monthly p99 | `aws::1.0.0::s3`: `ListObjects`, `ListObjectsV2`, `ListObjectVersions`, `ListParts` | One page with ≤1,000 entries or parts and ≤1 MiB of response data. |
| DeleteObjects adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::s3`: `DeleteObjects` | ≤1,000 keys. Record the result for each key, including failures. |
| CompleteMultipartUpload adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::s3`: `CompleteMultipartUpload` | ≤1,000 parts. Measure the time GCS spends combining parts separately. |
| Saving objects correctly | Save all required data before returning success | `aws::1.0.0::s3`: `PutObject`, `UploadPart`, `CompleteMultipartUpload`, `CopyObject`, `DeleteObject`, `DeleteObjects`, `CreateMultipartUpload`, `AbortMultipartUpload`, `PutObjectTagging`, `DeleteObjectTagging` | Keep object bytes, part order, required metadata and supported versions intact. A failed replacement must preserve the previous saved object. The provider's own data-durability guarantee is separate. |
| Adapter autoscaling and limits | Automatic scaling within agreed traffic and deployment limits | Adapter behavior across requests | Agree limits for bytes, simultaneous transfers, backend calls per request, shared metadata work, traffic growth and bursts, and spare capacity for failures. The standard service level promises no fixed request rate, reserved throughput or unlimited scaling. Backend capacity is separate. Adapter scaling delays still count toward the SLA while traffic stays within the agreed limits. |

**Adapter-added latency.** A + prefix marks time added by the adapter, not the total time your application waits. Total request time includes adapter processing, backend service time and network time. The backend provider's SLA applies independently. Only separately measured target-service wait may be subtracted, and only when your agreement permits it; internal metadata, coordination and retry processing still count. For one request, 12 ms of adapter processing plus 90 ms waiting for the backend means at least 102 ms total. This example does not add monthly p99 values.

**What Tensor9 covers.** Latency targets measure the time Tensor9's adapter adds to backend processing, not the application's total elapsed time. They do not replace the backend provider's SLA. Adapter time covers permission checks, deciding whether to accept a request, time waiting inside the adapter, request handling, coordination, retries, internal storage and response handling. Waiting for the backend service is excluded only when that wait is measured separately and the agreement allows the exclusion. Your agreement must name the covered deployment, operations, request limits and traffic limits. Unlisted operations are not automatically covered. Correct data and authorization behavior is required for every supported request; endpoint reachability does not excuse incorrect results.

**S3 operations without latency targets.** These supported operations have no latency target here: `UploadPart`, `CopyObject`, `CreateMultipartUpload`, `AbortMultipartUpload`, `GetObjectTagging`, `PutObjectTagging`, `DeleteObjectTagging`, `CreateBucket`, `DeleteBucket` and `HeadBucket`. `ListMultipartUploads` and `UploadPartCopy` are not covered. Azure's documented listing and version limits still apply; delimiter/`CommonPrefixes` requests are unsupported. A small range read must also fit the byte limit for all data the adapter reads or transfers.

**Scaling limits.** Tensor9 automatically adds adapter capacity within the traffic growth, burst size and infrastructure limits in your agreement. The standard service level does not promise a fixed request rate or unlimited scaling. Capacity depends on request sizes and types, how traffic is distributed across keys or message groups, backend configuration and spare capacity for failures. More adapter processes cannot speed up every shared or sequential step. You remain responsible for backend-service capacity; failures caused independently by the provider are outside this SLA.

**Read the details.** Each linked service page lists the covered operations, request limits, measurement rules, data guarantees, scaling limits and examples. This summary does not add coverage beyond those terms. Your signed agreement determines the service levels that apply to your deployment.

#### Adapter and scope

| Origin | Backend |
| - | - |
| `aws::1.0.0::s3` | `google::1.0.0::gcs` |

Your application uses S3 operations while object bytes live in Google Cloud Storage. Tensor9 handles the supported S3 request and response semantics, including the work needed around native object operations. Google remains responsible for running and storing data in Cloud Storage. Tensor9 is responsible for the adapter's work.

#### Why these latency targets differ

The 1 ms small-object and metadata targets budget bounded parsing, header translation, checksum work and response handling. They apply to the listed unversioned request shapes; writes or deletes that maintain version records need a separate class. A large object does not qualify merely because its first response byte arrives quickly.

A listing has a 5 ms target because up to 1,000 entries and 1 MiB of XML must be parsed or rendered. The 20 ms multi-delete target allows for constructing and scheduling up to 1,000 individual deletes and assembling their outcomes. The 20 ms multipart-completion target allows for validation, ordering and bookkeeping for up to 1,000 parts. These are distinct budgets, not a claim that every operation costs the same amount.

Backend object-store waits are excluded only when measured separately as the agreement requires. Work between backend calls still counts, including local retries and adapter-owned metadata storage. In particular, a multipart compose or block-commit request does not make all completion time external. Production qualification must verify the complete measured path under the agreed traffic mix.

#### Operation terms

The size and count limits in these tables do not override stricter API or adapter limits. A supported request that exceeds a row's limits has no latency guarantee from that row. The adapter must still return the complete result.

For `GetObject`, measure bytes returned **and** bytes the adapter loads or transfers. A small range response does not qualify for the small-object class if serving it requires a larger full-object transfer through the adapter. `PutObject` uses uploaded object bytes. For `HeadObject` and `DeleteObject`, measure metadata size; these operations do not read the object body.

##### Operations without a latency target

These supported operations have no numerical request-latency target in these standard terms:

`UploadPart`, `CopyObject`, `CreateMultipartUpload`, `AbortMultipartUpload`, `GetObjectTagging`, `PutObjectTagging`, `DeleteObjectTagging`, `CreateBucket`, `DeleteBucket`, `HeadBucket`.

The adapter must preserve documented behavior for these operations and supported large-object requests that exceed the small-object latency limits. No request-correctness percentage is offered. The adapter's documented limits still apply, including limits on partially supported operations.

Other supported operations are not covered just because they use the same S3 endpoint. In particular, these standard terms do not include `ListMultipartUploads` or `UploadPartCopy`. An operation can be supported without having a numerical SLA.

#### Multipart, listing and batch accounting

An SDK paginator making ten list calls produces ten separate API calls. It is not a single one-page operation. Multipart completion can make several native calls; all adapter work between those calls still counts toward adapter latency. If backend calls overlap, count the shared waiting time only once when excluding backend wait.

For `DeleteObjects`, retain the overall response and every per-key outcome. A valid partial result does not mean every key was deleted. Track origin calls, submitted keys, completed keys and native calls separately when measuring throughput or investigating failures.

#### Acknowledgment and object integrity

Before returning success, the adapter must verify that the upload is complete, the object is available, and the required object and adapter metadata have been saved. A cancelled or invalid upload must not replace an existing object with incomplete data.

For multipart completion, preserve part order and bytes when Cloud Storage combines the parts. Cleanup of unfinished staging data must not remove the previous committed object. Preserve supported version and delete-marker behavior, and translate ETags according to the service profile rather than treating every Google Cloud Storage validator as an equivalent S3 ETag.

Bucket configuration has its own operation-specific behavior. Object integrity does not imply that every bucket feature or version-addressed request behaves identically to native S3. Check the adapter's documentation for the request options your application uses.

The standard adapter SLA does not restate Google's storage-durability percentage as a Tensor9 guarantee. Tensor9 is responsible if the adapter returns success too early, corrupts data during translation, or deletes data incorrectly during cleanup. Data loss caused independently by the backend service is not covered by the standard adapter SLA.

#### Scaling considerations

The adapter can process independent requests and streams in parallel. Their byte volume, concurrent buffers, integrity work, network bandwidth and metadata coordination still impose limits. A thousand tiny object reads and a thousand large uploads are different workloads even though both are counted as a thousand API calls.

`CompleteMultipartUpload` adds coordination and composition work. `DeleteObjects` adds per-key work. Test those workloads separately; multiplying a small-object benchmark by the number of adapter instances does not establish their capacity.

The standard terms do not set a numerical maximum request rate, transfer rate or reserved throughput. The agreed limit must state the workload, operation mix, data sizes, spare capacity for failures, and the first part of the system that limits throughput. A local single-binary test does not establish how much traffic a production deployment can handle.

#### Example: uploading a report

**1. Identify the operation and payload**

The application uploads a 32 KiB `report.pdf` to the `media` bucket with `PutObject`. Its request metadata is 2 KiB, so it fits the small-object class, provided its request options and deployment meet the agreement's requirements.

**2. Separate the observed work**

Measure request handling and permission checks, object processing, the Cloud Storage upload, making the object available, saving metadata, and preparing the S3 response. Time spent maintaining the adapter's own metadata counts toward adapter latency, even when that metadata is in a cloud-managed database.

**3. Check both the response and the committed object**

A successful response must correspond to the required committed bytes and metadata. Keep the returned identifiers and check the stored object. An Explain report alone does not prove that the bytes were saved correctly.

For an illustrative request with 12 ms of adapter processing and 90 ms of measured backend wait, the application waits at least 102 ms between the stated measurement points. Compare the 12 ms sample with the small-object service level; the monthly p99 must be calculated from all requests covered by that measurement.

#### Example: the object commits but the response is lost

Google Cloud Storage accepts the upload, then the adapter fails before returning the S3 response. The original request still failed to receive a response. The adapter's response handling is covered by the SLA, even though the application cannot yet tell whether the write succeeded.

Preserve the request IDs and investigate the backend object/version before retrying. Do not blindly replay a write just to obtain an explanation. Use the existing report if available; if it is unavailable, support still investigates with the response, timestamps and backend evidence.

If Google Cloud Storage itself is slow, its measured execution is separately accounted for. Excessive local buffering, adapter queueing or extra work caused by retries remains Tensor9's responsibility; involving a backend call does not exclude all of that work.

#### Evidence for support

Include the operation, bucket and redacted key, object and metadata sizes, range or multipart shape, timestamps, origin and backend request IDs, adapter version, response, backend state and available Explain report. For performance, include completed bytes and operations, concurrent transfers, adapter timings and corresponding Google Cloud metrics over the same window.

### S3 to MinIO Storage

| SLA | Service level | What is covered | Conditions |
| - | - | - | - |
| Small object and metadata requests adapter-added latency | +1 ms monthly p99 | `aws::1.0.0::s3`: `DeleteObject`, `GetObject`, `HeadBucket`, `HeadObject`, `PutObject` | One object; complete request and response bodies each at most 64 KiB, metadata at most 8 KiB. No archive restore or multipart completion. Larger streaming bodies need a byte-rate and completion budget in the agreement. |
| Object tagging adapter-added latency | +3 ms monthly p99 | `aws::1.0.0::s3`: `DeleteObjectTagging`, `GetObjectTagging`, `PutObjectTagging` | One object and at most 10 tags; total encoded tags at most 4 KiB. Only the tag characters and version-addressing forms listed by this target profile are covered. |
| Bounded object copy adapter-added latency | +3 ms monthly p99 | `aws::1.0.0::s3`: `CopyObject` | One source and destination, object at most 64 KiB, metadata at most 8 KiB. Only supported source conditions and ranges are covered. |
| Bounded object and multipart listing adapter-added latency | +3 ms monthly p99 | `aws::1.0.0::s3`: `ListMultipartUploads`, `ListObjectVersions`, `ListObjects`, `ListObjectsV2`, `ListParts` | One page with at most 1,000 returned entries and 1 MiB of encoded response. No implicit traversal of later pages. |
| Bounded multi-object deletion adapter-added latency | +10 ms monthly p99 | `aws::1.0.0::s3`: `DeleteObjects` | At most 100 keys per request and at most 128 KiB of request and response metadata. Every key retains its individual success or error result. |
| Multipart setup, parts and completion adapter-added latency | +5 ms monthly p99 | `aws::1.0.0::s3`: `AbortMultipartUpload`, `CompleteMultipartUpload`, `CreateMultipartUpload`, `UploadPart` | At most 100 parts at completion; a part request is at most 64 KiB for this latency class. The target's supported multipart limits still apply. Larger parts are covered by a separately agreed streaming budget. |
| Bucket configuration requests adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::s3`: `CreateBucket`, `DeleteBucket` | One bucket; at most 32 KiB configuration and 50 policy or rule entries. Measures the API response, not asynchronous replication, lifecycle transitions or data migration. |
| Documented adapter behavior | Preserve the supported behavior documented for this adapter | `aws::1.0.0::s3`: `DeleteObject`, `GetObject`, `HeadBucket`, `HeadObject`, `PutObject`, `DeleteObjectTagging`, `GetObjectTagging`, `PutObjectTagging`, `CopyObject`, `ListMultipartUploads`, `ListObjectVersions`, `ListObjects`, `ListObjectsV2`, `ListParts`, `DeleteObjects`, `AbortMultipartUpload`, `CompleteMultipartUpload`, `CreateMultipartUpload`, `UploadPart`, `CreateBucket`, `DeleteBucket` | A successful write must preserve the accepted bytes and supported metadata; a failed replacement must not be reported as successful. Version IDs, delete markers, conditional requests, ACLs and retention follow this directed profile, not an assumed universal S3 contract. Target storage durability remains the provider's responsibility; Tensor9 is responsible for corrupting, misrouting or prematurely acknowledging a request in its own code. |
| Endpoint reachability | 99.9% per calendar month | Adapter endpoint reachability | The agreed production deployment has healthy target connectivity and receives a valid adapter health probe. This measures the adapter endpoint, not the target provider's service. |
| Adapter autoscaling and limits | Automatic scaling within the workload and deployment limits in your agreement | Adapter behavior across requests | Your agreement states the maximum request rate, burst size, request and response sizes, concurrency, and target calls per request. Tensor9 maintains adapter capacity inside that envelope. Target-service quotas and capacity are separate. |

**Adapter-added latency.** A + prefix marks time added by the adapter, not the total time your application waits. Total request time includes adapter processing, backend service time and network time. The backend provider's SLA applies independently. Only separately measured target-service wait may be subtracted, and only when your agreement permits it; internal metadata, coordination and retry processing still count. For one request, 12 ms of adapter processing plus 90 ms waiting for the backend means at least 102 ms total. This example does not add monthly p99 values.

**What Tensor9 covers.** These service levels cover the adapter between the origin API and target API. They do not replace the target provider's SLA.

**How latency is counted.** Adapter work, including metadata and coordination, counts. Only separately measured permitted target waits are excluded.

**Which terms apply.** Your signed agreement names the covered operations, workload limits, remedies, and final service levels for your deployment.

#### What this adapter does

For `minio::1.0.0::storage`, The S3-compatible target stores and serves object bytes. The adapter still authenticates, selects the bucket binding, handles permitted headers and errors, and applies the profile's versioning and multipart rules. Native API similarity does not waive these responsibilities. The small-object SLA is not a promise to transfer an arbitrarily large object in 1 ms. The body-size condition bounds checksum, encoding and buffering work on both directions.

#### How the latency targets were chosen

**Small object and metadata requests: +1 ms monthly p99 (adapter-added).** `DeleteObject`, `GetObject`, `HeadBucket`, `HeadObject`, `PutObject`. Bounded header translation, identity lookup, and checksum/body handling; target object-store waits are separate. A 1 ms target is an engineering objective, not a measured percentile.

**Object tagging: +3 ms monthly p99 (adapter-added).** `DeleteObjectTagging`, `GetObjectTagging`, `PutObjectTagging`. GCS stores tags in reserved metadata; Azure translates to native tags. Read/modify/write and adapter metadata work remain on the fabric clock.

**Bounded object copy: +3 ms monthly p99 (adapter-added).** `CopyObject`. A copy may require source metadata and result translation in addition to the copy request.

**Bounded object and multipart listing: +3 ms monthly p99 (adapter-added).** `ListMultipartUploads`, `ListObjectVersions`, `ListObjects`, `ListObjectsV2`, `ListParts`. Listing work grows with parsed entries and encoded XML; Azure must reconstruct the S3 listing from Blob XML.

**Bounded multi-object deletion: +10 ms monthly p99 (adapter-added).** `DeleteObjects`. GCS and Azure can fan out into per-key requests; request construction, scheduling, result aggregation and retries count as adapter work.

**Multipart setup, parts and completion: +5 ms monthly p99 (adapter-added).** `AbortMultipartUpload`, `CompleteMultipartUpload`, `CreateMultipartUpload`, `UploadPart`. Multipart identity, part-list validation and target block/part list translation add bounded work.

**Bucket configuration requests: +20 ms monthly p99 (adapter-added).** `CreateBucket`, `DeleteBucket`. Configuration validation and logical bucket/policy state can require adapter-owned storage. Those waits remain fabric time.

Your signed agreement sets the terms for your deployment. A target does not add an operation or option that the compatibility tables mark unavailable.

#### What counts toward latency

For a request-response row, measure from the agreed ingress boundary to dispatch of the complete response. A row that explicitly names a first response chunk ends at that chunk; its number does not cover the rest of the stream. A long-poll row names the intentional wait and when adapter delay starts. Include parsing, authorization, admission, translation, serialization, adapter-owned storage and coordination, retries and response handling. Subtract only separately measured target-workload waits and external network segments allowed by the measurement rules. The adapter's own response handling and dispatch remain covered. A database used for adapter metadata is still adapter work, even if a cloud provider hosts it.

For concurrent calls, exclude the union of permitted wait intervals, not the sum of overlapping spans. Calculate each request's adapter duration first, then the monthly p99. Do not subtract one service's p99 from another's. Known adapter timeouts are over-budget samples; failed or incomplete requests cannot disappear to improve the percentile. Missing measurements do not become zero latency. An SDK call span alone does not prove how much of its duration can be excluded.

#### Endpoint reachability and request failures

The endpoint-reachability target measures adapter health checks. Correctly forwarding a target quota or permission error is different from producing that error because the adapter sent the wrong request. Adapter-caused failures remain Tensor9's responsibility even when the target is healthy.

Correctness and data-integrity requirements apply to every supported request. Endpoint reachability does not measure request correctness or grant an allowance for incorrect results.

#### Scaling and target-service capacity

Scale on bytes per second, active streams and metadata requests separately. A few large uploads can exhaust memory or egress while request count stays low; listing and multi-delete amplify work per request. Tensor9 scales the adapter within the agreed concurrency, byte-rate, page-size and fan-out limits. The customer sizes the object-store account and checks provider throttling. Multipart completion needs enough headroom for its composition and cleanup work.

Tell Tensor9 the expected steady rate, bursts, concurrency, payload sizes and operation mix. Tensor9 sizes and scales the adapter for the agreed load; you choose and monitor the target service's capacity with Tensor9's help. A latency budget is not a requests-per-second rating. Larger requests and higher rates need explicit terms, not silent inheritance of a small-request SLA.

#### Data and behavior guarantees

A successful write must preserve the accepted bytes and supported metadata; a failed replacement must not be reported as successful. Version IDs, delete markers, conditional requests, ACLs and retention follow this directed profile, not an assumed universal S3 contract. Target storage durability remains the provider's responsibility; Tensor9 is responsible for corrupting, misrouting or prematurely acknowledging a request in its own code.

#### Example and diagnosis

For `GetObject` of `reports/invoice.json`, a 32 KiB body and 2 KiB metadata use the small-object row. A 500 MiB download does not. For a multi-delete of 80 keys, use the multi-delete row and retain every per-key error. If the native object-store wait grows while adapter time remains within target, investigate the target account or network; if XML translation or checksum work grows, investigate the adapter.

Use `tensor9 explain` and the documented explain headers to understand the selected adapter and its behavior. Correlate available request diagnostics with the target provider's latency, throttling and capacity metrics. An explain report helps diagnose a request; it is not by itself a qualified SLA timing measurement. Share the operation, request shape, timestamps and request identifiers with support, with credentials and customer payloads removed.

### S3 to OCI Object Storage

| SLA | Service level | What is covered | Conditions |
| - | - | - | - |
| Small object and metadata requests adapter-added latency | +1 ms monthly p99 | `aws::1.0.0::s3`: `DeleteObject`, `GetObject`, `HeadBucket`, `HeadObject`, `PutObject` | One object; complete request and response bodies each at most 64 KiB, metadata at most 8 KiB. No archive restore or multipart completion. Larger streaming bodies need a byte-rate and completion budget in the agreement. |
| Bounded object copy adapter-added latency | +3 ms monthly p99 | `aws::1.0.0::s3`: `CopyObject` | One source and destination, object at most 64 KiB, metadata at most 8 KiB. Only supported source conditions and ranges are covered. |
| Bounded object and multipart listing adapter-added latency | +3 ms monthly p99 | `aws::1.0.0::s3`: `ListMultipartUploads`, `ListObjects`, `ListObjectsV2`, `ListParts` | One page with at most 1,000 returned entries and 1 MiB of encoded response. No implicit traversal of later pages. |
| Bounded multi-object deletion adapter-added latency | +10 ms monthly p99 | `aws::1.0.0::s3`: `DeleteObjects` | At most 100 keys per request and at most 128 KiB of request and response metadata. Every key retains its individual success or error result. |
| Multipart setup, parts and completion adapter-added latency | +5 ms monthly p99 | `aws::1.0.0::s3`: `AbortMultipartUpload`, `CompleteMultipartUpload`, `CreateMultipartUpload`, `UploadPart` | At most 100 parts at completion; a part request is at most 64 KiB for this latency class. The target's supported multipart limits still apply. Larger parts are covered by a separately agreed streaming budget. |
| Bucket configuration requests adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::s3`: `CreateBucket`, `DeleteBucket` | One bucket; at most 32 KiB configuration and 50 policy or rule entries. Measures the API response, not asynchronous replication, lifecycle transitions or data migration. |
| Documented adapter behavior | Preserve the supported behavior documented for this adapter | `aws::1.0.0::s3`: `DeleteObject`, `GetObject`, `HeadBucket`, `HeadObject`, `PutObject`, `CopyObject`, `ListMultipartUploads`, `ListObjects`, `ListObjectsV2`, `ListParts`, `DeleteObjects`, `AbortMultipartUpload`, `CompleteMultipartUpload`, `CreateMultipartUpload`, `UploadPart`, `CreateBucket`, `DeleteBucket` | A successful write must preserve the accepted bytes and supported metadata; a failed replacement must not be reported as successful. Version IDs, delete markers, conditional requests, ACLs and retention follow this directed profile, not an assumed universal S3 contract. Target storage durability remains the provider's responsibility; Tensor9 is responsible for corrupting, misrouting or prematurely acknowledging a request in its own code. |
| Endpoint reachability | 99.9% per calendar month | Adapter endpoint reachability | The agreed production deployment has healthy target connectivity and receives a valid adapter health probe. This measures the adapter endpoint, not the target provider's service. |
| Adapter autoscaling and limits | Automatic scaling within the workload and deployment limits in your agreement | Adapter behavior across requests | Your agreement states the maximum request rate, burst size, request and response sizes, concurrency, and target calls per request. Tensor9 maintains adapter capacity inside that envelope. Target-service quotas and capacity are separate. |

**Adapter-added latency.** A + prefix marks time added by the adapter, not the total time your application waits. Total request time includes adapter processing, backend service time and network time. The backend provider's SLA applies independently. Only separately measured target-service wait may be subtracted, and only when your agreement permits it; internal metadata, coordination and retry processing still count. For one request, 12 ms of adapter processing plus 90 ms waiting for the backend means at least 102 ms total. This example does not add monthly p99 values.

**What Tensor9 covers.** These service levels cover the adapter between the origin API and target API. They do not replace the target provider's SLA.

**How latency is counted.** Adapter work, including metadata and coordination, counts. Only separately measured permitted target waits are excluded.

**Which terms apply.** Your signed agreement names the covered operations, workload limits, remedies, and final service levels for your deployment.

#### What this adapter does

For `oci::1.0.0::objectstorage`, The S3-compatible target stores and serves object bytes. The adapter still authenticates, selects the bucket binding, handles permitted headers and errors, and applies the profile's versioning and multipart rules. Native API similarity does not waive these responsibilities. The small-object SLA is not a promise to transfer an arbitrarily large object in 1 ms. The body-size condition bounds checksum, encoding and buffering work on both directions.

#### How the latency targets were chosen

**Small object and metadata requests: +1 ms monthly p99 (adapter-added).** `DeleteObject`, `GetObject`, `HeadBucket`, `HeadObject`, `PutObject`. Bounded header translation, identity lookup, and checksum/body handling; target object-store waits are separate. A 1 ms target is an engineering objective, not a measured percentile.

**Bounded object copy: +3 ms monthly p99 (adapter-added).** `CopyObject`. A copy may require source metadata and result translation in addition to the copy request.

**Bounded object and multipart listing: +3 ms monthly p99 (adapter-added).** `ListMultipartUploads`, `ListObjects`, `ListObjectsV2`, `ListParts`. Listing work grows with parsed entries and encoded XML; Azure must reconstruct the S3 listing from Blob XML.

**Bounded multi-object deletion: +10 ms monthly p99 (adapter-added).** `DeleteObjects`. GCS and Azure can fan out into per-key requests; request construction, scheduling, result aggregation and retries count as adapter work.

**Multipart setup, parts and completion: +5 ms monthly p99 (adapter-added).** `AbortMultipartUpload`, `CompleteMultipartUpload`, `CreateMultipartUpload`, `UploadPart`. Multipart identity, part-list validation and target block/part list translation add bounded work.

**Bucket configuration requests: +20 ms monthly p99 (adapter-added).** `CreateBucket`, `DeleteBucket`. Configuration validation and logical bucket/policy state can require adapter-owned storage. Those waits remain fabric time.

Your signed agreement sets the terms for your deployment. A target does not add an operation or option that the compatibility tables mark unavailable.

#### What counts toward latency

For a request-response row, measure from the agreed ingress boundary to dispatch of the complete response. A row that explicitly names a first response chunk ends at that chunk; its number does not cover the rest of the stream. A long-poll row names the intentional wait and when adapter delay starts. Include parsing, authorization, admission, translation, serialization, adapter-owned storage and coordination, retries and response handling. Subtract only separately measured target-workload waits and external network segments allowed by the measurement rules. The adapter's own response handling and dispatch remain covered. A database used for adapter metadata is still adapter work, even if a cloud provider hosts it.

For concurrent calls, exclude the union of permitted wait intervals, not the sum of overlapping spans. Calculate each request's adapter duration first, then the monthly p99. Do not subtract one service's p99 from another's. Known adapter timeouts are over-budget samples; failed or incomplete requests cannot disappear to improve the percentile. Missing measurements do not become zero latency. An SDK call span alone does not prove how much of its duration can be excluded.

#### Endpoint reachability and request failures

The endpoint-reachability target measures adapter health checks. Correctly forwarding a target quota or permission error is different from producing that error because the adapter sent the wrong request. Adapter-caused failures remain Tensor9's responsibility even when the target is healthy.

Correctness and data-integrity requirements apply to every supported request. Endpoint reachability does not measure request correctness or grant an allowance for incorrect results.

#### Scaling and target-service capacity

Scale on bytes per second, active streams and metadata requests separately. A few large uploads can exhaust memory or egress while request count stays low; listing and multi-delete amplify work per request. Tensor9 scales the adapter within the agreed concurrency, byte-rate, page-size and fan-out limits. The customer sizes the object-store account and checks provider throttling. Multipart completion needs enough headroom for its composition and cleanup work.

Tell Tensor9 the expected steady rate, bursts, concurrency, payload sizes and operation mix. Tensor9 sizes and scales the adapter for the agreed load; you choose and monitor the target service's capacity with Tensor9's help. A latency budget is not a requests-per-second rating. Larger requests and higher rates need explicit terms, not silent inheritance of a small-request SLA.

#### Data and behavior guarantees

A successful write must preserve the accepted bytes and supported metadata; a failed replacement must not be reported as successful. Version IDs, delete markers, conditional requests, ACLs and retention follow this directed profile, not an assumed universal S3 contract. Target storage durability remains the provider's responsibility; Tensor9 is responsible for corrupting, misrouting or prematurely acknowledging a request in its own code.

#### Example and diagnosis

For `GetObject` of `reports/invoice.json`, a 32 KiB body and 2 KiB metadata use the small-object row. A 500 MiB download does not. For a multi-delete of 80 keys, use the multi-delete row and retain every per-key error. If the native object-store wait grows while adapter time remains within target, investigate the target account or network; if XML translation or checksum work grows, investigate the adapter.

Use `tensor9 explain` and the documented explain headers to understand the selected adapter and its behavior. Correlate available request diagnostics with the target provider's latency, throttling and capacity metrics. An explain report helps diagnose a request; it is not by itself a qualified SLA timing measurement. Share the operation, request shape, timestamps and request identifiers with support, with credentials and customer payloads removed.

### S3 to Scaleway Object Storage

| SLA | Service level | What is covered | Conditions |
| - | - | - | - |
| Small object and metadata requests adapter-added latency | +1 ms monthly p99 | `aws::1.0.0::s3`: `GetBucketLocation`, `GetObject`, `HeadBucket`, `HeadObject`, `PutObject` | One object; complete request and response bodies each at most 64 KiB, metadata at most 8 KiB. No archive restore or multipart completion. Larger streaming bodies need a byte-rate and completion budget in the agreement. |
| Bounded object copy adapter-added latency | +3 ms monthly p99 | `aws::1.0.0::s3`: `CopyObject`, `UploadPartCopy` | One source and destination, object at most 64 KiB, metadata at most 8 KiB. Only supported source conditions and ranges are covered. |
| Bounded object and multipart listing adapter-added latency | +3 ms monthly p99 | `aws::1.0.0::s3`: `ListObjectVersions`, `ListObjectsV2`, `ListParts` | One page with at most 1,000 returned entries and 1 MiB of encoded response. No implicit traversal of later pages. |
| Bounded multi-object deletion adapter-added latency | +10 ms monthly p99 | `aws::1.0.0::s3`: `DeleteObjects` | At most 100 keys per request and at most 128 KiB of request and response metadata. Every key retains its individual success or error result. |
| Multipart setup, parts and completion adapter-added latency | +5 ms monthly p99 | `aws::1.0.0::s3`: `AbortMultipartUpload`, `CompleteMultipartUpload`, `CreateMultipartUpload`, `UploadPart` | At most 100 parts at completion; a part request is at most 64 KiB for this latency class. The target's supported multipart limits still apply. Larger parts are covered by a separately agreed streaming budget. |
| Bucket configuration requests adapter-added latency | +20 ms monthly p99 | `aws::1.0.0::s3`: `CreateBucket`, `DeleteBucket` | One bucket; at most 32 KiB configuration and 50 policy or rule entries. Measures the API response, not asynchronous replication, lifecycle transitions or data migration. |
| Documented adapter behavior | Preserve the supported behavior documented for this adapter | `aws::1.0.0::s3`: `GetBucketLocation`, `GetObject`, `HeadBucket`, `HeadObject`, `PutObject`, `CopyObject`, `UploadPartCopy`, `ListObjectVersions`, `ListObjectsV2`, `ListParts`, `DeleteObjects`, `AbortMultipartUpload`, `CompleteMultipartUpload`, `CreateMultipartUpload`, `UploadPart`, `CreateBucket`, `DeleteBucket` | A successful write must preserve the accepted bytes and supported metadata; a failed replacement must not be reported as successful. Version IDs, delete markers, conditional requests, ACLs and retention follow this directed profile, not an assumed universal S3 contract. Target storage durability remains the provider's responsibility; Tensor9 is responsible for corrupting, misrouting or prematurely acknowledging a request in its own code. |
| Endpoint reachability | 99.9% per calendar month | Adapter endpoint reachability | The agreed production deployment has healthy target connectivity and receives a valid adapter health probe. This measures the adapter endpoint, not the target provider's service. |
| Adapter autoscaling and limits | Automatic scaling within the workload and deployment limits in your agreement | Adapter behavior across requests | Your agreement states the maximum request rate, burst size, request and response sizes, concurrency, and target calls per request. Tensor9 maintains adapter capacity inside that envelope. Target-service quotas and capacity are separate. |

**Adapter-added latency.** A + prefix marks time added by the adapter, not the total time your application waits. Total request time includes adapter processing, backend service time and network time. The backend provider's SLA applies independently. Only separately measured target-service wait may be subtracted, and only when your agreement permits it; internal metadata, coordination and retry processing still count. For one request, 12 ms of adapter processing plus 90 ms waiting for the backend means at least 102 ms total. This example does not add monthly p99 values.

**What Tensor9 covers.** These service levels cover the adapter between the origin API and target API. They do not replace the target provider's SLA.

**How latency is counted.** Adapter work, including metadata and coordination, counts. Only separately measured permitted target waits are excluded.

**Which terms apply.** Your signed agreement names the covered operations, workload limits, remedies, and final service levels for your deployment.

#### What this adapter does

For `scaleway::1.0.0::object-storage`, The S3-compatible target stores and serves object bytes. The adapter still authenticates, selects the bucket binding, handles permitted headers and errors, and applies the profile's versioning and multipart rules. Native API similarity does not waive these responsibilities. The small-object SLA is not a promise to transfer an arbitrarily large object in 1 ms. The body-size condition bounds checksum, encoding and buffering work on both directions.

#### How the latency targets were chosen

**Small object and metadata requests: +1 ms monthly p99 (adapter-added).** `GetBucketLocation`, `GetObject`, `HeadBucket`, `HeadObject`, `PutObject`. Bounded header translation, identity lookup, and checksum/body handling; target object-store waits are separate. A 1 ms target is an engineering objective, not a measured percentile.

**Bounded object copy: +3 ms monthly p99 (adapter-added).** `CopyObject`, `UploadPartCopy`. A copy may require source metadata and result translation in addition to the copy request.

**Bounded object and multipart listing: +3 ms monthly p99 (adapter-added).** `ListObjectVersions`, `ListObjectsV2`, `ListParts`. Listing work grows with parsed entries and encoded XML; Azure must reconstruct the S3 listing from Blob XML.

**Bounded multi-object deletion: +10 ms monthly p99 (adapter-added).** `DeleteObjects`. GCS and Azure can fan out into per-key requests; request construction, scheduling, result aggregation and retries count as adapter work.

**Multipart setup, parts and completion: +5 ms monthly p99 (adapter-added).** `AbortMultipartUpload`, `CompleteMultipartUpload`, `CreateMultipartUpload`, `UploadPart`. Multipart identity, part-list validation and target block/part list translation add bounded work.

**Bucket configuration requests: +20 ms monthly p99 (adapter-added).** `CreateBucket`, `DeleteBucket`. Configuration validation and logical bucket/policy state can require adapter-owned storage. Those waits remain fabric time.

Your signed agreement sets the terms for your deployment. A target does not add an operation or option that the compatibility tables mark unavailable.

#### What counts toward latency

For a request-response row, measure from the agreed ingress boundary to dispatch of the complete response. A row that explicitly names a first response chunk ends at that chunk; its number does not cover the rest of the stream. A long-poll row names the intentional wait and when adapter delay starts. Include parsing, authorization, admission, translation, serialization, adapter-owned storage and coordination, retries and response handling. Subtract only separately measured target-workload waits and external network segments allowed by the measurement rules. The adapter's own response handling and dispatch remain covered. A database used for adapter metadata is still adapter work, even if a cloud provider hosts it.

For concurrent calls, exclude the union of permitted wait intervals, not the sum of overlapping spans. Calculate each request's adapter duration first, then the monthly p99. Do not subtract one service's p99 from another's. Known adapter timeouts are over-budget samples; failed or incomplete requests cannot disappear to improve the percentile. Missing measurements do not become zero latency. An SDK call span alone does not prove how much of its duration can be excluded.

#### Endpoint reachability and request failures

The endpoint-reachability target measures adapter health checks. Correctly forwarding a target quota or permission error is different from producing that error because the adapter sent the wrong request. Adapter-caused failures remain Tensor9's responsibility even when the target is healthy.

Correctness and data-integrity requirements apply to every supported request. Endpoint reachability does not measure request correctness or grant an allowance for incorrect results.

#### Scaling and target-service capacity

Scale on bytes per second, active streams and metadata requests separately. A few large uploads can exhaust memory or egress while request count stays low; listing and multi-delete amplify work per request. Tensor9 scales the adapter within the agreed concurrency, byte-rate, page-size and fan-out limits. The customer sizes the object-store account and checks provider throttling. Multipart completion needs enough headroom for its composition and cleanup work.

Tell Tensor9 the expected steady rate, bursts, concurrency, payload sizes and operation mix. Tensor9 sizes and scales the adapter for the agreed load; you choose and monitor the target service's capacity with Tensor9's help. A latency budget is not a requests-per-second rating. Larger requests and higher rates need explicit terms, not silent inheritance of a small-request SLA.

#### Data and behavior guarantees

A successful write must preserve the accepted bytes and supported metadata; a failed replacement must not be reported as successful. Version IDs, delete markers, conditional requests, ACLs and retention follow this directed profile, not an assumed universal S3 contract. Target storage durability remains the provider's responsibility; Tensor9 is responsible for corrupting, misrouting or prematurely acknowledging a request in its own code.

#### Example and diagnosis

For `GetObject` of `reports/invoice.json`, a 32 KiB body and 2 KiB metadata use the small-object row. A 500 MiB download does not. For a multi-delete of 80 keys, use the multi-delete row and retain every per-key error. If the native object-store wait grows while adapter time remains within target, investigate the target account or network; if XML translation or checksum work grows, investigate the adapter.

Use `tensor9 explain` and the documented explain headers to understand the selected adapter and its behavior. Correlate available request diagnostics with the target provider's latency, throttling and capacity metrics. An explain report helps diagnose a request; it is not by itself a qualified SLA timing measurement. Share the operation, request shape, timestamps and request identifiers with support, with credentials and customer payloads removed.

## Install and run

The documentation and SLAs are public. Downloading and running the Cloud Adapter binary requires an entitled customer account. Set `T9_API_KEY` as described in [Install and Authenticate](https://docs.tensor9.com/cloud-adapter-early-access/getting-started/install-and-authenticate.md), then list the adapters your account may use with this origin:

```sh theme={null}
tensor9 adapt svc list \
  -origin aws::1.0.0::s3
```

The result is limited to directed mappings for this origin that your account is entitled to use. Use a returned backend identifier when configuring the adapter or investigating a request.

## Material evaluation limit

Presigned URLs and browser-based uploads require direction-specific validation before migration.

Treat this as an evaluation warning, not a complete compatibility contract. Confirm the exact behavior for your entitled direction before migration.

Request binary access from [hello@tensor9.com](mailto:hello@tensor9.com) if your account does not yet include this direction.

## Existing data and credentials

Selecting a backend does not copy existing data, credentials or access policies. Plan and verify migration separately before changing an application's endpoint. Do not assume an identifier, credential or encrypted value from the origin service works unchanged on the target.

## Configure, tune and debug

Start with [setup](https://docs.tensor9.com/cloud-adapter-early-access/getting-started/overview.md) and [configuration](https://docs.tensor9.com/cloud-adapter-early-access/configuration/overview.md). Use [tuning](https://docs.tensor9.com/cloud-adapter-early-access/tuning/overview.md) to understand supported request tags, [debugging](https://docs.tensor9.com/cloud-adapter-early-access/debugging/overview.md) to investigate a request, and [High Fidelity Cloud Emulators](https://docs.tensor9.com/cloud-adapter-early-access/local-testing/overview.md) to validate a bounded reproduction.

For requests that go through an entitled service adapter, use [tensor9 explain](https://docs.tensor9.com/cloud-adapter-early-access/debugging/explain.md) and [x-t9-explain](https://docs.tensor9.com/cloud-adapter-early-access/debugging/response-headers.md) to inspect the selected mapping.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.