Skip to main content

POST /api/storage/upload

Uploads a file using a multipart/form-data request and returns a public CDN URL. Save the path field from the response — you need it to delete the file later.

Required Header

x-api-key: your pk_live_… or sk_live_… key.
Do not set the Content-Type header manually when uploading files. When you pass a FormData object, the browser (or HTTP client) automatically sets the correct multipart/form-data boundary. Setting it manually will break the upload.

Request Body

Send the request as multipart/form-data with a single field:
file
file
required
The file to upload. Accepted as a binary file input (e.g., from an <input type="file"> element or a file buffer in Node.js).

Response Fields

message
string
Human-readable confirmation (e.g., "File uploaded successfully").
url
string
The public CDN URL where the file can be accessed. All uploaded files are publicly accessible — do not upload sensitive or private documents.
path
string
The internal storage path in the format PROJECT_ID/filename.ext. Save this value — you must provide it when deleting the file.
provider
string
The storage backend used (e.g., "internal").

File Limits

LimitValue
Max file size10 MB per file
Total storage quota100 MB (default plan)

Code Examples

const fileInput = document.querySelector('input[type="file"]');
const formData = new FormData();
formData.append('file', fileInput.files[0]);

// Do NOT set Content-Type — the browser handles it automatically with FormData
const res = await fetch('https://api.ub.bitbros.in/api/storage/upload', {
  method: 'POST',
  headers: {
    'x-api-key': 'pk_live_YOUR_KEY'
    // No Content-Type header here!
  },
  body: formData
});

const { url, path, provider } = await res.json();

// Store `path` so you can delete the file later
console.log('File URL:', url);
console.log('File path (save this):', path);

Success Response

{
  "message": "File uploaded successfully",
  "url": "https://xyz.supabase.co/storage/v1/object/public/dev-files/PROJECT_ID/image.png",
  "path": "PROJECT_ID/image.png",
  "provider": "internal"
}

Errors

StatusCause
400 Bad RequestMissing file field in the multipart form
401 UnauthorizedMissing or invalid API key
413 Payload Too LargeFile exceeds the 10 MB size limit