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:

  1. Pide el documento con POST /v1/decks, /v1/landings o /v1/ads. Responde 202 con el documento en generating.
  2. Consulta GET /v1/documents/{id} cada pocos segundos hasta que status sea ready.
  3. Si queda en needs_input, el agente tiene preguntas: contéstalas en POST /v1/documents/{id}/answers, o manda {} para tomar las respuestas sugeridas.
  4. 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.

curl
# 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"
Python
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)
JavaScript
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/me

    Tu cuenta: plan y créditos disponibles.

  • POST/v1/decks

    Crea una presentación. slides de 2 a 25, language opcional.

  • POST/v1/landings

    Crea una landing page.

  • POST/v1/ads

    Crea anuncios para redes.

  • GET/v1/documents

    Tus documentos, del más reciente al más viejo. Filtra por type y pagina con limit y offset.

  • GET/v1/documents/{id}

    Un documento y su estado.

  • POST/v1/documents/{id}/answers

    Contesta las preguntas del agente: {question_id: índice de opción o texto}. {} toma las sugeridas.

  • POST/v1/documents/{id}/edit

    Pide un cambio en lenguaje natural. slide (desde 0) lo limita a una lámina.

  • POST/v1/documents/{id}/stop

    Detiene el trabajo en curso.

  • POST/v1/documents/{id}/share

    Crea el enlace público de solo lectura.

  • DELETE/v1/documents/{id}/share

    Quita el enlace público.

  • GET/v1/documents/{id}/export

    Descarga el archivo: pdf o images (zip de PNG) para presentaciones y anuncios; html para 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:

Document
{
  "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: generating mientras trabaja, needs_input cuando espera respuestas, ready cuando quedó, failed o stopped.
  • questions solo trae algo cuando status es needs_input.
  • share_url es null hasta que lo compartes; editor_url lo 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_limited con Retry-After.
  • Hasta 2 trabajos de IA a la vez por cuenta, igual que en la app.
  • 403 api_plan_required si 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.

Ver planes y créditos →

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.

  1. En claude.ai, abre Configuración → Conectores y elige Agregar conector personalizado.
  2. Ponle de nombre Deckly y pega la URL https://deckly-backend.onrender.com/mcp.
  3. Claude abre Deckly: entra con tu cuenta y dale Permitir. Listo, ya lo puedes usar en tus chats.

ChatGPT

  1. En ChatGPT, abre Configuración → Apps y conectores y activa el modo de desarrollador en las opciones avanzadas.
  2. Crea un conector con la URL https://deckly-backend.onrender.com/mcp y elige OAuth como autenticación.
  3. 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.

Terminal
claude mcp add --transport http deckly https://deckly-backend.onrender.com/mcp

O con una llave, en un solo comando:

Terminal
claude mcp add --transport http deckly https://deckly-backend.onrender.com/mcp --header "Authorization: Bearer dk_live_..."

Cursor

En ~/.cursor/mcp.json:

~/.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:

JSON
{
  "mcpServers": {
    "deckly": {
      "type": "http",
      "url": "https://deckly-backend.onrender.com/mcp",
      "headers": {
        "Authorization": "Bearer dk_live_..."
      }
    }
  }
}

Herramientas

  • create_deck
  • create_landing
  • create_ads
  • get_document
  • wait_for_document
  • list_documents
  • edit_document
  • answer_questions
  • share_document
  • export_document
  • get_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

  1. Tu agente empieza un documento vacío con start_deck, start_landing o start_ads, o toma uno que ya tienes con su id.
  2. Lee design_guide: las mismas indicaciones de diseño que sigue el agente de Deckly.
  3. Construye con las herramientas deck_*, landing_* o ads_*. look_at le enseña cómo se ve de verdad, para que corrija lo que salió chueco.
  4. Cierra con finish_work y 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_deck
  • start_landing
  • start_ads
  • design_guide
  • finish_work
Presentaciones
  • deck_list_slides
  • deck_read_slide
  • deck_write_slide
  • deck_edit_slide
  • deck_insert_slide
  • deck_delete_slide
  • deck_move_slide
  • deck_read_styles
  • deck_write_styles
  • deck_edit_styles
  • deck_set_title
  • deck_piece_guide
  • deck_look_at
  • deck_find_image
  • deck_generate_image
  • deck_research
  • deck_read_source
  • deck_search_project
  • deck_read_project_file
  • deck_undo_turn
Landing pages
  • landing_read_page
  • landing_write_page
  • landing_edit_page
  • landing_look_at
  • landing_research
  • landing_set_title
Anuncios
  • ads_list_pieces
  • ads_read_piece
  • ads_write_piece
  • ads_edit_piece
  • ads_delete_piece
  • ads_set_fonts
  • ads_look_at
  • ads_research
  • ads_set_title

Pídeselo a tu agente

Con el MCP ya configurado, basta con algo así:

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