Saltar al contenido

Notificar

POST https://api.pushwoosh.com/messaging/v2/notify

Crea y programa un único mensaje.

Estructura de la solicitud

Anchor link to

El cuerpo de la solicitud es un NotifyRequest con exactamente uno de los dos tipos:

  • segment: dirige a un segmento de audiencia por código de segmento, o —sin crear un segmento primero— una expresión seglang o una expresión de filtro estructurada.
  • transactional: envía a una lista explícita de hwids, ID de usuario, tokens push o dispositivos de prueba.
Forma
{
"segment": { ... }, // O
"transactional": { ... },
"transaction_id": "unique-uuid"
}
CampoTipoDescripción
transaction_idstringOpcional. Clave de idempotencia para la solicitud — funciona tanto con segment como con transactional. Una llamada repetida con el mismo transaction_id en un plazo de 5 minutos devuelve el message_code original en lugar de enviar un mensaje duplicado. Utiliza un UUID u otro valor único por envío lógico.

NotifySegment

Anchor link to

Se dirige a los usuarios que coinciden con un segmento de audiencia o una expresión de filtro. Establece exactamente uno de code, expression o filter_expression. Para expression y filter_expression, no es necesario crear un segmento de antemano — la expresión se evalúa en línea solo para este envío.

CampoTipoDescripción
scheduleScheduleCuándo y cómo enviar. Requerido.
applicationstringCódigo de aplicación.
platformsarray de PlatformPlataformas a las que se dirige el mensaje.
codestringCódigo de segmento de un segmento guardado previamente. Mutuamente excluyente con expression y filter_expression.
expressionstringExpresión Seglang, evaluada solo para este envío — no se requiere un segmento guardado. Mutuamente excluyente con code y filter_expression.
filter_expressionFilterExpressionLa misma lógica que expression, como un objeto estructurado en lugar de una cadena seglang. Mutuamente excluyente con code y expression. El esquema de FilterExpression no está documentado públicamente — solicítalo al soporte de Pushwoosh si necesitas la forma estructurada.
payloadPayloadPayload de Push / SMS / Telegram / Kakao / LINE / WhatsApp / Viber / Facebook Messenger. Mutuamente excluyente con email_payload.
email_payloadEmailPayloadPayload de correo electrónico.
campaignstringCódigo de campaña al que atribuir este mensaje.
campaign_namestringNombre interno de este mensaje, se muestra como el título de la fila en Message History y en su exportación. No tiene relación con campaign arriba. No agrupa mensajes ni afecta la entrega. Máximo 255 caracteres, recortado. Omítelo o déjalo vacío para que el título de la fila se tome del propio contenido del payload.
frequency_cappingFrequencyCappingLímites de frecuencia por usuario.
send_rateSendRateLimitación de velocidad para el envío.
silent_hoursSilentHoursOpcional. Envía el mensaje sin las horas de silencio de la aplicación.
message_typeMessageTypeMESSAGE_TYPE_MARKETING (predeterminado) o MESSAGE_TYPE_TRANSACTIONAL. Controla el filtrado del grupo de control.
dynamic_content_placeholdersmap<string, string>Reemplaza los marcadores de posición en el contenido.
meta_dataobjectMetadatos de formato libre reenviados a las analíticas posteriores.
use_latest_user_deviceboolCuando es true, entrega el mensaje al dispositivo más recientemente activo de cada usuario (el que tiene la última apertura de la aplicación más reciente) en lugar de a cada dispositivo que coincida con el segmento. Limitado a platforms: solo se consideran los dispositivos en esas plataformas, y si ninguno tiene datos de última apertura de la aplicación, se utiliza el primer dispositivo coincidente en lugar de descartar el envío. El valor predeterminado es false (enviar a cada dispositivo).
geo_zoneGeoZoneOpcional. Limita la audiencia a los dispositivos cuya última ubicación registrada se encuentra dentro de un círculo que usted define en esta solicitud. Se combina con code, expression o filter_expression mediante AND: un dispositivo debe coincidir con el segmento y estar dentro del círculo. Los dispositivos sin ubicación registrada se omiten. No disponible en NotifyTransactional.
control_groupstringCódigo o nombre del grupo de exclusión propio del envío que se aplicará a este mensaje. No restringe qué grupos de control se aplican: todos los grupos de control habilitados de la aplicación excluyen usuarios de los envíos de marketing, tanto si se establece este campo como si no. Mutuamente excluyente con holdout_percentage.
holdout_percentageuint32Extrae esta proporción del segmento, de 1 a 20, a un grupo de control limitado a este envío, además de los grupos de control habilitados de la aplicación, para medir el impacto de una sola campaña sin consumir los grupos compartidos. 0 (predeterminado) lo desactiva. Mutuamente excluyente con control_group.

