Node.js Cloud Storage API
Add File Storage to Express, Fastify, or Nest in Three HTTP Calls
S3-compatible file storage for Node.js applications with global CDN delivery and easy integration.
Picking cloud storage for Node.js, a backend almost always reaches the same file-storage fork: install the AWS SDK and take on IAM users, bucket policies, a separate CDN distribution, and SDK version churn — or find something that's just HTTP. files.link is the HTTP path. Your server handles the incoming multipart upload with whatever it already uses (multer for Express, @fastify/multipart for Fastify, the built-in interceptor for Nest), then forwards the bytes to files.link with three fetch calls and stores the returned CDN URL.
The flow, concretely: call POST /v1/files/{folderId} with the filename to get back { success, urls: [{ url, id }] }; PUT the file buffer to that presigned url; then POST /v1/files/confirm-upload with { ids: [id] } to publish. The auth header is your raw API key — no Bearer prefix, no signing algorithm, no STS dance. In Express that looks like: const r = await fetch(\https://api.files.link/v1/files/${folderId}\, { method: 'POST', headers: { Authorization: apiKey, 'Content-Type': 'application/json' }, body: JSON.stringify({ files: [{ name: req.file.originalname }] }) }); const { urls } = await r.json(); await fetch(urls[0].url, { method: 'PUT', body: req.file.buffer }); await fetch('https://api.files.link/v1/files/confirm-upload', { method: 'POST', headers: { Authorization: apiKey, 'Content-Type': 'application/json' }, body: JSON.stringify({ ids: [urls[0].id] }) }); then save urls[0] against your record.
The same three calls work unchanged in Fastify, Nest, a Bull/BullMQ worker, or a Lambda — there's no SDK to initialize and no connection pool to keep warm, which is exactly what you want in a stateless serverless function where cold-start SDK init and credential resolution cost real milliseconds. Compared to aws-sdk you drop a dependency tree and the entire IAM surface; compared to Vercel Blob you aren't tied to one host's platform; compared to writing uploads to local disk (which evaporates on container restart and doesn't survive horizontal scaling) you get durable storage with a global CDN URL out of the box.
Files you don't want public — user documents, private exports — are stored as private files, and your route mints an expiring signed URL only after it checks the requester's permissions. Billing is prepaid credits, so a side project and a production API draw from the same model without a tier negotiation. Building the frontend too? Pair this with the React and Next.js guides linked below.
Benefits With No Complexity
Global CDN delivery
Edge-cached worldwide
Signed-URL security
What You Get
Unlimited files
Unlimited storage
Public + Private storage
CDN ready links
Prepaid credits
More coming soon
How files.link Works
1. Upload
2. Copy
3. Use Anywhere
Why Developers Choose files.link
A Better Way to Store & Deliver Files
| AWS S3 (aws-sdk) | Vercel Blob | Multer + local disk | files.link | |
|---|---|---|---|---|
| No SDK dependency (just fetch) | ||||
| No IAM / credential signing | ||||
| Built-in global CDN | ||||
| Durable across restarts & scaling | ||||
| Works in any Node framework & serverless | ||||
| Prepaid credits billing |
Calculate Your Needs
Storage
Egress
CDN Bandwidth
Start Storing Files with Node.js
- Global CDN delivery
- Edge-cached worldwide
- Signed-URL security
- Unlimited files
- Unlimited storage
- Public + Private storage
- No subscription — prepaid credits keep spend predictable