Blog de WisyLink

APICLIautomatizacióndesarrolladorescrear páginas web con IA

API para crear páginas web con IA: sitios desde código

Usa la API de WisyLink para crear, actualizar y listar páginas web alojadas desde código: sube archivos, envía un encargo, consulta el estado y obtén la URL.

14 min de lectura
API para crear páginas web con IA: sitios desde código

La API de WisyLink crea y actualiza páginas web alojadas desde código. Sube archivos de referencia, envía un mensaje en lenguaje natural a POST /chat y el agente construye y aloja el sitio en su propia dirección de wisylink.com. Para cambiarlo, envía otro mensaje con el mismo id. Comparte la cuota de 5 horas y semanal de tu plan.

  • Unos pocos endpoints REST cubren todo el ciclo de vida: subir archivos, crear o continuar un sitio con POST /chat, consultar su estado, listar sitios y eliminarlos.
  • POST /chat habla con Wisy, el mismo asistente que en la app, así que la respuesta puede ser una pregunta en lugar de una compilación. Revisa status antes de empezar a consultar el estado.
  • Las claves API se crean en la web y cada una lleva su propio límite de gasto, de hasta 10 USD por día, semana o mes, además de las ventanas de tu plan.
  • El paquete npm @wisylink/cli envuelve los mismos endpoints en una herramienta de línea de comandos y un cliente de Node.
  • Los dominios propios y las claves de servicios (Stripe, correo) se configuran en la app web o móvil; la API pública no los cubre.

Qué puedes automatizar

La API es el chat sin la ventana del chat. Cada POST /chat es un mensaje para Wisy; cuando la petición está clara, un agente de compilación con IA escribe una aplicación web renderizada en el servidor y la despliega en https://<id>.wisylink.com, con datos guardados, cuentas o subida de archivos cuando el encargo lo pide. No hay parámetros de plantilla, tema ni tipo de página. Todo lo que define el sitio, desde las secciones y los textos hasta las funciones y el estilo, va en el mensaje, igual que lo describiría una persona. (Para los conceptos de fondo, consulta qué es un creador de apps con IA).

La URL base es https://api.wisylink.com. Autentícate con la cabecera x-api-key: <clave> o con Authorization: Bearer <clave>. Los endpoints JSON usan Content-Type: application/json y las marcas de tiempo van en milisegundos desde epoch.

Endpoints de la API de WisyLink
EndpointMétodoPara qué sirveCampos clave
/filesPOSTIniciar la subida de un archivoEnvías name, recibes id
/files/chunksPOSTSubir los bytes del archivo, como máximo 4 MB por peticiónid y last=true en el último fragmento; cuerpo binario sin procesar
/files/:idGETLeer los metadatos del archivocontent_type, name, size
/files/:idDELETEEliminar un archivoTambién se quita de los file_ids de cualquier enlace
/chatPOSTCrear un sitio (sin id) o continuarlo (con id)message, hasta 10 file_ids; devuelve id, url, status, answer
/linksGETListar tus sitios, del más nuevo al más antiguopage, limit (de 1 a 100); items, total_pages, has_next
/links/:idGETLeer un sitiostatus, url, file_ids
/links/:idDELETEEliminar un sitio y sus archivos de referenciaDevuelve {"ok": true}

Lo que la API pública no hace: configurar las claves que un sitio necesita para pagos o correo (el propietario las pega en Integraciones), asignar un dominio propio, leer o escribir los datos guardados de un sitio ni exportar el código fuente.

Consigue una clave API y fija un límite de gasto por clave

  1. Inicia sesión en wisylink.com. Las claves se crean solo en la web, no en las apps móviles.
  2. Abre Claves API en la configuración de tu cuenta y elige Generar clave.
  3. Ponle el nombre del lugar donde va a vivir, como «acme-landing-pages-ci», para saber qué se rompe si la revocas.
  4. Elige la ventana y el límite. Diaria, semanal o mensual, con un límite de gasto en USD de hasta 10 USD por ventana. Las ventanas siguen el día UTC, una semana que empieza el lunes o el mes.
  5. Copia la clave en ese momento. Solo se muestra una vez. Guárdala en tu gestor de secretos o en los secretos de tu CI, por ejemplo como WISYLINK_API_KEY.

