Web push con tus propias claves VAPID

Notificaciones push para developers

Web push y notificaciones en PWA con una sola llamada a la API. Cada proyecto tiene sus propias claves VAPID y puedes exportarlas cuando quieras: sin ataduras con ningún proveedor.

Plan Free para siempre · 10.000 pushes al mes · Sin tarjeta de crédito

Empieza en minutos

Tres pasos y tu web ya envía notificaciones.

Sin librerías que mantener ni claves que generar a mano. Crea un proyecto en el panel, copia su clave pública y listo.

  1. 01

    Añade el SDK

    Carga el SDK e inicialízalo con la clave pública del proyecto (pk_live_…, segura en el navegador). Llama a subscribe() desde un clic: los navegadores solo piden permiso tras un gesto del usuario.

    index.html
    <button id="notify">Avisarme</button>
    
    <script src="https://castly.sh/sdk/v1/castly.js"></script>
    <script>
      Castly.init({ publicKey: 'pk_live_…' });
    
      document.querySelector('#notify').addEventListener('click', async () => {
        await Castly.subscribe({ userId: 'user_123', tags: { plan: 'pro' } });
      });
    </script>
  2. 02

    Crea el service worker

    Un archivo /castly-sw.js en la raíz de tu web con una sola línea. Si ya tienes un service worker, añade la línea al tuyo y pasa su ruta en swPath.

    castly-sw.js
    importScripts('https://castly.sh/sdk/v1/sw.js');
  3. 03

    Envía desde tu servidor

    Una petición con tu clave secreta (sk_live_…). La API responde 202 al momento y la cola entrega en segundo plano.

    bash
    curl https://castly.sh/v1/notifications \
      -H "Authorization: Bearer $CASTLY_SECRET_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "to": { "type": "users", "userIds": ["user_123"] },
        "title": "Tu pedido ha salido",
        "body": "Llega hoy entre las 17:00 y las 19:00.",
        "url": "https://tienda.example/pedidos/8421"
      }'

Guía completa en la documentación

Qué incluye

Lo que necesitas para enviar push en serio, y nada que te ate.

Tus claves VAPID

Un proyecto por producto, app o web, cada uno con su par de claves; la privada se guarda cifrada. Expórtalas cuando quieras, junto con tus suscriptores.

Entrega en cola

La API responde 202 al instante y Cloudflare Queues reparte el envío en lotes de 100. Tu petición nunca espera a los navegadores.

Logs por dispositivo

Cada push deja su recorrido: enviado → entregado → clic, o el error del servicio push. Se guardan 30 días.

Segmentos

Envía a todos, a tus IDs de usuario, a suscriptores concretos, a quien tenga ciertas etiquetas (como plan=pro) o a tus dispositivos de prueba.

Webhooks firmados

Entregas, clics, envíos completados y suscripciones caducadas, firmados con HMAC-SHA256.

Aviso de permiso desde el panel

Diseña el aviso previo en el panel, con vista previa: posición, textos, colores, rutas y frecuencia. Los cambios llegan a tu web sin desplegar.

SDK de menos de 3 KB

Un script desde nuestro CDN o un módulo ESM. Detecta el soporte, gestiona permisos y te avisa cuando iOS necesita instalar la web.

Nativo del edge

La API corre en Cloudflare Workers, cerca de quien la llama, y el reparto en Cloudflare Queues. Tus datos se quedan en Cloudflare.

Cómo funciona

De tu servidor al dispositivo, sin esperas.

Tu petición termina en milisegundos. El reparto, la firma y el cifrado de cada push ocurren después, en colas.

Antes de enviarEl SDK suscribe cada navegador con tu clave VAPID pública y lo registra con tu clave pk_live_….

  1. 01 Tu servidor POST /v1/notifications

    Con tu clave secreta y un destino: todos, usuarios, suscriptores o un segmento.

  2. 02 API de castly 202 · queued

    Valida, comprueba tu cuota y encola. Responde al momento.

  3. 03 Cloudflare Queues lotes de 100

    Reparte a los destinatarios por páginas y firma cada push con tu clave VAPID privada.

  4. 04 Servicio push FCM · Mozilla · Apple

    El del navegador de cada suscriptor. Si responde 404 o 410, la suscripción pasa a caducada.

  5. 05 Dispositivo castly-sw.js

    Tu service worker muestra la notificación y confirma la entrega y el clic.

De vueltaCada delivered y clicked queda en el log del dispositivo y te llega como webhook firmado.

Precios

Empieza gratis. Paga cuando envíes más.

