Documentación de la API

Almacenamiento de archivos agentic-first para desarrolladores y agentes de IA

URL base: https://www.easybits.cloud/api/v2

3 formas de integrarte: REST API (abajo), SDK tipado (npm i @easybits.cloud/sdk), o servidor MCP (100+ herramientas para agentes, 12 core por defecto).

Inicio rápido

  1. Crea una cuenta en easybits.cloud
  2. Ve al Dashboard de Desarrollador y crea una API key
  3. 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.

ScopeAllows
READList and get files, websites, documents, webhooks, and usage stats
WRITECreate, upload, update, optimize, transform, and share files. Create websites, webhooks, databases, documents, and presentations
DELETESoft-delete and permanently remove files, websites, webhooks, and other resources
ADMINFull 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.

Web clients (Claude.ai / Cowork): use OAuth 2.1 + Dynamic Client Registration instead of an API key. See the Claude Cowork section →

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

  1. Instala el CLI: npm install -g ghostycode (o curl -fsSL https://formmy.app/ghosty/install.sh | sh)
  2. Autentica con tu key de EasyBits (sirve para LLM + MCP): ghosty auth set --provider easybits --api-key "TU_EASYBITS_API_KEY"
  3. 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

EasyBits MCP

100+ herramientas para archivos, documentos, DBs, sandboxes y más

🧠DeepSeek V4

Modelo principal con razonamiento profundo (thinking tokens)

🌐Búsqueda web

BrightData integrado para búsquedas y scraping

🔌MCP dinámico

Agrega y quita servidores MCP en runtime sin reiniciar

📦Sandboxes

Firecracker microVMs para ejecutar código y agentes aislados

🔄Auto-actualización

ghosty update para mantener todo al día

¿Ya usas Ghosty Code? Mantén el binario al día con 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

  1. In Cowork, open Settings → Connectors → Add custom connector
  2. Paste the MCP URL: https://www.easybits.cloud/api/mcp
  3. Click Connect — you'll be redirected to EasyBits to log in
  4. Authorize the connector. You're done — the agent has access to your workspace
Tip: append ?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:

EndpointSpecPurpose
/.well-known/oauth-protected-resourceRFC 9728Tells clients which Authorization Server protects /api/mcp
/.well-known/oauth-authorization-serverRFC 8414Advertises authorize, token, and registration endpoints
/oauth/registerRFC 7591Dynamic Client Registration — client_id + secret issued on POST
/oauth/authorizeOAuth 2.1User consent + code issuance (PKCE S256 required)
/oauth/tokenOAuth 2.1Exchanges code + verifier for a 1-hour JWT access token

Handshake flow

Flowtypescript

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 mcp scope — the authorized session has full access to the MCP handler.
Deep dive in the OAuth 2.1 + DCR blog post.

SDK

El SDK tipado envuelve toda la REST API. Instálalo y úsalo en cualquier proyecto Node.js/Bun/Deno.

Instalartypescript

Todos los métodos

Archivos

MethodDescription
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

MethodDescription
bulkUploadFiles(items)Sube hasta 20 archivos a la vez
bulkDeleteFiles(fileIds)Borra hasta 100 archivos a la vez

Imágenes

MethodDescription
optimizeImage(params)Convierte a WebP/AVIF
transformImage(params)Redimensiona, rota, voltea, convierte, escala de grises

Compartir

MethodDescription
shareFile(params)Comparte con otro usuario por email
generateShareToken(fileId, expiresIn?)URL de descarga temporal
listShareTokens(params?)Lista tokens (paginado)

Formularios

MethodDescription
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

MethodDescription
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

MethodDescription
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

MethodDescription
getUsageStats()Storage, conteo de archivos, info del plan
listProviders()Proveedores de storage
listKeys()API keys

Manejo de errores

SDKtypescript

Archivos

GET/files

Lista tus archivos (paginado)

Query Parameters
assetIdstringFiltra por ID de asset
limitnumberMáx resultados (default 50, máx 100)
cursorstringCursor de paginación
statusstringPon 'DELETED' para listar archivos borrados
Response
SDK
GET/files/:fileId

Obtén los detalles del archivo con una URL de descarga temporal

Response
SDK
POST/files

Crea un registro de archivo y obtén una URL de subida prefirmada

Request Body (JSON)
fileNamestringRequerido
contentTypestringTipo MIME (requerido)
sizenumberTamaño en bytes (requerido, 1B–5GB)
accessstring'public' o 'private' (default)
regionstring'LATAM', 'US' o 'EU'
Response
SDK

Sube los bytes con PUT a putUrl, luego haz PATCH del status del archivo a 'DONE'.

PATCH/files/:fileId

Actualiza nombre, nivel de acceso, metadata o status del archivo

Request Body (JSON)
namestringNuevo nombre
accessstring'public' o 'private'
metadataobjectPares clave-valor (se fusionan, máx 10KB)
statusstringSolo 'DONE' (desde PENDING)
SDK
DELETE/files/:fileId

Borrado suave (retención de 7 días)

Response
SDK
POST/files/:fileId/restore

Restaura un archivo borrado (soft-delete)

Response
SDK
GET/files/search?q=...

Búsqueda de archivos en lenguaje natural con IA (requiere AI key)

Query Parameters
qstringConsulta en lenguaje natural (requerida)
Response
SDK
POST/files/:fileId/duplicate

Crea una copia de un archivo existente (nuevo objeto de storage)

Request Body (JSON)
namestringNombre de la copia (opcional, default 'Copy of ...')
Response
SDK
GET/files/:fileId/permissions

Lista los permisos de compartición de un archivo

Response
SDK

Operaciones en lote

POST/files/bulk-upload

Crea varios registros de archivo y obtén URLs de subida prefirmadas (máx 20)

Request Body (JSON)
itemsarrayArreglo de { fileName, contentType, size, access? }
Response
SDK

Cada archivo se sube con PUT a su putUrl, luego se pone el status en DONE.

POST/files/bulk-delete

Borra varios archivos a la vez (soft-delete, máx 100)

Request Body (JSON)
fileIdsstring[]Arreglo de IDs de archivo a borrar
Response
SDK

Imágenes

POST/files/:fileId/optimize

Convierte la imagen a WebP o AVIF (crea un archivo nuevo)

Request Body (JSON)
formatstring'webp' (default) o 'avif'
qualitynumber1–100 (default: 80 webp, 50 avif)
Response
SDK
POST/files/:fileId/transform

Redimensiona, recorta, rota, voltea o convierte una imagen (crea un archivo nuevo)

Request Body (JSON)
widthnumberAncho objetivo en px
heightnumberAlto objetivo en px
fitstring'cover', 'contain', 'fill', 'inside', 'outside'
formatstring'webp', 'avif', 'png', 'jpeg'
qualitynumber1–100
rotatenumberGrados
flipbooleanVoltea vertical
grayscalebooleanConvierte a escala de grises
Response
SDK

Compartir

POST/files/:fileId/share

Comparte un archivo con otro usuario por email

Request Body (JSON)
targetEmailstringEmail del destinatario (requerido)
canReadbooleanDefault: true
canWritebooleanDefault: false
canDeletebooleanDefault: false
SDK
POST/files/:fileId/share-token

Genera una URL de descarga temporal

Request Body (JSON)
expiresInnumberSegundos (60–604800, default 3600)
Response
SDK
GET/share-tokens

Lista los share tokens (paginado)

Query Parameters
fileIdstringFiltra por archivo
limitnumberMáx resultados
cursorstringCursor de paginación
SDK

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.

Tipos de campo: text, email, tel, textarea, select, date, number, checkbox, radio, file, matrix (cuadrícula filas × columnas). Templates: formal, brutalista, institucional, editorial.
POST/forms

Crea un formulario hospedado standalone. Devuelve la URL pública /f/:slug.

Request Body (JSON)
namestringNombre del formulario (requerido)
fieldsFormField[]Campos: { name, type, label, required?, placeholder?, options?, showIf?, accept?, section? }
themestringTemplate: formal (default) | brutalista | institucional | editorial
slugstringSlug personalizado (opcional; se deriva del nombre)
successMessagestringMensaje al enviar (opcional)
Response
SDK
GET/forms

Lista tus formularios con el conteo de respuestas.

Response
SDK
PATCH/forms/:formId

Actualiza nombre, theme, campos o mensaje de éxito de un formulario.

Request Body (JSON)
namestringNuevo nombre (opcional)
themestringNuevo template (opcional)
fieldsFormField[]Reemplaza los campos (opcional)
successMessagestringNuevo mensaje al enviar (opcional)
SDK
GET/forms/:formId/submissions

Lista las respuestas de un formulario (más recientes primero).

Request Body (JSON)
limitnumberQuery param. Máx 200, default 50.
Response
SDK
Los archivos subidos (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.

Eventos: file.created, file.updated, file.deleted, file.restored, website.created, website.deleted, form.submitted, payment.paid, broadcast.sent
GET/webhooks

Lista tus webhooks configurados

Response
SDK
POST/webhooks

Crea un webhook. El secret solo se devuelve al crearlo — guárdalo.

Request Body (JSON)
urlstringURL HTTPS para recibir las notificaciones POST (requerida)
eventsstring[]Eventos a los que suscribirse (requerido)
Response
SDK

Máx 10 webhooks por cuenta. La URL debe usar HTTPS.

GET/webhooks/:webhookId

Obtén los detalles del webhook (sin el secret)

SDK
PATCH/webhooks/:webhookId

Actualiza URL, eventos o status del webhook

Request Body (JSON)
urlstringNueva URL HTTPS
eventsstring[]Nueva lista de eventos
statusstring'ACTIVE' o 'PAUSED'. Reactivar resetea el contador de fallos.
SDK
DELETE/webhooks/:webhookId

Borra un webhook permanentemente

Response
SDK

Verificar firmas

Node.jsjavascript

Formato del payload

JSONjson

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.

Tools MCP: create_payment_link, list_payment_links. Cuando el pago se aprueba, se dispara el webhook payment.paid.

Crear un link de pago

MCP (Claude)typescript

Webhook payment.paid

JSONjson

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.

Tools MCP: 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

MCP (Claude)typescript

Audiencia + newsletter

MCP (Claude)typescript

Sitios web

Cómo funcionan los deploys de sitios:
  1. Crea un sitio — obtienes un id y una URL tipo https://my-site.easybits.cloud
  2. Sube archivos con fileName puesto en sites/{websiteId}/path (ej. sites/{id}/index.html)
  3. Haz PUT de los bytes a cada putUrl, luego pon el status en DONE
  4. Tu sitio está en vivo — el fallback SPA a index.html viene incluido

Ejemplo de deploy

SDKtypescript

Endpoints

GET/websites

Lista tus sitios web estáticos

SDK
POST/websites

Crea un sitio nuevo

Request Body (JSON)
namestringNombre del sitio (requerido)
Response
SDK
GET/websites/:websiteId

Obtén los detalles del sitio

SDK
PATCH/websites/:websiteId

Actualiza el nombre o status del sitio

Request Body (JSON)
namestringNuevo nombre
statusstringej. 'DEPLOYED'
SDK
DELETE/websites/:websiteId

Borra el sitio y hace soft-delete de todos sus archivos

SDK

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.

GET/documents

Lista todos tus documentos

Response
SDK
GET/documents/:id

Obtén un documento con todos sus datos de páginas/secciones

Response
SDK
POST/documents

Crea un documento nuevo

Request Body (JSON)
namestringNombre del documento (requerido)
promptstringDescripción para la generación con IA
themestringTema: minimal, calido, oceano, noche, bosque, rosa
customColorsobjectPaleta personalizada: { primary, secondary, accent, surface }
Response
SDK
PATCH/documents/:id

Actualiza la metadata del documento (nombre, tema, colores). Usa las tools de página para cambios de contenido.

Request Body (JSON)
namestringNuevo nombre
promptstringPrompt actualizado
themestringNombre del tema
customColorsobjectPaleta de color personalizada
SDK
DELETE/documents/:id

Borra un documento

SDK
POST/documents/:id/deploy

Publica como sitio en vivo en slug.easybits.cloud

Response
SDK
POST/documents/:id/unpublish

Quita el sitio en vivo y vuelve a borrador

SDK

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_htmlMCP

documentId, pageId

Obtén el HTML y la metadata de una sola página.

set_page_htmlMCP

documentId, pageId, html

Actualiza el HTML completo de una página. Preferible a update_document para editar contenido.

get_section_htmlMCP

documentId, pageId, cssSelector

Obtén el outerHTML de un elemento específico dentro de una página por selector CSS.

set_section_htmlMCP

documentId, pageId, cssSelector, html

Reemplaza un elemento específico dentro de una página. Permite ediciones quirúrgicas.

add_pageMCP

documentId, html?, afterPageIndex?, label?

Agrega una página nueva. Opcionalmente pasa el HTML y la posición de inserción.

delete_pageMCP

documentId, pageId

Elimina una página. No se puede borrar la última que queda.

reorder_pagesMCP

documentId, pageIds

Reordena todas las páginas. pageIds debe contener cada ID de página exactamente una vez.

get_page_screenshotMCP

documentId, 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_documentMCP

documentId, 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_sectionMCP

documentId, sectionId, instruction

Cambios quirúrgicos con IA a una página específica. Usa get_page_html para ver el resultado.

regenerate_document_pageMCP

documentId, sectionId

Rediseña una página por completo manteniendo la misma intención de contenido.

enhance_document_promptMCP

name, prompt?, action?

Auto-genera una descripción desde el título o mejora un prompt existente.

get_document_directionsMCP

prompt, pageCount?, sourceContent?

Obtén 4 direcciones de diseño (fuentes, colores, mood). Pasa una a generate_document.

clone_documentMCP

documentId, 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).

GET/video-projects

Lista tus proyectos de video

Response
SDK
POST/video-projects

Crea un proyecto de video (vacío o con escenas)

Request Body (JSON)
namestringNombre del proyecto
formatobjectPreset de aspecto: { preset: 'reel' | 'story' | 'square' | 'landscape' }
themestringFondo: default | dark | light | brand
scenesarrayEscenas iniciales opcionales [{ html, timeline?, durationSec?, narration? }]
Response
SDK
POST/video-projects/:id/scenes

Agrega una escena (markup + animación + narración)

Request Body (JSON)
htmlstringMarkup de la escena (absoluto; assets como assets/<name>)
timelinestringSnippet GSAP contra `tl` (ej. tl.from('#t',{opacity:0,y:40,duration:0.6}))
durationSecnumberDuración; si hay narración, se ajusta para que quepa
narrationstringTexto de voz en off (kokoro em_santa)
Response
SDK
PATCH/video-projects/:id/scenes/:sceneId

Edita una escena. Cambiar narration re-sintetiza la voz en el próximo render.

SDK
PUT/video-projects/:id/audio

Registra un asset (imagen/logo) que la caja baja a assets/; referéncialo en el HTML como assets/<name>

Request Body (JSON)
urlstringURL pública del asset
namestringNombre de archivo, ej. logo.png
SDK
POST/video-projects/:id/audio

Música de fondo continua (auto-duckeada bajo la narración). url: null para quitar.

Request Body (JSON)
urlstringURL pública de audio (o null)
SDK
POST/video-projects/:id/render

Compila, sintetiza la narración pendiente y renderiza a MP4 en el microVM. Síncrono (decenas de segundos).

Response
SDK

MCP tools (12)

create_video_projectMCP

name?, format?, theme?, scenes?

Crea un proyecto de video doc-style.

list_video_projectsMCP

limit?, offset?, status?

Lista proyectos de video.

get_video_projectMCP

projectId

Proyecto con su lista completa de escenas.

update_video_projectMCP

projectId, name?, theme?, fps?, width?, height?

Actualiza metadata (no toca escenas).

delete_video_projectMCP

projectId

Elimina el proyecto.

add_video_sceneMCP

projectId, html, timeline?, durationSec?, narration?, afterIndex?

Agrega una escena.

set_video_sceneMCP

projectId, sceneId, html?, timeline?, durationSec?, narration?

Edita una escena por id.

delete_video_sceneMCP

projectId, sceneId

Elimina una escena.

reorder_video_scenesMCP

projectId, sceneIds

Reordena todas las escenas.

set_video_musicMCP

projectId, url, name?

Música de fondo (o url:null para quitar).

attach_video_assetMCP

projectId, url, name?, type?

Registra imagen/logo como asset.

render_video_projectMCP

projectId

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.

34 herramientas MCP en el grupo sandbox. Agrega --tools sandbox para habilitarlas. Ver tool groups.

Templates

Cada sandbox se crea desde un template. Estos son los disponibles:

TemplateTipoDescripción
code-interpretersandboxPython con kernel Jupyter persistente. Variables, imports y gráficas sobreviven entre celdas
python / node / bunsandboxRuntimes base. Cada sandbox_run_code ejecuta un proceso fresco
ubuntusandboxLinux completo. Ideal para instalar paquetes, compilar, o correr servidores
rust-ghostyagenteGhosty: cerebro CodeWhale/Rust DeepSeek-first con canales web SSE y WhatsApp
claude-codeagenteClaude Agent SDK loop. Modelo Sonnet 4.6, billing por token
computer-ghostyagenteComputer-use con escritorio Linux XFCE + terminal noVNC público
ghostyclaw / openclawagenteDaemons 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.

El snapshot NO detiene la caja — sigue corriendo. El fork la clona; los hijos heredan el disco completo al momento del snapshot y cuentan contra tu límite de sandboxes concurrentes.

Exponer un puerto (URL pública)

Arranca un servidor dentro del sandbox y obtén una URL HTTPS pública al instante.

SDKtypescript

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).

