Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Storage API

⚠️ Note: This API is not yet implemented and is planned for a future release.

BotServer provides a RESTful API for managing file storage and object management through its S3-compatible storage backend.

Overview

The Storage API allows you to:

  • Upload and download files
  • Manage buckets and objects
  • Generate presigned URLs
  • Handle binary data and documents
  • Organize bot assets

Base URL

http://localhost:8080/api/v1/storage

Authentication

All storage API requests require authentication:

Authorization: Bearer <token>

Endpoints

List Buckets

GET /buckets

List all available storage buckets.

Response:

{
  "buckets": [
    {
      "name": "mybot.gbai",
      "created": "2024-01-15T10:00:00Z",
      "size": 1048576
    }
  ]
}

Create Bucket

POST /buckets

Create a new storage bucket.

Request Body:

{
  "name": "newbot.gbai",
  "region": "us-east-1",
  "versioning": false
}

Response:

{
  "bucket": "newbot.gbai",
  "created": true,
  "location": "/newbot.gbai"
}

List Objects

GET /buckets/{bucket}/objects

List objects in a bucket.

Query Parameters:

  • prefix - Filter objects by prefix
  • delimiter - Delimiter for grouping
  • max_keys - Maximum number of results (default: 1000)
  • continuation_token - Pagination token

Response:

{
  "objects": [
    {
      "key": "documents/manual.pdf",
      "size": 2048576,
      "last_modified": "2024-01-15T10:30:00Z",
      "etag": "d41d8cd98f00b204e9800998ecf8427e"
    }
  ],
  "is_truncated": false,
  "continuation_token": null
}

Upload Object

PUT /buckets/{bucket}/objects/{key}

Upload a file to storage.

Headers:

  • Content-Type - MIME type of the file
  • Content-Length - Size of the file
  • x-amz-meta-* - Custom metadata

Request Body: Binary file data

Response:

{
  "bucket": "mybot.gbai",
  "key": "documents/report.pdf",
  "etag": "d41d8cd98f00b204e9800998ecf8427e",
  "version_id": null
}

Download Object

GET /buckets/{bucket}/objects/{key}

Download a file from storage.

Headers:

  • Range - Partial content request (optional)
  • If-None-Match - ETag for caching (optional)

Response: Binary file data with appropriate headers

Delete Object

DELETE /buckets/{bucket}/objects/{key}

Delete an object from storage.

Response:

{
  "deleted": true,
  "key": "documents/old-file.pdf"
}

Copy Object

POST /buckets/{bucket}/objects/{key}/copy

Copy an object to a new location.

Request Body:

{
  "source_bucket": "source.gbai",
  "source_key": "file.pdf",
  "destination_bucket": "dest.gbai",
  "destination_key": "copied-file.pdf"
}

Response:

{
  "copied": true,
  "source": "source.gbai/file.pdf",
  "destination": "dest.gbai/copied-file.pdf"
}

Generate Presigned URL

POST /buckets/{bucket}/objects/{key}/presign

Generate a presigned URL for temporary access.

Request Body:

{
  "operation": "GET",
  "expires_in": 3600,
  "content_type": "application/pdf"
}

Response:

{
  "url": "http://localhost:9000/mybot.gbai/file.pdf?X-Amz-Algorithm=...",
  "expires_at": "2024-01-15T11:30:00Z"
}

Object Metadata

HEAD /buckets/{bucket}/objects/{key}

Get object metadata without downloading.

Response Headers:

  • Content-Type - MIME type
  • Content-Length - File size
  • Last-Modified - Modification time
  • ETag - Entity tag
  • x-amz-meta-* - Custom metadata

Multipart Upload

POST /buckets/{bucket}/objects/{key}/multipart

Initiate multipart upload for large files.

Response:

{
  "upload_id": "abc123...",
  "bucket": "mybot.gbai",
  "key": "large-file.zip"
}

Upload Part: PUT /buckets/{bucket}/objects/{key}/multipart/{uploadId}/{partNumber}

Complete Upload: POST /buckets/{bucket}/objects/{key}/multipart/{uploadId}/complete

Error Responses

404 Not Found

{
  "error": "not_found",
  "message": "Object not found",
  "resource": "mybot.gbai/missing.pdf"
}

409 Conflict

{
  "error": "conflict",
  "message": "Bucket already exists",
  "bucket": "existing.gbai"
}

507 Insufficient Storage

{
  "error": "insufficient_storage",
  "message": "Storage quota exceeded",
  "quota": 10737418240,
  "used": 10737418240
}

Usage Examples

Upload File with cURL

curl -X PUT \
  -H "Authorization: Bearer token123" \
  -H "Content-Type: application/pdf" \
  --data-binary @document.pdf \
  http://localhost:8080/api/v1/storage/buckets/mybot.gbai/objects/docs/manual.pdf

Download File

curl -X GET \
  -H "Authorization: Bearer token123" \
  http://localhost:8080/api/v1/storage/buckets/mybot.gbai/objects/docs/manual.pdf \
  -o downloaded.pdf

List Objects with Prefix

curl -X GET \
  -H "Authorization: Bearer token123" \
  "http://localhost:8080/api/v1/storage/buckets/mybot.gbai/objects?prefix=docs/"

Storage Organization

bucket/
├── .gbkb/           # Knowledge base files
│   ├── docs/
│   └── data/
├── .gbdialog/       # Dialog scripts
│   ├── scripts/
│   └── tools/
├── .gbtheme/        # Theme assets
│   ├── css/
│   └── images/
└── .gbdrive/        # User uploads
    ├── attachments/
    └── temp/

Quotas and Limits

LimitDefault Value
Max file size100 MB
Max bucket size10 GB
Max objects per bucket10,000
Presigned URL validity7 days
Multipart chunk size5 MB

Performance Tips

  1. Use Multipart Upload for files > 5MB
  2. Enable Caching with ETags
  3. Compress Large Files before upload
  4. Use Presigned URLs for direct client uploads
  5. Implement Retry Logic for network failures

Security Considerations

  • All uploads are scanned for malware
  • File types are validated
  • Presigned URLs expire automatically
  • Access control per bucket
  • Encryption at rest
  • SSL/TLS for transfers