· Nacho Coll · Guides  · 9 min de lectura

API de Alertas de X: Suscripciones Programáticas e Historial de Notificaciones

Construye integraciones personalizadas sobre WALLAWHATS. Agrega y elimina suscripciones de X, enruta alertas a canales, extrae historial de notificaciones — todo vía REST.

Construye integraciones personalizadas sobre WALLAWHATS. Agrega y elimina suscripciones de X, enruta alertas a canales, extrae historial de notificaciones — todo vía REST.

Cuando las alertas en tiempo real de X (Twitter) se vuelven críticas para tu negocio, la gestión manual del dashboard llega a su límite. Ya sea que estés construyendo dashboards de inteligencia de clientes, automatizando flujos de monitoreo de marca, o creando sistemas de notificación personalizados para mesas de trading, necesitas control programático sobre tus suscripciones de alertas de X.

WALLAWHATS proporciona una API REST que te permite crear, gestionar y auditar suscripciones de alertas de X sin tocar la interfaz web. Agrega o elimina cuentas monitoreadas, extrae historial de notificaciones con estado de entrega, e integra alertas de X en tiempo real en cualquier sistema que hable HTTP.

Página de gestión de API keys con controles de crear / revocar

¿Por qué Usar la API de WALLAWHATS?

El dashboard funciona genial para flujos manuales, pero el acceso API desbloquea escenarios de automatización que escalan más allá de la gestión humana:

Plataformas de Inteligencia de Clientes: Suscríbete automáticamente a ejecutivos competidores recién identificados, líderes de producto, o analistas de industria conforme se descubren a través de herramientas de investigación o integraciones CRM.

Flujos de Trading y Financieros: Monitorea programáticamente cuentas regulatorias, handles de CEOs, o periodistas específicos de sectores basándote en cambios de portafolio o eventos de mercado—sin gestión manual de suscripciones.

Monitoreo de Marca a Escala: Agrega o elimina seguimiento de menciones de marca conforme nuevas campañas se lanzan, productos se envían, o situaciones de crisis se desarrollan.

Aplicaciones SaaS Multi-Inquilino: Monitoreo de X en tiempo real con marca blanca para tus clientes, con gestión programática de suscripciones tras bambalinas.

Sistemas de Cumplimiento y Auditoría: Extrae historial completo de notificaciones con estado de entrega para reportes regulatorios, rastros de auditoría interna, o monitoreo de SLA.

Autenticación y Acceso API

Cada plan de WALLAWHATS incluye acceso API con cuotas escalables de claves:

  • Free: 1 clave API
  • Pro: 1 clave API
  • Pro+: 2 claves API
  • Business: 5 claves API
  • Enterprise: 20 claves API

La autenticación usa el header x-api-key (no Authorization: Bearer). Genera tus claves desde la sección API del dashboard, y trátalas como contraseñas—tienen privilegios completos de cuenta.

curl -H "x-api-key: tu_clave_api_aqui" \
     https://api.wallawhats.com/subscriptions

Endpoints Principales de la API

La API de WALLAWHATS proporciona cinco grupos principales de recursos para construir integraciones:

Gestión de Suscripciones

Crear una nueva suscripción:

POST /subscriptions
Content-Type: application/json
x-api-key: tu_clave_api_aqui

{
  "xUsername": "elonmusk"
}

Listar todas las suscripciones:

GET /subscriptions
x-api-key: tu_clave_api_aqui

Eliminar una suscripción:

DELETE /subscriptions/elonmusk
x-api-key: tu_clave_api_aqui

Nota que el endpoint de eliminación toma el handle de X como parámetro de ruta—no un ID interno de suscripción.

Historial de Notificaciones y Auditoría

Extraer historial de notificaciones con estado de entrega:

GET /notifications?from=1704067200000&to=1704153600000
x-api-key: tu_clave_api_aqui

El endpoint de notificaciones devuelve resultados paginados con cada fila representando una alerta entregada a un canal. Los valores de estado incluyen:

  • queued: Alerta aceptada, esperando entrega
  • sent: Enviada al proveedor del canal
  • delivered: Confirmada como recibida por el destino
  • read: Abierta por el destinatario (solo WhatsApp, requiere confirmaciones de lectura habilitadas)
  • failed: Intento de entrega fallido

