Object storage (BLOB storage)
Object storage enables monday code apps to store and manage large, unstructured files such as images, videos, documents, and archives directly within monday.com.
It is designed for large volumes of unstructured files and heavy, infrequent read and write operations. By contrast, monday code also provides key-value storage for fast key-based access and a document database for rich querying of structured or semi-structured data.
With native object storage backed by Google Cloud Storage, you can upload, download, list, and delete files, retrieve metadata, and generate presigned URLs for direct client uploads. All capabilities are built into monday code, so data never leaves monday’s infrastructure, ensuring security, simplicity, and performance.
Object storage complements monday code’s existing storage solutions and is intended specifically for large, unstructured file content.
Limits
Object storage is subject to the following limits:
Limit | Description |
|---|---|
Server-side uploads ( | No SDK-enforced hard limit; practical limits depend on GCS and runtime constraints |
Presigned uploads | Maximum file size of 50 MB |
Presigned URL expiration | Default: 15 minutes |
Initialization
Initialize object storage from backend code running on monday code:
const objectStorage = new ObjectStorage();Notes
- All operations are asynchronous and must be awaited.
- All responses follow a
{ success: boolean, ... }pattern.
Supported methods
Upload files
Uploads file content from server-side code. For client-side uploads (browser or mobile), use a presigned upload URL.
const objectStorage = new ObjectStorage();
// Simple upload
const result = await objectStorage.uploadFile('user-avatar.jpg', fileBuffer);
// Upload with options
const result2 = await objectStorage.uploadFile('document.pdf', fileBuffer, {
contentType: 'application/pdf',
metadata: {
'uploaded-by': 'user123',
'department': 'sales'
}
});Options
| Option | Type | Description | Required |
|---|---|---|---|
| contentType | String | The file's MIME type. Default is application/octet-stream. | No |
| metadata | Object | Custom key-value pairs for tagging and organization. | No |
Response
{ "success": true, "fileName": "user-avatar.jpg", "fileUrl": "gs://bucket/user-avatar.jpg" }Download files
Retrieves file content and its content type.
const result = await objectStorage.downloadFile('user-avatar.jpg');
if (result.success) {
const fileContent = result.content; // Buffer
const mimeType = result.contentType; // e.g. 'image/jpeg'
}Response
Returns content (Buffer) and contentType.
Delete files
Permanently removes a file from storage.
const result = await objectStorage.deleteFile('old-document.pdf');Response
{ "success": true }List files
Lists files with metadata. Supports optional prefix filtering and pagination.
// List all files (default: 100 files per page)
const result = await objectStorage.listFiles();
// Filter by prefix (logical folder)
const result2 = await objectStorage.listFiles({
prefix: 'users/123/'
});
// Pagination
const result3 = await objectStorage.listFiles({
maxResults: 50,
pageToken: 'next-page-token-from-previous-response'
});Options
| Option | Type | Description | Required |
|---|---|---|---|
| prefix | String | Filter results by path prefix (logical folder). | No |
| maxResults | Number | Number of items per page. Default is 100. | No |
| pageToken | String | Token used to fetch the next page of results. | No |
Response
Returns:
- An array of file info objects:
name,size,contentType,lastModified,etag, andmetadata nextPageTokenwhen more results are available
Get file information
Retrieves metadata for a file without downloading its contents.
const result = await objectStorage.getFileInfo('report.pdf');
if (result.success) {
console.log(result.fileInfo.size); // File size in bytes
console.log(result.fileInfo.lastModified); // Date object
console.log(result.fileInfo.metadata); // Custom metadata
}Response
Returns a fileInfo object.
Generate presigned upload URLs
Creates temporary URLs that allow clients (browser or mobile) to upload a specific file directly to cloud storage without routing the request through your backend. A presigned URL is a temporary, secure link generated and authorized by monday code that grants restricted permission to upload that file.
Keep in mind that:
- Anyone with the presigned URL can upload until it expires
- The URL becomes invalid after expiration
- Recommended for large files and browser-based uploads
// Basic usage (15-minute expiration, 50 MB limit)
const result = await objectStorage.getPresignedUploadUrl('user-upload.jpg');
// With custom options
const result2 = await objectStorage.getPresignedUploadUrl('video.mp4', {
expires: new Date(Date.now() + 60 * 60 * 1000), // 1 hour
contentType: 'video/mp4',
maxFileSizeBytes: 50 * 1024 * 1024 // 50 MB
});
const uploadUrl = result.presignedUrl;Options
| Option | Type | Description | Required |
|---|---|---|---|
| expires | Date | Expiration time for the URL. Defaults to 15 minutes from creation. | No |
| contentType | String | Restricts uploads to a specific MIME type. | No |
| maxFileSizeBytes | Number | Maximum allowed file size. | No |
Errors
All operations return descriptive error messages, including but not limited to:
File not foundFailed to upload file: [reason]Failed to download file: [reason]Failed to list files: [reason]Failed to generate presigned upload URL: [reason]
Updated about 10 hours ago
