Push Notifications: tus avisos, directo al celular de tu equipo
Esta guía explica, paso a paso, cómo enviar notificaciones al celular de los usuarios de Cody desde tus propios sistemas usando la Public API: qué necesitas antes de empezar, cómo conectarte de forma segura, cómo enviar a una persona o a un grupo, y cómo saber a quién le llegó.
Lectura estimada: 15 minutos · Nivel: inicial · Incluye ejemplos en cURL, JavaScript y Python.
¿Vas a integrar con ayuda de un agente de IA?
Descarga esta guía en Markdown y agrégala al contexto de tu agente (Claude Code, Cursor, Copilot, ChatGPT…). Incluye reglas obligatorias, el contrato completo de la API, ejemplos y una lista de verificación para revisar el código que genere.
1 · Descripción
Qué es y para qué sirve
Una forma de que tus sistemas avisen a las personas en el momento justo, sin depender de que abran la app por su cuenta.
Una push notification es el aviso que aparece en la pantalla del celular aunque la aplicación esté cerrada —como los mensajes de tu banco o de una app de entregas—. Con esta funcionalidad, cualquier sistema de tu empresa puede pedirle a Cody que envíe uno de esos avisos a los usuarios que elijas, a través de la app Cody Companion.
Cada notificación lleva un título y un mensaje, y opcionalmente una imagen y un destino dentro de la app (por ejemplo, el chat con el agente). Tu sistema recibe un identificador del envío con el que después puede consultar el resultado.
A una persona o a miles
La misma solicitud sirve para avisar a un solo usuario o a toda una región: solo cambia la lista de destinatarios.
Inmediata o programada
Envía en el momento o indica fecha y hora; mientras no salga, puedes cancelarla.
Lleva a la pantalla correcta
Al tocar la notificación, la app puede abrir el chat, el coach, el inicio o un anuncio específico.
Seguimiento por usuario
Sabes a quién le llegó, quién la abrió y quién todavía no tiene la app activa.
Todos sus dispositivos
Si una persona usa Cody en más de un celular, la notificación llega a cada uno.
Reintentos automáticos
Si un dispositivo no responde por una falla temporal, Cody vuelve a intentarlo por ti.
Ejemplos de uso
- ERPSe aprueba un pedido o una devolución → avisar al vendedor responsable.
- CRMUn cliente clave queda sin visita en 15 días → recordar al ejecutivo de cuenta.
- BI / reportesUna tienda cae por debajo de su meta diaria → alertar al gerente de zona.
- Recursos humanosSe publica una capacitación obligatoria → notificar al área completa.
- AutomatizaciónCada lunes a las 8:00 a. m. → enviar el recordatorio de objetivos de la semana.
2 · Flujo general
Cómo funciona
El recorrido completo de una notificación, desde que tu sistema la solicita hasta que sabes quién la abrió.
- Solicitud
- Respuesta
- Ocurre en segundo plano
- Autenticación. Tu sistema presenta sus credenciales y obtiene un access token: una llave temporal que acompaña cada solicitud y dura una hora.
- Respuesta con el token. Tu sistema lo guarda y lo reutiliza hasta que esté por vencer.
- Consulta de destinatarios (opcional). Puedes preguntar qué usuarios tienen la app lista para recibir notificaciones.
- Lista de usuarios. Cody responde con sus identificadores.
- Envío. Tu sistema manda el título, el mensaje y la lista de destinatarios.
- Registro. Cody guarda el envío y prepara la entrega.
- Confirmación inmediata. Tu sistema recibe la respuesta
202 Aceptadacon el ID del envío, sin esperar a que lleguen todas las notificaciones. - Entrega en segundo plano. Cody hace llegar la notificación a cada celular de cada destinatario, normalmente en segundos.
- Apertura. Cuando la persona toca la notificación, la app la lleva a la pantalla indicada y Cody registra que la abrió.
- Consulta de resultado. Con el ID del envío, tu sistema pregunta cómo le fue.
- Resultado. Cody devuelve el estado general y el detalle por usuario: entregada, abierta, fallida o sin dispositivo.
Enviar no es lo mismo que entregar
La respuesta 202 confirma que Cody aceptó tu solicitud, no que ya llegó a todos. La entrega ocurre justo después, en segundo plano. Para saber el resultado final, consulta el envío con su ID (fase 5).
3 · Precondiciones
Antes de empezar
Revisa esta lista antes de escribir la primera línea de código: si falta alguna pieza, los envíos no van a llegar.
Requisito 1
Tu organización está activa en Cody
Con usuarios dados de alta. Las notificaciones solo pueden enviarse a usuarios de tu propia organización.
Requisito 2
Un administrador con acceso a Cody AMS
Es quien crea la credencial de integración desde la consola de administración, en Integraciones API.
Requisito 3
Una credencial de servicio asociada a un administrador
La credencial actúa en nombre del usuario que elijas al crearla, y ese usuario debe tener rol de administrador. Si no lo tiene, la API rechaza el envío.
Requisito 4
La URL base de la Public API
Es https://api.public.cody-tech.com. Todas las rutas de esta guía son relativas a esa URL; por ejemplo, el envío se hace a https://api.public.cody-tech.com/push-notification/send.
Requisito 5
Usuarios con la app Cody Companion lista
Para que una persona reciba notificaciones debe tener la app instalada, haber iniciado sesión y aceptado el permiso de notificaciones en su celular. Si cierra sesión, deja de recibirlas en ese dispositivo hasta que vuelva a entrar.
Requisito 6
Un sistema capaz de hacer solicitudes HTTPS
Cualquier lenguaje o herramienta que pueda enviar solicitudes HTTPS con JSON y guardar secretos de forma segura: un backend propio, un ERP con conectores, o plataformas como Power Automate, Make, Zapier o n8n.
¿No sabes si tus usuarios ya tienen la app lista?
Una vez que tengas tu credencial, la consulta GET /user-device/users te dice exactamente cuántos y cuáles usuarios pueden recibir notificaciones hoy. Es la mejor prueba de humo antes de tu primer envío.
4 · Integración
Integración con tus sistemas
Seis pasos para dejar lista la conexión entre tu sistema y Cody, de forma segura y mantenible.
Te recomendamos concentrar toda la comunicación con Cody en un solo componente de tu sistema —un conector—. Así, el resto de tus procesos solo le dice “avisa a estas personas” y el conector se encarga de las credenciales, de renovar el token, de traducir tus usuarios a los de Cody y de guardar el resultado. Al final de esta sección encontrarás uno listo para copiar.
Si vas a desarrollarlo con un agente de IA, dale la versión en Markdown de esta guía como especificación: trae estas mismas instrucciones más una lista de verificación para revisar el resultado.
URL base de la Public API
Todas las solicitudes van a https://api.public.cody-tech.com seguida de la ruta de cada operación; por ejemplo, https://api.public.cody-tech.com/push-notification/send.
Crea tu credencial de servicio en Cody AMS
Un administrador de tu organización debe:
- Entrar a Cody AMS y abrir Integraciones API en el menú lateral.
- Hacer clic en Nueva credencial de servicio.
- Escribir un nombre que identifique la integración, por ejemplo “ERP – Notificaciones”.
- Elegir el usuario en cuyo nombre actuará la integración. Debe tener rol de administrador.
- Hacer clic en Crear credencial y copiar los cuatro valores que aparecen: Client ID, Client Secret, Access Token y Refresh Token.
Los valores solo se muestran una vez
Guárdalos antes de cerrar la ventana. Si se pierden, crea una credencial nueva y elimina la anterior desde la misma pantalla.
Guarda las credenciales de forma segura
Trátalas como la contraseña de un administrador: quien las tenga puede enviar notificaciones en nombre de tu organización.
- Guárdalas en un gestor de secretos o en variables de entorno del servidor, nunca en el código fuente ni en un repositorio.
- Úsalas solo desde un servidor. No las incluyas en páginas web, apps móviles ni hojas de cálculo compartidas.
- Usa una credencial distinta por sistema integrado: así puedes eliminar una sin afectar a las demás.
# URL base de la Public API de Cody.
CODY_API_URL="https://api.public.cody-tech.com"
# Valores entregados al crear la credencial de servicio en Cody AMS.
# Guárdalos en tu gestor de secretos; nunca en el código fuente.
CODY_CLIENT_ID="<client-id>"
CODY_CLIENT_SECRET="<client-secret>"
CODY_REFRESH_TOKEN="<refresh-token>"
CODY_ACCESS_TOKEN="<access-token>" # vigente por 1 horaAutentícate y renueva el token
Cada solicitud a la Public API debe llevar el access token en el encabezado Authorization:
Authorization: Bearer <access_token>
Content-Type: application/jsonEl access token vence a la hora. Para obtener uno nuevo sin intervención humana, usa tu Client ID, Client Secret y Refresh Token. El refresh token no cambia: consérvalo junto con tus credenciales.
curl -X POST "$CODY_API_URL/auth/oauth/v2/refresh" \
-H "Content-Type: application/json" \
-d '{
"client_id": "'"$CODY_CLIENT_ID"'",
"client_secret": "'"$CODY_CLIENT_SECRET"'",
"refresh_token": "'"$CODY_REFRESH_TOKEN"'"
}'{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600
}Cuándo renovar
Renueva unos minutos antes de que venza (por ejemplo, a los 55 minutos) y, como red de seguridad, si una solicitud responde 401, renueva y reintenta una sola vez.
Relaciona tus usuarios con los de Cody
Las notificaciones se dirigen por ID de usuario de Cody, no por correo ni por número de empleado. Arma una tabla de equivalencias entre tus usuarios y los de Cody —por ejemplo, usando el correo electrónico— y actualízala periódicamente (una vez al día suele bastar).
curl "$CODY_API_URL/user/list?skip=0&limit=1000" \
-H "Authorization: Bearer $CODY_ACCESS_TOKEN"[
{
"id": "664f5f3c2f4f5e3b1c2a9d10",
"name": "Ana",
"lastname": "López",
"username": "ana.lopez",
"email": "ana.lopez@tuempresa.com"
},
{
"id": "664f5f3c2f4f5e3b1c2a9d11",
"name": "Carlos",
"lastname": "Méndez",
"username": "carlos.mendez",
"email": "carlos.mendez@tuempresa.com"
}
]El listado se entrega por páginas de hasta 1,000 usuarios: si tu organización tiene más, repite la consulta aumentando skip (0, 1000, 2000…) hasta que la respuesta llegue vacía.
Para saber cuáles de ellos pueden recibir notificaciones hoy, consulta los usuarios con la app activa:
curl "$CODY_API_URL/user-device/users" \
-H "Authorization: Bearer $CODY_ACCESS_TOKEN"{
"ok": true,
"data": {
"user_ids": [
"664f5f3c2f4f5e3b1c2a9d10",
"664f5f3c2f4f5e3b1c2a9d11"
],
"count": 2
}
}Envía la notificación
Con el token vigente y la lista de IDs, envía la solicitud a POST /push-notification/send. Guarda el id que te devuelve junto al registro de tu sistema que originó el aviso (el pedido, la campaña, la alerta): es la llave para consultar el resultado después. Los campos disponibles están en la referencia y los casos más comunes, en los ejemplos.
Cada solicitud es un envío nuevo
Si repites una solicitud de envío que ya respondió 202, los usuarios recibirán la notificación dos veces. Si tu solicitud falló por un corte de red y no sabes si llegó a Cody, consulta primero GET /push-notification/list antes de reintentar.
Da seguimiento al resultado
Unos segundos después del envío, consulta GET /push-notification/{id} para conocer el estado general y el detalle por usuario. Si necesitas medir aperturas, vuelve a consultarlo más tarde: el conteo de abiertas crece conforme las personas tocan la notificación.
Un buen uso del detalle: los usuarios con estado no_device todavía no tienen la app lista. Puedes avisarles por otro canal —correo o SMS— e invitarlos a instalarla.
Frecuencia de consulta
No hace falta consultar en bucle. Una consulta a los pocos segundos y otra al día siguiente (para aperturas) cubren la mayoría de los casos.
Listo para copiar
Conector de referencia
Un conector mínimo que ya resuelve la renovación del token, el reintento ante un 401, la eliminación de destinatarios duplicados y el formato de fechas. Tómalo como punto de partida y agrégale el registro (log) y manejo de errores que use tu equipo.
// cody-push.js — conector mínimo para enviar notificaciones desde tu sistema.
const API = process.env.CODY_API_URL
let accessToken = process.env.CODY_ACCESS_TOKEN ?? null
let expiresAt = 0 // se fuerza la primera renovación
async function renewToken() {
const response = await fetch(`${API}/auth/oauth/v2/refresh`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: process.env.CODY_CLIENT_ID,
client_secret: process.env.CODY_CLIENT_SECRET,
refresh_token: process.env.CODY_REFRESH_TOKEN,
}),
})
if (!response.ok) throw new Error(`No se pudo renovar el token (${response.status})`)
const body = await response.json()
accessToken = body.access_token
// Renovamos 5 minutos antes de que expire
expiresAt = Date.now() + (body.expires_in - 300) * 1000
}
async function codyRequest(path, options = {}, retried = false) {
if (!accessToken || Date.now() >= expiresAt) await renewToken()
const response = await fetch(`${API}${path}`, {
...options,
headers: {
Authorization: `Bearer ${accessToken}`,
"Content-Type": "application/json",
...options.headers,
},
})
// Token vencido o revocado a mitad del camino: renueva y reintenta una sola vez
if (response.status === 401 && !retried) {
await renewToken()
return codyRequest(path, options, true)
}
if (!response.ok) {
throw new Error(`Cody respondió ${response.status}: ${await response.text()}`)
}
return response.json()
}
export async function sendPush({ title, body, userIds, imageUrl, deeplink, scheduledAt }) {
const { data } = await codyRequest("/push-notification/send", {
method: "POST",
body: JSON.stringify({
title,
body,
target_user_ids: [...new Set(userIds)],
image_url: imageUrl,
deeplink,
scheduled_at: scheduledAt?.toISOString(),
}),
})
return data // { id, status }
}
export async function getPushStatus(pushId) {
const { data } = await codyRequest(`/push-notification/${pushId}`)
return data // { notification, deliveries }
}
export async function usersWithApp() {
const { data } = await codyRequest("/user-device/users")
return data.user_ids
}Patrones de integración más comunes
Disparada por un evento
Algo pasa en tu sistema (se aprueba un pedido, se detecta una alerta) y en ese momento se llama al conector con los destinatarios afectados. Ideal para avisos individuales y operativos.
Campañas programadas
Un proceso calendarizado arma la lista y envía una sola notificación a muchos usuarios, o la deja programada con fecha y hora. Ideal para recordatorios periódicos y arranques de temporada.
Herramientas sin código
En Power Automate, Make, Zapier o n8n, usa el módulo de solicitud HTTP con los mismos datos de los ejemplos cURL. Guarda las credenciales en el almacén de secretos de la herramienta.
5 · Ejemplos
Ejemplos de envío
Casos listos para copiar. Todos asumen que ya tienes un access token vigente en CODY_ACCESS_TOKEN y la URL base (https://api.public.cody-tech.com) en CODY_API_URL.
Ejemplo 1
Enviar a un usuario
El caso más simple: un aviso operativo para una sola persona. Solo se necesitan el título, el mensaje y una lista con un único ID.
curl -X POST "$CODY_API_URL/push-notification/send" \
-H "Authorization: Bearer $CODY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Tu pedido fue aprobado",
"body": "El pedido #4821 ya está en ruta. Revisa los detalles con tu coach.",
"target_user_ids": ["664f5f3c2f4f5e3b1c2a9d10"]
}'{
"ok": true,
"data": {
"id": "6710a2c4e8b1f23d4c5a6b7e",
"status": "sending"
}
}El estado sending indica que la entrega ya está en curso. En segundos, la persona verá en su celular:
Cody Companionahora
Tu pedido fue aprobado
El pedido #4821 ya está en ruta. Revisa los detalles con tu coach.
Representación ilustrativa; el aspecto final depende del teléfono.
Ejemplo 2
Enviar a un grupo de usuarios
Para un grupo, la solicitud es idéntica: solo agrega más IDs a la lista. Este ejemplo además incluye una imagen y un destino dentro de la app, para que al tocar la notificación la persona llegue directo a la sección del coach.
curl -X POST "$CODY_API_URL/push-notification/send" \
-H "Authorization: Bearer $CODY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Nuevo reto de la semana",
"body": "Completa el reto de exhibición antes del viernes y suma puntos para tu equipo.",
"image_url": "https://cdn.tuempresa.com/campanas/reto-exhibicion.png",
"deeplink": "codycompanion://coach",
"target_user_ids": [
"664f5f3c2f4f5e3b1c2a9d10",
"664f5f3c2f4f5e3b1c2a9d11",
"664f5f3c2f4f5e3b1c2a9d12"
]
}'¿Qué pasa con los usuarios que no tienen la app?
No bloquean el envío. El resto del grupo la recibe normalmente y esos usuarios aparecen con estado no_device en el seguimiento, para que puedas identificarlos.
Ejemplo 3
Enviar a todos los usuarios con la app
Para un aviso general, primero consulta quién tiene la app activa y después envía a esa lista en una sola solicitud.
const api = process.env.CODY_API_URL
const headers = {
Authorization: `Bearer ${accessToken}`,
"Content-Type": "application/json",
}
// 1. ¿Quién puede recibir notificaciones hoy?
const devices = await fetch(`${api}/user-device/users`, { headers }).then((r) => r.json())
const recipients = devices.data.user_ids
if (recipients.length === 0) {
console.log("Ningún usuario tiene la app activa todavía.")
} else {
// 2. Enviar a todos ellos en una sola solicitud
const response = await fetch(`${api}/push-notification/send`, {
method: "POST",
headers,
body: JSON.stringify({
title: "Cierre de mes",
body: "Hoy es el último día para registrar tus ventas del mes.",
deeplink: "codycompanion://chat",
target_user_ids: recipients,
}),
})
const { data } = await response.json()
console.log(`Envío ${data.id} registrado para ${recipients.length} usuarios`)
}Listas muy grandes
Si vas a enviar a varios miles de personas, te recomendamos dividir la lista en lotes (por ejemplo, de 1,000 usuarios). Cada lote será un envío con su propio ID y su propio seguimiento.
Ejemplo 4
Programar un envío y cancelarlo
Agrega scheduled_at con la fecha y hora deseadas. La respuesta llega con estado scheduled y Cody la envía automáticamente al llegar el momento (puede tardar hasta un par de minutos después de la hora indicada).
# Programada para el 1 de octubre de 2026 a las 9:00 a. m., hora del centro de México (UTC-6)
curl -X POST "$CODY_API_URL/push-notification/send" \
-H "Authorization: Bearer $CODY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "¡Arranca la temporada de octubre!",
"body": "Ya están disponibles los nuevos retos. Entra y conoce las metas del mes.",
"deeplink": "codycompanion://home",
"target_user_ids": ["664f5f3c2f4f5e3b1c2a9d10", "664f5f3c2f4f5e3b1c2a9d11"],
"scheduled_at": "2026-10-01T09:00:00-06:00"
}'Incluye siempre la zona horaria
Escribe la fecha en formato ISO 8601 con zona horaria: por ejemplo 2026-10-01T09:00:00-06:00 (centro de México) o 2026-10-01T15:00:00Z (UTC). Sin ella, la fecha es ambigua y la solicitud puede ser rechazada. Si indicas una fecha que ya pasó, la notificación se envía de inmediato.
Mientras siga en estado scheduled, puedes cancelarla con su ID:
curl -X POST "$CODY_API_URL/push-notification/6710a2c4e8b1f23d4c5a6b7e/cancel" \
-H "Authorization: Bearer $CODY_ACCESS_TOKEN"{
"ok": true,
"message": "Push notification canceled"
}Ejemplo 5
Consultar el resultado de un envío
Con el ID que recibiste al enviar, consulta el estado general, los contadores y el detalle por dispositivo.
curl "$CODY_API_URL/push-notification/6710a2c4e8b1f23d4c5a6b7e" \
-H "Authorization: Bearer $CODY_ACCESS_TOKEN"{
"ok": true,
"data": {
"notification": {
"id": "6710a2c4e8b1f23d4c5a6b7e",
"title": "Nuevo reto de la semana",
"body": "Completa el reto de exhibición antes del viernes y suma puntos para tu equipo.",
"image_url": "https://cdn.tuempresa.com/campanas/reto-exhibicion.png",
"deeplink": "codycompanion://coach",
"status": "sent",
"scheduled_at": null,
"sent_at": "2026-09-23T16:02:11Z",
"stats": {
"targeted_users": 3,
"devices": 3,
"sent": 3,
"failed": 0,
"opened": 1,
"no_device": 1
},
"created_at": "2026-09-23T16:02:10Z"
},
"deliveries": [
{ "user_id": "664f5f3c2f4f5e3b1c2a9d10", "status": "opened", "sent_at": "2026-09-23T16:02:11Z", "opened_at": "2026-09-23T16:05:40Z" },
{ "user_id": "664f5f3c2f4f5e3b1c2a9d10", "status": "sent", "sent_at": "2026-09-23T16:02:11Z", "opened_at": null },
{ "user_id": "664f5f3c2f4f5e3b1c2a9d11", "status": "sent", "sent_at": "2026-09-23T16:02:11Z", "opened_at": null },
{ "user_id": "664f5f3c2f4f5e3b1c2a9d12", "status": "no_device", "sent_at": "2026-09-23T16:02:11Z", "opened_at": null }
]
}
}Cómo leer este resultado: se dirigió a 3 usuarios. El primero tiene dos celulares, así que aparece dos veces en deliveries y ya abrió la notificación en uno de ellos; el segundo la recibió pero aún no la abre; el tercero no tiene la app activa. Para listar todos los envíos de tu organización, del más reciente al más antiguo, usa GET /push-notification/list.
6 · Referencia
Referencia rápida
Todas las rutas, campos, estados y respuestas en un solo lugar.
Rutas disponibles
| Método y ruta | Para qué sirve |
|---|---|
POST /auth/oauth/v2/refresh | Obtener un access token nuevo. |
GET /user/list | Listar los usuarios de tu organización (para armar tu tabla de equivalencias). |
GET /user-device/users | Listar los usuarios que pueden recibir notificaciones hoy. |
POST /push-notification/send | Crear un envío, inmediato o programado. |
GET /push-notification/list | Listar los envíos de tu organización, del más reciente al más antiguo. |
GET /push-notification/{id} | Consultar el estado y el detalle por usuario de un envío. |
POST /push-notification/{id}/cancel | Cancelar un envío programado que todavía no sale. |
Campos de POST /push-notification/send
| Campo | Tipo | ¿Obligatorio? | Descripción |
|---|---|---|---|
title | Texto | Sí | Título visible de la notificación. Recomendado: hasta 50 caracteres para que no se corte en pantalla. |
body | Texto | Sí | Mensaje de la notificación. Recomendado: hasta 150 caracteres. |
target_user_ids | Lista de textos | Sí | IDs de usuario de Cody que recibirán la notificación. Mínimo uno; evita duplicados. Los IDs que no pertenezcan a tu organización no la reciben. |
image_url | Texto (URL) | No | Dirección pública (https) de una imagen JPG o PNG. Es un complemento: el mensaje debe entenderse sin ella, porque algunos teléfonos no la muestran. |
deeplink | Texto | No | Pantalla que se abre al tocar la notificación. Usa uno de los valores de la tabla de destinos. Sin este campo, la app abre en su pantalla habitual. |
scheduled_at | Fecha ISO 8601 | No | Fecha y hora del envío, con zona horaria. Sin este campo (o con una fecha pasada), se envía de inmediato. |
announcement_id | Texto | No | Relaciona el envío con un anuncio publicado en Cody. Déjalo vacío si tu notificación no corresponde a un anuncio. |
tenant_id | Texto | No | No lo envíes: Cody toma tu organización automáticamente de tu credencial. |
Destinos dentro de la app (deeplink)
| Valor | Qué abre | Úsalo para |
|---|---|---|
codycompanion://home | Pantalla de inicio de la app. | Avisos generales, arranque de temporada. |
codycompanion://chat | Conversación con el agente. | Invitar a registrar algo o a pedir ayuda. |
codycompanion://coach | Sección del coach. | Retos, metas y seguimiento de desempeño. |
codycompanion://announcement/{id} | Inicio, abriendo el anuncio indicado. | Reforzar un anuncio ya publicado en Cody. |
Un valor distinto a los de esta tabla no produce error, pero la notificación solo abrirá la app sin llevar a ninguna pantalla en particular.
Estados de un envío
| Estado | Qué significa |
|---|---|
scheduled | Programada; espera la fecha y hora indicadas. Es el único estado que se puede cancelar. |
sending | La entrega está en curso. |
sent | Entregada a todos los dispositivos disponibles. Puede incluir usuarios sin dispositivo, que no cuentan como falla. |
partially_failed | Llegó a una parte de los dispositivos y otros fallaron. Cody reintenta automáticamente las fallas temporales. |
failed | No llegó a ningún dispositivo. Si la falla es temporal, Cody la reintenta automáticamente. |
canceled | Cancelada antes de enviarse. |
Estados por destinatario
| Estado | Qué significa | Qué hacer |
|---|---|---|
sent | Llegó al celular. | Nada; puede pasar a abierta. |
opened | La persona tocó la notificación. | Nada; es el mejor resultado. |
failed | No se pudo entregar a ese dispositivo (por ejemplo, la app se desinstaló). | Si persiste, pide al usuario reinstalar la app e iniciar sesión. |
no_device | El usuario no tiene la app activa en ningún celular. | Invítalo a instalar Cody Companion, iniciar sesión y permitir notificaciones. |
Contadores en stats: targeted_users (usuarios en la lista de destinatarios) · devices (celulares alcanzados) · sent (entregas exitosas) · failed (entregas fallidas) · opened (notificaciones que la persona tocó) · no_device (usuarios sin la app activa)
Códigos de respuesta
| Código | Qué significa | Cómo resolverlo |
|---|---|---|
200 OK | Consulta o cancelación exitosa. | — |
202 Accepted | Envío aceptado; la entrega continúa en segundo plano. | Guarda el ID y consulta el resultado. |
400 Bad Request | La solicitud tiene un dato inválido. | Revisa el formato de los campos contra la tabla de esta guía. |
401 Unauthorized | Falta el token, es inválido o ya venció. | Renueva el access token y reintenta una vez. |
403 Forbidden | Tu credencial no tiene permiso para esta acción, o el envío pertenece a otra organización. | Verifica que la credencial esté asociada a un usuario administrador. |
404 Not Found | El envío no existe. | Revisa el ID. |
409 Conflict | Intentaste cancelar un envío que ya no está programado. | Solo se cancelan envíos en estado scheduled. |
422 Unprocessable Entity | Falta un campo obligatorio o tiene un formato incorrecto (por ejemplo, la lista de destinatarios vacía). | El detalle de la respuesta indica qué campo corregir. |
5xx | Error temporal de la plataforma. | Espera unos momentos y reintenta. En envíos, confirma primero con la lista que no se haya registrado. |
7 · Preguntas frecuentes
Preguntas frecuentes
¿Cuánto tarda en llegar una notificación?
Normalmente unos segundos después de recibir la respuesta 202. Si el celular está apagado o sin conexión, se entrega cuando vuelve a conectarse, según las reglas del sistema operativo del teléfono.
¿Puedo enviar a usuarios de otra organización?
No. Cada credencial solo puede enviar a los usuarios de su propia organización. Los IDs ajenos simplemente no reciben la notificación.
¿Qué pasa si un usuario tiene la app en dos celulares?
Recibe la notificación en ambos. En el seguimiento verás una entrada por cada celular.
¿Puedo borrar una notificación que ya se envió?
No. Una vez entregada, la notificación ya está en el celular de la persona. Lo único que se puede cancelar es un envío programado que todavía no sale.
¿Cuándo se marca una notificación como abierta?
Cuando la persona la toca y se abre la app. Si la descarta sin tocarla, queda como entregada.
¿Necesito reintentar si algunos dispositivos fallan?
No. Cody reintenta automáticamente las fallas temporales. Las fallas permanentes (por ejemplo, una app desinstalada) no se reintentan; el usuario debe volver a instalar la app e iniciar sesión.
¿Cómo pruebo sin molestar a mis usuarios?
Instala la app Cody Companion en tu propio celular con un usuario de tu organización y haz tus primeros envíos solo a tu ID. Cuando veas la notificación y el seguimiento correcto, pasa a tus listas reales.
¿Qué hago si mi credencial se expone por error?
Elimínala de inmediato desde Integraciones API en Cody AMS, crea una nueva y actualiza tu sistema. Eliminar una credencial no afecta a las demás integraciones.
¿Necesitas ayuda con tu integración?
Si es tu primera integración con Cody, con gusto te acompañamos: podemos revisar contigo tu caso de uso, validar tu primer envío y ayudarte a elegir el mejor patrón para tu operación. Escríbele a tu contacto de Cody y agendamos una sesión.
El equipo de Cody