Los dispositivos seleccionados para el grupo de exclusión quedan excluidos de la entrega del mismo modo que con los grupos de control de la aplicación. No se les envía el mensaje, y el registro de seguimiento anota el descarte como Device is in control group. Un message_type de MESSAGE_TYPE_TRANSACTIONAL omite esta exclusión por completo, igual que con los grupos de control de la aplicación.

Establecer holdout_percentage junto con control_group, o un holdout_percentage superior a 20, devuelve 400:

Invalid holdout_percentage
{
"code": 3,
"message": "invalid argument",
"details": [
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"field": "holdout_percentage",
"description": "holdout_percentage and control_group are mutually exclusive"
}
]
},
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "InvalidHoldoutPercentage",
"domain": "api.pushwoosh.com",
"metadata": {}
}
]
}

Ejemplo: Enviar a un segmento

Anchor link to
Terminal window
curl -X POST https://api.pushwoosh.com/messaging/v2/notify \
-H "Authorization: Token YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"segment": {
"application": "XXXXX-XXXXX",
"platforms": ["IOS", "ANDROID"],
"code": "active_users",
"payload": {
"content": {
"localized_content": {
"en": {
"ios": { "body": "Hello!" },
"android": { "body": "Hello!" }
}
}
}
},
"schedule": { "at": "2026-05-01T12:00:00Z" },
"message_type": "MESSAGE_TYPE_MARKETING"
}
}'

NotifyTransactional

Anchor link to

Envía a una lista explícita de destinatarios.

CampoTipoDescripción
scheduleScheduleRequerido.
applicationstringCódigo de aplicación.
platformsarray de PlatformPlataformas a las que se dirige el mensaje.
test_devicesboolSi es true, enviar solo a los dispositivos de prueba de la aplicación.
hwids{ "list": [string, ...] }Enviar solo a estos hwids.
users{ "list": [string, ...] }Enviar solo a estos ID de usuario.
push_tokens{ "list": [string, ...] }Enviar solo a estos tokens push.
payloadPayloadPayload de Push / SMS / Telegram / Kakao / LINE / WhatsApp / Viber / Facebook Messenger.
email_payloadEmailPayloadPayload de correo electrónico.
return_unknown_identifiersboolCuando es true, la lista unknown_identifiers de la respuesta contiene los identificadores que no se encontraron.
registration_typeRegistrationTypeQué hacer con los hwids que aún no están registrados en Pushwoosh. El valor predeterminado es REGISTRATION_TYPE_DEFAULT, que los omite. Establezca REGISTRATION_TYPE_FORCE para registrar nuevas direcciones de correo electrónico o números de teléfono y enviarles el mensaje en la misma solicitud.
use_latest_user_deviceboolSolo se aplica cuando se dirige a users. Mismo comportamiento que en NotifySegment anterior — entrega un mensaje por usuario en lugar de uno por dispositivo, limitado a platforms. El valor predeterminado es false.
campaign, campaign_name, frequency_capping, send_rate, silent_hours, message_type, dynamic_content_placeholders, meta_dataVer NotifySegment arriba.

test_devices, hwids, users y push_tokens son mutuamente excluyentes. Se debe establecer exactamente uno.

Enviar a nuevas direcciones de correo electrónico y números de teléfono

Anchor link to

Para email, SMS, WhatsApp, LINE, Viber y Kakao, el hwid es el propio destino, como la dirección de correo electrónico o el número de teléfono. Para enviar a un hwid que aún no está registrado, inclúyalo en hwids y establezca registration_type en REGISTRATION_TYPE_FORCE. Pushwoosh lo registra y entrega el mensaje en la misma solicitud, por lo que no necesita hacer antes una llamada a /registerDevice o /registerEmail.