Todos los planes tienen las mismas funciones. Solo cambian los pushes al mes y los proyectos.

Free

Para probar y para proyectos pequeños.

0 US$ para siempre

  • 10.000 pushes al mes
  • 1 proyecto
Empezar gratis

Scale

Para mucho volumen y varios productos.

79 US$ / mes

  • 2.000.000 pushes al mes
  • 25 proyectos
Elegir Scale

Todos los planes incluyen

  • Suscriptores ilimitados
  • Tus claves VAPID, exportables
  • Webhooks firmados
  • Logs por dispositivo durante 30 días
  • Aviso de permiso configurable en el panel
  • Playground y dispositivos de prueba

Precios en dólares estadounidenses, facturados cada mes con Stripe. Cancela cuando quieras. La cuota es por mes natural (UTC) y la comparten todos los proyectos de tu organización.

Preguntas frecuentes

Lo que suelen preguntarnos.

¿Funciona en iPhone y iPad?

Sí, desde iOS y iPadOS 16.4, con una condición de Apple: la persona tiene que añadir tu web a la pantalla de inicio y abrirla desde ahí, como PWA (tu web necesita un manifest con display: standalone). En una pestaña normal de Safari en iPhone no hay push. Castly.needsInstall() te dice cuándo mostrar las instrucciones para instalarla.

¿Qué navegadores son compatibles?

Chrome, Edge, Firefox, Opera, Samsung Internet y los demás navegadores basados en Chromium, en escritorio y en Android; Safari 16 o posterior en macOS; y en iPhone y iPad, las webs añadidas a la pantalla de inicio. Castly.isSupported() lo comprueba en cada navegador.

¿De quién son las claves y los suscriptores? ¿Puedo irme?

Son tuyos. GET /v1/project/export (o Exportar, en el panel) te da el par de claves VAPID, pública y privada, y todos los suscriptores con su endpoint y sus claves. Con eso puedes seguir enviando con cualquier librería de web push, sin que tus usuarios tengan que volver a suscribirse.

¿Qué cuenta como un push?

Un intento de entrega a un dispositivo. Enviar una notificación a 5.000 suscriptores consume 5.000 pushes. Registrar suscriptores y las llamadas de lectura a la API no consumen cuota.

¿Qué pasa si llego al límite de mi plan?

Te avisamos por correo al pasar del 80 %. Al llegar al 100 %, los envíos se detienen: la API responde 429 quota_exceeded hasta que empiece el mes siguiente (UTC) o subas de plan. Mientras tanto, tus suscriptores se siguen registrando con normalidad.

¿Cumple el RGPD?

Para los datos de tus suscriptores, tu organización es la responsable del tratamiento y castly es la encargada: los tratamos solo para entregar tus notificaciones. Guardamos el endpoint y las claves de la suscripción, el navegador y el sistema, el ID de usuario y las etiquetas si los envías, y los eventos de entrega, que se borran a los 30 días. Todo vive en Cloudflare. El encargo de tratamiento está en los términos.

¿Puedo cambiar el aviso de permiso sin tocar mi web?

Sí. Se configura en el panel con vista previa en vivo: posición, textos en español e inglés, colores, retraso, a partir de qué visita, en qué rutas y cuántos días esperar tras «Ahora no». El SDK lo lee al cargar, así que los cambios llegan a tu web en unos 5 minutos, sin desplegar. Si prefieres decidir tú cuándo aparece, usa autoPrompt: false y Castly.showPrompt().

¿Sirve para varios productos?

Sí: crea un proyecto por producto, app o web (1, 5 o 25 según el plan). Cada uno tiene sus claves VAPID, claves de API, suscriptores, webhook, aviso de permiso y dispositivos de prueba. La cuota de pushes es de la organización y la comparten todos.

Ya tengo un service worker. ¿Tengo que cambiarlo?

No hace falta tener dos: añade importScripts('…/sdk/v1/sw.js') al principio del tuyo y pasa su ruta en Castly.init({ swPath }). Funciona con service workers clásicos, también los generados por Workbox.

¿Cómo sé si una notificación ha llegado?

Cada notificación tiene un log por dispositivo: enviado, entregado (el service worker la recibió) y clic, o el código de error del servicio push. Lo ves en el panel, en GET /v1/notifications/:id y, si lo configuras, por webhook.

¿Puedo cancelar cuando quiera?

Sí. Los planes de pago se facturan cada mes con Stripe y se cancelan desde Facturación, en el panel, sin permanencia.

Envía tu primera notificación hoy.

Plan Free para siempre con 10.000 pushes al mes. Sin tarjeta de crédito.