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 (uploadFile)

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
Maximum: 7 days

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

OptionTypeDescriptionRequired
contentTypeStringThe file's MIME type. Default is application/octet-stream.No
metadataObjectCustom 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

OptionTypeDescriptionRequired
prefixStringFilter results by path prefix (logical folder).No
maxResultsNumberNumber of items per page. Default is 100.No
pageTokenStringToken used to fetch the next page of results.No

Response

Returns:

  • An array of file info objects: name, size, contentType, lastModified, etag, and metadata
  • nextPageToken when 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

OptionTypeDescriptionRequired
expiresDateExpiration time for the URL. Defaults to 15 minutes from creation.No
contentTypeStringRestricts uploads to a specific MIME type.No
maxFileSizeBytesNumberMaximum allowed file size.No

Errors

All operations return descriptive error messages, including but not limited to:

  • File not found
  • Failed to upload file: [reason]
  • Failed to download file: [reason]
  • Failed to list files: [reason]
  • Failed to generate presigned upload URL: [reason]