registration_type solo funciona con hwids. Con users, un ID de usuario desconocido no se crea, sea cual sea el valor de registration_type.

Escriba cada hwid en el mismo formato en que /registerDevice lo almacena para ese canal:

CanalFormato del hwidEjemplo
EmailDirección de correo electróniconew.customer@example.com
SMSNúmero de teléfono en formato internacional+14155552671
WhatsAppNúmero de teléfono con el prefijo whatsapp:whatsapp:+14155552671
KakaoNúmero de teléfono con el prefijo kakao:kakao:+821012345678
ViberNúmero de teléfono con el prefijo viber:. Pushwoosh añade el prefijo si faltaviber:+14155552671
LINEID de usuario de LINEU4af4980629a1b2c3d4e5f6a7b8c9d0e1

Mantenga los prefijos whatsapp: y kakao:. Sin ellos, el número se interpreta como un hwid de SMS. Si ese número ya está registrado para SMS, el envío encuentra el hwid de SMS, que no coincide con la plataforma de destino, y el destinatario se omite.

Pushwoosh comprueba los números de teléfono solo con return_unknown_identifiers: true. En ese caso, un hwid de SMS, WhatsApp o Kakao que no sea un número de teléfono válido no se registra y se devuelve en unknown_identifiers. Sin ese indicador, el valor se registra tal cual.

REGISTRATION_TYPE_FORCE no registra hwids en plataformas push, Telegram ni Facebook Messenger, ya que estas necesitan un token del SDK o del servicio de mensajería. Un hwid desconocido en estas plataformas se descarta sin aviso. No se devuelve en unknown_identifiers y no se le envía nada.

Para WhatsApp, registrar un número no abre la ventana de atención al cliente de 24 horas. Un número que no le ha escrito solo puede recibir una plantilla aprobada previamente indicada en whatsapp.content_id, no whatsapp.content de formato libre.

Ejemplo: Enviar a una nueva dirección de correo electrónico

Anchor link to
Terminal window
curl -X POST https://api.pushwoosh.com/messaging/v2/notify \
-H "Authorization: Token YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"transactional": {
"application": "XXXXX-XXXXX",
"platforms": ["EMAIL"],
"hwids": { "list": ["new.customer@example.com"] },
"registration_type": "REGISTRATION_TYPE_FORCE",
"email_payload": {
"subject": { "en": "Welcome aboard" },
"body": "<p>Thanks for signing up!</p>"
},
"schedule": { "at": "2026-05-01T12:00:00Z" },
"message_type": "MESSAGE_TYPE_TRANSACTIONAL",
"return_unknown_identifiers": true
}
}'

Ejemplo: Transaccional por ID de usuario

Anchor link to
Terminal window
curl -X POST https://api.pushwoosh.com/messaging/v2/notify \
-H "Authorization: Token YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"transactional": {
"application": "XXXXX-XXXXX",
"platforms": ["IOS", "ANDROID"],
"users": { "list": ["user-123", "user-456"] },
"payload": {
"content": {
"localized_content": {
"en": { "ios": { "body": "Your order has shipped." } }
}
}
},
"schedule": { "at": "2026-05-01T12:00:00Z" },
"message_type": "MESSAGE_TYPE_TRANSACTIONAL",
"return_unknown_identifiers": true,
"use_latest_user_device": true
}
}'
{
"result": {
"message_code": "XXXXX-XXXXX-XXXXX",
"unknown_identifiers": []
}
}
CampoTipoDescripción
message_codestringCódigo de mensaje único. Úsalo con /getMessageDetails y los endpoints de estadísticas de mensajes.
unknown_identifiersarray de stringIdentificadores no encontrados en la cuenta. Se completa solo en un envío transactional con return_unknown_identifiers: true o con segmentación por push_tokens. Los identificadores registrados mediante REGISTRATION_TYPE_FORCE no se incluyen.

