uindocs
Developer

Emitir eventos

El único llamado en caliente de tu integración — sincrónico, asincrónico e idempotente

Cada vez que el usuario hace la acción que interesa, tu sistema emite un evento. Es el único llamado que ocurre en caliente.

Descubrir qué eventos podés emitir

Antes de emitir nada necesitás los códigos válidos para tu organización:

GET /gamification/triggers
Authorization: Bearer <YOUR_API_KEY>

Devuelve los eventos configurados, cada uno con su programmaticCode —la constante que vas a enviar— y su type, que determina qué metadata acepta:

typeQué mandar en metadata
SINGLE{} — la sola ocurrencia cuenta
AMOUNT{ "amount": 1500 } — se suma el monto

El código nombra la acción, no la campaña: PAGO_SERVICIO, no CAMPANA_VERANO. Así el mismo evento sirve para todas las campañas que premien esa acción, y marketing puede armar campañas nuevas sin tocar tu integración.

El catálogo se acuerda con UIN antes de la implementación. Si el negocio pide premiar una acción que tu plataforma todavía no emite, ahí sí hay desarrollo de tu lado — por eso conviene mapear generosamente desde el principio.

El request

POST /gamification/triggers
Authorization: Bearer <YOUR_API_KEY>
Content-Type: application/json

{
  "programmaticCode": "PAGO_SERVICIO",
  "accountId": "user-4821",
  "idType": "EXTERNAL",
  "metadata": { "amount": 1500 },
  "operationId": "7f3d9a4c-2e5b-4a6f-9c1d-8e2b3a4d5e6f"
}
CampoRequeridoDetalle
programmaticCodeSíEl código del evento, de la lista de arriba.
accountIdSíTu externalId o el UUID interno, según idType.
idTypeNoEXTERNAL o INTERNAL (por defecto). Ver Account.
metadataDependeSu forma la define el type del evento — ver arriba.
operationIdRecomendadoClave de idempotencia derivada del id de tu operación. Ver Idempotencia.

La respuesta

Cuando la respuesta llega, el progreso ya está guardado y la recompensa ya está entregada.

{
  "progressedMissions": [ /* misiones cuyo progreso avanzó */ ],
  "rewards": [ /* recompensas entregadas por este evento */ ]
}
RespuestaQué significaQué mostrar
200 con progresoLa misión avanzó pero no llegó al objetivo."Vas 2 de 3", con la barra actualizada.
200 completada con recompensaObjetivo alcanzado y recompensa entregada.Celebración, y el código o los puntos acreditados.
200 completada sin recompensaLa entrega no se pudo resolver en el momento."Misión cumplida, tu recompensa llega en breve". Reconciliá con my-rewards.
200 con listas vacíasNo tenía la misión activa, o el evento no cumplió la condición (por ejemplo, monto mínimo).Nada. No es un error ni una misión perdida.

Emití el evento fuera de tu transacción principal. Si el usuario transfirió y BehaviorOS falla, la transferencia salió bien: lo único que no aparece es el progreso. La gamificación nunca puede hacer fracasar la operación de negocio.

El camino asincrónico

Cuando no podés esperar la respuesta —un core con latencia crítica, una cola, un batch— emitís por el camino asincrónico:

POST /gamification/triggers/async

Responde 200 sin cuerpo y seguís con tu transacción. UIN suma progreso y entrega la recompensa fuera del request, y el resultado llega a tu endpoint por webhook.

1 · POST /gamification/triggers/async
       200 sin cuerpo · seguís con tu transacción
                              │
                              ▼  UIN procesa en segundo plano
2 ·                    recompensa entregada → POST a tu webhook
                              │
3 · GET /v1/gamification/missions/my-rewards/{accountId}
       200 · recompensas ganadas, para reconciliar

La entrega del webhook es best-effort y sin reintentos. Si tu endpoint falla, la recompensa ya quedó entregada igual: dejá un job que reconcilie con my-rewards. Si necesitás el resultado en la misma transacción, usá el camino sincrónico.

Errores

CódigoCausaQué hace tu sistema
400Payload mal armado.Loguear con traceId y corregir la integración. No reintentar.
401API key vencida o revocada.Alerta operativa: toda la gamificación está caída.
404El programmaticCode no existe, o la cuenta no existe con idType=INTERNAL.Revisar el id y el idType.
409El mismo operationId ya se está procesando.Reintento con backoff, mismo operationId.
5xx o timeoutServicio no disponible.Reintento con backoff. La operación de negocio no se toca.

Ninguno de estos se le muestra al usuario como fallo de su operación. Ver Errores.

Qué sigue

Progreso y recompensas — la lectura que alimenta tu pantalla.

On this page