Audiencias
Construye segmentos de usuarios/comercios con un query-builder, sin escribir SQL, y genera, valida y previsualiza la consulta resultante.
Descripción general
Un Audience Criteria es un segmento de usuarios o comercios definido con un query-builder —tabla → columnas → filtros → joins → agregaciones → combinación de bloques y audiencias— sin escribir SQL a mano.
La definición se arma componiendo:
| Pieza | Qué aporta |
|---|---|
| Bloques de consulta | Uno o más bloques; cada bloque parte de una tabla del catálogo y define sobre ella columnas, filtros, tiempo, cruces y agregaciones. |
| Filtros | Condiciones por columna con un operador de comparación (EQUALS, IN, BETWEEN, …). |
| Ventana temporal | Acota el bloque a un período de tiempo (IN_THE_LAST 30 DAYS, SINCE, …). |
| Cruces (joins) | Une el bloque con otras tablas del catálogo (INNER, LEFT, …). |
| Agregaciones | Resume columnas del bloque en una métrica (COUNT, SUM, AVG, …). |
| Composiciones | Combina varios bloques y otras audiencias con operadores de conjunto (UNION_DISTINCT, …). |
AUDIENCE vs FILTER
El campo type distingue dos usos del mismo recurso (enum
AudienceCriteriaTypeEnum):
AUDIENCE— un segmento con identidad propia, pensado para reutilizarse y combinarse con otras audiencias.FILTER— un criterio auxiliar que refina o restringe, típicamente embebido dentro de otra configuración.
Ambos comparten exactamente la misma estructura de definición; solo cambia la intención de uso.
Endpoints
Listar
GET /audience-criterias — lista paginada con filtros por type y búsqueda.
Obtener
GET /audience-criterias/:id — detalle completo de un criterio.
Crear
POST /audience-criterias — crea un criterio a partir de su definición.
Actualizar
PATCH /audience-criterias/:id — actualiza un criterio existente.
Eliminar
DELETE /audience-criterias/:id — elimina un criterio.
Generar SQL
POST /generate-sql y GET /:id/sql — obtiene el SQL de una definición.
Validar
POST /validate-from-body y POST /:id/validate — valida una definición.
Previsualizar
POST /preview-from-body y POST /:id/preview — ejecuta una muestra acotada.
Base URL y ambientes
Todas las rutas cuelgan del prefijo global /api bajo el recurso
/audience-criterias (por ejemplo POST /api/audience-criterias).
Ambientes de Reten
| Ambiente | Panel de Admin | API Base URL |
|---|---|---|
| Development | app-development.reten.ai | https://api-development.reten.ai |
| Staging | app-staging.reten.ai | https://api-staging.reten.ai |
| Production | app.reten.ai | https://api.reten.ai |
Usa la URL del panel de admin para gestionar claves de API y configuraciones de dispatch. Reemplaza BASE_URL en los ejemplos de código con la API Base URL de tu ambiente.
Autenticación
Todos los endpoints requieren un token JWT Bearer más la cabecera
x-tenant-id que identifica el tenant sobre cuyo esquema opera la solicitud.
| Cabecera | Obligatoria | Valor |
|---|---|---|
Authorization | Sí | Bearer <access_token> |
x-tenant-id | Sí | UUID del tenant |
-H "Authorization: Bearer <access_token>"
-H "x-tenant-id: <tenant-id>"Permisos
Cada ruta exige un permiso específico vía el decorador @Auth(...):
| Permiso | Endpoints |
|---|---|
audience-criteria:view | GET /audience-criterias, GET /audience-criterias/:id |
audience-criteria:create | POST /audience-criterias |
audience-criteria:update | PATCH /audience-criterias/:id |
audience-criteria:delete | DELETE /audience-criterias/:id |
audience-criteria:view-sql | POST /generate-sql, GET /:id/sql, POST /validate-from-body, POST /:id/validate, POST /preview-from-body, POST /:id/preview |
Códigos de estado
Los endpoints POST de solo lectura (generate-sql, validate-*,
preview-*) no declaran un código explícito, por lo que NestJS responde
201 Created por defecto —no 200—, aunque no creen ningún recurso.
| Método + ruta | Código | Cuerpo de respuesta |
|---|---|---|
POST /audience-criterias (crear) | 201 | El criterio creado |
GET /audience-criterias | 200 | Lista paginada |
GET /audience-criterias/:id | 200 | El criterio |
PATCH /audience-criterias/:id | 200 | El criterio actualizado |
DELETE /audience-criterias/:id | 204 | (sin cuerpo) |
POST /generate-sql | 201 | SQL generado |
GET /:id/sql | 200 | SQL generado |
POST /validate-from-body | 201 | Resultado de validación |
POST /:id/validate | 201 | Resultado de validación |
POST /preview-from-body | 201 | Resultado de la muestra |
POST /:id/preview | 201 | Resultado de la muestra |
Formato de error
Los errores siguen el formato por defecto de NestJS:
{
"statusCode": 400,
"message": ["type must be one of the following values: AUDIENCE, FILTER"],
"error": "Bad Request"
}En errores de validación de DTO, message es un arreglo de strings (una
entrada por regla incumplida). La validación es estricta: se rechazan propiedades
no declaradas, así que enviar un campo desconocido produce un 400.
Errores comunes en esta API:
400 Bad Request— definición o DTO inválido (campo faltante, tipo incorrecto, enum fuera de rango, propiedad desconocida).401 Unauthorized— falta o es inválido elAuthorization: Bearer.403 Forbidden— el usuario no tiene el permiso requerido, o elx-tenant-idno está autorizado.404 Not Found— elidsolicitado no existe en el tenant.
Paginación
El listado envuelve los resultados en PaginatedResponseDto<T>:
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"total_pages": 0,
"has_next": false,
"has_previous": false
}
}Los campos dentro de pagination usan snake_case (per_page,
total_pages, has_next, has_previous), a diferencia del resto del recurso
que usa camelCase.
El detalle de los parámetros de paginación (page, per_page, filtros) se
documenta en Listar.
Glosario de enums
Catálogo de referencia rápida. Cada página de endpoint vuelve a listar los valores válidos junto al campo donde aparecen.
AudienceCriteriaTypeEnum
Tipo del criterio (campo type).
AUDIENCE·FILTER
SetOperatorEnum
Combinación de bloques/audiencias en composedWith.
UNION_DISTINCT·UNION_ALL·INTERSECT_DISTINCT
LogicalOperatorEnum
Encadenamiento de predicados dentro de un grupo.
AND·OR
ComparisonOperatorEnum
Operador de un predicado sobre una columna.
EQUALS·NOT_EQUALS·GREATER_THAN·LESS_THAN·GREATER_THAN_OR_EQUAL·LESS_THAN_OR_EQUAL·CONTAINS·NOT_CONTAINS·STARTS_WITH·ENDS_WITH·IS_NULL·IS_NOT_NULL·IN·NOT_IN·BETWEEN
AggregationOperatorEnum
Función de agregación sobre una columna.
COUNT·SUM·AVG·MIN·MAX
TimeOperatorEnum
Operador de la ventana temporal (timeWindow).
ALL_TIME·IN_THE_LAST·IN_THE_FIRST·SINCE·BETWEEN
TimeUnitEnum
Unidad de la ventana temporal.
DAYS·WEEKS·MONTHS·YEARS
JoinTypeEnum
Tipo de join entre tablas del catálogo.
INNER·LEFT·RIGHT·FULL
AudienceFieldTypeEnum
Tipo de dato de un campo del catálogo de audiencias.
STRING·TIMESTAMP·BOOLEAN·FLOAT64·INT64·NUMERIC·BIGNUMERIC
Forma del valor según el operador de comparación
La forma que toma value depende del comparisonOperator del predicado:
| Operadores | Forma de value | Ejemplo |
|---|---|---|
IS_NULL, IS_NOT_NULL | Sin valor (NONE) | (se omite) |
IN, NOT_IN | Lista no vacía (LIST) | ["a", "b", "c"] |
BETWEEN | Par ordenado (RANGE) | [10, 20] |
El resto (EQUALS, GREATER_THAN, CONTAINS, …) | Escalar único (SINGLE) | "activo" · 42 |