Skip to main content

Overview

You have two ways to upload files.
  1. Simple Upload: Quick, easy, for small stuff.
  2. Resumable Upload: Robust, 3-step process, for big videos.
Recommendation: Always use the Resumable Upload for videos. It’s more reliable. If a 1GB upload fails at 99% with the Simple method, you start over. With Resumable, you don’t.

Method 1: Resumable Upload (The Pro Way)

Ideal for videos or anything >25MB.

Step 1: Initialize

Tell us what you’re planning to upload. Endpoint: POST /upload/init
// Request
{
  "fileName": "viral-video.mp4",
  "mimeType": "video/mp4",
  "teamId": "..." // optional
}
Response: We give you a magic url (Pre-signed URL) and a path. Keep them safe.
{
  "url": "https://storage.googleapis.com/...",
  "path": "uploads/123/viral-video.mp4"
}

Step 2: Push the Bytes

Send the raw binary file to the url we gave you. Use PUT.
Important: Do not wrap this in JSON or Multipart form. Just send the raw bytes.
curl -X PUT "https://storage.googleapis.com/..." \
  --upload-file ./viral-video.mp4

Step 3: Finalize

Tell us you’re done so we can register the file in our system. Endpoint: POST /upload/finalize
// Request
{
  "path": "uploads/123/viral-video.mp4", // from Step 1
  "teamId": "..."
}
Response: You get an id (e.g., upload_abc123). This is the ID you use when creating a post.

Method 2: Simple Upload (The Lazy Way)

Good for images or small clips. Uses standard multipart/form-data. Endpoint: POST /upload/create
curl -X POST "https://api.bundle.social/upload/create" \
  -H "Authorization: Bearer YOUR_KEY" \
  -F "file=@./meme.jpg" \
  -F "teamId=YOUR_TEAM_ID"
Response: Returns the id immediately.

Supported Formats & Limits

TypeFormatsMax Size
ImagesJPG, PNG25 MB
VideosMP41 GB (1024 MB)
Tip: If you are uploading a picture of your cat (or your mom, we don’t judge), Simple Upload is fine. For a 4K podcast clip, use Resumable.