Filtros de eventos
Selecione eventos com um query-builder, sem escrever SQL, e gere, valide e pré-visualize a consulta resultante.
Visão geral
Um filtro de eventos (event criteria) é um conjunto de eventos selecionado com um
query-builder —tabela → colunas → filtros → janela temporal → agregações— sem
escrever SQL manualmente.
A definição é montada compondo:
| Peça | O que fornece |
|---|---|
| Blocos de consulta | Um ou mais blocos; cada bloco parte de uma tabela do catálogo de eventos e define sobre ela colunas, filtros, tempo e agregações. |
| Filtros de coluna | Condições sobre uma coluna escalar com um operador de comparação (EQUALS, IN, BETWEEN, …). |
| Filtros de registro | Condições sobre uma coluna RECORD REPEATED (attributes, items): existe pelo menos um elemento que satisfaz o sub-filtro. |
| Filtros de tabela relacionada | Condições sobre um semi-join declarado pelo catálogo (products): existe pelo menos uma correspondência na tabela relacionada. |
| Janela temporal | Restringe o bloco a um período de tempo (IN_THE_LAST 30 DAYS, SINCE, …). |
| Agregações | Resume colunas do bloco em uma métrica (COUNT, SUM, AVG, …). |
A árvore completa —com as três folhas do where e todos os seus campos— é documentada uma
única vez em Definição; as páginas de
endpoint a referenciam em vez de repeti-la.
Sem coluna de identidade
Um filtro de eventos projeta eventos, não sujeitos: não existe uma coluna de identidade
obrigatória e o SQL gerado retorna subjectColumn: null. Essa é a diferença estrutural
com as audiências, que precisam, sim, expor sua
identidade em pelo menos um bloco.
Endpoints
Catálogo
GET /tables e GET /tables/:tableName/columns — o que pode ser filtrado.
Listar
GET /event-criterias — lista paginada com busca por nome.
Obter
GET /event-criterias/:id — detalhe completo de um filtro.
Criar
POST /event-criterias — cria um filtro a partir de sua definição.
Atualizar
PATCH /event-criterias/:id — atualiza um filtro existente.
Excluir
DELETE /event-criterias/:id — arquiva um filtro.
Gerar SQL
POST /generate-sql e GET /:id/sql — obtém o SQL de uma definição.
Validar
POST /validate-from-body — valida uma definição contra o BigQuery.
Pré-visualizar
POST /preview-from-body e POST /:id/preview — executa uma amostra limitada.
Formato compute
GET /event-criterias/:id?format=compute — lista plana de condições.
Base URL e ambientes
Todas as rotas ficam sob o prefixo global /api, dentro do recurso
/event-criterias (por exemplo POST /api/event-criterias).
Ambientes da Reten
| Ambiente | Painel 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 |
Use a URL do painel de admin para gerenciar chaves de API e configurações de dispatch. Substitua BASE_URL nos exemplos de código pela API Base URL do seu ambiente.
Autenticação
Todos os endpoints exigem um token JWT Bearer mais o header x-tenant-id
que identifica o tenant em cujo schema a requisição opera, e o header x-project-id
que identifica o projeto em que a requisição trabalha (veja
Autenticação → Contexto de Projeto).
| Header | Obrigatório | Valor |
|---|---|---|
Authorization | Sim | Bearer <access_token> |
x-tenant-id | Sim | UUID do tenant |
x-project-id | Sim | UUID do projeto |
-H "Authorization: Bearer <access_token>"
-H "x-tenant-id: <tenant-id>"
-H "x-project-id: <project-id>"Permissões
Cada rota exige uma permissão específica:
| Permissão | 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 |
O catálogo (/tables e /tables/:tableName/columns) exige event-criteria:view, a
mesma permissão de leitura do recurso: quem pode ver um filtro pode ver com o que ele é
construído.
Códigos de status
Os endpoints POST somente leitura (generate-sql, validate-from-body,
preview-from-body, :id/preview) respondem 201 Created —e não 200—, mesmo
que não criem nenhum recurso.
| Método + rota | Código | Corpo da resposta |
|---|---|---|
POST /event-criterias (criar) | 201 | O filtro criado |
GET /event-criterias | 200 | Lista paginada |
GET /event-criterias/:id | 200 | O filtro |
GET /event-criterias/tables | 200 | Tabelas do catálogo |
GET /tables/:tableName/columns | 200 | Colunas e semi-joins da tabela |
PATCH /event-criterias/:id | 200 | O filtro atualizado |
DELETE /event-criterias/:id | 204 | (sem corpo) |
POST /generate-sql | 201 | SQL gerado |
GET /:id/sql | 200 | SQL gerado |
POST /validate-from-body | 201 | Resultado da validação |
POST /preview-from-body | 201 | Resultado da amostra |
POST /:id/preview | 201 | Resultado da amostra |
Formato de erro
Os erros de validação, autorização e resolução seguem o formato de erro padrão da API:
{
"statusCode": 400,
"message": ["name should not be empty"],
"error": "Bad Request"
}Em erros de validação de DTO, message é um array de strings (uma entrada por regra
violada). A validação é estrita: propriedades não declaradas são rejeitadas, então
enviar um campo desconhecido produz um 400.
Erros comuns nesta API:
400 Bad Request— definição ou DTO inválido (campo ausente, tipo incorreto, enum fora do intervalo, propriedade desconhecida), ou uma regra de negócio violada.401 Unauthorized— oAuthorization: Bearerestá ausente ou é inválido.403 Forbidden— o usuário não tem a permissão necessária, ou ox-tenant-idnão está autorizado.404 Not Found— oidsolicitado não existe no tenant (Event criteria not found).
Paginação
A listagem envolve os resultados em PaginatedResponseDto<T>:
{
"data": [],
"pagination": {
"page": 1,
"per_page": 25,
"total": 0,
"total_pages": 0,
"has_next": false,
"has_previous": false
}
}Os campos dentro de pagination usam snake_case (per_page, total_pages,
has_next, has_previous), diferente do resto do recurso que usa camelCase.
O detalhe dos parâmetros de paginação está documentado em Listar.
Glossário de enums
Catálogo de referência rápida. O campo onde cada um aparece e sua forma exata estão em Definição.
SetOperatorEnum
Combinação de blocos de consulta dentro do mesmo filtro (setOperator de um bloco).
UNION_DISTINCT·UNION_ALL·INTERSECT_DISTINCT
LogicalOperatorEnum
Encadeamento de predicados dentro de um grupo da árvore de filtros.
AND·OR
ComparisonOperatorEnum
Operador de um predicado sobre uma coluna ou sobre um 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
Função de agregação sobre um operando (uma coluna, * ou uma expressão aritmética).
COUNT·SUM·AVG·MIN·MAX
ArithmeticOperatorEnum
Operador de uma expressão aritmética dentro do operando de um agregado. SAFE_DIVIDE retorna
NULL quando o denominador é zero.
ADD·SUBTRACT·MULTIPLY·SAFE_DIVIDE
TimeOperatorEnum
Operador da janela temporal (timeWindow).
ALL_TIME·IN_THE_LAST·IN_THE_FIRST·SINCE·BETWEEN
IN_THE_FIRST não é suportado neste recurso: a janela "nos primeiros N" se ancora
à origem de vida de um sujeito, e um filtro de eventos não tem sujeito. Enviá-la
responde 400 com
timeWindow IN_THE_FIRST is not supported: the catalog does not declare a lifetime origin.
TimeUnitEnum
Unidade da janela temporal.
DAYS·WEEKS·MONTHS·YEARS
JoinTypeEnum
Tipo de join entre tabelas do catálogo.
INNER·LEFT·RIGHT·FULL
CatalogFieldTypeEnum
Tipo de dado de uma coluna escalar do catálogo de eventos. Determina quais operadores de comparação ela admite.
STRING·TIMESTAMP·BOOLEAN·FLOAT64·INT64·NUMERIC·BIGNUMERIC
Diferenças em relação às audiências
Os dois recursos compartilham o query-builder, mas não são simétricos. Se você chega das audiências, estas são as suposições que não se transferem:
| Aspecto | Audiências | Filtros de eventos |
|---|---|---|
| Composição com outros critérios | composedWith | Não existe |
| Coluna de identidade | Obrigatória em ≥1 bloco; 400 se ausente | Não se aplica — projeta eventos, não sujeitos |
subjectColumn do SQL | A coluna de identidade | Sempre null |
IN_THE_FIRST | Suportado | 400 — sem sujeito não há origem de vida para ancorar |
| Validar por id | POST /:id/validate | Não existe; apenas POST /validate-from-body |
| Contagens da listagem | queryBlockCount, compositionCount | conditionCount — folhas do where de todos os blocos |
| Catálogo — colunas | isIdentity e isDefaultTimeReference por coluna | Nenhum dos dois; a referência temporal é da tabela (defaultTimeReferenceColumn) |
| Catálogo — semi-joins | Não declara | products → product_properties |
| Folhas da árvore de filtros | predicate, recordPredicate | predicate, recordPredicate, semiJoinPredicate |
finalCteName do SQL | O do domínio de audiências | CTE_VALID_EVENTS |
Pré-visualizar
Executa um audience criteria contra o BigQuery e retorna uma amostra de linhas reais mais o total, a partir do corpo (ainda não persistido) ou por id de um critério salvo.
Definição
A árvore completa da definição de um filtro de eventos — blocos de consulta, projeção, filtros de coluna, de registro e de tabela relacionada, janela temporal e agregação.