Flujo (3 pasos):
  1. sandbox_domain_add → te devuelve en dns el registro EXACTO a crear.
  2. 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).
  3. sandbox_domain_verify → confirma que ya resuelve y sirve con TLS. El cert se emite solo en el primer acceso.
SDKtypescript

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.

SDKtypescript

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.

SDKtypescript

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.

SDKtypescript

Herramientas MCP del grupo sandbox

sandbox_createMCP

template, timeoutSeconds

Crear un sandbox nuevo

sandbox_listMCP

Listar sandboxes activos

sandbox_statusMCP

sandboxId

Estado del sandbox (running/stopped/error)

sandbox_destroyMCP

sandboxId

Destruir y liberar recursos

sandbox_extendMCP

sandboxId, extendSeconds

Extender TTL del sandbox

sandbox_suspendMCP

sandboxId

Snapshot a disco y liberar CPU (pausa el TTL)

sandbox_resumeMCP

sandboxId

Restaurar desde snapshot (restaura el TTL restante)

sandbox_execMCP

sandboxId, command

Ejecutar comando (sync, 60s timeout)

sandbox_exec_backgroundMCP

sandboxId, command

Ejecutar comando en background

sandbox_exec_statusMCP

sandboxId, execId

Consultar estado de ejecución background

sandbox_run_codeMCP