/getMessageDetails no encuentra un mensaje transactional enviado de inmediato a menos de 10 usuarios y menos de 10 dispositivos, porque ese mensaje no se almacena. Consulte Mensajes enviados de inmediato a menos de 10 destinatarios.

No se encontraron destinatarios

Anchor link to

Con return_unknown_identifiers: true o segmentación por push_tokens, Pushwoosh busca cada destinatario antes de crear el mensaje. Si ninguno está registrado, Notify devuelve HTTP 400 con este error y no se crea ningún mensaje:

{
"code": 9,
"message": "No recipients found",
"details": [ ... ]
}

Si se encuentra al menos un destinatario, la solicitud se completa correctamente y el resto se incluye en unknown_identifiers. Para enviar en su lugar a nuevas direcciones de correo electrónico o números de teléfono, establezca registration_type en REGISTRATION_TYPE_FORCE.

Para email, las direcciones no válidas y las que rebotaron anteriormente se eliminan antes de esta comprobación, sin incluirse en unknown_identifiers. Si después de eso no queda ninguna dirección, Notify devuelve 200 con un message_code, pero no se crea ningún mensaje y no se envía nada.

Tipos compartidos

Anchor link to
{
"at": "2026-05-01T12:00:00Z",
"follow_user_timezone": true,
"past_timezones_behaviour": "PAST_TIMEZONES_BEHAVIOUR_SEND_IMMEDIATELY"
}
CampoTipoDescripción
attimestampHora de envío absoluta (RFC 3339). Máximo 30 días en el futuro. Con follow_user_timezone sin establecer o en false, un at en el pasado se sustituye por la hora en que se recibió la solicitud, por lo que el mensaje se envía inmediatamente a todos. Con follow_user_timezone: true, un at en el pasado se mantiene tal cual. Consulte la advertencia a continuación.
afterdurationAlternativa a at. Enviar después de este desfase desde “ahora” (p. ej., "3600s"). Máximo 30 días.
follow_user_timezoneboolCuando es true, cada dispositivo recibe el mensaje a la hora at en su zona horaria local.
past_timezones_behaviourenumPAST_TIMEZONES_BEHAVIOUR_SEND_IMMEDIATELY (predeterminado), PAST_TIMEZONES_BEHAVIOUR_DO_NOT_SEND o PAST_TIMEZONES_BEHAVIOUR_NEXT_DAY. Solo tiene sentido cuando follow_user_timezone es true o best_time_to_send está establecido.
best_time_to_sendtimestampOpcional. Solo para envíos a segmentos. Cada dispositivo recibe el mensaje a su propia mejor hora dentro de las 24 horas siguientes a este momento. Los dispositivos sin mejor hora lo reciben en la fecha y hora de at / after en su zona horaria local. Consulte Mejor momento de envío.

Mejor momento de envío

Anchor link to

best_time_to_send es el equivalente en la API de la opción Mejor momento del Control Panel. at / after define el envío alternativo para los dispositivos sin datos suficientes para calcular una mejor hora. Pushwoosh toma la fecha y hora UTC de at / after y entrega el envío alternativo en esa fecha y hora en la zona horaria local de cada dispositivo, como con follow_user_timezone: true. Esto se aplica de forma implícita: deje follow_user_timezone sin establecer, ya que true se rechaza con BestTimeToSendWithUserTimezone. En el ejemplo siguiente, los dispositivos sin mejor hora reciben el mensaje a las 18:00 hora local del 1 de mayo. Donde esa hora local ya haya pasado cuando comienza el envío, se aplica past_timezones_behaviour.

{
"at": "2026-05-01T18:00:00Z",
"best_time_to_send": "2026-05-01T00:00:00Z"
}

Pushwoosh rechaza la solicitud con 400 a menos que se cumplan todas estas condiciones:

  • La solicitud usa el tipo segment. Los envíos transactional no admiten best_time_to_send.
  • follow_user_timezone no está establecido o es false.
  • La hora de envío de at / after está en el futuro. Un at en el pasado, after: "0s" o un after omitido cuentan como «enviar ahora» y se rechazan.
  • best_time_to_send no es anterior a la próxima hora en punto ni está a más de 30 días en el futuro. Se redondea hacia abajo a la hora en punto.
  • La hora de envío de at / after no es posterior a best_time_to_send más 24 horas.

