Filtros de eventos
Selecciona eventos con un query-builder, sin escribir SQL, y genera, valida y previsualiza la consulta resultante.
Descripción general
Un filtro de eventos (event criteria) es un conjunto de eventos seleccionado con un
query-builder —tabla → columnas → filtros → ventana temporal → agregaciones— 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 de eventos y define sobre ella columnas, filtros, tiempo y agregaciones. |
| Filtros de columna | Condiciones sobre una columna escalar con un operador de comparación (EQUALS, IN, BETWEEN, …). |
| Filtros de registro | Condiciones sobre una columna RECORD REPEATED (attributes, items): existe al menos un elemento que cumple el sub-filtro. |
| Filtros de tabla relacionada | Condiciones sobre un semi-join declarado por el catálogo (products): existe al menos un match en la tabla relacionada. |
| Ventana temporal | Acota el bloque a un período de tiempo (IN_THE_LAST 30 DAYS, SINCE, …). |
| Agregaciones | Resume columnas del bloque en una métrica (COUNT, SUM, AVG, …). |
El árbol completo —con las tres hojas del where y todos sus campos— se documenta una sola
vez en Definición; las páginas de endpoint
la referencian en vez de repetirla.
Sin columna de identidad
Un filtro de eventos proyecta eventos, no sujetos: no existe una columna de identidad
obligatoria y el SQL generado devuelve subjectColumn: null. Es la diferencia estructural
con las audiencias, que sí deben exponer su
identidad en al menos un bloque.
Endpoints
Catálogo
GET /tables y GET /tables/:tableName/columns — qué se puede filtrar.
Listar
GET /event-criterias — lista paginada con búsqueda por nombre.
Obtener
GET /event-criterias/:id — detalle completo de un filtro.
Crear
POST /event-criterias — crea un filtro a partir de su definición.
Actualizar
PATCH /event-criterias/:id — actualiza un filtro existente.
Eliminar
DELETE /event-criterias/:id — archiva un filtro.
Generar SQL
POST /generate-sql y GET /:id/sql — obtiene el SQL de una definición.
Validar
POST /validate-from-body — valida una definición contra BigQuery.
Previsualizar
POST /preview-from-body y POST /:id/preview — ejecuta una muestra acotada.
Formato compute
GET /event-criterias/:id?format=compute — lista plana de condiciones.
Base URL y ambientes
Todas las rutas cuelgan del prefijo global /api bajo el recurso
/event-criterias (por ejemplo POST /api/event-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, y la
cabecera x-project-id que identifica el proyecto en el que trabaja la solicitud (ver
Autenticación → Contexto de Proyecto).
| Cabecera | Obligatoria | Valor |
|---|---|---|
Authorization | Sí | Bearer <access_token> |
x-tenant-id | Sí | UUID del tenant |
x-project-id | Sí | UUID del proyecto |
-H "Authorization: Bearer <access_token>"
-H "x-tenant-id: <tenant-id>"
-H "x-project-id: <project-id>"Permisos
Cada ruta exige un permiso específico:
| Permiso | Endpoints |
|---|---|
event-criteria:view | GET /event-criterias, GET /event-criterias/:id, GET /tables, GET /tables/:tableName/columns |
event-criteria:create | POST /event-criterias |
event-criteria:update | PATCH /event-criterias/:id |
event-criteria:delete | DELETE /event-criterias/:id |
event-criteria:view-sql | POST /generate-sql, GET /:id/sql, POST /validate-from-body, POST /preview-from-body, POST /:id/preview |
El catálogo (/tables y /tables/:tableName/columns) exige event-criteria:view, el
mismo permiso de lectura del recurso: quien puede ver un filtro puede ver con qué se
construye.
Códigos de estado
Los endpoints POST de solo lectura (generate-sql, validate-from-body,
preview-from-body, :id/preview) responden 201 Created —no 200—, aunque no
creen ningún recurso.
| Método + ruta | Código | Cuerpo de respuesta |
|---|---|---|
POST /event-criterias (crear) | 201 | El filtro creado |
GET /event-criterias | 200 | Lista paginada |
GET /event-criterias/:id | 200 | El filtro |
GET /event-criterias/tables | 200 | Tablas del catálogo |
GET /tables/:tableName/columns | 200 | Columnas y semi-joins de la tabla |
PATCH /event-criterias/:id | 200 | El filtro actualizado |
DELETE /event-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 /preview-from-body | 201 | Resultado de la muestra |
POST /:id/preview | 201 | Resultado de la muestra |
Formato de error
Los errores de validación, autorización y resolución siguen el formato de error estándar de la API:
{
"statusCode": 400,
"message": ["name should not be empty"],
"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), o una regla de negocio incumplida.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 (Event criteria not found).
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 se documenta en Listar.
Glosario de enums
Catálogo de referencia rápida. El campo donde aparece cada uno y su forma exacta están en Definición.
SetOperatorEnum
Combinación de bloques de consulta dentro del mismo filtro (setOperator de un bloque).
UNION_DISTINCT·UNION_ALL·INTERSECT_DISTINCT
LogicalOperatorEnum
Encadenamiento de predicados dentro de un grupo del árbol de filtros.
AND·OR
ComparisonOperatorEnum
Operador de un predicado sobre una columna o sobre un sub-campo.
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 un operando (una columna, * o una expresión aritmética).
COUNT·SUM·AVG·MIN·MAX
ArithmeticOperatorEnum
Operador de una expresión aritmética dentro del operando de un agregado. SAFE_DIVIDE da NULL
cuando el denominador es cero.
ADD·SUBTRACT·MULTIPLY·SAFE_DIVIDE
TimeOperatorEnum
Operador de la ventana temporal (timeWindow).
ALL_TIME·IN_THE_LAST·IN_THE_FIRST·SINCE·BETWEEN
IN_THE_FIRST no está soportado en este recurso: la ventana "en los primeros N" se
ancla al origen de vida de un sujeto, y un filtro de eventos no tiene sujeto. Enviarla
responde 400 con
timeWindow IN_THE_FIRST is not supported: the catalog does not declare a lifetime origin.
TimeUnitEnum
Unidad de la ventana temporal.
DAYS·WEEKS·MONTHS·YEARS
JoinTypeEnum
Tipo de join entre tablas del catálogo.
INNER·LEFT·RIGHT·FULL
CatalogFieldTypeEnum
Tipo de dato de una columna escalar del catálogo de eventos. Determina qué operadores de comparación admite.
STRING·TIMESTAMP·BOOLEAN·FLOAT64·INT64·NUMERIC·BIGNUMERIC
Diferencias con audiencias
Los dos recursos comparten el query-builder, pero no son simétricos. Si llegas desde audiencias, estas son las suposiciones que no se trasladan:
| Aspecto | Audiencias | Filtros de eventos |
|---|---|---|
| Composición con otros criterios | composedWith | No existe |
| Columna de identidad | Obligatoria en ≥1 bloque; 400 si falta | No aplica — proyecta eventos, no sujetos |
subjectColumn del SQL | La columna de identidad | Siempre null |
IN_THE_FIRST | Soportado | 400 — sin sujeto no hay origen de vida que anclar |
| Validar por id | POST /:id/validate | No existe; solo POST /validate-from-body |
| Conteos del listado | queryBlockCount, compositionCount | conditionCount — hojas del where de todos los bloques |
| Catálogo — columnas | isIdentity e isDefaultTimeReference por columna | Sin ambos; la referencia temporal es de la tabla (defaultTimeReferenceColumn) |
| Catálogo — semi-joins | No declara | products → product_properties |
| Hojas del árbol de filtros | predicate, recordPredicate | predicate, recordPredicate, semiJoinPredicate |
finalCteName del SQL | El del dominio de audiencias | CTE_VALID_EVENTS |
Previsualizar
Ejecuta una audience criteria contra BigQuery y devuelve una muestra de filas reales más el total, desde el cuerpo (aún sin persistir) o por id de un criterio guardado.
Definición
El árbol completo de la definición de un filtro de eventos — bloques de consulta, proyección, filtros de columna, de registro y de tabla relacionada, ventana temporal y agregación.