sandboxId, code, lang

Ejecutar Python/Node/Bash inline

sandbox_run_cellMCP

sandboxId, code

Ejecutar celda en kernel Jupyter persistente

sandbox_files_writeMCP

sandboxId, path, content

Escribir archivo en el sandbox

sandbox_files_readMCP

sandboxId, path

Leer archivo del sandbox

sandbox_files_listMCP

sandboxId, path

Listar directorio

sandbox_files_editMCP

sandboxId, path, oldString, newString

Edición quirúrgica in-place (sin escaping de shell)

sandbox_logsMCP

sandboxId, unit?, lines?, since?, grep?

Logs journald nativos del daemon

sandbox_runtimeMCP

sandboxId, action, unit?, buildCommand?

systemd status/restart/rebuild del daemon

sandbox_apply_patchMCP

sandboxId, edits[], rebuild?, restart?

Hotfix atómico: edita → rebuild → restart

sandbox_expose_portMCP

sandboxId, port

Exponer puerto como URL pública HTTPS

sandbox_domain_addMCP

sandboxId, domain, port

Atar dominio propio (devuelve el registro DNS: CNAME o A)

sandbox_domain_removeMCP

sandboxId, domain

Quitar dominio personalizado

sandbox_domain_listMCP

sandboxId

Listar dominios del sandbox

