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 /chathabla con Wisy, el mismo asistente que en la app, así que la respuesta puede ser una pregunta en lugar de una compilación. Revisastatusantes 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/clienvuelve 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.
| Endpoint | Método | Para qué sirve | Campos clave |
|---|---|---|---|
/files | POST | Iniciar la subida de un archivo | Envías name, recibes id |
/files/chunks | POST | Subir los bytes del archivo, como máximo 4 MB por petición | id y last=true en el último fragmento; cuerpo binario sin procesar |
/files/:id | GET | Leer los metadatos del archivo | content_type, name, size |
/files/:id | DELETE | Eliminar un archivo | También se quita de los file_ids de cualquier enlace |
/chat | POST | Crear un sitio (sin id) o continuarlo (con id) | message, hasta 10 file_ids; devuelve id, url, status, answer |
/links | GET | Listar tus sitios, del más nuevo al más antiguo | page, limit (de 1 a 100); items, total_pages, has_next |
/links/:id | GET | Leer un sitio | status, url, file_ids |
/links/:id | DELETE | Eliminar un sitio y sus archivos de referencia | Devuelve {"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
- Inicia sesión en wisylink.com. Las claves se crean solo en la web, no en las apps móviles.
- Abre Claves API en la configuración de tu cuenta y elige Generar clave.
- Ponle el nombre del lugar donde va a vivir, como «acme-landing-pages-ci», para saber qué se rompe si la revocas.
- 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.
- 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:
buildingoqueued- Hay una compilación en marcha o esperando un hueco libre (
queuedtodavía no aparece en la lista de la referencia, pero puedes verlo). Empieza a sondear. En un sitio nuevo, laurlmuestra una página de «en construcción» hasta que termina la primera compilación. idleen un sitio nuevo- No empezó ninguna compilación. Wisy respondió en su lugar, y
answersuele contener una pregunta breve, por ejemplo qué proveedor de pagos usar. Responde con otroPOST /chatcon el mismoid. completedoabortedjusto 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; leeanswer.
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/cliy despuésexport WISYLINK_API_KEY=..., o pasa--api-keyen cada comando.wisylink files upload ./guia-de-marca.pdfsube el archivo en fragmentos de 4 MB automáticamente.wisylink chat --message "Crea una landing page para Brasa Café." --file-id FILE_IDcrea un sitio.wisylink links list --page 1 --limit 50lista 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 (
reasones5h_limitoweekly_limit). Programa el reintento parareset_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_ato 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 primerosfile_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 /chata 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. RevisaGET /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_limitcomo 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.