Gestión de Canales

Listar canales configurados:

GET /channels
x-api-key: tu_clave_api_aqui

Agregar un nuevo canal:

POST /channels
Content-Type: application/json
x-api-key: tu_clave_api_aqui

{
  "type": "email",
  "destination": "alerts@tuempresa.com"
}

Eliminar un canal:

DELETE /channels/channel_id_aqui
x-api-key: tu_clave_api_aqui

Capturas de Tweets

Acceder a la galería de capturas:

GET /snapshots
x-api-key: tu_clave_api_aqui

Eliminar una captura específica:

DELETE /snapshots/tweet_id_aqui
x-api-key: tu_clave_api_aqui

Construyendo Integraciones: Ejemplos de Código

Integración Node.js

Aquí tienes un ejemplo de Node.js que agrega una suscripción y consulta por nuevas notificaciones:

const axios = require('axios');

class WallaWhatsClient {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.baseURL = 'https://api.wallawhats.com';
  }

  async addSubscription(xUsername) {
    try {
      const response = await axios.post(
        `${this.baseURL}/subscriptions`,
        { xUsername },
        { headers: { 'x-api-key': this.apiKey } }
      );
      return response.data;
    } catch (error) {
      throw new Error(`Failed to add subscription: ${error.response?.data?.message || error.message}`);
    }
  }

  async getNotifications(from, to, lastKey = null) {
    try {
      let url = `${this.baseURL}/notifications?from=${from}&to=${to}`;
      if (lastKey) url += `&lastKey=${lastKey}`;
      
      const response = await axios.get(url, {
        headers: { 'x-api-key': this.apiKey }
      });
      return response.data;
    } catch (error) {
      throw new Error(`Failed to fetch notifications: ${error.response?.data?.message || error.message}`);
    }
  }

  async listSubscriptions() {
    try {
      const response = await axios.get(
        `${this.baseURL}/subscriptions`,
        { headers: { 'x-api-key': this.apiKey } }
      );
      return response.data;
    } catch (error) {
      throw new Error(`Failed to list subscriptions: ${error.response?.data?.message || error.message}`);
    }
  }
}

// Ejemplo de uso
async function monitorCompetitor() {
  const client = new WallaWhatsClient('tu_clave_api_aqui');
  
  // Agregar una nueva suscripción
  await client.addSubscription('vercel');
  console.log('Ahora monitoreando @vercel');
  
  // Revisar notificaciones recientes
  const oneDayAgo = Date.now() - (24 * 60 * 60 * 1000);
  const notifications = await client.getNotifications(oneDayAgo, Date.now());
  
  console.log(`Encontradas ${notifications.items.length} alertas recientes`);
  notifications.items.forEach(notification => {
    console.log(`${notification.xUsername}: ${notification.status} en ${notification.timestamp}`);
  });
}

Integración Python

Para flujos de Python, aquí tienes una clase que maneja gestión de suscripciones y consulta de notificaciones:

import requests
import time
from datetime import datetime, timedelta

class WallaWhatsAPI:
    def __init__(self, api_key):
        self.api_key = api_key
        self.base_url = 'https://api.wallawhats.com'
        self.headers = {'x-api-key': api_key}

    def add_subscription(self, x_username):
        """Agregar una nueva cuenta de X para monitorear"""
        response = requests.post(
            f'{self.base_url}/subscriptions',
            json={'xUsername': x_username},
            headers=self.headers
        )
        response.raise_for_status()
        return response.json()

    def remove_subscription(self, x_username):
        """Eliminar una cuenta de X del monitoreo"""
        response = requests.delete(
            f'{self.base_url}/subscriptions/{x_username}',
            headers=self.headers
        )
        response.raise_for_status()
        return response.status_code == 200

    def get_notifications(self, from_ms, to_ms, last_key=None):
        """Obtener historial de notificaciones con paginación"""
        params = {'from': from_ms, 'to': to_ms}
        if last_key:
            params['lastKey'] = last_key
            
        response = requests.get(
            f'{self.base_url}/notifications',
            params=params,
            headers=self.headers
        )
        response.raise_for_status()
        return response.json()

    def get_all_notifications(self, from_ms, to_ms):
        """Obtener todas las notificaciones en un rango de tiempo, manejando paginación"""
        all_notifications = []
        last_key = None
        
        while True:
            batch = self.get_notifications(from_ms, to_ms, last_key)
            all_notifications.extend(batch['items'])
            
            if not batch.get('lastKey'):
                break
            last_key = batch['lastKey']
        
        return all_notifications

    def list_subscriptions(self):
        """Obtener todas las suscripciones actuales"""
        response = requests.get(
            f'{self.base_url}/subscriptions',
            headers=self.headers
        )
        response.raise_for_status()
        return response.json()

