Reupload

The developer-first upload layer

Files for developers.

Upload API, CDN, dashboard, webhooks, and hosted intake pages — without wiring S3 buckets and CDN rules yourself.

File uploads that work with any stack.

upload.sh — zsh

The developer-first upload layer

Reupload handles the file layer so you don't wire S3, CDN rules, previews, and links yourself. S3 alone means buckets, policies, signed URLs, and edge caching — too much config for a feature that should take one API call.

< 5 min

to integrate

1 key

per project

mode

production

Three steps

How it works

From sign-up to your first upload in minutes — not days of infra setup.

01

Create a project

Sign up, create a workspace, add a project, and copy your API key.

02

Upload a file

Send one POST request with your file attached. PDF, image, audio — multipart upload.

03

Use the URL

Get back a URl (Public files) / File ID (Private files) and store in your database. Get signed URL for private files.

Workspace dashboard

Everything in your control

Every upload from your API lands in one workspace. Track usage, browse files, and manage keys and webhooks without building admin UI from scratch.

Metrics, quick actions, and recent uploads.

File Intake

Collect files from anyone.

Not every uploader is in your app. Onboarding packets, vendor invoices, grant applications, and KYC documents need a simple page — not a multipart integration in someone else's codebase.

Create an intake in the dashboard, share the link, and let Reupload handle gates, CDN uploads, and delivery into the project you already use for API uploads.

Read the File Intake docs →

One link, zero custom UI

Share a hosted page. Clients, vendors, and applicants upload without you building a dropzone or auth flow.

Access you control

Public, password, email verification with allowlists, or one-time links.

Structured intake forms

Label each field — logo, contract, tax form — with per-field file types, limits, and required rules.

Lands in your project

Files save under your folder path with intake. Fire intake.

PDFs for RAG

Upload documents, get extracted text back. Chunk it, embed it, and feed your retrieval pipeline — no OCR glue code.

Images for vision

Send photos and screenshots, get a stable URL. Pass it straight to GPT-4V, Claude, or any multimodal model.

Audio for Whisper

Accept voice recordings and audio files. Store them once, transcribe on demand, and keep the source linked.

Built for AI buildersBeta

Every AI app needs a file layer.

Every single AI app needs file handling — PDFs for RAG pipelines, images for vision models, audio for Whisper. And zero upload services are talking to this person.

Generic storage APIs give you buckets and signed URLs. Reupload gives you uploads, public links, and extracted text in one call — the primitives AI products actually need.

Everything you need for file infrastructure

One platform for uploads, storage, sharing, and developer tooling.

Upload API

Multipart uploads with progress, any file type.

Files & public links

Browse, search, and organize in the dashboard — plus shareable URLs and downloads without extra CDN setup.

File Intake

Hosted upload pages for clients and vendors — gates, fields, webhooks.

API keys & webhooks

Real-time file.uploaded, intake.completed, and lifecycle events.

Usage & billing

Storage, bandwidth, and request visibility.

vs raw object storage (S3, GCS)

Object storage

Reupload

  • Buckets, IAM, policies

    Projects and API keys

  • You build CDN and signed URLs

    CDN URLs and signing built in

  • No file UI

    Dashboard + search + previews

  • No webhooks for "file uploaded"

    First-class webhook events

  • No hosted third-party upload page

    File Intake

Ship uploads in your stack

One POST to Reupload — get a CDN URL and extracted text back. Pick your language and paste the snippet into your API or script.

upload.mjs
import { createReuploadFromEnv } from "@reupload/sdk";
import { readFile } from "node:fs/promises";

const reupload = createReuploadFromEnv();
const bytes = await readFile("./report.pdf");

const result = await reupload.uploads.uploadDirect({
  projectId: reupload.defaultProjectId,
  isPublic: true,
  file: {
    data: bytes,
    filename: "report.pdf",
    contentType: "application/pdf",
    size: bytes.length,
  },
});
{ uploadId, fileId, status: "processing" }

Frequently asked questions

S3 is raw storage. Reupload gives you uploads, CDN links, a file dashboard, API keys, webhooks, and usage tracking — all wired together so you don't build the file layer yourself.

Start uploading in minutes.

Create a free account, grab an API key, and make your first upload today.

Get started