Enviar notificaciones
Destinos, contenido por idioma, datos, enlaces, botones, categorías y validación.
Un envío es un POST /v1/notifications con tu llave secreta, o lo mismo desde Notificaciones → Nueva en el panel. Responde 202 de inmediato y se entrega en segundo plano.
{
"target": { "type": "external_users", "ids": ["cliente-123"] },
"content": {
"es": { "title": "Tu pedido va en camino", "body": "Llega hoy" },
"en": { "title": "Your order is on its way", "body": "Arriving today" }
},
"data": { "orderId": "A-1029" },
"deepLink": "miapp://pedidos/A-1029"
}
Destinos (target.type)
| Tipo | Campos | Alcanza a |
|---|---|---|
devices |
ids o tokens |
Dispositivos concretos |
external_users |
ids |
Todos los dispositivos de esos usuarios (externalUserId) |
topic |
name |
Los suscritos al topic |
segment |
segmentId |
Los que cumplen un segmento guardado |
filters |
rules |
Un filtro al vuelo (mismo formato que los segmentos) |
all |
— | Todos los dispositivos activos de la app |
test_devices |
— | Solo los dispositivos de prueba |
Con una llave test, cualquier destino se limita a los dispositivos de prueba. platforms: ["ios"] restringe a una plataforma.
Contenido
- Por idioma:
content.es,content.en… contitle,subtitle(iOS) ybody. Cada dispositivo recibe su idioma; si no está, el idioma por defecto de la app. - Variables:
{{nombre}}en el texto, con sus valores envariables. - Plantillas:
templateIdusa una plantilla guardada; lo que envíes en la petición tiene prioridad. contentType:alert, la visible (por defecto);data_only, solo datos: la app arma la notificación. El título y el texto viajan endata, en las claves que lee el plugin de tu framework (titleybody;titleymessageen Cordova y Expo). Ver Compatibilidad;silent, para actualizar la app en segundo plano.
Datos, enlaces y botones
data: hasta 50 claves que tu app recibe. No uses claves que empiecen por_ph: son de PushHub.deepLink: la app lo recibe al tocar la notificación.actions: hasta 3 botones{ id, title, deepLink }. Requieren código en la app (o el SDK).sound:defaulto un sonido incluido en la app y registrado en el panel.badge(iOS),ttlSeconds(hasta 28 días),priority(high/normal).- Opciones por plataforma:
android:channelId,color,tag,collapseKey;ios:interruptionLevel,threadId,relevanceScore.
Categoría
transactional(por defecto): pedidos, seguridad, recordatorios del usuario.marketing: promociones. Va por una cola de menor prioridad, para que nunca retrase a las transaccionales, y respeta los límites de la app.
Límites de marketing
En la configuración de cada app (Apps → editar → Envíos de marketing) puedes fijar dos límites. Se aplican en la hora local de cada dispositivo y solo a los envíos marketing:
- Máximo por dispositivo y día: las notificaciones que pasan el límite se omiten. Aparecen como
skipped(códigoFREQUENCY_CAP) y no cuentan como fallidas. - Horas de silencio (por ejemplo, de 22:00 a 08:00): la entrega se aplaza hasta la hora de fin. El envío sigue en
sendinghasta entregarlas, ystats.deferredcuenta cuántas se aplazaron.
Si el dispositivo no informó su zona horaria, se usa la de la empresa. El SDK la envía siempre.
Validar sin enviar
"validateOnly": true valida todo, estima cuántos dispositivos alcanzaría y calcula el tamaño del payload, sin crear el envío.
El payload no puede pasar de 4 KB (2003): la multimedia nunca viaja en el payload, solo su URL.
Seguimiento
GET /v1/notifications/{id}: estado y estadísticas (enviadas, aceptadas, fallidas, tokens inválidos, aperturas, clics).GET /v1/notifications/{id}/deliveries: el resultado por dispositivo.POST /v1/notifications/{id}/cancel: cancela un envío programado o en curso.- Webhooks
notification.completedynotification.failedal terminar. Ver Webhooks.