Saltar al contenido
CodyCody
Cody Academy · Public API

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ó.

Flujo general de una push notification con la Public API de CodyTu sistema se autentica, opcionalmente consulta qué usuarios tienen la app activa, envía la notificación, la plataforma Cody la entrega a los celulares en segundo plano y tu sistema consulta el resultado.Tu sistemaERP, CRM o automatizaciónCody Public APIPunto de entrada seguroPlataforma CodyEntrega y seguimientoApp Cody CompanionCelular del usuarioFase 1 · Autenticación1Renueva su access token2Access token (vigente 1 hora)Fase 2 · Destinatarios (opcional)3¿Quién tiene la app activa?4Lista de IDs de usuarioFase 3 · Envío5Envía título, mensaje y destinatarios6Registra el envío7202 Aceptada + ID del envío8Entrega a cada dispositivoFase 4 · Interacción del usuario9El usuario la toca y se marca abiertaFase 5 · Seguimiento10Consulta el estado con el ID11Estado y resultado por usuario
  • Solicitud
  • Respuesta
  • Ocurre en segundo plano
  1. Autenticación. Tu sistema presenta sus credenciales y obtiene un access token: una llave temporal que acompaña cada solicitud y dura una hora.
  2. Respuesta con el token. Tu sistema lo guarda y lo reutiliza hasta que esté por vencer.
  3. Consulta de destinatarios (opcional). Puedes preguntar qué usuarios tienen la app lista para recibir notificaciones.
  4. Lista de usuarios. Cody responde con sus identificadores.
  5. Envío. Tu sistema manda el título, el mensaje y la lista de destinatarios.
  6. Registro. Cody guarda el envío y prepara la entrega.
  7. Confirmación inmediata. Tu sistema recibe la respuesta 202 Aceptada con el ID del envío, sin esperar a que lleguen todas las notificaciones.
  8. Entrega en segundo plano. Cody hace llegar la notificación a cada celular de cada destinatario, normalmente en segundos.
  9. Apertura. Cuando la persona toca la notificación, la app la lleva a la pantalla indicada y Cody registra que la abrió.
  10. Consulta de resultado. Con el ID del envío, tu sistema pregunta cómo le fue.
  11. 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.

1

Crea tu credencial de servicio en Cody AMS

Un administrador de tu organización debe:

  1. Entrar a Cody AMS y abrir Integraciones API en el menú lateral.
  2. Hacer clic en Nueva credencial de servicio.
  3. Escribir un nombre que identifique la integración, por ejemplo “ERP – Notificaciones”.
  4. Elegir el usuario en cuyo nombre actuará la integración. Debe tener rol de administrador.
  5. 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.

2

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.
Variables de entorno
# 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 hora
3

Autentícate y renueva el token

Cada solicitud a la Public API debe llevar el access token en el encabezado Authorization:

Encabezado HTTP
Authorization: Bearer <access_token>
Content-Type: application/json

El 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.

Solicitud
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"'"
  }'
Respuesta 200
{
  "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.

4

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).

Solicitud
curl "$CODY_API_URL/user/list?skip=0&limit=1000" \
  -H "Authorization: Bearer $CODY_ACCESS_TOKEN"
Respuesta 200 (extracto)
[
  {
    "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:

Solicitud
curl "$CODY_API_URL/user-device/users" \
  -H "Authorization: Bearer $CODY_ACCESS_TOKEN"
Respuesta 200
{
  "ok": true,
  "data": {
    "user_ids": [
      "664f5f3c2f4f5e3b1c2a9d10",
      "664f5f3c2f4f5e3b1c2a9d11"
    ],
    "count": 2
  }
}
5

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.

6

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.

Solicitud
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"]
  }'
Respuesta 202
{
  "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

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.

Solicitud
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).

Solicitud
# 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:

Solicitud
curl -X POST "$CODY_API_URL/push-notification/6710a2c4e8b1f23d4c5a6b7e/cancel" \
  -H "Authorization: Bearer $CODY_ACCESS_TOKEN"
Respuesta 200
{
  "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.

Solicitud
curl "$CODY_API_URL/push-notification/6710a2c4e8b1f23d4c5a6b7e" \
  -H "Authorization: Bearer $CODY_ACCESS_TOKEN"
Respuesta 200 (simplificada)
{
  "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

Rutas de la Public API para push notifications
Método y rutaPara qué sirve
POST /auth/oauth/v2/refreshObtener un access token nuevo.
GET /user/listListar los usuarios de tu organización (para armar tu tabla de equivalencias).
GET /user-device/usersListar los usuarios que pueden recibir notificaciones hoy.
POST /push-notification/sendCrear un envío, inmediato o programado.
GET /push-notification/listListar 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}/cancelCancelar un envío programado que todavía no sale.

Campos de POST /push-notification/send

Campos de la solicitud de envío
CampoTipo¿Obligatorio?Descripción
titleTextoTítulo visible de la notificación. Recomendado: hasta 50 caracteres para que no se corte en pantalla.
bodyTextoMensaje de la notificación. Recomendado: hasta 150 caracteres.
target_user_idsLista de textosIDs 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_urlTexto (URL)NoDirecció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.
deeplinkTextoNoPantalla 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_atFecha ISO 8601NoFecha y hora del envío, con zona horaria. Sin este campo (o con una fecha pasada), se envía de inmediato.
announcement_idTextoNoRelaciona el envío con un anuncio publicado en Cody. Déjalo vacío si tu notificación no corresponde a un anuncio.
tenant_idTextoNoNo lo envíes: Cody toma tu organización automáticamente de tu credencial.

Destinos dentro de la app (deeplink)

Valores válidos del campo deeplink
ValorQué abreÚsalo para
codycompanion://homePantalla de inicio de la app.Avisos generales, arranque de temporada.
codycompanion://chatConversación con el agente.Invitar a registrar algo o a pedir ayuda.
codycompanion://coachSecció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

Estados generales de una notificación
EstadoQué significa
scheduledProgramada; espera la fecha y hora indicadas. Es el único estado que se puede cancelar.
sendingLa entrega está en curso.
sentEntregada a todos los dispositivos disponibles. Puede incluir usuarios sin dispositivo, que no cuentan como falla.
partially_failedLlegó a una parte de los dispositivos y otros fallaron. Cody reintenta automáticamente las fallas temporales.
failedNo llegó a ningún dispositivo. Si la falla es temporal, Cody la reintenta automáticamente.
canceledCancelada antes de enviarse.

Estados por destinatario

Estados de cada entrega individual
EstadoQué significaQué hacer
sentLlegó al celular.Nada; puede pasar a abierta.
openedLa persona tocó la notificación.Nada; es el mejor resultado.
failedNo 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_deviceEl 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ódigos de respuesta HTTP y cómo resolverlos
CódigoQué significaCómo resolverlo
200 OKConsulta o cancelación exitosa.
202 AcceptedEnvío aceptado; la entrega continúa en segundo plano.Guarda el ID y consulta el resultado.
400 Bad RequestLa solicitud tiene un dato inválido.Revisa el formato de los campos contra la tabla de esta guía.
401 UnauthorizedFalta el token, es inválido o ya venció.Renueva el access token y reintenta una vez.
403 ForbiddenTu 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 FoundEl envío no existe.Revisa el ID.
409 ConflictIntentaste cancelar un envío que ya no está programado.Solo se cancelan envíos en estado scheduled.
422 Unprocessable EntityFalta 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.
5xxError 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