Deckly · Desarrolladores
Deckly desde tu código y tus agentes
Una API REST y un servidor MCP para crear, editar, compartir y exportar presentaciones, landings y anuncios. Es el mismo agente de la app, con los mismos créditos.
Autenticación
Crea una llave en Mi cuenta → API y mándala en cada petición en el encabezado Authorization. La llave se muestra completa una sola vez; guárdala como una contraseña.
La API y el MCP son para las cuentas Plus y Pro. Cada cuenta puede tener hasta 10 llaves; las apps que conectas con OAuth no cuentan.
- URL base
https://deckly-backend.onrender.com/v1- Encabezado
Authorization: Bearer dk_live_...
Cómo se usa
Generar toma de unos segundos a un par de minutos, así que todo trabajo de IA corre en segundo plano:
- Pide el documento con
POST /v1/decks,/v1/landingso/v1/ads. Responde 202 con el documento engenerating. - Consulta
GET /v1/documents/{id}cada pocos segundos hasta questatusseaready. - Si queda en
needs_input, el agente tiene preguntas: contéstalas enPOST /v1/documents/{id}/answers, o manda{}para tomar las respuestas sugeridas. - Ya listo, compártelo con un enlace, expórtalo o pídele cambios con
/edit.
Ejemplos
Crear una presentación, esperar a que quede y compartirla. Guarda tu llave en la variable de entorno DECKLY_API_KEY.
# Create a deck
curl -X POST https://deckly-backend.onrender.com/v1/decks \
-H "Authorization: Bearer $DECKLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "Quarterly results for a coffee chain", "slides": 10}'
# Check on it (use the id from the answer above)
curl https://deckly-backend.onrender.com/v1/documents/a1b2c3 \
-H "Authorization: Bearer $DECKLY_API_KEY"import os, time, requests
API = "https://deckly-backend.onrender.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['DECKLY_API_KEY']}"}
doc = requests.post(f"{API}/decks", headers=HEADERS, json={
"prompt": "Quarterly results for a coffee chain",
"slides": 10,
}).json()
while doc["status"] in ("generating", "needs_input"):
if doc["status"] == "needs_input":
# take the agent's suggested answers
doc = requests.post(f"{API}/documents/{doc['id']}/answers",
headers=HEADERS, json={"answers": {}}).json()
time.sleep(5)
doc = requests.get(f"{API}/documents/{doc['id']}", headers=HEADERS).json()
if doc["status"] == "ready":
share = requests.post(f"{API}/documents/{doc['id']}/share", headers=HEADERS).json()
print(share["share_url"])
pdf = requests.get(f"{API}/documents/{doc['id']}/export",
headers=HEADERS, params={"format": "pdf"})
open("deck.pdf", "wb").write(pdf.content)const API = "https://deckly-backend.onrender.com/v1";
const headers = {
Authorization: `Bearer ${process.env.DECKLY_API_KEY}`,
"Content-Type": "application/json",
};
async function call(path, init = {}) {
const res = await fetch(`${API}${path}`, { ...init, headers });
if (!res.ok) throw new Error((await res.json()).detail);
return res.json();
}
let doc = await call("/decks", {
method: "POST",
body: JSON.stringify({ prompt: "Quarterly results for a coffee chain", slides: 10 }),
});
while (doc.status === "generating" || doc.status === "needs_input") {
if (doc.status === "needs_input") {
// take the agent's suggested answers
doc = await call(`/documents/${doc.id}/answers`, {
method: "POST",
body: JSON.stringify({ answers: {} }),
});
}
await new Promise((resolve) => setTimeout(resolve, 5000));
doc = await call(`/documents/${doc.id}`);
}
if (doc.status === "ready") {
const { share_url } = await call(`/documents/${doc.id}/share`, { method: "POST" });
console.log(share_url);
}Endpoints
Todas las rutas cuelgan de la URL base y responden JSON, salvo la exportación, que regresa un archivo.
GET
/v1/meTu cuenta: plan y créditos disponibles.
POST
/v1/decksCrea una presentación.
slidesde 2 a 25,languageopcional.POST
/v1/landingsCrea una landing page.
POST
/v1/adsCrea anuncios para redes.
GET
/v1/documentsTus documentos, del más reciente al más viejo. Filtra por
typey pagina conlimityoffset.GET
/v1/documents/{id}Un documento y su estado.
POST
/v1/documents/{id}/answersContesta las preguntas del agente:
{question_id: índice de opción o texto}.{}toma las sugeridas.POST
/v1/documents/{id}/editPide un cambio en lenguaje natural.
slide(desde 0) lo limita a una lámina.POST
/v1/documents/{id}/stopDetiene el trabajo en curso.
POST
/v1/documents/{id}/shareCrea el enlace público de solo lectura.
DELETE
/v1/documents/{id}/shareQuita el enlace público.
GET
/v1/documents/{id}/exportDescarga el archivo:
pdfoimages(zip de PNG) para presentaciones y anuncios;htmlpara landings.DELETE
/v1/documents/{id}Lo manda a la papelera; se puede recuperar desde la app durante unos días.
El documento
Casi todas las rutas regresan la misma forma, sea presentación, landing o anuncio:
{
"id": "a1b2c3",
"type": "deck",
"title": "Quarterly results",
"status": "needs_input",
"questions": [
{
"id": "q1",
"text": "Who is the audience?",
"options": ["Investors", "The team"],
"default_index": 0
}
],
"slides": 10,
"share_url": null,
"editor_url": "https://www.decklyai.com/deck/a1b2c3",
"updated_at": "2026-10-06T18:20:00Z"
}status:generatingmientras trabaja,needs_inputcuando espera respuestas,readycuando quedó,failedostopped.questionssolo trae algo cuandostatusesneeds_input.share_urlesnullhasta que lo compartes;editor_urllo abre en la app.
Errores y límites
Un error regresa su código HTTP y {detail, code}. detail viene en el idioma de Accept-Language y se puede enseñar tal cual; para decidir en tu código, lee code.
- 120 peticiones por minuto por llave. Arriba de eso, 429
api_rate_limitedconRetry-After. - Hasta 2 trabajos de IA a la vez por cuenta, igual que en la app.
- 403
api_plan_requiredsi la cuenta ya no es Plus o Pro.
Créditos
La API cobra exactamente como la app: el mismo precio, apartado al empezar y ajustado al terminar. Los créditos salen de tu plan y tus recargas.
max_credits pone un tope a lo que puede gastar una petición. Si no lo mandas, el tope es el precio cotizado para ese pedido.
MCP
El servidor MCP le da a claude.ai, ChatGPT, Claude Code, Cursor y otros clientes de IA las mismas acciones que la API. Usa HTTP (streamable) y se autentica de dos formas: entrando con tu cuenta de Deckly (OAuth, sin copiar nada) o con una llave.
- Endpoint
https://deckly-backend.onrender.com/mcp- Encabezado
Authorization: Bearer dk_live_...
claude.ai y la app de Claude
Se conecta como un conector, sin llaves: entras con tu cuenta de Deckly y le das permiso.
- En claude.ai, abre
Configuración → Conectoresy eligeAgregar conector personalizado. - Ponle de nombre Deckly y pega la URL
https://deckly-backend.onrender.com/mcp. - Claude abre Deckly: entra con tu cuenta y dale
Permitir. Listo, ya lo puedes usar en tus chats.
ChatGPT
- En ChatGPT, abre
Configuración → Apps y conectoresy activa el modo de desarrollador en las opciones avanzadas. - Crea un conector con la URL
https://deckly-backend.onrender.com/mcpy eligeOAuthcomo autenticación. - ChatGPT abre Deckly: entra con tu cuenta y dale
Permitir.
Cada app que conectas aparece en Mi cuenta → API como conector; desde ahí la desconectas cuando quieras. Gasta tus créditos igual que la app, y es para las cuentas Plus y Pro.
Claude Code
Sin llave: agrega el servidor y, cuando Claude Code te lo pida, entra con tu cuenta de Deckly y dale Permitir.
claude mcp add --transport http deckly https://deckly-backend.onrender.com/mcpO con una llave, en un solo comando:
claude mcp add --transport http deckly https://deckly-backend.onrender.com/mcp --header "Authorization: Bearer dk_live_..."Cursor
En ~/.cursor/mcp.json:
{
"mcpServers": {
"deckly": {
"url": "https://deckly-backend.onrender.com/mcp",
"headers": {
"Authorization": "Bearer dk_live_..."
}
}
}
}Otros clientes
Cualquier cliente que acepte un servidor MCP por HTTP con encabezados:
{
"mcpServers": {
"deckly": {
"type": "http",
"url": "https://deckly-backend.onrender.com/mcp",
"headers": {
"Authorization": "Bearer dk_live_..."
}
}
}
}Herramientas
create_deckcreate_landingcreate_adsget_documentwait_for_documentlist_documentsedit_documentanswer_questionsshare_documentexport_documentget_account
wait_for_document espera hasta unos 50 segundos a que cambie el estado, así el agente no tiene que preguntar a cada rato.
Modo estudio: tu agente diseña
Con el MCP conectado, tu propio agente (Claude Code, Cursor, Codex...) se vuelve el diseñador de Deckly. Trabaja con las mismas herramientas de diseño que usa el agente de Deckly para presentaciones, landings y anuncios: escribe cada lámina, acomoda fotos, ve cómo quedó de verdad y corrige.
Es distinto de create_deck, create_landing y create_ads: ahí le pasas un pedido al agente de Deckly y él diseña. En el modo estudio el que diseña es tu agente, y Deckly le pone las herramientas.
Cómo va una sesión
- Tu agente empieza un documento vacío con
start_deck,start_landingostart_ads, o toma uno que ya tienes con su id. - Lee
design_guide: las mismas indicaciones de diseño que sigue el agente de Deckly. - Construye con las herramientas
deck_*,landing_*oads_*.look_atle enseña cómo se ve de verdad, para que corrija lo que salió chueco. - Cierra con
finish_worky un resumen. Todo lo que hizo queda guardado como un solo cambio en el chat del editor, y lo puedes deshacer de un jalón.
- Mientras tu agente trabaja, el documento es solo suyo: el chat y el editor de la app esperan a que termine. Si pasan 15 minutos sin que haga nada, se libera solo.
- Lo que piensa tu agente no gasta créditos de Deckly; solo se cobra lo que Deckly hace por su lado en el camino, como generar imágenes o elegir fotos.
Herramientas
- Para empezar y terminar
start_deckstart_landingstart_adsdesign_guidefinish_work
- Presentaciones
deck_list_slidesdeck_read_slidedeck_write_slidedeck_edit_slidedeck_insert_slidedeck_delete_slidedeck_move_slidedeck_read_stylesdeck_write_stylesdeck_edit_stylesdeck_set_titledeck_piece_guidedeck_look_atdeck_find_imagedeck_generate_imagedeck_researchdeck_read_sourcedeck_search_projectdeck_read_project_filedeck_undo_turn
- Landing pages
landing_read_pagelanding_write_pagelanding_edit_pagelanding_look_atlanding_researchlanding_set_title
- Anuncios
ads_list_piecesads_read_pieceads_write_pieceads_edit_pieceads_delete_pieceads_set_fontsads_look_atads_researchads_set_title
Pídeselo a tu agente
Con el MCP ya configurado, basta con algo así:
Usando Deckly, diseña tú mismo una presentación de 6 láminas sobre la historia del café en México. Revisa cómo se ve cada lámina antes de terminar y pásame el enlace para compartirla.Pronto: exportar a PPTX.