Make one real URL before you keep reading

Upload a file up to 10 MB. The public URL works immediately, with no password or credit card. Executable files require email verification.

Best file.io Alternative in 2026: 5 Services Compared

· · 8 min read

file.io is convenient for one-off transfers, but its defaults are easy to mistake for permanent hosting. Check expiration and auto-delete behavior before you put a returned URL into an application or automation.

If the URL goes to another system

For an automation, the important test is not whether the upload succeeds once. It is whether the next node can fetch the URL later.

Upload → capture the URL → save or send it downstream → fetch it again.

Use file.io for intentional expiry. Use FilePost when the URL is an application record, a hosted asset, or a durable automation output.

file.io at a Glance: Defaults and Limits

Setting Default / Limit
Default expiration 14 days (free tier)
Default auto-delete behavior File is deleted after 1 successful download
Max file size (free) 2 GB per file
Max file size (paid) 10 GB Basic; 100 GB Premium
Upload endpoint POST https://file.io/
Body format multipart/form-data with file field
Authentication Anonymous (optional API key for paid plans)
Paid plans start at $25/month

file.io Default Expiration: 14 Days on the Free Sharing Path

On file.io's free sharing path, the default expiration is commonly documented as 14 days. The current API still exposes expires, maxDownloads, and autoDelete, and the current free plan says files are auto-deleted after one download. Treat both settings as part of the link's contract, not as storage you can assume will remain available. See file.io's API reference and current plans.

In practice, there are two ways a file gets removed from file.io:

If you want the file to stay available until the expiration window ends (and not disappear after the first download), set autoDelete=false when uploading:

curl -F "file=@report.pdf" "https://file.io?expires=1w&autoDelete=false"

Paid file.io plans now advertise a different model: Basic is $25/month with optional auto-delete and 2 TB of permanent storage, while Premium is $99/month with 3 TB. That is separate from the anonymous/free sharing path. If you need a simple account-owned API with durable public URLs and predictable upload-count plans, FilePost is the narrower alternative.

file.io File Size Limits by Plan

file.io allows large individual files, which is one of its main selling points. The per-file maximum depends on your plan:

Note that the per-file size is only one constraint. Free-tier uploads are also rate-limited, and daily bandwidth caps apply on every tier. If you are doing automated uploads at scale, the rate limits tend to bite before the file size limit does.

file.io Upload API: Endpoint and curl Example

The file.io upload endpoint is a single POST:

# Basic upload - uses all defaults (14-day expiry, auto-delete after 1 download)
curl -F "file=@report.pdf" https://file.io

# With custom expiration and no auto-delete
curl -F "file=@report.pdf" "https://file.io?expires=7d&autoDelete=false&maxDownloads=10"

A successful response looks like:

{
  "success": true,
  "status": 200,
  "id": "abc123",
  "key": "abc123",
  "name": "report.pdf",
  "link": "https://file.io/abc123",
  "expires": "2026-05-07T10:32:14.123Z",
  "expiry": "14 days",
  "downloads": 0,
  "maxDownloads": 1,
  "autoDelete": true,
  "size": 204800,
  "mimeType": "application/pdf",
  "created": "2026-09-13T10:32:14.123Z",
  "modified": "2026-09-13T10:32:14.123Z"
}

The useful upload parameters are:

When file.io's Ephemeral Model Is a Problem

file.io's delete-after-download default is a feature for one-time file transfers. It becomes a liability the moment you need the URL to be stable. Common situations where developers run into the limit:

If any of those are your use case, you need a file upload API with durable public URLs. FilePost uses the same simple curl -F upload pattern as file.io, but its URLs do not expire or disappear after the first download by default.

FilePost vs file.io: Ephemeral vs Permanent

This is the single most important distinction between the two services, and it should drive your decision:

If you are building a one-time file transfer tool, a "send this to someone" feature, or a temporary paste service, file.io is a great fit. If you are building anything where the file URL needs to persist: user avatars, document storage, hosted assets, form submissions, you need FilePost.

Quick Comparison Table

Feature FilePost file.io
File permanence Permanent (until you delete) Free path: download or expiry; paid plans advertise optional auto-delete
CDN delivery Yes (Cloudflare) No CDN delivery
Authentication API key required Anonymous (optional account)
File management API Yes (list, delete, metadata) Yes, for account/API use
Dashboard Yes Limited
Intake links (shareable upload pages) Yes No
Max file size (free) 50 MB 2 GB
Free tier uploads 1 provisional / 15 verified Limited (rate-limited)
Swagger / OpenAPI docs Yes No
Paid plan starting price $4/mo $25/mo

Uploading a File: curl Examples

Both APIs keep the upload request small. The table below compares the behaviors that affect whether the returned link is usable later.

Upload with file.io