Ese límite es un freno de seguridad, no tu plan. Cada petición también consume las ventanas móviles de 5 horas y semanal de tu cuenta, las mismas que usa el chat en la web y en el móvil, medidas según el trabajo de IA que dispara la petición, incluida la lectura de tus archivos de referencia. El límite se comprueba antes de cada petición y el gasto se registra después, así que la última petición de una ventana puede pasarse un poco. Revocar una clave la elimina al instante, y todo lo que aún la use recibe un 401.

¿Se puede usar la API con el plan gratuito? Sí. En Community se aplican las mismas reglas que en la app: una compilación por ventana de 5 horas, y los sitios siguen en línea 30 días más una semana marcados para eliminación. Basta para prototipar una integración; para trabajos de clientes o lotes, un plan de pago te da más cuota, compilaciones en paralelo y enlaces que siguen en línea mientras mantengas la suscripción.

Sube archivos de referencia (subida por fragmentos)

Un archivo de referencia es cualquier cosa que el agente deba leer o colocar en el sitio: una guía de marca, un logo, fotos de producto, una lista de precios. Los formatos admitidos son JPEG, PNG, WebP, GIF, HEIC, SVG, MP3, MP4, PDF, XLSX, DOCX, CSV, TXT, JSON y HTML, de hasta 25 MB cada uno. El tipo real se detecta a partir de los bytes y los archivos vacíos se rechazan.

La subida lleva dos llamadas. Primero crea el archivo y guarda el id que recibes:

curl -s -X POST https://api.wisylink.com/files -H "x-api-key: $WISYLINK_API_KEY" -H "Content-Type: application/json" -d '{"name":"guia-de-marca.pdf"}'

Después envía los bytes. Un archivo de 4 MB o menos va en una sola petición con last=true:

curl -s -X POST "https://api.wisylink.com/files/chunks?id=$FILE_ID&last=true" -H "x-api-key: $WISYLINK_API_KEY" -H "Content-Type: application/octet-stream" --data-binary @guia-de-marca.pdf

Si el archivo es más grande, divídelo (split -b 4m guia-de-marca.pdf parte_), envía las partes en orden al mismo id y añade last=true solo a la última; esa llamada cierra y procesa el archivo. La subida debe terminar en 15 minutos o la sesión caduca. En Node, el cliente que se describe más abajo divide el archivo por ti.

Crea un sitio con POST /chat y espera la URL en vivo

Envía el encargo

Omite id para empezar un sitio nuevo. El mensaje puede tener hasta 5000 caracteres, espacio de sobra para un buen encargo: propósito, público, secciones, textos reales, funciones, estilo e idioma. Termínalo con «elige valores razonables para todo lo que no haya especificado» para que sea más probable que la compilación empiece en la primera llamada. Sustituye FILE_ID por el id de tu subida.

curl -s -X POST https://api.wisylink.com/chat -H "x-api-key: $WISYLINK_API_KEY" -H "Content-Type: application/json" -d '{"message":"Crea una landing page de una sola página para Brasa, un tostador de café de especialidad en Guadalajara. Secciones: portada, tres cafés de origen único con precios, formulario de consultas para venta al por mayor guardado en un área de administración, horario y enlace al mapa. Usa la guía de marca adjunta para los colores y las tipografías. Elige valores razonables para todo lo que no haya especificado.","file_ids":["FILE_ID"]}'

La misma llamada desde Node con fetch:

const res = await fetch("https://api.wisylink.com/chat", { method: "POST", headers: { "x-api-key": process.env.WISYLINK_API_KEY, "Content-Type": "application/json" }, body: JSON.stringify({ message: brief, file_ids: [fileId] }) }); let link = await res.json();

Un sitio nuevo responde 201 con id, url, status, answer, created_at y updated_at. Guarda el id: con él cambiarás, leerás o eliminarás el sitio más adelante. Trátalo como una cadena opaca en lugar de validar su formato.