# Ejemplo: Reporte de auditoría diario
def generate_daily_report():
    api = WallaWhatsAPI('tu_clave_api_aqui')
    
    # Obtener notificaciones de ayer
    end_time = int(time.time() * 1000)
    start_time = end_time - (24 * 60 * 60 * 1000)
    
    notifications = api.get_all_notifications(start_time, end_time)
    
    # Agrupar por cuenta y estado
    report = {}
    for notification in notifications:
        account = notification['xUsername']
        status = notification['status']
        
        if account not in report:
            report[account] = {'total': 0, 'delivered': 0, 'failed': 0}
        
        report[account]['total'] += 1
        if status in ['delivered', 'read']:
            report[account]['delivered'] += 1
        elif status == 'failed':
            report[account]['failed'] += 1
    
    # Imprimir resumen
    print(f"Reporte de Alertas Diarias - {datetime.now().strftime('%Y-%m-%d')}")
    print("-" * 50)
    for account, stats in report.items():
        success_rate = (stats['delivered'] / stats['total']) * 100 if stats['total'] > 0 else 0
        print(f"@{account}: {stats['total']} alertas, {success_rate:.1f}% entregadas")

Entendiendo el Enrutamiento de Canales

WALLAWHATS usa un modelo de enrutamiento global de canales—cada alerta de cada suscripción se distribuye a todos los canales habilitados y verificados. No puedes enrutar cuentas específicas a destinos específicos vía la API (como “@elonmusk → WhatsApp, @vercel → email”).

La selección de canales ocurre a nivel de cuenta en la página de Canales. Cuando agregas un canal vía API, se vuelve disponible para todas las alertas una vez verificado. Cuando eliminas un canal, deja de recibir alertas de todas las suscripciones.

Este diseño simplifica la automatización mientras previene la fragmentación de alertas. Tu código de integración no necesita rastrear reglas de enrutamiento por suscripción—solo gestiona qué cuentas monitorear y qué canales habilitar.

Límites de Velocidad y Caps de Velocidad

WALLAWHATS implementa caps de velocidad a nivel de usuario para prevenir spam de alertas durante períodos de alta actividad:

  • Free: 2 alertas/hora
  • Pro: 5 alertas/hora
  • Pro+: 15 alertas/hora
  • Business: 30 alertas/hora
  • Enterprise: 100 alertas/hora

Cuando los caps de velocidad se exceden, tweets adicionales se almacenan en mensajes de resumen y se entregan cada 15 minutos. Tu integración API verá estos como registros de notificación separados—uno para la alerta inmediata, y uno para cada lote de resumen.

La API en sí no impone límites de velocidad separados en la gestión de suscripciones o consultas de notificaciones. Sin embargo, evita bombardear los endpoints con solicitudes innecesarias—cachea listas de suscripciones localmente y agrupa consultas de notificaciones eficientemente.

Manejo de Errores y Solución de Problemas

Patrones comunes de errores de API y cómo manejarlos:

Fallas de autenticación (401):

  • Verifica que tu clave API sea correcta y no haya sido revocada
  • Asegúrate de usar el header x-api-key, no Authorization

Conflictos de suscripción (409):

  • Cuenta ya monitoreada: La suscripción existe, tratar como éxito
  • Cuenta protegida/privada: WALLAWHATS las rechaza por diseño

Limitación de velocidad (429):

  • Retrocede exponencialmente antes de reintentar
  • Verifica si te acercas a límites de plan en cuentas monitoreadas

