Skip to content

PutPut vs the Alternatives

Developers waste hours evaluating file upload services. We did the work for you. Each comparison breaks down pricing, setup time, lock-in, and what actually matters when you just need to upload a file and get a URL.

PutPut vs Amazon S3

S3 is the industry standard for object storage, but it was built for infrastructure engineers, not developers who just need file uploads. PutPut gives you the same presigned upload flow with zero config.

FeaturePutPutAmazon S3
Signup required No Yes (AWS account)
Setup time< 1 minute15-30 minutes
Lines of code~10 lines~50 lines
SDK needed No (plain HTTP) Yes (aws-sdk)
Presigned uploads Built-inManual setup
Egress fees $0$0.09/GB
CORS config Automatic Manual XML policy
IAM / permissionsToken-basedIAM policies
CDN included Yes CloudFront extra
AI-friendly docs docs.putput.io No

Code comparison

PutPut
// Get a token (no signup)
const tok = await fetch('/api/v1/auth/guest',
  { method: 'POST' }).then(r => r.json());

// Upload a file
const pre = await fetch('/api/v1/upload/presign',
  { method: 'POST',
    headers: { Authorization: `Bearer ${tok.token}` },
    body: JSON.stringify({ filename: 'photo.jpg',
      content_type: 'image/jpeg' }) }
).then(r => r.json());

await fetch(pre.upload_url,
  { method: 'PUT', body: file });

const result = await fetch('/api/v1/upload/confirm',
  { method: 'POST',
    headers: { Authorization: `Bearer ${tok.token}` },
    body: JSON.stringify({ upload_id: pre.upload_id }) }
).then(r => r.json());
Amazon S3
// Install aws-sdk, configure IAM
import { S3Client,
  PutObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl }
  from '@aws-sdk/s3-request-presigner';

const s3 = new S3Client({
  region: 'us-east-1',
  credentials: {
    accessKeyId: process.env.AWS_KEY!,
    secretAccessKey: process.env.AWS_SECRET!,
  }
});

const cmd = new PutObjectCommand({
  Bucket: 'my-bucket',
  Key: 'photo.jpg',
  ContentType: 'image/jpeg',
});

const url = await getSignedUrl(s3, cmd,
  { expiresIn: 3600 });

await fetch(url,
  { method: 'PUT', body: file });

Frequently asked questions

What's the difference between PutPut and Amazon S3?

PutPut is a managed file upload API built on top of Cloudflare R2. Unlike S3, PutPut requires no signup, no IAM configuration, and no SDK — just plain HTTP calls. Egress is $0 on every plan.

Does PutPut have egress fees?

No. PutPut uses Cloudflare R2 which has zero egress fees. S3 charges $0.09/GB for data transfer out.

Is PutPut free?

Yes. PutPut has a free tier with 10 GB storage, 100 MB max file size, unlimited files, and $0 egress. No credit card required.

Do I need an AWS account to use PutPut?

No. PutPut gives you an API token with a single POST request. No AWS account, no IAM roles, no bucket configuration needed.

Can I migrate from S3 to PutPut?

Yes. PutPut uses standard presigned URL uploads, so migration is straightforward. Replace your S3 presign logic with PutPut's presign endpoint.

Get started for free

No signup required. No credit card.

v0.4.77