curl -F "file=@report.pdf" https://file.io

Response:

{
  "success": true,
  "key": "abc123",
  "link": "https://file.io/abc123",
  "expiry": "14 days"
}

That link works exactly once. After someone downloads the file, the URL returns a 404. If nobody downloads it, it expires after 14 days (on the free tier).

Upload with FilePost

curl -X POST https://upload.filepost.dev/v1/upload \
  -H "X-API-Key: your_api_key" \
  -F "file=@report.pdf"

Response:

{
  "url": "https://cdn.filepost.dev/file/filepost/uploads/a1/a1b2c3.pdf",
  "file_id": "a1b2c3d4e5f6",
  "size": 204800
}

That URL is served from Cloudflare's CDN. You can share it, embed it, and store it in your database.

Upload with Python

import requests

# file.io : temporary link
resp = requests.post("https://file.io", files={"file": open("report.pdf", "rb")})
print(resp.json()["link"])  # expires after download

# FilePost : permanent CDN URL
resp = requests.post(
    "https://upload.filepost.dev/v1/upload",
    headers={"X-API-Key": "your_api_key"},
    files={"file": open("report.pdf", "rb")}
)
print(resp.json()["url"])  # permanent

When file.io Is the Right Choice

file.io solves a different problem. Use it when:

If any of those describe your use case, file.io is a solid pick. But if you answered "no" to all three, keep reading.

When FilePost Is the Right Choice

FilePost is built for developers who need file URLs that last. Use FilePost when:

Pricing Comparison

Both services offer free tiers, but the paid plans differ in what you get.

FilePost Pricing

All plans include CDN URLs with no automatic expiry by default, the file management API, dashboard access, and intake links.

file.io Pricing

Check the current plan and API settings before choosing file.io for a production workflow. The free sharing path remains ephemeral, while paid plans advertise optional auto-delete and permanent storage.

Migrating from file.io to FilePost

If you are currently using file.io and want URLs that do not expire by default, the migration is a few lines of code. The upload pattern is nearly identical.

Step 1: Get Your API Key

Sign up at filepost.dev and grab your API key from the dashboard. The free tier starts with one provisional upload before verification and unlocks 15/month after email verification for testing.

Step 2: Swap the Endpoint

# Before: file.io
curl -F "file=@photo.jpg" https://file.io

# After: FilePost
curl -X POST https://upload.filepost.dev/v1/upload \
  -H "X-API-Key: your_api_key" \
  -F "file=@photo.jpg"

The main differences: you add the X-API-Key header, and the response gives you a CDN URL with no automatic expiry by default instead of a self-destructing link.

Step 3: Use the File Management API

Unlike file.io, FilePost lets you list and manage your files after upload:

# List your files
curl -H "X-API-Key: your_api_key" https://filepost.dev/v1/files

# Delete a file
curl -X DELETE -H "X-API-Key: your_api_key" \
  https://filepost.dev/v1/files/a1b2c3d4e5f6

FAQ

What is file.io's default expiration time?

The free sharing path is commonly documented as 14 days, and the current free plan says files are auto-deleted after one download. You can control the API behavior with expires, maxDownloads, and autoDelete. Check the current API reference before relying on a link.

What is file.io's maximum file size limit?

2 GB per file on the free tier. The current public plans list 10 GB on Basic and 100 GB on Premium. Uploads are also subject to plan-specific transfer and rate limits.

What is the file.io upload API endpoint?

The endpoint is POST https://file.io/ with a multipart/form-data body containing a file field. Basic example: curl -F "file=@report.pdf" https://file.io. Optional query parameters include expires, maxDownloads, and autoDelete.

Can I use file.io for permanent file hosting?

The free sharing path is temporary by design. Current paid Basic and Premium plans advertise optional auto-delete and permanent storage, but they use a different storage and billing model. For a focused upload-count API with durable public URLs, FilePost is a direct alternative.

What is the best file.io alternative for developers?

FilePost is the closest alternative to file.io for developers who want a simple upload API with URLs that do not expire by default. Both services use a single POST request to upload. FilePost adds CDN delivery, a file management dashboard, intake links, and API key authentication.

How much does FilePost cost compared to file.io?

FilePost's free tier starts with one provisional upload before verification and unlocks 15 per month after email verification, with 50 MB max file size. Paid plans start at $4/mo (Lite: 300 uploads, 100 MB max), then $9/mo (Starter: 1,500 uploads, 200 MB max) and $29/mo (Pro: 7,500 uploads, 500 MB max). file.io starts at $25/mo for Basic and uses a different storage and transfer model. Compare the workflow and usage meter, not only the headline price.

Test a small upload

Test the request with a small file from your own workflow. If the URL resolves in the next step, the basic integration is working.

Test a small upload