sandbox_domain_verifyMCP

domain

Confirmar DNS + cert TLS del dominio

agent_createMCP

template

Crear agente persistente (endpoint HTTP)

agent_listMCP

Listar agentes persistentes

agent_messageMCP

agentId, content

Enviar mensaje a un agente

agent_runMCP

prompt, model?

Agente Claude one-shot (async)

agent_run_statusMCP

jobId

Consultar estado de agent_run

templates_listMCP

tier?

Listar templates disponibles

Rate limits: 10 spawns/min (sandbox_create, agent_create, agent_run). 120 operaciones/min para el resto. Sandboxes se auto-destruyen al TTL (default 5 min; máx según plan: Byte 1h · Mega 4h · Tera 24h).

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.

¿Prefieres UI? Administra tu flota desde el dashboard en /dash/flota — crear agentes, vincular WhatsApp, prender/apagar grupos y desconectar.
¿Construyes sobre EasyBits? Crea y configura agentes por código con el SDK (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)

  1. Entra a /dash/flota y crea un agente.
  2. 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.
  3. 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.

  1. En /dash/flota, sobre tu agente, pulsa Conectar WhatsApp Business. Se abre el wizard de Meta (Embedded Signup) en un popup.
  2. Sigue los pasos de Meta para vincular tu cuenta de WhatsApp Business. Al terminar, el número queda asociado a ese agente.
  3. Un número recién conectado arranca apagado. Elige su estado de respuesta en Conversaciones para que empiece a atender.
