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
| Respuesta | Qué significa | Qué mostrar |
|---|---|---|
200 con ítems | El usuario tiene misiones, retos, rachas o rutinas activas. | La lista, agrupada o priorizada según tu diseño. |
200 vacío | No 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. |
404 | El 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. |
401 | API key vencida o revocada. | Nada al usuario. Alerta operativa inmediata. |
5xx o timeout | Servicio 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.
type | Qué trae | Có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:
| Campo | Qué es |
|---|---|
title | El nombre de la misión. |
objective | El objetivo de la misión. |
action | El programmaticCode del evento que la hace avanzar. Sirve para enlazar la tarjeta con la pantalla de tu app donde se hace esa acción. |
progressMethodType | COUNT si se cuentan eventos, SUM si se suman importes. |
Dónde vienen:
- En
MISSIONyCHALLENGE, en el ítem. - En
STREAKcon varias acciones y enROUTINE, en cada elemento desteps[]. - En una
STREAKde una sola acción, que no traesteps[], 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"
}rewardStatus | Qué significa | Qué mostrar |
|---|---|---|
LOCKED | Todavía no completó la campaña. | La recompensa como meta: "completá y ganá…". |
CLAIMABLE | Completó, la recompensa no se entregó y hay stock. | El botón de reclamo, si tu UX lo tiene. Ver Recompensas y entrega. |
PENDING_STOCK | Completó, pero la entrega espera stock. | "Misión cumplida, tu recompensa llega en breve." Nunca "no ganaste". |
DELIVERED | Entregada. | El código o el saldo, desde my-rewards. |
campaignIdyexperienceIdidentifican el origen del ítem.campaignIdes el que usás para el reclamo explícito.displayName,descriptioneimageUrlsalen del producto. En recompensas de puntos o cofres vienen ennull.rewardesnullcuando 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 casorewardStatustambién esnull.- En un ítem sin campaña (
campaignId: null, experiencias previas a las campañas),campaign,rewardyrewardStatusvienen los tres ennull. - 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 traecompletedAt(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 ennull— contemplalo antes de construir una fecha. EnMISSIONyCHALLENGEno 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
| Endpoint | Para 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ó.
