uindocs
Developer

Leer progreso

El feed que alimenta tu pantalla, y cómo se representa cada tipo de mecánica

El feed es el endpoint que alimenta tu pantalla. Una sola llamada devuelve lo que el usuario tiene en curso, con el progreso calculado, la mecánica resuelta y, en cada ítem, la campaña, la recompensa y en qué estado está esa recompensa. No hace falta cruzarlo con otros endpoints para pintar la tarjeta.

GET /v1/feed/account/{accountId}?idType=EXTERNAL
Authorization: Bearer <YOUR_API_KEY>

Los cuatro estados de la pantalla

RespuestaQué significaQué mostrar
200 con ítemsEl usuario tiene misiones, retos, rachas o rutinas activas.La lista, agrupada o priorizada según tu diseño.
200 vacíoNo tiene nada en curso: no hay campaña activa para él, todavía no entró a la audiencia, o ya completó todo.Estado vacío con copy propio. No es un error.
404El id enviado no existe en UIN — solo pasa con idType=INTERNAL.Tratalo como estado vacío y alertá a tu equipo: es un problema de datos.
401API key vencida o revocada.Nada al usuario. Alerta operativa inmediata.
5xx o timeoutServicio no disponible.Reintento; si persiste, ocultá la sección en lugar de mostrar un error.

Cómo representar cada tipo

Cada ítem trae un campo type. Conviene resolverlos como cuatro componentes separados en lugar de forzar una tarjeta única.

typeQué traeCómo representarlo
MISSION
hito
Título, objetivo, progreso y estado.Tarjeta con título y barra de avance. Es el caso más simple y el más frecuente.
CHALLENGE
reto
Lo mismo que MISSION, pero solo del paso habilitado.Tarjeta de paso activo.
STREAK
racha
Racha actual, mejor racha, meta de ventanas, periodicidad, ventana vigente y fecha límite. Además, cuánto falta en la ventana o la lista de pasos con el nombre de cada acción.Contador de racha, indicador de ventanas cumplidas y la fecha límite visible. Es la mecánica que justifica recordatorios y push.
ROUTINE
rutina
Ciclo actual, meta de ciclos y los pasos pendientes del ciclo, cada uno con su progreso."Ciclo 2 de 3" más un checklist de lo que falta.

Los ítems llegan agrupados por tipo. Todos traen además la campaña y la experiencia de origen, para agrupar o filtrar en la UI.

Los textos de cada misión

Los textos de la misión tienen el mismo nombre y la misma ubicación en los cuatro tipos:

CampoQué es
titleEl nombre de la misión.
objectiveEl objetivo de la misión.
actionEl programmaticCode del evento que la hace avanzar. Sirve para enlazar la tarjeta con la pantalla de tu app donde se hace esa acción.
progressMethodTypeCOUNT si se cuentan eventos, SUM si se suman importes.

Dónde vienen:

  • En MISSION y CHALLENGE, en el ítem.
  • En STREAK con varias acciones y en ROUTINE, en cada elemento de steps[].
  • En una STREAK de una sola acción, que no trae steps[], en el ítem.

El nombre de la campaña es la excepción: campaign: { id, title } viene siempre en el ítem, en los cuatro tipos, nunca dentro de steps[].

La recompensa y su estado

Cada ítem trae la recompensa de su campaña y en qué estado está para este usuario. Todos los ítems de una misma campaña comparten los mismos valores.

