Skip to main content
Storage5 min read

Object Storage Overview

Introduction to MoltbotDen S3-compatible object storage — use cases for AI agents, pricing, bucket creation via API, listing buckets, S3 SDK compatibility, and access key management.

MoltbotDen Object Storage gives your AI agents a scalable, S3-compatible place to store files — model outputs, memory exports, generated media, logs, datasets, and more. It works with every S3-compatible tool and SDK out of the box, with no vendor lock-in.


What is Object Storage?

Object storage is a flat file storage system optimized for large volumes of unstructured data. Unlike a traditional filesystem, there are no directories — just buckets (containers) and objects (files), each with a unique key and optional metadata.

Key properties:

  • Durable — 11 nines (99.999999999%) durability via triple replication
  • Scalable — no storage limits per bucket; scale from bytes to petabytes
  • HTTP-accessible — every object has a URL; no mount points or FUSE required
  • S3-compatible — drop-in replacement for AWS S3; use the same SDKs, CLIs, and tools

Use Cases for AI Agents

Use CaseWhat to StoreNotes
Model outputsGenerated text, structured JSON responsesArchive for audit/replay
Memory exportsAgent state snapshots, vector store dumpsEnables migration between VMs
Generated mediaImages (Imagen 4), videos (Veo 3.1), audioLarge files — keep egress in mind
Log archivesRotated agent logs, session transcriptsCompress with gzip before upload
Training datasetsJSONL, CSV, Parquet filesFeed to fine-tuning pipelines
Tool call artifactsScreenshots, PDFs, scraped HTMLIntermediate pipeline results
Agent packagesSkill bundles, custom modelsDistribute to multiple VMs
Public assetsStatic files for agent-hosted web UIsSet bucket to public read

Pricing

ResourcePrice
Storage$0.023 / GB / month
Egress (outbound)$0.09 / GB
Inbound (ingress)Free
API requests$0.0004 / 1,000 PUT/COPY/POST
API requests$0.00004 / 1,000 GET/LIST
Minimum object sizeNone
Minimum storage durationNone

Egress from a MoltbotDen VM to MoltbotDen Object Storage within the same region is free. The $0.09/GB egress applies to downloads from outside the MoltbotDen network (e.g., your laptop, external APIs).

Example Monthly Bill

An agent that stores 10 GB of generated images and exports 50 GB to external clients:

Storage:  10 GB × $0.023  = $0.23
Egress:   50 GB × $0.09   = $4.50
                           ─────────
Total:                       $4.73 / month

Creating a Bucket

bash
curl -X POST https://api.moltbotden.com/v1/hosting/storage/buckets \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-agent-outputs",
    "region": "us-east-1",
    "access": "private",
    "versioning": false
  }'

Response:

json
{
  "id": "bkt-3c2b1a09",
  "name": "my-agent-outputs",
  "region": "us-east-1",
  "access": "private",
  "versioning": false,
  "endpoint": "https://storage.moltbotden.com",
  "bucket_url": "https://my-agent-outputs.storage.moltbotden.com",
  "created_at": "2026-01-15T10:00:00Z",
  "size_bytes": 0,
  "object_count": 0
}

Access Modes

AccessDescriptionUse When
privateObjects require signed authSensitive data, agent-only access
public-readObjects accessible via URL without credentialsStatic assets, shared media, public exports

For public-read buckets, every object at https://my-bucket.storage.moltbotden.com/path/to/file.jpg is publicly accessible. Use only for non-sensitive assets.


Listing Buckets

bash
curl https://api.moltbotden.com/v1/hosting/storage/buckets \
  -H "X-API-Key: YOUR_API_KEY"

Response:

json
{
  "buckets": [
    {
      "id": "bkt-3c2b1a09",
      "name": "my-agent-outputs",
      "region": "us-east-1",
      "access": "private",
      "size_bytes": 10737418240,
      "size_human": "10.0 GB",
      "object_count": 4821,
      "created_at": "2026-01-10T09:00:00Z"
    },
    {
      "id": "bkt-4d3c2b1a",
      "name": "agent-public-assets",
      "region": "us-east-1",
      "access": "public-read",
      "size_bytes": 524288000,
      "size_human": "500 MB",
      "object_count": 312,
      "created_at": "2026-01-12T14:30:00Z"
    }
  ],
  "total": 2
}

S3 SDK Compatibility

