File Upload API

A File Upload API That Hands Back a Direct Link

Upload a file, get a direct link. A REST API with presigned PUT, permanent CDN URLs, and expiring signed links — no SDK.

A file upload API should do one thing well: take bytes and give back a link you can use immediately. That is the whole flow here, and it is three REST calls with no SDK to install. Unlike a free anonymous pastebin, files.link is predictable paid storage — you authenticate with an API key, files persist until you delete them, and every public file is served over a global CDN — so it fits a product you are actually shipping rather than a throwaway drop.

Step one, POST /v1/files/{folderId} with the file's metadata, returns { success, urls: [{ url, id }] } — a presigned PUT URL and a file id. Step two, PUT the raw bytes straight to that url; they never stream through your API process, which matters when a user uploads a 200 MB file. Step three, POST /v1/files/confirm-upload with { ids: [id] } finalizes it, and the file is live at a permanent CDN URL worldwide.

The Authorization header is your raw API key — no Bearer prefix, no request signing. A Node.js backend tying the three calls together:

js
// Node 18+: three calls, no SDK. FL_KEY is your raw API key.
const api = 'https://api.files.link/v1';
async function uploadFile(bytes, name) {
  const step1 = await fetch(`${api}/files/${FOLDER_ID}`, {
    method: 'POST',
    headers: { Authorization: FL_KEY, 'Content-Type': 'application/json' },
    body: JSON.stringify({ filesMetadata: [{ name }] }),
  }).then((r) => r.json());
  const { url, id } = step1.urls[0];
  await fetch(url, { method: 'PUT', body: bytes });          // straight to storage
  await fetch(`${api}/files/confirm-upload`, {
    method: 'POST',
    headers: { Authorization: FL_KEY, 'Content-Type': 'application/json' },
    body: JSON.stringify({ ids: [id] }),
  });
  return id;                                                 // now has a CDN URL
}

For a React or browser upload, keep the two key-bearing calls on your backend and expose only the presigned PUT to the client, so a large file skips your server entirely and your API key never reaches the browser:

jsx
// your backend returns { url, id } from step 1; the browser does only the PUT
async function upload(file, presignedUrl) {
  await fetch(presignedUrl, {
    method: 'PUT',
    headers: { 'Content-Type': file.type },
    body: file,
  });
}

Temporary and private where you need it: send private: true with the metadata and no public URL is minted; when an authorized user asks for the file, your backend mints a signed URL that expires in ten minutes, so the links you hand out are short-lived rather than permanent. Public files instead get a stable direct URL served from 450+ edge locations — the same URL works in an <img> tag, a download button, or a webhook payload.

On limits and price, be clear-eyed: this is prepaid credits, not a free tier. Storage, CDN delivery, and API requests all draw from one balance, auto-recharge keeps you topped up, and you control retention by deleting files you no longer need. Compared with file.io's delete-after-download drops or TempFile.org's anonymous free hosting, files.link trades throwaway anonymity for a predictable, key-authenticated API you can build a product on — direct links, CDN delivery, and signed private access included.

Building the frontend or a specific stack? See the Node.js, React, and Next.js guides.

Came here looking for a file uploader or a file upload widget? Set expectations first: files.link is the upload API and the storage behind it, not a drop-in widget. There is no script tag to embed and no vendor component in your bundle — you build the uploader UI yourself (a native <input type="file">, a dropzone, or your framework's form handling) and point it at the three calls above.

What you get underneath is the part a widget usually wraps: direct file links that stay valid until you delete the file, and CDN-backed uploads live at 450+ edge locations the moment confirm-upload returns. If you are weighing that against a widget-plus-transformations product, the trade is spelled out in the Uploadcare alternative and Filestack alternative comparisons.

Benefits With No Complexity

Global CDN delivery

Your files are served from 450+ edge locations worldwide.

Edge-cached worldwide

Files are cached close to your users for fast delivery.

Signed-URL security

Private files stay protected with time-limited access.

What You Get

Unlimited files

Upload as many files as you need.

Unlimited storage

There is no storage limit.

Public + Private storage

Private files are fully secured.

CDN ready links

Upload directly to 450+ edge locations worldwide.

Prepaid credits

No subscription. Pay only for the storage and bandwidth you use.

More coming soon

We have plenty of features coming!

How files.link Works

1. Upload

Create a project and upload your first file.

2. Copy

Copy the CDN link.

3. Use Anywhere

Paste and enjoy the blazing speed.

Why Developers Choose files.link

A Better Way to Store & Deliver Files

file.ioTempFile.orgFilestackfiles.link
3-call REST upload, no SDK required
Presigned PUT keeps bytes off your server
Permanent direct CDN URL
Private files with expiring signed URLs
Predictable paid storage (not one-off/anonymous)
No per-transformation or per-request tier fees

Calculate Your Needs

Storage

0GB

Egress

0GB

CDN Bandwidth

0GB
Total: $0.000/month

Start Using the File Upload API

  • Global CDN delivery
  • Edge-cached worldwide
  • Signed-URL security
  • Unlimited files
  • Unlimited storage
  • Public + Private storage
  • No subscription — prepaid credits keep spend predictable
Start Using the File Upload API

Frequently Asked Questions

What are the exact API calls to upload a file and get a link?
Three: POST /v1/files/{folderId} with the file metadata returns { urls: [{ url, id }] } (a presigned PUT URL and id); PUT the raw bytes to that url; POST /v1/files/confirm-upload with { ids: [id] }. After confirm, the file's permanent CDN URL is live.
Is this a free anonymous file host like file.io?
No. files.link is predictable paid storage on prepaid credits, authenticated with an API key. Files persist until you delete them and public files are served over a global CDN — it is built for products you ship, not one-off anonymous drops.
Can I make upload links temporary or private?
Yes. Upload with private: true and no public URL is created; your backend then mints a signed URL that expires in ten minutes for each authorized request. Public files get a stable direct CDN URL instead.
Can I upload directly from the browser?
Yes — mint the presigned PUT URL on your backend so the API key stays secret, return it to the client, and have the browser PUT the file straight to that URL. The large payload never passes through your API server.
Is there a file uploader or file upload widget I can drop in?
No. files.link ships no upload widget or file picker component — you build the uploader UI against the REST API and keep full control of styling, sources, and UX with nothing third-party in your bundle. If a drop-in widget is the requirement, see the Uploadcare alternative and Filestack alternative comparisons for what you would be trading away.
General Questions
Is there a subscription?
No. files.link uses prepaid credits, so storage, bandwidth, and API usage are deducted from your balance as you go. The app explains the payment step before uploads are enabled — no monthly subscription and no per-user fees.
What is files.link?
files.link is a developer-first file platform that makes it simple to store, secure, and deliver files globally. It provides signed URLs, public/private access, and an API-first design so you can integrate file delivery into any app without the usual complexity.
How does billing work?
files.link uses prepaid credits. As you use storage, bandwidth, and API requests, credits are deducted daily. When your balance runs low, we automatically recharge it using your saved card. If an auto-recharge doesn't go through, your files and links stay put — you simply update your payment method or top up manually to keep going. No monthly subscriptions — just simple usage-based pricing.
How secure is my data?
All files are encrypted at rest and in transit. You can use signed URLs for private files, control access with permissions, and rely on enterprise-grade infrastructure for data protection.

Related

files.link
Copyright © 2026
All rights reserved
ContactGuidesGlossaryStatusLegal