Revisa el estado antes de sondear

El status de la respuesta de POST /chat te dice si de verdad empezó una compilación:

building o queued
Hay una compilación en marcha o esperando un hueco libre (queued todavía no aparece en la lista de la referencia, pero puedes verlo). Empieza a sondear. En un sitio nuevo, la url muestra una página de «en construcción» hasta que termina la primera compilación.
idle en un sitio nuevo
No empezó ninguna compilación. Wisy respondió en su lugar, y answer suele contener una pregunta breve, por ejemplo qué proveedor de pagos usar. Responde con otro POST /chat con el mismo id.
completed o aborted justo después de un mensaje de seguimiento
En un sitio existente, el estado muestra el resultado de la última compilación. Si no cambió a building, tu mensaje recibió una respuesta, no una compilación; lee answer.

Sondea hasta que la compilación termine

No hay webhooks, así que hay que hacer sondeo (polling) de GET /links/:id. Las compilaciones duran minutos, no segundos, así que consultar cada 15 a 30 segundos es más que suficiente. Trata cualquier estado distinto de completed, aborted o idle como «todavía en curso»; así tu bucle sigue siendo seguro si aparece un nuevo estado intermedio:

const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); while (!["completed", "aborted", "idle"].includes(link.status)) { await sleep(20000); link = await (await fetch(`https://api.wisylink.com/links/${link.id}`, { headers: { "x-api-key": process.env.WISYLINK_API_KEY } })).json(); }

Cuando status es completed, la url es tu sitio en vivo. aborted significa que la compilación se detuvo antes de terminar; un sitio que ya estaba en línea conserva su versión anterior, y un mensaje nuevo lo vuelve a intentar. Si más adelante el sitio recibe un dominio propio, url devuelve ese dominio. El informe completo de la compilación, con cualquier aviso de que el sitio espera las claves de Stripe o de correo, está en el chat de ese enlace en la aplicación web.

Continuar, listar y eliminar enlaces

Para cambiar un sitio, envía solo la nueva instrucción con su id en lugar de LINK_ID; el servidor conserva el historial de la conversación, y un sitio continuado responde 200:

curl -s -X POST https://api.wisylink.com/chat -H "x-api-key: $WISYLINK_API_KEY" -H "Content-Type: application/json" -d '{"id":"LINK_ID","message":"Añade un segundo local: Av. Chapultepec 412, abierto todos los días de 7:00 a 15:00."}'

Vuelve a sondear de la misma manera. Cada cambio es una nueva compilación; si falla, la última versión buena sigue en línea, y si sale bien, se publica en cuanto termina, así que revisa el sitio después de cada cambio. Espera a que termine una compilación antes de enviar el siguiente cambio, salvo que el nuevo mensaje corrija la compilación que está en curso.

Para listar los sitios, recorre GET /links?page=1&limit=100 página a página hasta que has_next sea false. Para quitar uno, DELETE /links/:id elimina el sitio y los archivos de referencia que tiene adjuntos. Si usaba un dominio propio, el dominio se queda en tu cuenta, listo para otro sitio.

La CLI y el cliente de Node

El paquete @wisylink/cli (licencia MIT, Node 18.17 o posterior) asigna cada comando a uno de los endpoints de arriba, lo que lo convierte en la forma más rápida de automatizar WisyLink desde una terminal o un trabajo de CI:

  • npm i -g @wisylink/cli y después export WISYLINK_API_KEY=..., o pasa --api-key en cada comando.
  • wisylink files upload ./guia-de-marca.pdf sube el archivo en fragmentos de 4 MB automáticamente.
  • wisylink chat --message "Crea una landing page para Brasa Café." --file-id FILE_ID crea un sitio.
  • wisylink links list --page 1 --limit 50 lista tus sitios.

Los comandos imprimen JSON, así que jq puede extraer el id o la url. --timeout acepta de 1000 a 120 000 milisegundos; súbelo para chat, que espera la respuesta de Wisy.