El reason del error (en el detalle ErrorInfo) indica la comprobación que falló:

reasonCausa
BestTimeToSendWithUserTimezonefollow_user_timezone es true.
BestTimeToSendTooEarlybest_time_to_send es anterior a la próxima hora en punto.
BestTimeToSendTooFarInFuturebest_time_to_send está a más de 30 días en el futuro.
SendDateAfterBestTimeToSendat / after es posterior a best_time_to_send más 24 horas.
BestTimeToSendNotAllowedbest_time_to_send está establecido en un envío transactional.
BestTimeToSendWithSendNowat / after se resuelve como «ahora» (at en el pasado o after igual a cero).

Un círculo puntual para geo_zone, definido en la propia solicitud. No es una geozona guardada: no intervienen las campañas geográficas ni la API de Geozonas, y no se almacena nada en la aplicación.

{ "lat": 40.7128, "lng": -74.006, "range": 500 }
CampoTipoDescripción
latdoubleLatitud del centro del círculo, en grados. Obligatorio.
lngdoubleLongitud del centro del círculo, en grados. Obligatorio.
rangedoubleRadio del círculo en metros. Obligatorio.

FrequencyCapping

Anchor link to

Límites de frecuencia por usuario para envíos de marketing. Para deshabilitar el límite, omite frequency_capping por completo, o envía days: 0 junto con count: 0.

{ "days": 7, "count": 3, "exclude": false, "avoid": true }
  • days (int, 1–30, o 0 para deshabilitar el límite): ventana de retrospectiva. Debe enviarse junto con count — si uno es 0, el otro también debe ser 0; enviar uno como 0 mientras el otro no es cero devuelve 400.
  • count (int, 1 o superior, o 0 para deshabilitar el límite): número máximo de mensajes permitidos dentro de days. Misma regla de emparejamiento que days.
  • exclude (bool): excluye estrictamente a los usuarios que ya han alcanzado el límite.
  • avoid (bool): evita suavemente a los usuarios que ya han alcanzado el límite (aún cuentan para las analíticas).
{ "value": 500, "bucket": "1s", "avoid": false }

Limita la velocidad del envío. value es el número de mensajes por bucket; un bucket típico es "1s".

SilentHours

Anchor link to
{ "avoid": true }

Los mensajes de marketing respetan las horas de silencio de la aplicación de forma predeterminada: durante el período de silencio, se retienen hasta que termina o no se envían, según la configuración del canal. Establezca avoid en true para enviar este mensaje incluso durante el período de silencio. Los mensajes con message_type MESSAGE_TYPE_TRANSACTIONAL nunca se retienen por las horas de silencio, por lo que no necesitan este campo.

Enumeración de Plataforma

Anchor link to

IOS, ANDROID, OSX, WINDOWS, AMAZON, SAFARI, CHROME, FIREFOX, IE, EMAIL, HUAWEI_ANDROID, SMS, WEB, KAKAO, TELEGRAM, LINE, WHATS_APP, VIBER, FB_MESSENGER.

Enumeración de RegistrationType

Anchor link to
  • REGISTRATION_TYPE_DEFAULT: omite los identificadores que no están registrados en Pushwoosh. Predeterminado.
  • REGISTRATION_TYPE_NONE: envía a cada hwid de la lista sin guardar un dispositivo para él.
  • REGISTRATION_TYPE_FORCE: registra cada hwid desconocido como dispositivo en el canal de destino y luego le envía el mensaje. Se aplica a email, SMS, WhatsApp, LINE, Viber y Kakao.

Enumeración de MessageType

Anchor link to
  • MESSAGE_TYPE_UNSPECIFIED: equivalente a MESSAGE_TYPE_MARKETING.
  • MESSAGE_TYPE_MARKETING: sujeto al filtrado del grupo de control, al límite de frecuencia y a las horas de silencio.
  • MESSAGE_TYPE_TRANSACTIONAL: omite el filtrado del grupo de control, el límite de frecuencia y las horas de silencio. Úsalo para confirmaciones de pedidos, OTP y flujos críticos similares.

Relacionado

Anchor link to