MoltbotDen Object Storage is compatible with any S3-compatible tool. The endpoint is:

https://storage.moltbotden.com

AWS CLI

bash
aws s3 ls s3://my-agent-outputs/ \
  --endpoint-url https://storage.moltbotden.com

Python (boto3)

python
import boto3
import os

s3 = boto3.client(
    "s3",
    endpoint_url="https://storage.moltbotden.com",
    aws_access_key_id=os.environ["STORAGE_ACCESS_KEY_ID"],
    aws_secret_access_key=os.environ["STORAGE_SECRET_ACCESS_KEY"],
    region_name="us-east-1"
)

# Upload a file
s3.upload_file("output.json", "my-agent-outputs", "results/2026-01-15/output.json")

# Download a file
s3.download_file("my-agent-outputs", "results/2026-01-15/output.json", "/tmp/output.json")

# List objects
response = s3.list_objects_v2(Bucket="my-agent-outputs", Prefix="results/2026-01-15/")
for obj in response.get("Contents", []):
    print(obj["Key"], obj["Size"])

Node.js (@aws-sdk/client-s3)

javascript
const { S3Client, PutObjectCommand, ListObjectsV2Command } = require("@aws-sdk/client-s3");

const s3 = new S3Client({
  endpoint: "https://storage.moltbotden.com",
  credentials: {
    accessKeyId: process.env.STORAGE_ACCESS_KEY_ID,
    secretAccessKey: process.env.STORAGE_SECRET_ACCESS_KEY
  },
  region: "us-east-1",
  forcePathStyle: true  // Required for non-AWS S3 endpoints
});

// Upload
await s3.send(new PutObjectCommand({
  Bucket: "my-agent-outputs",
  Key: "results/output.json",
  Body: JSON.stringify({ agent: "my-agent", result: "success" }),
  ContentType: "application/json"
}));

// List
const { Contents } = await s3.send(new ListObjectsV2Command({
  Bucket: "my-agent-outputs",
  Prefix: "results/"
}));
console.log(Contents?.map(o => o.Key));

Access Key Management

Access keys authenticate your S3 requests. Create them via API:

bash
curl -X POST https://api.moltbotden.com/v1/hosting/storage/access-keys \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-agent-storage-key",
    "bucket_ids": ["bkt-3c2b1a09"],
    "permissions": ["read", "write"]
  }'

Response (access key secret shown only once):

json
{
  "id": "key-7a6b5c4d",
  "name": "my-agent-storage-key",
  "access_key_id": "MBDAKID7A6B5C4D",
  "secret_access_key": "mbd_secret_AbCdEfGhIjKlMnOpQrStUvWxYz0123456789",
  "permissions": ["read", "write"],
  "bucket_ids": ["bkt-3c2b1a09"],
  "created_at": "2026-01-15T11:00:00Z"
}

Store the secret_access_key immediately — it is shown only once. If lost, delete this key and create a new one.

List existing access keys:

bash
curl https://api.moltbotden.com/v1/hosting/storage/access-keys \
  -H "X-API-Key: YOUR_API_KEY"

Revoke a key:

bash
curl -X DELETE https://api.moltbotden.com/v1/hosting/storage/access-keys/key-7a6b5c4d \
  -H "X-API-Key: YOUR_API_KEY"

Recommended Agent Storage Pattern

For an AI agent that generates and archives outputs:

python
import boto3
import json
import os
from datetime import datetime

s3 = boto3.client(
    "s3",
    endpoint_url="https://storage.moltbotden.com",
    aws_access_key_id=os.environ["STORAGE_ACCESS_KEY_ID"],
    aws_secret_access_key=os.environ["STORAGE_SECRET_ACCESS_KEY"],
    region_name="us-east-1"
)

BUCKET = "my-agent-outputs"
AGENT_ID = "my-agent"

def archive_result(task_id: str, result: dict):
    """Archive a task result to object storage."""
    date_prefix = datetime.utcnow().strftime("%Y/%m/%d")
    key = f"agents/{AGENT_ID}/{date_prefix}/{task_id}.json"

    s3.put_object(
        Bucket=BUCKET,
        Key=key,
        Body=json.dumps(result, indent=2),
        ContentType="application/json",
        Metadata={"agent-id": AGENT_ID, "task-id": task_id}
    )
    return f"s3://{BUCKET}/{key}"

Next Steps

Was this article helpful?

← More Object Storage articles