El mismo paquete exporta un cliente de Node: import { CreateWisyLinkClient } from "@wisylink/cli"; const client = CreateWisyLinkClient({ apiKey: process.env.WISYLINK_API_KEY }); const file = await client.uploadFile("./guia-de-marca.pdf"); const link = await client.chat({ message: brief, fileIds: [file.id] });

Dos notas de versión, según la publicación 0.2.1 en npm. Primera: los comandos y métodos del cliente que reciben un id de enlace (chat --link-id, links get, links delete, y linkId, getLink, deleteLink en Node) validan los ids con un formato antiguo y rechazan los actuales, así que continúa, lee y elimina sitios por HTTP como se muestra arriba. Segunda: la documentación de la CLI (en inglés) ya describe una versión más nueva con inicio de sesión desde el navegador (wisylink login), un chat interactivo con el progreso de la compilación en vivo y la opción --json; ejecuta wisylink --version para ver cuál tienes.

Límites, errores y buenas prácticas

Los errores llegan como JSON con un código en error. Estos son los que conviene gestionar de forma explícita:

429 limit_reached
Se agotó la ventana de 5 horas o la semanal de tu plan (reason es 5h_limit o weekly_limit). Programa el reintento para reset_at, en milisegundos desde epoch, en lugar de reintentar en bucle.
429 credit_limit_exceeded
Esta clave alcanzó su propio límite de gasto. Puede ocurrir en cualquier endpoint; espera a resets_at o sube el límite (hasta 10 USD) en la web.
429 build_concurrency_limit
Hay demasiadas compilaciones en marcha para tu plan. Espera a que termine una y envía la siguiente.
429 rate_limited
Demasiadas peticiones en poco tiempo. Espera un poco y vuelve a intentarlo.
400 bad_request
JSON no válido, un mensaje vacío o de más de 5000 caracteres, o ids de archivo que no existen (aparecen en missing_file_ids). Ojo: solo se usan los 10 primeros file_ids; los demás se descartan sin error.
401, 404, 500 chat_unavailable
Una clave ausente o revocada; un enlace o archivo que no es tuyo; Wisy no disponible por un momento, que merece un reintento tras una pausa.

Hábitos que ahorran dinero y confusiones:

  • Mantén las claves en el servidor. Nunca incluyas una clave en el código del navegador o de una app. Usa una clave por cliente o por pipeline, para que cada una tenga su propio límite y se pueda revocar sola.
  • No reintentes POST /chat a ciegas. No es idempotente: una petición que agotó el tiempo en tu lado puede haber creado un sitio o iniciado una compilación igualmente. Revisa GET /links (los más nuevos primero) antes de reenviar y da a la llamada un tiempo de espera en el cliente de un minuto o más.
  • Pon en cola los trabajos por lotes. Lanza tantas compilaciones a la vez como permita tu plan y toma build_concurrency_limit como señal para esperar.
  • Revisa antes de entregar. Lo que genera la IA puede tener errores. Abre cada sitio, prueba sus formularios y lee sus textos antes de que los vea un cliente o el público; los términos de WisyLink dejan la revisión y las pruebas bajo tu responsabilidad.

Casos de uso: agencias, eventos y herramientas internas

Landing pages para agencias. Ten una plantilla de encargo con huecos para el nombre del cliente, la oferta, las secciones y el tono, rellénala desde tu CRM y adjunta como archivos el logo y la guía de marca del cliente. Cada campaña se convierte en su propio sitio, los comentarios del cliente se convierten en mensajes de seguimiento y una clave por cliente mantiene el gasto separado. Cuando la página esté aprobada, conecta el dominio del cliente en Dominios. Tienes un ejemplo completo de la página en sí en cómo crear una landing page de lista de espera con IA.

Micrositios por evento. Una fila por evento en una hoja de cálculo (nombre, fecha, lugar, aforo) se convierte en un sitio de confirmación de asistencia por evento, creado por un script que guarda cada id devuelto junto a su fila. La guía para crear una página de confirmación de asistencia con IA muestra qué poner en cada encargo. Después del evento, elimina el sitio o consérvalo como archivo con un plan de pago.

