
S3 object storage is a service that keeps data as objects, each named by a key inside a bucket and reached over HTTP. Amazon launched it in 2006, and dozens of other providers copy its API. This guide covers how it works, how the S3 API behaves, and what "S3-compatible" means for you.
TL;DR:
PUT to write, GET to read, DELETE to remove), and the request carries a signature made from your access keys.Amazon Simple Storage Service, or S3, is the AWS service behind the name, which AWS describes as "an object storage service that offers industry-leading scalability, data availability, security, and performance." It launched on March 14, 2006, as the first generally available AWS service, and today it stores more than 500 trillion objects, according to AWS's 20th-anniversary retrospective.
"S3 object storage" now means two things, the AWS service and the model and API that other providers copy. When you read about an "S3 bucket" on a non-AWS provider, the second meaning applies.
AWS lists the use cases as data lakes, websites, mobile applications, backup and restore, archive, enterprise applications, IoT devices, and big data analytics.
AWS puts the model plainly: "An object is a file and any metadata that describes the file. A bucket is a container for objects." Every object has a key, which is a unique name inside its bucket, and AWS describes S3 as "a basic data map between 'bucket + key + version' and the object itself."
A few details about buckets, keys, and metadata matter in practice when you design around them:
photos/2026/puppy.jpg looks like a file path, but the storage underneath is flat. Tools that show folders are splitting the key on its slashes for display.Content-Type. You can add your own at upload time.The flat design is a deliberate simplification: a client asks for an object by bucket and key and gets back bytes and metadata, without reasoning about directory permissions or symlinks. That is a big reason the API is so easy to implement. Naming data by bucket and key is location addressing, the opposite of content addressing in IPFS, where a hash of the data is its name.
The S3 API is a REST interface over HTTP, and AWS says you can use "any toolkit that supports HTTP" to send standard requests "to create, fetch, and delete buckets and objects." Three things decide how a request looks: the method, the address, and the signature.
The method says what to do: PUT uploads an object, GET downloads it, and DELETE removes it, while a GET on a bucket lists its objects.
The address says where, and AWS supports two URL styles. In virtual-hosted style the bucket is part of the hostname: https://amzn-s3-demo-bucket1.s3.us-west-2.amazonaws.com/puppy.jpg. In path style the bucket comes first in the path: https://s3.us-west-2.amazonaws.com/amzn-s3-demo-bucket1/puppy.jpg. AWS supports both and has said path style will be discontinued in the future, though it delayed that plan in 2020.
The signature says who you are, since every interaction is either authenticated or anonymous. With an AWS SDK, the library computes the signature from the keys you give it. If you send raw REST calls, AWS says you "must write the code to compute the signature and add it to the request."
You can see all three parts in one request, and this table lists the calls that AIOZ's own Postman documentation shows, all in path style and all sent to the Host s3.aiozstorage.network:
| What you do | HTTP request |
|---|---|
| List buckets | GET / |
| List objects | GET /bucket-name |
| Upload an object | PUT /bucket-name/object-name |
| Download an object | GET /bucket-name/object-name |
| Delete an object | DELETE /bucket-name/object-name |
| Delete several objects | POST /?delete |
| Copy an object | PUT /dest-bucket-name/dest-object-name with an x-amz-copy-source header |

