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 Vercel Blob
Both PutPut and Vercel Blob use Cloudflare R2 for storage. The difference: Vercel adds platform lock-in and a $0.15/GB egress markup. PutPut gives you the same storage without the Vercel tax.
| Feature | PutPut | Vercel Blob |
|---|---|---|
| Platform requirement | Any platform | Vercel only |
| Egress fees | $0 | $0.15/GB after 1 GB/mo |
| Storage pricing | Free (10 GB) | $0.03/GB after 250 MB |
| Max file size | 100 MB (free tier) | 500 MB (Pro) |
| Framework lock-in | None (plain HTTP) | Next.js / Vercel Functions |
| Signup required | No | Yes (Vercel account) |
| AI-friendly docs | docs.putput.io | No |
| Guest tokens (no auth) | Yes | No |
| Direct-to-storage uploads | Yes (R2 presigned) | Yes (client uploads) |
| Self-hostable | Yes (Cloudflare) | No |
Code comparison
// Works anywhere — no platform lock-in
const tok = await fetch('/api/v1/auth/guest',
{ method: 'POST' }).then(r => r.json());
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());// Requires Vercel deployment + @vercel/blob
// 1. Server action (Next.js only)
'use server';
import { put } from '@vercel/blob';
export async function upload(
formData: FormData
) {
const file = formData.get('file') as File;
const blob = await put(
file.name,
file,
{ access: 'public' }
);
// blob.url — served via Vercel's CDN
// egress: $0.15/GB after 1 GB/mo free
return blob;
}
// 2. Client component
'use client';
async function handleUpload(file: File) {
const form = new FormData();
form.append('file', file);
const blob = await upload(form);
}Frequently asked questions
Does Vercel Blob work outside Vercel?
No. The @vercel/blob SDK requires Vercel serverless functions and a BLOB_READ_WRITE_TOKEN tied to your Vercel project. You cannot use it on AWS, Cloudflare, or a VPS. PutPut works anywhere you can make an HTTP request.
Why does Vercel charge for egress?
Vercel Blob stores files on Cloudflare R2 (which has zero egress fees) but routes reads through Vercel's edge network, adding a $0.15/GB markup. PutPut serves files directly from R2, so egress is always $0.
Can I migrate from Vercel Blob to PutPut?
Yes. Download your files from Vercel Blob, then re-upload them to PutPut using the presigned upload API. No SDK swap needed — PutPut is plain HTTP.
How does PutPut pricing compare at scale?
At 100 GB of monthly downloads, Vercel Blob costs ~$14.85 in egress alone. PutPut egress is $0. Both use R2 for storage, so the underlying cost is the same — Vercel just adds a markup.
No signup required. No credit card.