Coexistencia: puedes conectar el mismo número que ya usas en la app de WhatsApp. La coexistencia siempre está activa: el agente atiende mientras tú no estás, y en cuanto respondes una conversación desde tu teléfono el bot se pausa solo en esa conversación (handoff humano). Desde el Inbox lo reactivas o lo pausas tú con un botón.

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.

Compra cajas para tu flota en /dash/packs — elige cuántas cajas necesitas y se suman a tu capacidad al instante.

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).

5 herramientas MCP en el grupo hosting. Agrega --tools hosting para habilitarlas. Requiere plan de pago (Mega/Tera) — el plan es el gate de acceso.
¿Prefieres UI? Administra tus sandboxes desde el dashboard en /dash/hosting — crear, ver estado, promover un sandbox a permanente, y liberar.

Catálogo de tiers

TiervCPU / RAM / NVMeSharedReserved
estandar2 / 2GB / 80GB$449
focus4 / 8GB / 64GB$690$1,725
performance8 / 16GB / 128GB$1,290$3,225
performance-4x16 / 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.

Cobro: el plan da acceso; cada sandbox factura aparte (flat MXN/mes, prorrateado). 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.

Límite por plan: Byte 3 · Mega 10 · Tera 20 bases de datos. El nombre admite letras, números, guiones y guiones bajos (máx 64 caracteres).

