API

Referencia de la API

Todos los endpoints de /api/v2 — configuración del agente, bases de datos, documentos, turnos, WhatsApp, tableros, cuenta, conversaciones, archivos y partners — con su esquema OpenAPI 3.1.

Actualizado 2026-10-01

Pruébala desde aquí: en el visor de abajo, pega el token de tu agente (Agentes → tu agente → Generar token) en el campo de autenticación agentToken y ejecuta GET /api/v2/agents/{id}; las llamadas salen contra la API real.

La especificación completa está en (OpenAPI 3.1). Abajo se renderiza; puedes importarla en Postman, Bruno o generar un cliente con openapi-generator.

Base: https://www.ghosty.studio. Todas las rutas exigen Authorization: Bearer () y responden JSON con Cache-Control: no-store.

Mapa

RecursoRutas
Configuración del agente (token gat_ o sesión)GET/PATCH/DELETE /api/v2/agents/:id, PUT/DELETE/GET …/files/*, GET …/skills, GET/PUT …/skills/house, PUT/PATCH/DELETE …/skills/:slug, GET/PUT …/mcp, POST …/restart, GET …/templates, GET/POST/DELETE …/shares, GET/POST/DELETE …/teams, GET/PUT …/demo — ver y
Token, memoria y cesión del agentePOST …/token/rotate (token gat_ nuevo, se enseña una vez), POST …/token/revoke — sólo el dueño con su sesión · GET/POST/DELETE …/memory (reglas y promos) · POST …/transfer (cederlo con to o moverlo de espacio con workspace; dryRun) · [`ghosty agents token
El agente como archivoGET …/export (YAML) y POST …/apply (plan y aplicar), con tu sesión (no gat_); GET/POST …/bundle (estilo Eve) ·
Bases de datos y fotosGET …/dbs, PUT/DELETE …/dbs/:db, POST …/dbs/:db/query, GET …/dbs/:db/export, POST …/dbs/:db/import, POST …/dbs/:db/rehost, POST …/dbs/:db/photos · ,
DocumentosGET/POST …/documents, PUT/DELETE …/documents/:doc, GET/POST …/documents/:doc/versions, POST …/versions/:n/restore ·
Turnos y diagnósticoPOST …/try, GET …/turns, GET …/turns/:turnId, GET …/doctor, GET/POST …/box · ,
WhatsAppGET/PUT …/whatsapp, POST …/whatsapp/link, POST …/whatsapp/history, GET/POST/DELETE …/wa, GET/POST …/wa/groups, POST …/wa/import, GET …/channels/links (quién contestó por última vez; orphans=1) · , ,
MessengerGET …/messenger (cada página: quién la contesta y último webhook; health=1 pregunta a Meta por el token), POST …/messenger {pageId, on, take?} (prenderla o apagarla para este agente) ·
Tableros y tarjetasPOST …/board/archive, GET …/board/conversations, GET …/board/conversations/:ref, POST …/board/conversations/:ref/pause, POST …/board/conversations/:ref/reply, GET …/board/pending, GET/POST/DELETE /api/v2/workspaces/:slug/boards, POST …/boards/move-cards, GET/POST …/boards/access, GET/POST/DELETE /api/v2/workspaces/:slug/members, GET /api/v2/access/why ·
CuentaGET/PATCH/DELETE /api/v2/me (PATCH {name} cambia tu nombre), PUT/DELETE /api/v2/me/avatar (tu foto: JPG, PNG o WebP de hasta 5 MB), GET /api/v2/me/usage, GET /api/v2/me/credentials, PUT/DELETE …/credentials/:provider · ,
Bitácora y fábricaGET /api/v2/audit · GET /api/v2/workspaces/:slug/factory/runs, GET/POST …/factory/runs/:runId · GET /api/v2/teams/handles · ,
AgentesGET /api/v2/me/agents · POST /api/v2/me/agents (crear, scope agents:write; dryRun, workspace, like…) · GET …/agents/:agentId/schedule, GET …/agents/:agentId/tasks · · GET·POST …/agents/:agentId/watches, POST·DELETE …/watches/:id ({action:"check", dryRun} · {action:"resume"}) ·
ConversacionesGET/POST …/agents/:agentId/conversations, GET/PATCH/DELETE …/conversations/:sessionId (?archivos=1 trae también sus archivos), GET /api/v2/me/conversations?agentes=a,b (las listas de varios agentes en una respuesta)
TurnosPOST …/:sessionId/messages (202), GET …/:sessionId/events (SSE), POST …/:sessionId/cancel
Permisos y modeloPOST …/:sessionId/permission, POST …/:sessionId/model
ProgramadosGET/POST …/:sessionId/schedule, DELETE …/:sessionId/schedule/:id
CompartirGET/POST/DELETE …/:sessionId/share
ArchivosGET/POST /api/v2/me/files, GET/DELETE /api/v2/me/files/:id, POST /api/v2/me/stt
ConectoresGET /api/v2/me/connectors, POST …/:id/start, POST …/:id/credentials, DELETE …/:id
Documentos editablesGET/PUT/POST /api/v2/me/docs/:id (versiones, guardar, restaurar), `GET …/export?format=pdf
MemoriasGET/POST /api/v2/me/memories, PATCH/DELETE /api/v2/me/memories/:id
Hilo largoPOST /api/v2/me/agents/:agentId/conversations/:sessionId/continue
DispositivosPOST/DELETE /api/v2/me/devices · POST /api/v2/me/push (mándate un aviso; token gpu_ o tu bearer) · GET/POST/DELETE /api/v2/me/push-tokens
Partners (credencial gpk_/gps_)/api/v2/partner, …/partner/credentials[/:id[/rotate]], …/partner/audit, GET …/partner/usage, …/partner/agent, …/partner/tenants[/:externalId], POST …/partner/turns ·

Un turno completo

typescript
const base = "https://www.ghosty.studio/api/v2/me";const h = { Authorization: `Bearer ${token}`, "Content-Type": "application/json" };
// 1. abre una conversaciónconst { id: sessionId } = await (await fetch(`${base}/agents/${agentId}/conversations`, { method: "POST", headers: h })).json();
// 2. suscríbete a los eventos ANTES de mandar (el stream reproduce lo ya emitido, así que el orden no es crítico)const es = new EventSource(`${base}/agents/${agentId}/conversations/${sessionId}/events`); // añade el bearer con un polyfill que acepte headerses.addEventListener("chunk", (e) => process.stdout.write(JSON.parse(e.data).text));es.addEventListener("done", () => es.close());
// 3. manda el mensaje: responde 202 al aceptarlo, no al terminarawait fetch(`${base}/agents/${agentId}/conversations/${sessionId}/messages`, {  method: "POST", headers: h,  body: JSON.stringify({ content: "Resume este PDF en 5 líneas", images: [{ name: "contrato.pdf", mimeType: "application/pdf", data: base64 }] }),});

Adjuntar algo que ya está en la cuenta

Descargar todo: GET /api/v2/me/files?all=1 lista TODOS los archivos de la cuenta (documentos, conversaciones y lo que llegó por los canales de tus agentes), 500 por página con nextCursor; cada uno trae group (documents | conversations | library). Cada archivo se baja con GET /api/v2/me/files/:id (liga firmada). Lo usa ghosty me files export. Una base se descarga con GET /api/v2/agents/:id/dbs/:db/export (?format=sqlite, default, o ?format=csv&table=T); sólo con la sesión de la persona, no con gat_.

GET /api/v2/me/files?q=contrato (con q, aunque vaya vacío) devuelve tus archivos: lo que subiste y lo de tus conversaciones personales, nunca adjuntos de clientes ni de pruebas. Cada uno trae id, una url de 15 min para la miniatura y la página siguiente en nextCursor. Para mandarlo al agente no se vuelve a subir: va por id.

typescript
await fetch(`${base}/agents/${agentId}/conversations/${sessionId}/messages`, {  method: "POST", headers: h,  body: JSON.stringify({ content: "Mete esta foto en el reporte", images: [{ fileId: "cmx…" }] }),});

El agente lo ve como archivo:<id> y, en un turno posterior, lo vuelve a traer con su tool file_get (liga nueva de 15 min). Un id que no es tuyo responde 404.

EventSource del navegador no manda headers; en Node usa eventsource o fetch con lectura del body. Detalle de cada evento en .

Avisos a tu app desde fuera (crons)

Un token personal de push (gpu_…) deja que algo de fuera —un cron de EasyBits, un script— te mande un aviso al teléfono. Sólo sirve para eso y sólo te llega a ti.

bash
# 1. Sácalo con tu sesión o bearer (el valor sale una sola vez)curl -X POST https://www.ghosty.studio/api/v2/me/push-tokens -H "Authorization: Bearer $GS_TOKEN" -d '{"name":"cron estudio"}'# 2. Úsalocurl -X POST https://www.ghosty.studio/api/v2/me/push -H "Authorization: Bearer gpu_…" \  -H "Content-Type: application/json" -d '{"title":"Hora de estudiar","body":"Media hora antes del café."}'

Body: title (obligatorio), body, url (https, la app la abre), agentId + sessionId (abre ese chat), urgent, tag. Responde {ok, devices}; devices: 0 = no tienes la app con sesión. Revocar: DELETE /api/v2/me/push-tokens?id=….