Skip to main content
The Upload endpoint transfers documents to Reducto’s servers, returning a unique reducto:// identifier you can use with other endpoints like Parse, Split, Extract, and Edit.
Files over 100MB? Use the presigned URL method which supports files up to 5GB.

When to Use Upload

Your situationWhat to do
Local file under 100MBUse Upload (this page)
Local file over 100MBUse Presigned URL Upload
File already hosted at a URLSkip upload entirely β€” pass the URL directly
Presigned S3/GCS/Azure URLSkip upload entirely β€” pass the URL directly

Supported File Types

CategoryFormats
PDFPDF (Portable Document Format)
DocumentsDOCX (Word Open XML), DOC (Word Binary), DOTX (Word Template), RTF (Rich Text Format), TXT (Plain Text), WPD (WordPerfect)
SpreadsheetsXLSX (Excel Open XML), XLSM (Excel Macro-Enabled), XLS (Excel Binary), XLTX (Excel Template), XLTM (Excel Macro-Enabled Template), CSV (Comma-Separated Values), QPW (Quattro Pro)
PresentationsPPTX (PowerPoint Open XML), PPT (PowerPoint Binary)
ImagesPNG (Portable Network Graphics), JPEG/JPG (Joint Photographic Experts Group), GIF (Graphics Interchange Format), BMP (Bitmap), TIFF (Tagged Image File Format), HEIC (High Efficiency Image Codec), PSD (Adobe Photoshop), PCX (PC Paintbrush), PPM (Portable Pixmap), APNG (Animated PNG), CUR (Windows Cursor), DCX (Multi-page PCX), FTEX (3D Textures), PIXAR (Pixar Image)
Multi-page images: TIFF files with multiple pages are processed as multi-page documents.

Quick Start

from pathlib import Path
from reducto import Reducto

client = Reducto()  # Reads REDUCTO_API_KEY from environment

upload = client.upload(file=Path("document.pdf"))
print(upload.file_id)
# Output: reducto://a8f8ead1-e360-4ec6-9ccd-b3277421b9ef.pdf

# Now use it with Parse, Split, or Extract
result = client.parse.run(input=upload.file_id)

URL Passthrough

If your document is already accessible via URL, skip the upload step entirely:
# No upload needed β€” pass URL directly
result = client.parse.run(input="https://example.com/document.pdf")
This works with:
  • Public URLs (https://…)
  • Presigned S3, GCS, or Azure Blob URLs
  • Any URL that returns the file directly when accessed

Response Format

{
  "file_id": "reducto://a8f8ead1-e360-4ec6-9ccd-b3277421b9ef.pdf"
}
FieldDescription
file_idUnique identifier in reducto:// format. Pass this to Parse, Split, or Extract.
Files expire after 24 hours. The reducto:// URI becomes invalid after expiration. Re-upload if you need to process the file again.
Reuse the file_id: You can process the same document multiple times with different configurations without re-uploading β€” just use the same file_id.

Common Questions

MethodMax Size
Direct upload (this page)100MB
Presigned URL upload5GB
For files over 100MB, see Uploading Large Files.
Files expire 24 hours after upload. The reducto:// URI becomes invalid after expiration.Need to process the same file again after 24 hours? Re-upload it.
The Upload endpoint accepts one file per request. For batch uploads, make parallel requests:
from concurrent.futures import ThreadPoolExecutor

files = ["doc1.pdf", "doc2.pdf", "doc3.pdf"]

with ThreadPoolExecutor(max_workers=10) as executor:
    uploads = list(executor.map(
        lambda f: client.upload(file=Path(f)), 
        files
    ))
See our batch processing guide for production patterns.
Files are automatically deleted after 24 hours. There’s no manual delete endpoint β€” files are purged automatically for security and compliance.

Troubleshooting

Error: Unsupported file formatFix: Check that your file extension matches the supported file types. When uploading programmatically, ensure the filename includes the extension.
Error: File size exceeds maximum allowedFix: Direct upload is limited to 100MB. For larger files, use the presigned URL method which supports up to 5GB.
Error: Request timeoutFix:
  • For files approaching 100MB, consider using presigned URL upload
  • Check your network connection
  • Implement retry logic with exponential backoff

Next Steps