Crear y consultar

Herramientas MCP del grupo databases

db_listMCP

Listar tus bases de datos

db_createMCP

name, description?

Crear una base de datos aislada

db_getMCP

dbId

Obtener una base de datos

db_deleteMCP

dbId

Eliminar la base de datos y todos sus datos (irreversible)

db_queryMCP

dbId, sql, args?

Ejecutar una consulta SQL

db_execMCP

dbId, statements

Batch de hasta 20 sentencias

db_importMCP

dbId, table, columns, rows, onConflict?

Importar hasta 10,000 filas de una vez

Eventos de webhook: 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.

Solo disponible vía MCP (no hay endpoint REST ni método SDK, por seguridad). Los nombres deben ser estilo variable de entorno: [A-Z_][A-Z0-9_]* (mayúsculas, dígitos y guiones bajos).

Herramientas MCP del grupo secrets

secret_setMCP

name, 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_deleteMCP

name

Eliminar un secreto por nombre

MCPtypescript

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.

7 herramientas MCP en el grupo 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.

Privacidad: cada sala corre en su propia microVM aislada con llaves generadas por instancia. Los participantes eligen entrar con cámara/mic apagados (el dispositivo se suelta de verdad, sin parpadeo). Si no llamas call_destroy, la sala se apaga sola al TTL de 3 horas.

Cuenta & Uso

GET/usage

Obtén las estadísticas de uso de la cuenta: storage, conteo de archivos, info del plan

Response
SDK
GET/providers

Lista tus proveedores de storage configurados

Response
SDK
GET/keys

Lista tus API keys (solo con auth de sesión)

SDK

Errores & Límites

StatusSignificado
400Petición inválida (params incorrectos)
401No autorizado (API key faltante/inválida)
403Prohibido (scope insuficiente)
404Recurso no encontrado
429Rate limited (demasiadas peticiones)
500Error 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.

GrupoHerramientasDescripción
core12Archivos, DB, documentos, cotizaciones, estadísticas (default)
sandbox22MicroVMs Firecracker: crear, ejecutar, exponer puertos, agentes persistentes y one-shot
files~37Todas las ops de archivos: bulk, sharing, permisos, webhooks, imágenes, AI keys
docs~33Documentos: generación AI, refine, screenshots, structured docs
sites~8Sitios web: CRUD, upload, deploy
brand~8Brand kits, plantillas, temas
payments2Links de pago con MercadoPago (BYO): create_payment_link, list_payment_links
email6Email transaccional + contactos + broadcasts (send_email, add_contact, create_broadcast…)
all~104Todo (incluye slides y agentes)

Uso