Automatizaciones internas. Un script puede crear la primera versión de una herramienta interna, como un control de inventario o un tablero de aprobaciones. Eso sí, no recompiles para actualizar datos: pide a Wisy que añada un endpoint al que tus sistemas puedan enviar registros, protegido con un secreto que configures en Integraciones. Los registros que llegan así se ven en el sitio en aproximadamente un minuto, sin gastar una compilación. Encontrarás más sobre este patrón en cómo crear herramientas internas con IA.

Consigue tu clave y crea tu primer sitio desde código

Crea una cuenta gratis, genera una clave API con un límite bajo y envía tu primer encargo con la llamada curl de arriba. Ten abierta la referencia de la API (en inglés) para los detalles de cada campo y, cuando la integración pase de prototipo a producción, elige en la sección de precios un plan con la cuota de compilación y las compilaciones en paralelo que necesita tu volumen.

F.A.Q.

Preguntas frecuentes

¿Puedo usar la API de WisyLink con el plan gratuito?
Sí. Cualquier cuenta puede crear claves API, y las llamadas consumen la misma cuota de Community que el chat: una compilación por ventana de 5 horas, con sitios gratuitos en línea 30 días más una semana marcados para eliminación. Es suficiente para construir y probar una integración de principio a fin. Para volúmenes de producción, un plan de pago amplía las ventanas de 5 horas y semanal, permite varias compilaciones a la vez y mantiene los sitios en línea mientras sigas suscrito.
¿Cómo se cobra el uso de la API?
No hay una factura aparte para la API. Las peticiones cuentan contra las ventanas móviles de 5 horas y semanal de tu plan, medidas según el trabajo de IA que dispara cada una, como el razonamiento del agente y la lectura de tus archivos de referencia. Subir un archivo no tiene coste propio. Además, cada clave puede tener su propio límite en USD, como máximo 10 USD por ventana diaria, semanal o mensual, que detiene esa clave sin afectar a las demás.
¿Cómo sé cuándo ha terminado una compilación?
Consulta GET /links/:id cada 15 a 30 segundos hasta que status sea completed y usa la url que devuelve. Si status pasa a aborted, la compilación se detuvo; un sitio existente conserva su última versión buena. Si la llamada de creación devolvió idle, no hay ninguna compilación en marcha: lee el campo answer, que normalmente hace una pregunta, y responde con otro POST /chat para el mismo id.
¿Puedo asignar un dominio propio a través de la API?
No con la API pública. Conecta y verifica el dominio en Dominios, en la aplicación web o en las apps para iOS y Android (si aún no tienes un dominio, regístralo primero en cualquier registrador de dominios), y después asígnalo al sitio; esto funciona en cualquier plan, incluido el gratuito. A partir de ahí, GET /links/:id devuelve el dominio propio en el campo url, así que los scripts que leen la url siguen funcionando.
¿Hay un SDK para la API de WisyLink?
El paquete @wisylink/cli incluye una herramienta de línea de comandos y un cliente de Node que se crea con CreateWisyLinkClient. Cubre subidas, creación de sitios y listados. En la versión 0.2.1 de npm, los métodos que reciben un id de enlace rechazan los ids actuales, así que usa llamadas HTTP directas para continuar, leer y eliminar sitios hasta que una versión más nueva lo corrija. Desde otros lenguajes puedes llamar directamente a los endpoints REST.
¿Qué errores de la API debo gestionar?
Como mínimo: 429 limit_reached, que obliga a esperar hasta reset_at; 429 credit_limit_exceeded, que indica que el límite propio de la clave está agotado hasta resets_at; y 429 build_concurrency_limit, que pide poner en cola hasta que termine una compilación en curso. Además, espera y reintenta ante 429 rate_limited, reintenta una vez 500 chat_unavailable tras una pausa y registra las respuestas 400, que suelen indicar un mensaje demasiado largo o un id de archivo incorrecto.
Compartir
XLinkedInFacebook