{
  "campaignId": "…",
  "experienceId": "…",
  "campaign": { "id": "…", "title": "Pagá tus servicios" },
  "reward": {
    "id": "…",
    "type": "PRODUCTS",
    "amount": 1,
    "displayName": "Netflix 1 mes",
    "description": "…",
    "imageUrl": "https://…"
  },
  "rewardStatus": "LOCKED"
}
rewardStatusQué significaQué mostrar
LOCKEDTodavía no completó la campaña.La recompensa como meta: "completá y ganá…".
CLAIMABLECompletó, la recompensa no se entregó y hay stock.El botón de reclamo, si tu UX lo tiene. Ver Recompensas y entrega.
PENDING_STOCKCompletó, pero la entrega espera stock."Misión cumplida, tu recompensa llega en breve." Nunca "no ganaste".
DELIVEREDEntregada.El código o el saldo, desde my-rewards.
  • campaignId y experienceId identifican el origen del ítem. campaignId es el que usás para el reclamo explícito.
  • displayName, description e imageUrl salen del producto. En recompensas de puntos o cofres vienen en null.
  • reward es null cuando la campaña no tiene recompensa configurada, o cuando tiene varias opciones y todavía no está definida cuál le toca a este usuario. En ese caso rewardStatus también es null.
  • En un ítem sin campaña (campaignId: null, experiencias previas a las campañas), campaign, reward y rewardStatus vienen los tres en null.
  • El feed nunca trae códigos. Se leen desde my-rewards.

Completadas y vencidas

Sin filtros, el feed devuelve lo que está en curso:

  • Misiones y retos, mientras están activos.
  • Rachas y rutinas, activas o completadas: una completada sigue mostrando el estado de su recompensa.

Nunca devuelve ítems vencidos. Para ver otros estados se usa el parámetro filters estándar de la API sobre status, type o campaignId. Va URL-encodeado, así que dejá que lo arme el cliente HTTP:

const filters = JSON.stringify({ filters: [{ field: 'status', value: ['COMPLETED'] }] });

const url = `${BASE}/v1/feed/account/${accountId}?${new URLSearchParams({
  idType: 'EXTERNAL',
  filters,
})}`;
  • Completados (COMPLETED): cada ítem trae completedAt (UTC). Para mostrar "lo que completó en los últimos 30 días", filtrá por esa fecha en tu app: no hay operadores de rango. Puede venir en null — contemplalo antes de construir una fecha. En MISSION y CHALLENGE no se guarda la fecha de completado y el valor es la última modificación de la asignación: sirve para ordenar y para un corte aproximado, no para auditar.
  • Vencidos (EXPIRED): los ítems cuya asignación venció sin completarse. Es el estado de la asignación del usuario, no el de la campaña: puede vencer por su propia ventana con la campaña todavía en curso. Las asignaciones canceladas no se devuelven nunca, ni con filtro.
  • No hay paginación: la respuesta es siempre un array.

El formato del parámetro está en Paginación y filtros.

Cuatro detalles que definen el diseño

  • El progreso puede ser cantidad o dinero. Una misión puede pedir "3 transferencias" o "$50.000 transferidos", y en los dos casos llegan los mismos campos. El formato —número seco o importe con moneda— se acuerda por misión con UIN; no se puede inferir del feed.
  • En el reto ves un solo paso. El siguiente aparece cuando el usuario completa el actual. No diseñes una pantalla que necesite conocer toda la cadena de entrada.
  • En la rutina, los pasos cumplidos del ciclo desaparecen de la lista. Si querés un checklist completo con tildes, guardá el conjunto de pasos la primera vez que lo recibís. En la racha, en cambio, los pasos del ciclo se mantienen visibles con su marca de cumplido.
  • Las fechas vienen en UTC. Convertilas a la zona del usuario antes de mostrarlas o de programar un recordatorio: una racha que "cierra el domingo" puede cerrarse el sábado a la noche en su reloj.

Los otros endpoints de lectura

EndpointPara qué
GET /v1/gamification/missions/progress/{accountId}Vista plana de todas sus misiones. Para soporte y reconciliación.
GET /v1/gamification/missions/completed/{accountId}Vista plana de las misiones completadas.
GET /v1/gamification/missions/my-rewards/{accountId}Recompensas ganadas, con su estado de entrega y sus códigos cuando corresponde.

La regla que ordena todo

Ningún error de BehaviorOS se le muestra al usuario como fallo de su operación. Un 400, un 401 o un 500 se loguean con su traceId y se resuelven entre tu equipo y UIN. Para el usuario, esa pantalla simplemente no tiene novedades de gamificación.

Qué sigue

Recompensas y entrega — cómo llega lo que el usuario ganó.

On this page