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 trae el MCP de EasyBits preconfigurado.
Viene desactivado de fábrica hasta que añades tu API key — una instalación nueva nunca falla por falta de credencial.
Conexión en 3 pasos
- Instala el CLI:
npm install -g ghostycode(ocurl -fsSL https://formmy.app/ghosty/install.sh | sh) - Autentica con tu key de EasyBits (sirve para LLM + MCP):
ghosty auth set --provider easybits --api-key "TU_EASYBITS_API_KEY" - Ejecuta:
ghosty --yolo
Consigue tu API key en /dash/developer. Verifica el setup con ghosty doctor y los MCPs con ghosty mcp list.
Agregar EasyBits manualmente
Si necesitas (re)agregar el servidor MCP con tu key:
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 — el MCP de EasyBits ya viene preconfigurado.¿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
El SDK tipado envuelve toda la REST API. Instálalo y úsalo en cualquier proyecto Node.js/Bun/Deno.
Todos los métodos
Archivos
| Method | Description |
|---|---|
| listFiles(params?) | Lista archivos (paginado) |
| getFile(fileId) | Obtén el archivo + URL de descarga |
| uploadFile(params) | Crea el archivo + obtén URL de subida |
| updateFile(fileId, params) | Actualiza nombre, acceso, metadata, status |
| deleteFile(fileId) | Borrado suave (retención 7 días) |
| restoreFile(fileId) | Restaura desde la papelera |
| listDeletedFiles(params?) | Lista la papelera con días hasta la purga |
| searchFiles(query) | Búsqueda en lenguaje natural con IA |
| duplicateFile(fileId, name?) | Copia el archivo (nuevo objeto de storage) |
| listPermissions(fileId) | Lista los permisos de compartición |
Operaciones en lote
| Method | Description |
|---|---|
| bulkUploadFiles(items) | Sube hasta 20 archivos a la vez |
| bulkDeleteFiles(fileIds) | Borra hasta 100 archivos a la vez |
Imágenes
| Method | Description |
|---|---|
| optimizeImage(params) | Convierte a WebP/AVIF |
| transformImage(params) | Redimensiona, rota, voltea, convierte, escala de grises |
Compartir
| Method | Description |
|---|---|
| shareFile(params) | Comparte con otro usuario por email |
| generateShareToken(fileId, expiresIn?) | URL de descarga temporal |
| listShareTokens(params?) | Lista tokens (paginado) |
Formularios
| Method | Description |
|---|---|
| createForm(params) | Crea un formulario hospedado (/f/:slug) |
| listForms() | Lista tus formularios con conteo de respuestas |
| getForm(formId) | Obtén la config del formulario (campos, theme) |
| updateForm(formId, patch) | Actualiza nombre, theme, campos o mensaje |
| getFormSubmissions(formId, opts?) | Lista las respuestas de un formulario |
Webhooks
| Method | Description |
|---|---|
| listWebhooks() | Lista los webhooks configurados |
| createWebhook(params) | Crea un webhook (devuelve el secret una vez) |
| getWebhook(webhookId) | Obtén los detalles del webhook |
| updateWebhook(webhookId, params) | Actualiza URL, eventos o status |
| deleteWebhook(webhookId) | Borra permanentemente |
Sitios web
| Method | Description |
|---|---|
| listWebsites() | Lista los sitios estáticos |
| createWebsite(name) | Crea un sitio, obtén id + URL |
| getWebsite(websiteId) | Obtén los detalles del sitio |
| updateWebsite(websiteId, params) | Actualiza nombre/status |
| deleteWebsite(websiteId) | Borra el sitio + archivos |
Despliega archivos subiéndolos con fileName: "sites/{websiteId}/path" — ve la sección Sitios web para el ejemplo completo.
Cuenta
| Method | Description |
|---|---|
| getUsageStats() | Storage, conteo de archivos, info del plan |
| listProviders() | Proveedores de storage |
| listKeys() | API keys |
Manejo de errores
Archivos
/filesLista tus archivos (paginado)
| assetId | string | Filtra por ID de asset |
| limit | number | Máx resultados (default 50, máx 100) |
| cursor | string | Cursor de paginación |
| status | string | Pon 'DELETED' para listar archivos borrados |
/files/:fileIdObtén los detalles del archivo con una URL de descarga temporal
/filesCrea un registro de archivo y obtén una URL de subida prefirmada
| fileName | string | Requerido |
| contentType | string | Tipo MIME (requerido) |
| size | number | Tamaño en bytes (requerido, 1B–5GB) |
| access | string | 'public' o 'private' (default) |
| region | string | 'LATAM', 'US' o 'EU' |
Sube los bytes con PUT a putUrl, luego haz PATCH del status del archivo a 'DONE'.
/files/:fileIdActualiza nombre, nivel de acceso, metadata o status del archivo
| name | string | Nuevo nombre |
| access | string | 'public' o 'private' |
| metadata | object | Pares clave-valor (se fusionan, máx 10KB) |
| status | string | Solo 'DONE' (desde PENDING) |
/files/:fileIdBorrado suave (retención de 7 días)
/files/:fileId/restoreRestaura un archivo borrado (soft-delete)
/files/search?q=...Búsqueda de archivos en lenguaje natural con IA (requiere AI key)
| q | string | Consulta en lenguaje natural (requerida) |
/files/:fileId/duplicateCrea una copia de un archivo existente (nuevo objeto de storage)
| name | string | Nombre de la copia (opcional, default 'Copy of ...') |
/files/:fileId/permissionsLista los permisos de compartición de un archivo
Operaciones en lote
/files/bulk-uploadCrea varios registros de archivo y obtén URLs de subida prefirmadas (máx 20)
| items | array | Arreglo de { fileName, contentType, size, access? } |
Cada archivo se sube con PUT a su putUrl, luego se pone el status en DONE.
/files/bulk-deleteBorra varios archivos a la vez (soft-delete, máx 100)
| fileIds | string[] | Arreglo de IDs de archivo a borrar |
Imágenes
/files/:fileId/optimizeConvierte la imagen a WebP o AVIF (crea un archivo nuevo)
| format | string | 'webp' (default) o 'avif' |
| quality | number | 1–100 (default: 80 webp, 50 avif) |
/files/:fileId/transformRedimensiona, recorta, rota, voltea o convierte una imagen (crea un archivo nuevo)
| width | number | Ancho objetivo en px |
| height | number | Alto objetivo en px |
| fit | string | 'cover', 'contain', 'fill', 'inside', 'outside' |
| format | string | 'webp', 'avif', 'png', 'jpeg' |
| quality | number | 1–100 |
| rotate | number | Grados |
| flip | boolean | Voltea vertical |
| grayscale | boolean | Convierte a escala de grises |
Formularios
Crea formularios de captura hospedados — servidos en /f/:slug, sin que el usuario final necesite cuenta. Cada envío se guarda, dispara el webhook form.submitted y (si configuraste una) inserta la fila en tu base de datos. Multi-paso por secciones, condicionales y subida de archivos incluidos.
text, email, tel, textarea, select, date, number, checkbox, radio, file, matrix (cuadrícula filas × columnas). Templates: formal, brutalista, institucional, editorial./formsCrea un formulario hospedado standalone. Devuelve la URL pública /f/:slug.
| name | string | Nombre del formulario (requerido) |
| fields | FormField[] | Campos: { name, type, label, required?, placeholder?, options?, showIf?, accept?, section? } |
| theme | string | Template: formal (default) | brutalista | institucional | editorial |
| slug | string | Slug personalizado (opcional; se deriva del nombre) |
| successMessage | string | Mensaje al enviar (opcional) |
/formsLista tus formularios con el conteo de respuestas.
/forms/:formIdActualiza nombre, theme, campos o mensaje de éxito de un formulario.
| name | string | Nuevo nombre (opcional) |
| theme | string | Nuevo template (opcional) |
| fields | FormField[] | Reemplaza los campos (opcional) |
| successMessage | string | Nuevo mensaje al enviar (opcional) |
/forms/:formId/submissionsLista las respuestas de un formulario (más recientes primero).
| limit | number | Query param. Máx 200, default 50. |
type: "file") se guardan privados; la respuesta almacena el fileId. El envío público es POST /forms/:formId/submit (JSON) y la subida POST /forms/:formId/upload (multipart) — ambos sin auth, embebibles en cualquier dominio.Webhooks
Recibe notificaciones POST en tiempo real cuando ocurren eventos. Los payloads se firman con HMAC SHA-256 en el header X-Easybits-Signature. Los webhooks se pausan solos tras 5 fallos de entrega consecutivos.
file.created, file.updated, file.deleted, file.restored, website.created, website.deleted, form.submitted, payment.paid, broadcast.sent/webhooksLista tus webhooks configurados
/webhooksCrea un webhook. El secret solo se devuelve al crearlo — guárdalo.
| url | string | URL HTTPS para recibir las notificaciones POST (requerida) |
| events | string[] | Eventos a los que suscribirse (requerido) |
Máx 10 webhooks por cuenta. La URL debe usar HTTPS.
/webhooks/:webhookIdObtén los detalles del webhook (sin el secret)
/webhooks/:webhookIdActualiza URL, eventos o status del webhook
| url | string | Nueva URL HTTPS |
| events | string[] | Nueva lista de eventos |
| status | string | 'ACTIVE' o 'PAUSED'. Reactivar resetea el contador de fallos. |
/webhooks/:webhookIdBorra un webhook permanentemente
Verificar firmas
Formato del payload
Pagos
Genera links de pago con MercadoPago (Checkout Pro). Conecta tu cuenta en Dashboard → Pagos (pega tu access token). El dinero va directo a tu cuenta de MercadoPago — EasyBits no retiene fondos. Tools del grupo MCP payments.
create_payment_link, list_payment_links. Cuando el pago se aprueba, se dispara el webhook payment.paid.Crear un link de pago
Webhook payment.paid
Email & Broadcasts
Email transaccional, audiencia con tags y newsletters one-shot — todo desde MCP. Los broadcasts agregan un pie de cancelar suscripción automáticamente y saltan a los contactos dados de baja. Tools del grupo MCP email.
send_email, add_contact, list_contacts, create_broadcast, send_broadcast, list_broadcasts. Al terminar un envío se dispara el webhook broadcast.sent.Email transaccional
Audiencia + newsletter
Sitios web
- Crea un sitio — obtienes un
idy una URL tipohttps://my-site.easybits.cloud - Sube archivos con
fileNamepuesto ensites/{websiteId}/path(ej.sites/{id}/index.html) - Haz PUT de los bytes a cada
putUrl, luego pon el status en DONE - Tu sitio está en vivo — el fallback SPA a
index.htmlviene incluido
Ejemplo de deploy
Endpoints
/websitesLista tus sitios web estáticos
/websitesCrea un sitio nuevo
| name | string | Nombre del sitio (requerido) |
/websites/:websiteIdObtén los detalles del sitio
/websites/:websiteIdActualiza el nombre o status del sitio
| name | string | Nuevo nombre |
| status | string | ej. 'DEPLOYED' |
/websites/:websiteIdBorra el sitio y hace soft-delete de todos sus archivos
Documentos
Documentos profesionales generados con IA (reportes, folletos, catálogos, propuestas, CVs) con generación de páginas en paralelo, direcciones de diseño y temas de color semánticos.
/documentsLista todos tus documentos
/documents/:idObtén un documento con todos sus datos de páginas/secciones
/documentsCrea un documento nuevo
| name | string | Nombre del documento (requerido) |
| prompt | string | Descripción para la generación con IA |
| theme | string | Tema: minimal, calido, oceano, noche, bosque, rosa |
| customColors | object | Paleta personalizada: { primary, secondary, accent, surface } |
/documents/:idActualiza la metadata del documento (nombre, tema, colores). Usa las tools de página para cambios de contenido.
| name | string | Nuevo nombre |
| prompt | string | Prompt actualizado |
| theme | string | Nombre del tema |
| customColors | object | Paleta de color personalizada |
/documents/:idBorra un documento
/documents/:id/deployPublica como sitio en vivo en slug.easybits.cloud
/documents/:id/unpublishQuita el sitio en vivo y vuelve a borrador
Gestión de páginas (MCP)
Estas tools están disponibles vía MCP para edición quirúrgica a nivel de página.
get_page_htmlMCPdocumentId, pageId
Obtén el HTML y la metadata de una sola página.
set_page_htmlMCPdocumentId, pageId, html
Actualiza el HTML completo de una página. Preferible a update_document para editar contenido.
get_section_htmlMCPdocumentId, pageId, cssSelector
Obtén el outerHTML de un elemento específico dentro de una página por selector CSS.
set_section_htmlMCPdocumentId, pageId, cssSelector, html
Reemplaza un elemento específico dentro de una página. Permite ediciones quirúrgicas.
add_pageMCPdocumentId, html?, afterPageIndex?, label?
Agrega una página nueva. Opcionalmente pasa el HTML y la posición de inserción.
delete_pageMCPdocumentId, pageId
Elimina una página. No se puede borrar la última que queda.
reorder_pagesMCPdocumentId, pageIds
Reordena todas las páginas. pageIds debe contener cada ID de página exactamente una vez.
get_page_screenshotMCPdocumentId, pageIndex?
Toma un screenshot de una página. Devuelve una imagen PNG (tamaño carta). Úsala para verificar las ediciones visualmente.
Generación con IA (MCP)
generate_documentMCPdocumentId, prompt, skipCover?
Genera todas las páginas con IA vía streaming. Usa skipCover: true para agregar páginas sin regenerar la portada.
refine_document_sectionMCPdocumentId, sectionId, instruction
Cambios quirúrgicos con IA a una página específica. Usa get_page_html para ver el resultado.
regenerate_document_pageMCPdocumentId, sectionId
Rediseña una página por completo manteniendo la misma intención de contenido.
enhance_document_promptMCPname, prompt?, action?
Auto-genera una descripción desde el título o mejora un prompt existente.
get_document_directionsMCPprompt, pageCount?, sourceContent?
Obtén 4 direcciones de diseño (fuentes, colores, mood). Pasa una a generate_document.
clone_documentMCPdocumentId, name?
Duplica un documento con todas sus páginas.
Flujo de trabajo
1. enhance_document_prompt — auto-genera una descripción
2. get_document_directions — obtén 4 direcciones de diseño
3. create_document — crea el documento
4. generate_document — la IA genera todas las páginas
5. get_page_screenshot — verifica las páginas visualmente
6. refine_document_section — ajusta páginas individuales
7. deploy_document — publica en slug.easybits.cloud
Video
Videos editables por escenas que compilan a MP4. Cada escena es una composición HyperFrames: tú das el HTML de la escena (posicionado absoluto, assets como assets/<name>) y un snippet de timeline GSAP opcional contra un tl pausado. Agrega narración por escena → se sintetiza con kokoro (voz em_santa) y se muxea sola; la escena se estira para que la voz quepa. El render corre en un microVM on-demand (decenas de segundos) y el MP4 aterriza en tus archivos, público. Vertical 1080×1920 por default (presets: reel/story/tiktok 9:16, square 1:1, landscape 16:9).
/video-projectsLista tus proyectos de video
/video-projectsCrea un proyecto de video (vacío o con escenas)
| name | string | Nombre del proyecto |
| format | object | Preset de aspecto: { preset: 'reel' | 'story' | 'square' | 'landscape' } |
| theme | string | Fondo: default | dark | light | brand |
| scenes | array | Escenas iniciales opcionales [{ html, timeline?, durationSec?, narration? }] |
/video-projects/:id/scenesAgrega una escena (markup + animación + narración)
| html | string | Markup de la escena (absoluto; assets como assets/<name>) |
| timeline | string | Snippet GSAP contra `tl` (ej. tl.from('#t',{opacity:0,y:40,duration:0.6})) |
| durationSec | number | Duración; si hay narración, se ajusta para que quepa |
| narration | string | Texto de voz en off (kokoro em_santa) |
/video-projects/:id/scenes/:sceneIdEdita una escena. Cambiar narration re-sintetiza la voz en el próximo render.
/video-projects/:id/audioRegistra un asset (imagen/logo) que la caja baja a assets/; referéncialo en el HTML como assets/<name>
| url | string | URL pública del asset |
| name | string | Nombre de archivo, ej. logo.png |
/video-projects/:id/audioMúsica de fondo continua (auto-duckeada bajo la narración). url: null para quitar.
| url | string | URL pública de audio (o null) |
/video-projects/:id/renderCompila, sintetiza la narración pendiente y renderiza a MP4 en el microVM. Síncrono (decenas de segundos).
MCP tools (12)
create_video_projectMCPname?, format?, theme?, scenes?
Crea un proyecto de video doc-style.
list_video_projectsMCPlimit?, offset?, status?
Lista proyectos de video.
get_video_projectMCPprojectId
Proyecto con su lista completa de escenas.
update_video_projectMCPprojectId, name?, theme?, fps?, width?, height?
Actualiza metadata (no toca escenas).
delete_video_projectMCPprojectId
Elimina el proyecto.
add_video_sceneMCPprojectId, html, timeline?, durationSec?, narration?, afterIndex?
Agrega una escena.
set_video_sceneMCPprojectId, sceneId, html?, timeline?, durationSec?, narration?
Edita una escena por id.
delete_video_sceneMCPprojectId, sceneId
Elimina una escena.
reorder_video_scenesMCPprojectId, sceneIds
Reordena todas las escenas.
set_video_musicMCPprojectId, url, name?
Música de fondo (o url:null para quitar).
attach_video_assetMCPprojectId, url, name?, type?
Registra imagen/logo como asset.
render_video_projectMCPprojectId
Compila + renderiza a MP4 con narración kokoro.
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.
Snapshot & fork (clonado copy-on-write)
Congela el estado de una caja viva en una imagen nombrada (snapshot) y arranca N hijos desde ella (fork). Cada hijo es una caja independiente con su propia IP. Patrón estrella: prepara el entorno una vez (deps instaladas, proyecto listo), snapshotea, y bifurca en paralelo para probar N variantes — sin repetir el setup en cada una.
Exponer un puerto (URL pública)
Arranca un servidor dentro del sandbox y obtén una URL HTTPS pública al instante.
Dominio personalizado (custom domain + HTTPS automático)
Sirve un puerto del sandbox bajo tu propio dominio con certificado TLS emitido automáticamente — sin egress fees, sin configurar nada de TLS. Funciona con subdominios (app.cliente.com) y dominios raíz (cliente.com).
sandbox_domain_add→ te devuelve endnsel registro EXACTO a crear.- Crea ese registro en tu DNS: subdominio → CNAME a
cname.sandboxes.easybits.cloud; raíz/apex → A a la IP del edge (apex no admite CNAME). sandbox_domain_verify→ confirma que ya resuelve y sirve con TLS. El cert se emite solo en el primer acceso.
Nota: crea el registro en tu DNS autoritativo. Si tu registrador delega los nameservers a otro proveedor (ej. Google Cloud DNS, Route53), edítalo ahí — no en el panel del registrador.
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 (pausa el TTL)
sandbox_resumeMCPsandboxId
Restaurar desde snapshot (restaura el TTL restante)
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_files_editMCPsandboxId, path, oldString, newString
Edición quirúrgica in-place (sin escaping de shell)
sandbox_logsMCPsandboxId, unit?, lines?, since?, grep?
Logs journald nativos del daemon
sandbox_runtimeMCPsandboxId, action, unit?, buildCommand?
systemd status/restart/rebuild del daemon
sandbox_apply_patchMCPsandboxId, edits[], rebuild?, restart?
Hotfix atómico: edita → rebuild → restart
sandbox_expose_portMCPsandboxId, port
Exponer puerto como URL pública HTTPS
sandbox_domain_addMCPsandboxId, domain, port
Atar dominio propio (devuelve el registro DNS: CNAME o A)
sandbox_domain_removeMCPsandboxId, domain
Quitar dominio personalizado
sandbox_domain_listMCPsandboxId
Listar dominios del sandbox
sandbox_domain_verifyMCPdomain
Confirmar DNS + cert TLS del dominio
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
Flota
Tu flota es un grupo de agentes Ghosty que atienden tus grupos de WhatsApp 24/7. Respondes a tus clientes al instante, sin contratar a nadie y sin dejar a nadie esperando. Conectas tu WhatsApp una vez y eliges en qué grupos contesta.
eb.fleet.create({ engine, name, systemPrompt }), eb.fleet.setModel, setAgentPrompt, setToolGroup…) o la REST /api/v2/fleet-agents. Motores: Claude, DeepSeek, Codex. Así es como Formmy configura sus agentes en tu flota.Cómo conectar (WhatsApp personal)
- Entra a /dash/flota y crea un agente.
- Vincúlalo a tu WhatsApp: escanea el código QR (o usa el código con tu número) desde WhatsApp → Dispositivos vinculados → Vincular dispositivo.
- Prende los grupos que quieras que atienda con los toggles. El agente solo responde en los grupos activos — los demás los ignora (anti-spam).
WhatsApp Business (WABA)
Conecta tu WhatsApp Business API oficial y tu flota atiende desde tu número oficial, sin el riesgo de bloqueo de la vinculación personal. WABA atiende conversaciones 1:1 con tus clientes (no grupos) — ideal para soporte y ventas directas. Cada número tiene su propia identidad (nombre y persona), su propio Inbox y su propio estado de respuesta.
- En /dash/flota, sobre tu agente, pulsa Conectar WhatsApp Business. Se abre el wizard de Meta (Embedded Signup) en un popup.
- Sigue los pasos de Meta para vincular tu cuenta de WhatsApp Business. Al terminar, el número queda asociado a ese agente.
- Un número recién conectado arranca apagado. Elige su estado de respuesta en Conversaciones para que empiece a atender.
Inbox y estados de respuesta (por número)
Cada número WABA tiene un Inbox (botón Conversaciones): ves quién le escribe al agente, su último mensaje, y eliges con granularidad a quién responde. El estado se aplica al instante. Hay 3 estados:
- Apagado — no responde a nadie en ese número.
- Activo — responde a todos, excepto las conversaciones que pauses (cuando quieres atenderlas tú). Útil para soporte abierto.
- Solo a… — responde solo a las conversaciones que actives (lista blanca). Útil cuando estrenas el bot con un grupo reducido antes de abrirlo a todos.
En el Inbox buscas por nombre o número, ves quién está En pausa y, con un botón, pausas o reactivas el agente en cada conversación. Cualquier cambio refresca el Inbox de inmediato.
Cómo funciona: cajas
La capacidad de tu flota se compra en cajas. Cada caja corre 4 agentes Ghosty a la vez y cuesta $299 MXN/mes como suscripción mensual. ¿Necesitas atender más conversaciones al mismo tiempo? Agrega más cajas — cada caja suma 4 agentes a tu flota.
Sandboxes permanentes
Un sandbox efímero se auto-destruye al TTL. Una sandbox permanente corre 24/7 y se cobra flat en MXN/mes como item de suscripción encima de tu plan. Mismo recurso, mismo sandboxId — "permanente" es solo un flag + cobro. La operas igual que cualquier sandbox (exec, archivos, expose_port, dominios).
hosting. Agrega --tools hosting para habilitarlas. Requiere plan de pago (Mega/Tera) — el plan es el gate de acceso.Catálogo de tiers
| Tier | vCPU / RAM / NVMe | Shared | Reserved |
|---|---|---|---|
| estandar | 2 / 2GB / 80GB | $449 | — |
| focus | 4 / 8GB / 64GB | $690 | $1,725 |
| performance | 8 / 16GB / 128GB | $1,290 | $3,225 |
| performance-4x | 16 / 32GB / 256GB | $4,980 | $12,450 |
Precios MXN/mes, NVMe, sin cobro de tráfico. Disco add-on: +100GB NVMe = $99/mes (apilable). CPU reserved (piso garantizado por cgroup) solo desde focus. estandar trae disco grande (80GB) para correr una app 24/7 — pensado para migrar desde Fly/Render.
Crear un sandbox permanente
Promover un efímero a permanente
Levanta un sandbox, pruébalo, y si quieres conservarlo hazlo permanente — conserva el mismo sandboxId, desarma el reaper y arranca el cobro.
release_machine es destructiva (quita el cobro y destruye la VM). Si tu plan se cancela, tus sandboxes se suspenden.Bases de datos
Crea bases de datos SQLite aisladas para tus agentes y apps — una por cliente, proyecto o recurso. Corren sobre sqld (libsql-server), con scale-to-zero: no pagas cómputo cuando nadie consulta. Cada DB es un namespace independiente; tu agente las crea, consulta y llena sin que escribas backend.
Crear y consultar
Herramientas MCP del grupo databases
db_listMCP—
Listar tus bases de datos
db_createMCPname, description?
Crear una base de datos aislada
db_getMCPdbId
Obtener una base de datos
db_deleteMCPdbId
Eliminar la base de datos y todos sus datos (irreversible)
db_queryMCPdbId, sql, args?
Ejecutar una consulta SQL
db_execMCPdbId, statements
Batch de hasta 20 sentencias
db_importMCPdbId, table, columns, rows, onConflict?
Importar hasta 10,000 filas de una vez
database.created y database.deleted. Combínalos con la sección Webhooks para notificar sistemas externos.Secretos
Guarda credenciales (API tokens, OAuth, llaves) cifradas AES-256-GCM en tu cuenta. Un secreto es write-only: una vez guardado, su valor nunca se puede volver a leer por API ni MCP — solo se inyecta como variable de entorno dentro de un sandbox vía agent_run({ secrets: [nombre, ...] }). Es también donde vive el OAuth que usa tu Flota.
[A-Z_][A-Z0-9_]* (mayúsculas, dígitos y guiones bajos).Herramientas MCP del grupo secrets
secret_setMCPname, value
Crear o sobrescribir un secreto (cifrado; el valor no se devuelve jamás)
secret_listMCP—
Listar nombres, fecha de creación y último uso (nunca valores)
secret_deleteMCPname
Eliminar un secreto por nombre
Llamadas
Salas de videollamada con grabación en HD, self-hosted (template livekit-svc). Tu agente crea la sala, los participantes se unen desde el navegador (cámara + pantalla compartida, sin instalar nada), y el servidor graba el layout completo en 1080p. Al terminar, el MP4 se sube a tus Archivos. Sin servidores de terceros, sin límite de duración.
sandbox: call_create, call_record, call_stop, call_status, call_files, call_transcript, call_destroy. Las llaves del servidor de video se generan solas — no necesitas cuenta en ningún proveedor ni pasar secrets.Crear una llamada y grabar
create levanta la sala y devuelve roomUrl — compártelo con los participantes. La sala se auto-destruye a las 3 horas si no la cierras antes.
Estado, archivos y cierre
status reporta si está grabando y quién está conectado; files lista las grabaciones; destroy cierra la sala limpiamente (sube grabaciones pendientes y libera la VM).
Transcript de la llamada
Al detener la grabación, la caja transcribe el audio con Whisper embebido (español, on-device — sin proveedor externo) y sube el .txt a tus Archivos. transcript devuelve el texto inline (no un link) más un status: transcribing (Whisper procesando, reintenta en ~1 min), ready (texto en text), failed, unavailable o no_recording. Con sandboxId = estado en vivo del box; sin él = el transcript más reciente de Archivos.
call_destroy, la sala se apaga sola al TTL de 3 horas.Cuenta & Uso
/usageObtén las estadísticas de uso de la cuenta: storage, conteo de archivos, info del plan
/providersLista tus proveedores de storage configurados
/keysLista tus API keys (solo con auth de sesión)
Errores & Límites
| Status | Significado |
|---|---|
| 400 | Petición inválida (params incorrectos) |
| 401 | No autorizado (API key faltante/inválida) |
| 403 | Prohibido (scope insuficiente) |
| 404 | Recurso no encontrado |
| 429 | Rate limited (demasiadas peticiones) |
| 500 | Error del servidor |
Todas las respuestas de error tienen la misma forma: un JSON { "error": "message" }, opcionalmente con campos extra (ej. code, status). Por MCP se devuelve el mismo payload con isError: true.
Todo endpoint de lista devuelve el mismo envelope: { items, nextCursor, hasMore, total? }. Cuando hasMore es true, regresa nextCursor como cursor (u offset para documentos/sitios) para traer la siguiente página.
Límites: 100 peticiones cada 15 minutos en todos los planes.
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 |
| payments | 2 | Links de pago con MercadoPago (BYO): create_payment_link, list_payment_links |
| 6 | Email transaccional + contactos + broadcasts (send_email, add_contact, create_broadcast…) | |
| all | ~104 | Todo (incluye slides y agentes) |
