🏗️ documentación

Construir sobre CloudWapp (marca blanca)

Si tienes una plataforma —un constructor de sitios, una agencia, un SaaS vertical— puedes usar CloudWapp como el motor que construye con IA, despliega y hospeda las apps de tus clientes. Tu backend habla con nuestra API; tus clientes ven tu marca y tu dominio.

Cómo funciona

Todo pasa por tu cuenta de CloudWapp y una API key (x-api-key). Tu backend guarda qué app es de qué cliente tuyo; nosotros nunca le hablamos a tu cliente final.

  1. Crear la app con IA. Describes lo que quiere tu cliente y Claude Code la construye:
curl -X POST https://cloudwapp.net/api/v1/tickets/app \
  -H "x-api-key: TU_API_KEY" -H "Content-Type: application/json" \
  -d '{ "name": "Barbería Don Pepe", "description": "Landing con servicios, precios y reservas por WhatsApp." }'
  1. Revisar y publicar. Cuando el cambio está listo te llega el webhook ticket.ready con el resumen. Lo apruebas y se despliega:
curl -X POST https://cloudwapp.net/api/v1/tickets/TICKET_ID/approve -H "x-api-key: TU_API_KEY"
  1. Pedir cambios después. Cada pedido de tu cliente es un ticket sobre la misma app:
curl -X POST https://cloudwapp.net/api/v1/tickets \
  -H "x-api-key: TU_API_KEY" -H "Content-Type: application/json" \
  -d '{ "appId": "APP_ID", "title": "Cambiar colores", "body": "Usar azul marino y dorado." }'

También puedes desplegar código propio (POST /apps/:id/upload o desde Git), levantar templates (POST /apps/from-template) y agregarle bases de datos o buckets (POST /apps/:id/services).

Tu dominio, no el nuestro

Crea una sola vez un CNAME comodín *.tumarca.com apuntando a CloudWapp. Desde ahí cada app de un cliente se conecta con su propio nombre, sin volver a tocar el DNS:

curl -X POST https://cloudwapp.net/api/v1/apps/APP_ID/domains \
  -H "x-api-key: TU_API_KEY" -H "Content-Type: application/json" \
  -d '{ "domainName": "donpepe.tumarca.com" }'

El certificado SSL se emite solo en la primera visita. Si tu cliente trae su propio dominio, le pides que cree un CNAME al mismo destino.

Webhooks

Configura la URL en Configuración → Webhook. Te hacemos POST en cada evento:

EventoCuándo
ticket.readyLa IA terminó un cambio y espera tu aprobación
ticket.appliedLo aprobaste: el cambio quedó en cola de deploy (deploymentId)
ticket.failedLa IA no pudo hacer el cambio, o falló al aplicarlo (error)
app.deploy.succeededEl deploy terminó y la app está en línea (url)
app.deploy.failedEl deploy falló; la versión anterior sigue corriendo (error)

El cuerpo es siempre { event, userId, timestamp, data }. Si configuras un secret, la firma va en X-CloudWapp-Signature: sha256=<HMAC-SHA256 del cuerpo>. Verifícala antes de confiar en el evento:

import { createHmac, timingSafeEqual } from 'node:crypto';

function firmaValida(rawBody, header, secret) {
  const esperada = 'sha256=' + createHmac('sha256', secret).update(rawBody).digest('hex');
  return header?.length === esperada.length && timingSafeEqual(Buffer.from(header), Buffer.from(esperada));
}

Si tu servidor no responde 2xx, reintentamos 5 veces con espera creciente. La URL tiene que ser pública: no aceptamos localhost ni redes internas, y no seguimos redirecciones.

Cupos para plataformas

Los planes normales tienen topes pensados para una persona (por ejemplo, 10 apps y 50 builds de IA al mes en Hobbyist). Para una plataforma ajustamos los topes de tu cuenta a medida —apps, builds de IA, dominios, servicios— sin cambiar de plan. Escríbenos y lo dejamos configurado.