Reten Docs
Filtros de eventos

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çaO que fornece
Blocos de consultaUm 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 colunaCondições sobre uma coluna escalar com um operador de comparação (EQUALS, IN, BETWEEN, …).
Filtros de registroCondições sobre uma coluna RECORD REPEATED (attributes, items): existe pelo menos um elemento que satisfaz o sub-filtro.
Filtros de tabela relacionadaCondições sobre um semi-join declarado pelo catálogo (products): existe pelo menos uma correspondência na tabela relacionada.
Janela temporalRestringe o bloco a um período de tempo (IN_THE_LAST 30 DAYS, SINCE, …).
AgregaçõesResume 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

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

AmbientePainel de AdminAPI Base URL
Developmentapp-development.reten.aihttps://api-development.reten.ai
Stagingapp-staging.reten.aihttps://api-staging.reten.ai
Productionapp.reten.aihttps://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).

HeaderObrigatórioValor
AuthorizationSimBearer <access_token>
x-tenant-idSimUUID do tenant
x-project-idSimUUID 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ãoEndpoints
event-criteria:viewGET /event-criterias, GET /event-criterias/:id, GET /tables, GET /tables/:tableName/columns
event-criteria:createPOST /event-criterias
event-criteria:updatePATCH /event-criterias/:id
event-criteria:deleteDELETE /event-criterias/:id
event-criteria:view-sqlPOST /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 + rotaCódigoCorpo da resposta
POST /event-criterias (criar)201O filtro criado
GET /event-criterias200Lista paginada
GET /event-criterias/:id200O filtro
GET /event-criterias/tables200Tabelas do catálogo
GET /tables/:tableName/columns200Colunas e semi-joins da tabela
PATCH /event-criterias/:id200O filtro atualizado
DELETE /event-criterias/:id204(sem corpo)
POST /generate-sql201SQL gerado
GET /:id/sql200SQL gerado
POST /validate-from-body201Resultado da validação
POST /preview-from-body201Resultado da amostra
POST /:id/preview201Resultado 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 — o Authorization: Bearer está ausente ou é inválido.
  • 403 Forbidden — o usuário não tem a permissão necessária, ou o x-tenant-id não está autorizado.
  • 404 Not Found — o id solicitado 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:

AspectoAudiênciasFiltros de eventos
Composição com outros critérioscomposedWithNão existe
Coluna de identidadeObrigatória em ≥1 bloco; 400 se ausenteNão se aplica — projeta eventos, não sujeitos
subjectColumn do SQLA coluna de identidadeSempre null
IN_THE_FIRSTSuportado400 — sem sujeito não há origem de vida para ancorar
Validar por idPOST /:id/validateNão existe; apenas POST /validate-from-body
Contagens da listagemqueryBlockCount, compositionCountconditionCount — folhas do where de todos os blocos
Catálogo — colunasisIdentity e isDefaultTimeReference por colunaNenhum dos dois; a referência temporal é da tabela (defaultTimeReferenceColumn)
Catálogo — semi-joinsNão declaraproducts → product_properties
Folhas da árvore de filtrospredicate, recordPredicatepredicate, recordPredicate, semiJoinPredicate
finalCteName do SQLO do domínio de audiênciasCTE_VALID_EVENTS