Most people never write these requests by hand, because an SDK builds them for you. Here is the same upload in Python with boto3, set up the way AIOZ's Python guide sets it up, plus two checksum settings:
import boto3
from botocore.config import Config
s3 = boto3.client(
"s3",
region_name="us-east-1",
aws_access_key_id="YOUR_ACCESS_KEY_ID",
aws_secret_access_key="YOUR_SECRET_ACCESS_KEY",
endpoint_url="https://s3.aiozstorage.network",
config=Config(
request_checksum_calculation="when_required",
response_checksum_validation="when_required",
s3={"addressing_style": "path"},
),
)
with open("puppy.jpg", "rb") as f:
s3.put_object(Bucket="my-bucket", Key="photos/puppy.jpg", Body=f)We checked what this call builds without sending it. boto3 produces PUT https://s3.aiozstorage.network/my-bucket/photos/puppy.jpg and signs it with an Authorization header that starts with AWS4-HMAC-SHA256. That is AWS Signature Version 4, the same scheme S3 itself uses.
The two when_required settings are there because AIOZ Storage needs a Content-Length header on uploads. Since 1.36.0, boto3 otherwise sends uploads chunked without one (see AWS's data integrity settings and the botocore Config reference). Path-style URLs are required too, because bucket subdomains don't resolve. We confirmed both on Oct 19, 2026; a full upload with real keys is not tested yet.
Two behaviors from AWS's docs shape how you use the API: a single PUT can upload an object up to 5 GB, and larger objects need multipart upload. AWS documents multipart upload for objects from 5 MB to 50 TB, with parts sent in any order and in parallel.
On consistency, AWS says S3 provides "strong read-after-write consistency for PUT and DELETE requests" in all regions. If a PUT succeeds, the next GET or LIST returns the new data. Writes to a single key are atomic, so a reader gets the old object or the new one, never half of each.
S3 does not lock an object for concurrent writers: if two PUT requests hit the same key, the latest timestamp wins. Updates are also per key, so you cannot make one key's update depend on another's without building that into your application.
The three models fit three jobs, and AWS's own comparison draws the lines clearly:
| Model | How data is stored | Best for |
|---|---|---|
| Object | Whole objects with metadata, found by key | Large amounts of unstructured data: backups, media, datasets |
| Block | Equal-sized blocks | Low-latency access, such as a database disk or a VM boot volume |
| File | A hierarchy of directories and folders | Shared access to one file tree over SMB or NFS |
None of them is strictly better, because object storage gives up a real directory tree and block-level speed in return for durability, near-unlimited scale, and a simple HTTP API. That trade suits data you write once and read many times, and it does not suit a database that needs millisecond reads.
S3 is not one price tier, because AWS offers classes built around access patterns. S3 Standard is for frequent access, and S3 Standard-IA and One Zone-IA are for infrequent access, while three Glacier classes cover archives. S3 Intelligent-Tiering moves data between tiers as your access pattern changes, and S3 Express One Zone targets single-digit millisecond latency.
If you want the trade-offs, our guide to hot vs cold storage tiers covers when each tier makes sense.
It means a provider accepts the same REST requests, so software written for Amazon S3 works against it. That includes an SDK, a CLI, or a script that calls PutObject and GetObject. Usually you change only the endpoint URL and the credentials.
The claim is real, but it is rarely a perfect match. Most providers implement the common operations faithfully: put, get, list, delete, and metadata. They differ on AWS extras such as S3 Object Lambda or S3 Tables, so before you build on an edge case, test it against the provider you plan to use.
A short checklist helps you test a provider before you commit to it:
AIOZ Storage is an S3-compatible object store that uses the same bucket, key, and object model and the same REST API described above. The difference is where the data lives: on AIOZ DePIN, a decentralized network of independently operated nodes, instead of a company-owned data center fleet.
What you need to connect is short, and it comes down to four settings:
https://s3.aiozstorage.network. The AWS CLI uses it through --endpoint-url.addressing_style set to path in Python and forcePathStyle: true in JavaScript.s3 and region us-east-1.For where AIOZ behavior differs from AWS, see the S3 compatibility page in AIOZ's docs and our guide to how AIOZ Storage works and how S3-compatible it is. If you want to try it, the CLI quickstart takes a few minutes.
What is S3 object storage in simple terms?
It is a service where you store data as objects, each identified by a key inside a bucket, and reach it over HTTP. You upload with PUT, download with GET, and delete with DELETE.
What is the difference between an object, a bucket, and a key?
A bucket is a container for objects, an object is your data plus its metadata, and a key is the object's unique name inside its bucket.
Does S3 have real folders?
No. Keys can contain slashes and look like paths, but the storage is flat, and tools that show folders just split the key string for display.
How does the S3 API authenticate you?
Each request is either anonymous or signed. With an SDK, the library computes the signature from your access key and secret key, and with raw REST calls you compute it yourself.
What is the largest file you can upload to S3?
A single PUT handles up to 5 GB, and for larger files you use multipart upload, which AWS documents for objects from 5 MB to 50 TB.
How is object storage different from block storage?
Block storage splits data into fixed-size blocks for fast, low-latency access, as in a database disk. Object storage keeps whole objects with metadata and is built for scale and durability.
What does S3-compatible mean?
The provider accepts the same REST requests as Amazon S3, so existing S3 tools and code work with a different endpoint and credentials.
Is AIOZ Storage compatible with Amazon S3?
Yes. You reach it with the same SDKs and CLI tools, pointed at https://s3.aiozstorage.network, and AIOZ's guides use path-style requests, so set that in your client.

Distributed storage keeps data on many independent nodes that act as one system. See how it works, replication vs erasure coding, its types and trade-offs.

Egress fees are charges for data leaving a storage provider's network. See what triggers them, how to estimate them, and what AIOZ Storage's docs say.

An object storage vector database keeps vectors in the storage layer, not a cluster. See how it differs, when to pick it, and where AIOZ Storage fits in.

AIOZ Storage vector database pricing line by line: upload, storage, queries, data searched and data returned, with a worked monthly example you can reuse.

Create a bucket and upload a file on AIOZ Storage in five steps: sign up, set a passphrase, add credits, and upload. Plus what the passphrase cannot recover.

The AIOZ Storage rate limit is 100 requests per second. See what the docs do and don't say, and how to stay under it with boto3 retries and a limiter.