Documentación de la API
Almacenamiento de archivos agentic-first para desarrolladores y agentes de IA
URL base: https://www.easybits.cloud/api/v2
Inicio rápido
- Crea una cuenta en easybits.cloud
- Ve al Dashboard de Desarrollador y crea una API key
- Haz tu primera llamada:
Obtén tu API key. Por defecto cargan 12 herramientas core. Agrega --tools docs,slides,all para más. Ver tool groups.
Authentication
All API requests require a Bearer token in the Authorization header.
What your key grants access to
An EasyBits API key authenticates you as the owner of your account. It grants access to all your resources: files, websites, databases, webhooks, documents, presentations, and landings. Keep it secret — anyone with your key can read, modify, or delete your data.
Scopes
Each key is created with one or more scopes. Use the most restrictive scope your integration needs.
| Scope | Allows |
|---|---|
| READ | List and get files, websites, documents, webhooks, and usage stats |
| WRITE | Create, upload, update, optimize, transform, and share files. Create websites, webhooks, databases, documents, and presentations |
| DELETE | Soft-delete and permanently remove files, websites, webhooks, and other resources |
| ADMIN | Full access including key management, provider configuration, sandbox/agent operations, and account-wide actions |
Keys created from the Developer Dashboard default to READ + WRITE + DELETE. Use the API to create scoped keys programmatically.
Ghosty Code
El runtime agéntico con EasyBits preinstalado. Cero configuración.
Ghosty Code v0.0.4+ ya trae EasyBits MCP HTTP preinstalado.
Solo necesitas tu API key. Nada que instalar, nada que configurar.
Conexión en 2 pasos
- Configura tu API key:
export EASYBITS_API_KEY=eb_sk_live_YOUR_KEY - Ejecuta:
ghosty
EasyBits aparece como easybits en tu lista de MCPs con 100+ herramientas listas para usar.
¿Versión anterior o instalación manual?
Si usas Ghosty Code v0.0.3 o necesitas agregar EasyBits manualmente:
Qué incluye
100+ herramientas para archivos, documentos, DBs, sandboxes y más
Modelo principal con razonamiento profundo (thinking tokens)
BrightData integrado para búsquedas y scraping
Agrega y quita servidores MCP en runtime sin reiniciar
Firecracker microVMs para ejecutar código y agentes aislados
ghosty update para mantener todo al día
ghosty update y EasyBits aparece automáticamente.¿No usas Ghosty Code? EasyBits funciona con Claude Cowork, Cursor, VS Code y cualquier cliente MCP. Ver todas las opciones de conexión.
Claude Cowork (OAuth)
For Claude.ai, Cowork, and other web-based MCP clients that can't store API keys.
EasyBits implements OAuth 2.1 with Dynamic Client Registration (RFC 7591) and PKCE S256. Web MCP clients discover, register, and authenticate automatically — no API key copying, no JSON configs.
Connect in 4 steps
- In Cowork, open Settings → Connectors → Add custom connector
- Paste the MCP URL:
https://www.easybits.cloud/api/mcp - Click Connect — you'll be redirected to EasyBits to log in
- Authorize the connector. You're done — the agent has access to your workspace
?tools=all to the URL to expose all 100+ tools instead of the 12-tool core group. See Tool Groups for other options.How it works
EasyBits exposes the standard OAuth discovery endpoints so any spec-compliant MCP client connects without manual setup:
| Endpoint | Spec | Purpose |
|---|---|---|
| /.well-known/oauth-protected-resource | RFC 9728 | Tells clients which Authorization Server protects /api/mcp |
| /.well-known/oauth-authorization-server | RFC 8414 | Advertises authorize, token, and registration endpoints |
| /oauth/register | RFC 7591 | Dynamic Client Registration — client_id + secret issued on POST |
| /oauth/authorize | OAuth 2.1 | User consent + code issuance (PKCE S256 required) |
| /oauth/token | OAuth 2.1 | Exchanges code + verifier for a 1-hour JWT access token |
Handshake flow
Notes
- Access tokens are HS256 JWTs, valid for 1 hour. No refresh token — reauthorize is a single click when you already have a session.
- Auto-approval: once logged in, the authorize screen redirects back immediately. The user already expressed consent by initiating the flow from the connector.
- Additive: API key Bearer auth keeps working unchanged. The handler tries JWT verification first and silently falls through to API key validation.
- PKCE S256 is mandatory. Plain and no-PKCE flows are rejected.
- Scope: a single
mcpscope — the authorized session has full access to the MCP handler.
SDK
The typed SDK wraps the entire REST API. Install and use it in any Node.js/Bun/Deno project.
All Methods
Files
| Method | Description |
|---|---|
| listFiles(params?) | List files (paginated) |
| getFile(fileId) | Get file + download URL |
| uploadFile(params) | Create file + get upload URL |
| updateFile(fileId, params) | Update name, access, metadata, status |
| deleteFile(fileId) | Soft-delete (7-day retention) |
| restoreFile(fileId) | Restore from trash |
| listDeletedFiles(params?) | List trash with days until purge |
| searchFiles(query) | AI-powered natural language search |
| duplicateFile(fileId, name?) | Copy file (new storage object) |
| listPermissions(fileId) | List sharing permissions |
Bulk Operations
| Method | Description |
|---|---|
| bulkUploadFiles(items) | Upload up to 20 files at once |
| bulkDeleteFiles(fileIds) | Delete up to 100 files at once |
Images
| Method | Description |
|---|---|
| optimizeImage(params) | Convert to WebP/AVIF |
| transformImage(params) | Resize, rotate, flip, convert, grayscale |
Sharing
| Method | Description |
|---|---|
| shareFile(params) | Share with another user by email |
| generateShareToken(fileId, expiresIn?) | Temporary download URL |
| listShareTokens(params?) | List tokens (paginated) |
Webhooks
| Method | Description |
|---|---|
| listWebhooks() | List configured webhooks |
| createWebhook(params) | Create webhook (returns secret once) |
| getWebhook(webhookId) | Get webhook details |
| updateWebhook(webhookId, params) | Update URL, events, or status |
| deleteWebhook(webhookId) | Delete permanently |
Websites
| Method | Description |
|---|---|
| listWebsites() | List static websites |
| createWebsite(name) | Create website, get id + URL |
| getWebsite(websiteId) | Get website details |
| updateWebsite(websiteId, params) | Update name/status |
| deleteWebsite(websiteId) | Delete website + files |
Deploy files by uploading with fileName: "sites/{websiteId}/path" — see Websites section for full example.
Account
| Method | Description |
|---|---|
| getUsageStats() | Storage, file counts, plan info |
| listProviders() | Storage providers |
| listKeys() | API keys |
Error Handling
Files
/filesList your files (paginated)
| assetId | string | Filter by asset ID |
| limit | number | Max results (default 50, max 100) |
| cursor | string | Pagination cursor |
| status | string | Set to 'DELETED' to list deleted files |
/files/:fileIdGet file details with a temporary download URL
/filesCreate a file record and get a presigned upload URL
| fileName | string | Required |
| contentType | string | MIME type (required) |
| size | number | File size in bytes (required, 1B–5GB) |
| access | string | 'public' or 'private' (default) |
| region | string | 'LATAM', 'US', or 'EU' |
Upload bytes via PUT to putUrl, then PATCH the file status to 'DONE'.
/files/:fileIdUpdate file name, access level, metadata, or status
| name | string | New file name |
| access | string | 'public' or 'private' |
| metadata | object | Key-value pairs (merged, max 10KB) |
| status | string | Only 'DONE' (from PENDING) |
/files/:fileIdSoft-delete a file (7-day retention)
/files/:fileId/restoreRestore a soft-deleted file
/files/search?q=...AI-powered natural language file search (requires AI key)
| q | string | Natural language query (required) |
/files/:fileId/duplicateCreate a copy of an existing file (new storage object)
| name | string | Name for the copy (optional, defaults to 'Copy of ...') |
/files/:fileId/permissionsList sharing permissions for a file
Bulk Operations
/files/bulk-uploadCreate multiple file records and get presigned upload URLs (max 20)
| items | array | Array of { fileName, contentType, size, access? } |
Each file must be uploaded via PUT to its putUrl, then status set to DONE.
/files/bulk-deleteSoft-delete multiple files at once (max 100)
| fileIds | string[] | Array of file IDs to delete |
Images
/files/:fileId/optimizeConvert image to WebP or AVIF (creates a new file)
| format | string | 'webp' (default) or 'avif' |
| quality | number | 1–100 (default: 80 webp, 50 avif) |
/files/:fileId/transformResize, crop, rotate, flip, or convert an image (creates a new file)
| width | number | Target width in px |
| height | number | Target height in px |
| fit | string | 'cover', 'contain', 'fill', 'inside', 'outside' |
| format | string | 'webp', 'avif', 'png', 'jpeg' |
| quality | number | 1–100 |
| rotate | number | Degrees |
| flip | boolean | Vertical flip |
| grayscale | boolean | Convert to grayscale |
Webhooks
Receive real-time POST notifications when events occur. Payloads are signed with HMAC SHA-256 via the X-Easybits-Signature header. Webhooks auto-pause after 5 consecutive delivery failures.
file.created, file.updated, file.deleted, file.restored, website.created, website.deleted/webhooksList your configured webhooks
/webhooksCreate a webhook. The secret is only returned on creation — save it.
| url | string | HTTPS URL to receive POST notifications (required) |
| events | string[] | Events to subscribe to (required) |
Max 10 webhooks per account. URL must use HTTPS.
/webhooks/:webhookIdGet webhook details (excluding secret)
/webhooks/:webhookIdUpdate webhook URL, events, or status
| url | string | New HTTPS URL |
| events | string[] | New events list |
| status | string | 'ACTIVE' or 'PAUSED'. Reactivating resets fail counter. |
/webhooks/:webhookIdPermanently delete a webhook
Verifying Signatures
Payload Format
Websites
- Create a website — you get an
idand a URL likehttps://my-site.easybits.cloud - Upload files with
fileNameset tosites/{websiteId}/path(e.g.sites/{id}/index.html) - PUT the bytes to each
putUrl, then set status to DONE - Your site is live — SPA fallback to
index.htmlis built-in
Deploy Example
Endpoints
/websitesList your static websites
/websitesCreate a new website
| name | string | Website name (required) |
/websites/:websiteIdGet website details
/websites/:websiteIdUpdate website name or status
| name | string | New name |
| status | string | e.g. 'DEPLOYED' |
/websites/:websiteIdDelete website and soft-delete all its files
Documents
AI-generated professional documents (reports, brochures, catalogs, proposals, CVs) with parallel page generation, design directions, and semantic color themes.
/documentsList all your documents
/documents/:idGet a document with full page/section data
/documentsCreate a new document
| name | string | Document name (required) |
| prompt | string | Description for AI generation |
| theme | string | Theme: minimal, calido, oceano, noche, bosque, rosa |
| customColors | object | Custom palette: { primary, secondary, accent, surface } |
/documents/:idUpdate document metadata (name, theme, colors). Use page tools for content changes.
| name | string | New name |
| prompt | string | Updated prompt |
| theme | string | Theme name |
| customColors | object | Custom color palette |
/documents/:idDelete a document
/documents/:id/deployPublish as a live website at slug.easybits.cloud
/documents/:id/unpublishRemove the live website and revert to draft
Page Management (MCP)
These tools are available via MCP for surgical page-level editing.
get_page_htmlMCPdocumentId, pageId
Get the HTML and metadata of a single page.
set_page_htmlMCPdocumentId, pageId, html
Update a single page's full HTML. Preferred over update_document for content edits.
get_section_htmlMCPdocumentId, pageId, cssSelector
Get the outerHTML of a specific element within a page by CSS selector.
set_section_htmlMCPdocumentId, pageId, cssSelector, html
Replace a specific element within a page. Enables surgical edits.
add_pageMCPdocumentId, html?, afterPageIndex?, label?
Add a new page. Optionally provide HTML and insertion position.
delete_pageMCPdocumentId, pageId
Remove a page. Cannot delete the last remaining page.
reorder_pagesMCPdocumentId, pageIds
Reorder all pages. pageIds must contain every page ID exactly once.
get_page_screenshotMCPdocumentId, pageIndex?
Take a screenshot of a page. Returns a PNG image (letter-sized). Prefer this tool to verify edits visually.
AI Generation (MCP)
generate_documentMCPdocumentId, prompt, skipCover?
Generate all pages with AI via streaming. Use skipCover: true to add pages without regenerating the cover.
refine_document_sectionMCPdocumentId, sectionId, instruction
Surgical AI changes to a specific page. Use get_page_html to see the result.
regenerate_document_pageMCPdocumentId, sectionId
Completely redesign a page while keeping the same content intent.
enhance_document_promptMCPname, prompt?, action?
Auto-generate a description from the title or improve an existing prompt.
get_document_directionsMCPprompt, pageCount?, sourceContent?
Get 4 design directions (fonts, colors, mood). Pass one to generate_document.
clone_documentMCPdocumentId, name?
Duplicate a document with all its pages.
Workflow
1. enhance_document_prompt — auto-generate a description
2. get_document_directions — get 4 design directions
3. create_document — create the document
4. generate_document — AI generates all pages
5. get_page_screenshot — verify pages visually
6. refine_document_section — tweak individual pages
7. deploy_document — publish at slug.easybits.cloud
Account & Usage
/usageGet account usage statistics: storage, file counts, plan info
/providersList your configured storage providers
/keysList your API keys (session auth only)
Errors & Rate Limits
| Status | Meaning |
|---|---|
| 400 | Bad request (invalid params) |
| 401 | Unauthorized (missing/invalid API key) |
| 403 | Forbidden (insufficient scope) |
| 404 | Resource not found |
| 429 | Rate limited (too many requests) |
| 500 | Server error |
All error responses include a JSON body: {"error": "message"}
Rate limits: 100 requests per 15 minutes for all plans.
Agentes & Sandboxes
MicroVMs Firecracker para correr agentes y código aislado. Crea sandboxes, ejecuta comandos, expón puertos, y despliega agentes persistentes — todo desde el SDK, REST API o herramientas MCP.
Templates
Cada sandbox se crea desde un template. Estos son los disponibles:
| Template | Tipo | Descripción |
|---|---|---|
| code-interpreter | sandbox | Python con kernel Jupyter persistente. Variables, imports y gráficas sobreviven entre celdas |
| python / node / bun | sandbox | Runtimes base. Cada sandbox_run_code ejecuta un proceso fresco |
| ubuntu | sandbox | Linux completo. Ideal para instalar paquetes, compilar, o correr servidores |
| rust-ghosty | agente | Ghosty: cerebro CodeWhale/Rust DeepSeek-first con canales web SSE y WhatsApp |
| claude-code | agente | Claude Agent SDK loop. Modelo Sonnet 4.6, billing por token |
| computer-ghosty | agente | Computer-use con escritorio Linux XFCE + terminal noVNC público |
| ghostyclaw / openclaw | agente | Daemons always-on para WhatsApp, Slack, Telegram |
Flujo básico: sandbox efímero
Crea un sandbox, ejecuta código, expón un puerto, destrúyelo. Ideal para ejecución aislada.
Exponer un puerto (URL pública)
Arranca un servidor dentro del sandbox y obtén una URL HTTPS pública al instante.
Kernel persistente (code-interpreter)
El template code-interpreter mantiene un kernel Jupyter con estado entre celdas. Variables, imports y gráficas (matplotlib) sobreviven.
Agentes persistentes (agent_create)
Crea agentes de larga duración con un endpoint HTTP público. Ideal para chatbots embebidos, asistentes en WhatsApp, o dashboards.
Agent Run (one-shot)
Dispara un agente Claude para una tarea, espera el resultado, y destruye el sandbox. Ideal para CI/CD, procesamiento por lotes, o tareas puntuales.
Herramientas MCP del grupo sandbox
sandbox_createMCPtemplate, timeoutSeconds
Crear un sandbox nuevo
sandbox_listMCP—
Listar sandboxes activos
sandbox_statusMCPsandboxId
Estado del sandbox (running/stopped/error)
sandbox_destroyMCPsandboxId
Destruir y liberar recursos
sandbox_extendMCPsandboxId, extendSeconds
Extender TTL del sandbox
sandbox_suspendMCPsandboxId
Snapshot a disco y liberar CPU
sandbox_resumeMCPsandboxId
Restaurar desde snapshot
sandbox_execMCPsandboxId, command
Ejecutar comando (sync, 60s timeout)
sandbox_exec_backgroundMCPsandboxId, command
Ejecutar comando en background
sandbox_exec_statusMCPsandboxId, execId
Consultar estado de ejecución background
sandbox_run_codeMCPsandboxId, code, lang
Ejecutar Python/Node/Bash inline
sandbox_run_cellMCPsandboxId, code
Ejecutar celda en kernel Jupyter persistente
sandbox_files_writeMCPsandboxId, path, content
Escribir archivo en el sandbox
sandbox_files_readMCPsandboxId, path
Leer archivo del sandbox
sandbox_files_listMCPsandboxId, path
Listar directorio
sandbox_expose_portMCPsandboxId, port
Exponer puerto como URL pública HTTPS
agent_createMCPtemplate
Crear agente persistente (endpoint HTTP)
agent_listMCP—
Listar agentes persistentes
agent_messageMCPagentId, content
Enviar mensaje a un agente
agent_runMCPprompt, model?
Agente Claude one-shot (async)
agent_run_statusMCPjobId
Consultar estado de agent_run
templates_listMCPtier?
Listar templates disponibles
Tool Groups
Por defecto el servidor MCP carga 12 herramientas core para minimizar el uso de tokens. Habilita grupos adicionales para desbloquear más capacidades.
| Grupo | Herramientas | Descripción |
|---|---|---|
| core | 12 | Archivos, DB, documentos, cotizaciones, estadísticas (default) |
| sandbox | 22 | MicroVMs Firecracker: crear, ejecutar, exponer puertos, agentes persistentes y one-shot |
| files | ~37 | Todas las ops de archivos: bulk, sharing, permisos, webhooks, imágenes, AI keys |
| docs | ~33 | Documentos: generación AI, refine, screenshots, structured docs |
| sites | ~8 | Sitios web: CRUD, upload, deploy |
| brand | ~8 | Brand kits, plantillas, temas |
| all | ~104 | Todo (incluye slides y agentes) |