Problemas de verificación de canales:

  • Nuevos canales requieren verificación OTP antes de recibir alertas
  • Canales agregados programáticamente no funcionarán hasta que el usuario complete la verificación

Monitoreando y Alertando tus Integraciones

Ya que WALLAWHATS se convierte en infraestructura crítica cuando se integra en flujos de negocio, monitorea la salud de tu integración:

Detección de Deriva de Suscripciones:

// Revisar si las suscripciones esperadas siguen activas
async function auditSubscriptions(expectedHandles) {
  const current = await client.listSubscriptions();
  const currentHandles = current.map(s => s.xUsername);
  
  const missing = expectedHandles.filter(h => !currentHandles.includes(h));
  if (missing.length > 0) {
    console.warn(`Suscripciones faltantes: ${missing.join(', ')}`);
  }
  
  return missing;
}

Monitoreo de Tasa de Éxito de Entrega:

def check_delivery_health():
    # Revisar últimas 6 horas
    end_time = int(time.time() * 1000)
    start_time = end_time - (6 * 60 * 60 * 1000)
    
    notifications = api.get_all_notifications(start_time, end_time)
    if not notifications:
        return None
    
    delivered = sum(1 for n in notifications if n['status'] in ['delivered', 'read'])
    total = len(notifications)
    success_rate = (delivered / total) * 100
    
    if success_rate < 95:
        # Alertar a tu equipo de ops
        print(f"ADVERTENCIA: Tasa de éxito de entrega bajó a {success_rate:.1f}%")
    
    return success_rate

Patrones de Integración y Mejores Prácticas

Procesamiento Estilo Webhook: Aunque WALLAWHATS no proporciona webhooks directamente, puedes consultar el endpoint de notificaciones por nuevas alertas y procesarlas en tiempo casi real:

async function pollForNewAlerts() {
  const lastCheck = localStorage.getItem('lastNotificationCheck') || Date.now() - 300000;
  const now = Date.now();
  
  const notifications = await client.getNotifications(lastCheck, now);
  
  for (const notification of notifications.items) {
    if (notification.status === 'delivered') {
      // Procesar la alerta - enviar a Slack, actualizar base de datos, etc.
      await processAlert(notification);
    }
  }
  
  localStorage.setItem('lastNotificationCheck', now);
}

// Consultar cada 30 segundos
setInterval(pollForNewAlerts, 30000);

Gestión Condicional de Suscripciones: Agregar o eliminar suscripciones dinámicamente basándose en disparadores externos:

def update_competitor_monitoring(portfolio_companies):
    """Actualizar monitoreo de X basado en portafolio actual"""
    current_subs = {s['xUsername'] for s in api.list_subscriptions()}
    
    # Cuentas que deberíamos estar monitoreando
    target_accounts = set()
    for company in portfolio_companies:
        if company.get('ceo_twitter_handle'):
            target_accounts.add(company['ceo_twitter_handle'])
        if company.get('company_twitter_handle'):
            target_accounts.add(company['company_twitter_handle'])
    
    # Agregar suscripciones faltantes
    for account in target_accounts - current_subs:
        try:
            api.add_subscription(account)
            print(f"Empezando a monitorear @{account}")
        except Exception as e:
            print(f"Falló agregar @{account}: {e}")
    
    # Eliminar suscripciones desactualizadas
    for account in current_subs - target_accounts:
        api.remove_subscription(account)
        print(f"Dejando de monitorear @{account}")

La API de WALLAWHATS transforma las alertas de X en tiempo real de una herramienta manual de dashboard a un componente de infraestructura programable. Ya sea que estés construyendo flujos personalizados de inteligencia, automatizando monitoreo de marca, o creando servicios de notificación con marca blanca, la API proporciona las capacidades de control y auditoría necesarias para integración en producción.

¿Buscas expandir tu monitoreo más allá de competidores? Revisa nuestra guía sobre monitorear crypto Twitter para señales de mercado o aprende cómo los periodistas usan WALLAWHATS para monitoreo de fuentes en tiempo real.

Nunca te pierdas un post importante otra vez. Crea una cuenta gratis — 1 número de WhatsApp, alertas en tiempo real, no se requiere tarjeta de crédito.

Volver al Blog

Artículos Relacionados

Ver Todos los Artículos »