PrismaFlowGuia do produto

Dashboards — referência do contrato

Esta página é a referência compacta da especificação de dashboards e das operações expostas pelo produto. Use-a quando precisar conferir nomes de campos, valores aceitos, padrões, limites ou códigos de erro.

Os guias de painéis [blocked] e de períodos e filtros [blocked] explicam como interpretar cada escolha.

Objeto de dashboard

CampoTipoRegra
app_idUUIDApp proprietário.
dashboard_idUUIDIdentificador do dashboard.
nametextoObrigatório, sem ficar vazio após remover espaços, até 120 caracteres.
descriptiontexto ou nullOpcional, até 2.000 caracteres.
statusenumdraft, active ou archived.
spec_versioninteiro positivoVersão da especificação persistida; atualmente 1.
specobjetoEspecificação declarativa descrita abaixo.
versioninteiro positivoVersão do registro usada no controle de concorrência.
created_by, updated_bytexto ou nullAtores da criação e última atualização quando disponíveis.
created_at, updated_atdata e horaInstantes em ISO 8601.

O plano compilado não faz parte do objeto público do dashboard.

Especificação do dashboard

json
{  "version": 1,  "panels": []}

Somente version e panels são aceitos nesse nível. O contrato da API não define mínimo nem máximo de painéis, embora o editor exija pelo menos um para salvar.

Especificação completa de um painel

json
{  "version": 1,  "panel_id": "00000000-0000-4000-8000-000000000001",  "event_name": "pix_recebido",  "event_version": 1,  "time": {    "kind": "relative",    "amount": 7,    "unit": "day"  },  "max_buckets": 30,  "metric": {    "op": "sum",    "field": {      "source": "properties",      "path": "amount"    }  },  "group_by": [    { "kind": "time" },    {      "kind": "property",      "field": {        "source": "properties",        "path": "origin"      }    }  ],  "filters": [    {      "field": {        "source": "properties",        "path": "currency"      },      "op": "EQ",      "value": "BRL"    }  ],  "viz": "line",  "sort": {    "by": "time",    "direction": "asc"  },  "limit": 100,  "metadata": {    "x": 0,    "y": 0,    "w": 12,    "h": 4,    "value_format": "currency_brl"  }}

O exemplo usa campos já apresentados no guia público de eventos. A configuração só será válida em um app se a combinação pix_recebido versão 1 e esses campos existirem no catálogo desse app.

Campos do painel

CampoObrigatórioRegra
versionSimInteiro igual a 1.
panel_idSimUUID.
event_nameSimDe 1 a 100 caracteres; começa com letra e depois aceita letras, números, _ e -.
event_versionSimInteiro de 1 a 65.535.
timeSimPeríodo relativo ou absoluto, com no máximo 31 dias.
max_bucketsCondicionalInteiro de 1 a 1.500. Obrigatório com dimensão de tempo; proibido sem ela.
metricSimOperação e campo condicional.
group_byNãoPadrão []; até duas dimensões, no máximo uma de cada tipo.
filtersNãoPadrão []; até 20 filtros.
vizSimline, bar, pie, stat ou table.
sortNãoPadrão { "by": "value", "direction": "desc" }.
limitNãoInteiro de 1 a 1.000; padrão 100.
metadataNãoMetadados de apresentação.

Campos adicionais não são aceitos, exceto dentro de metadata.

Referência de campo

json
{  "source": "properties",  "path": "amount"}

source aceita properties ou context. path aceita de 1 a 64 letras, números ou _. O campo precisa existir no catálogo para o nome e a versão do evento selecionado.

Períodos

Relativo:

json
{  "kind": "relative",  "amount": 15,  "unit": "minute"}

amount é inteiro positivo. unit aceita minute, hour, day ou week.

Absoluto:

json
{  "kind": "absolute",  "from": "2026-09-01T00:00:00.000-03:00",  "to": "2026-09-02T00:00:00.000-03:00"}

from e to precisam ser datas e horas ISO 8601 válidas. from deve ser anterior a to.

Métrica

json
{ "op": "count" }

ou:

json
{  "op": "avg",  "field": {    "source": "properties",    "path": "amount"  }}

Operações: count, sum, avg, min, max, uniq, p50, p90, p95.

count proíbe field. Todas as outras operações exigem field. Operações numéricas exigem um campo numérico. uniq proíbe JSON.

Dimensões

Tempo:

json
{ "kind": "time" }

Propriedade:

json
{  "kind": "property",  "field": {    "source": "context",    "path": "device_type"  }}

Uma dimensão de propriedade precisa estar marcada como agrupável no catálogo. A mesma dimensão não pode ser repetida.

Filtro

Com valor:

json
{  "field": {    "source": "properties",    "path": "amount"  },  "op": "GTE",  "value": 100}

Sem valor:

json
{  "field": {    "source": "context",    "path": "device_type"  },  "op": "EXISTS"}

Operadores: EQ, NEQ, IN, NIN, EXISTS, NOT_EXISTS, GT, GTE, LT, LTE, CONTAINS.

EXISTS e NOT_EXISTS proíbem value. Todos os outros exigem value. IN e NIN exigem uma lista homogênea, não vazia, com até 100 itens. Os demais exigem texto, número ou booleano escalar.

Ordenação

json
{  "by": "value",  "direction": "desc"}

by aceita time, dimension ou value. time exige dimensão temporal; dimension exige dimensão de propriedade. direction aceita asc ou desc.

Metadados de apresentação

Campo conhecidoRegra
xInteiro maior ou igual a zero.
yInteiro maior ou igual a zero.
wInteiro positivo. A interface normaliza para 3 a 12 colunas.
hInteiro positivo. A interface normaliza para no mínimo 3 linhas.
value_formatConvenção da interface: automatic, integer, decimal, currency_brl, percentage ou duration_ms. Hoje é aplicada ao indicador.

metadata aceita outras chaves para evolução da apresentação. Essas chaves são persistidas, mas não alteram o plano analítico. O contrato central valida x, y, w e h; value_format desconhecido volta a automatic na interface.

Operações disponíveis

Todas as operações trabalham no app atual e exigem a capacidade correspondente.

OperaçãoMétodo e caminho relativo
Listar eventos do catálogoGET /app/catalog/events
Listar propriedades de um eventoGET /app/catalog/events/:event_name/versions/:event_version/properties
Validar um dashboard sem salvarPOST /app/dashboards/validate
Compilar um painel sem expor a consulta internaPOST /app/dashboards/panels/compile
Consultar um painel ad hocPOST /app/dashboards/panels/query
Consultar um painel salvoPOST /app/dashboards/:dashboard_id/panels/:panel_id/query
Consultar todos os painéis salvosPOST /app/dashboards/:dashboard_id/query
CriarPOST /app/dashboards
ListarGET /app/dashboards
ObterGET /app/dashboards/:dashboard_id
AtualizarPUT /app/dashboards/:dashboard_id
PublicarPOST /app/dashboards/:dashboard_id/publish
ArquivarDELETE /app/dashboards/:dashboard_id

A base pública da API é /v1/dashboard. Atualizar, publicar e arquivar exigem a versão esperada no cabeçalho If-Match-Version.

Paginação e busca

RecursoLimite padrãoLimite máximoBusca
Dashboards20100Parte do nome, até 120 caracteres.
Eventos do catálogo2020Prefixo do nome, até 100 caracteres; pode filtrar active ou disabled.
Propriedades100100Parte do caminho, até 100 caracteres.

As listas usam cursor opaco de até 2.048 caracteres e retornam next_cursor e total.

Requisição de consulta

Painel ad hoc:

json
{  "panel": {},  "timezone": "America/Sao_Paulo",  "time_override": {    "kind": "relative",    "amount": 7,    "unit": "day"  }}

Painel ou dashboard salvo:

json
{  "timezone": "America/Sao_Paulo",  "time_override": {    "kind": "relative",    "amount": 7,    "unit": "day"  }}

timezone é obrigatório e aceita um nome IANA de até 100 caracteres. time_override é opcional.

Resultado de painel

CampoTipo
panel_idUUID
from, toData e hora ISO 8601
timezoneTexto com o fuso IANA usado
effective_granularity_secondsInteiro positivo ou null
bucket_countInteiro de zero até max_buckets
rowsLista de linhas agregadas, limitada a 1.000
data_qualityObjeto com total_rows e ignored_rows, ou null
executed_atData e hora ISO 8601

Cada row exige value numérico. bucket é uma string opcional e dimension é uma string ou null opcional.

effective_granularity_seconds é null e bucket_count é 0 sem dimensão de tempo. data_quality é null para métricas não numéricas.

Na consulta conjunta, a resposta possui panels. Cada item contém panel_id, outcome: "ok" e result, ou outcome: "error" e error.code.

Códigos de erro de operação

CódigoSignificado
dashboard_not_foundDashboard não existe, está arquivado ou pertence a outro app.
dashboard_not_publishableO estado atual não permite publicar.
dashboard_name_conflictJá existe rascunho ou dashboard ativo com o mesmo nome normalizado.
dashboard_version_conflictA versão esperada ficou desatualizada.
invalid_dashboard_draftA especificação falhou na validação.
dashboard_catalog_unavailableCatálogo temporariamente indisponível.
dashboard_catalog_event_not_foundEvento solicitado não existe no catálogo.
dashboard_panel_not_foundPainel não existe no dashboard.
dashboard_query_invalid_timezoneFuso não é um nome IANA válido.
dashboard_query_limit_exceededA consulta ultrapassou um limite de execução.
dashboard_query_saturatedA capacidade momentânea de consultas foi preenchida.
dashboard_query_timeoutA consulta ultrapassou o tempo permitido.
dashboard_query_unavailableA engine analítica está temporariamente indisponível ou retornou resultado inválido.

Códigos de validação da especificação

Erros de validação trazem code, path, message e, quando aplicável, reason. path aponta para o campo inválido; dentro do dashboard, começa com panels e o índice do painel.

GrupoCódigos possíveis
Estruturainvalid_type, too_small, too_big, invalid_format, invalid_value, unrecognized_keys
Período e bucketstime_range_invalid, time_range_exceeds_31_days, max_buckets_required, max_buckets_time_dimension_required
Métricacount_field_not_allowed, metric_field_required, numeric_metric_requires_number, uniq_json_not_allowed
Dimensões e visualizaçãoduplicate_or_excess_dimension, duplicate_dimension, stat_group_by_not_allowed, pie_requires_property_dimension, line_requires_time_dimension, bar_requires_dimension
Ordenaçãosort_time_dimension_required, sort_property_dimension_required
Filtrosfilter_value_not_allowed, filter_value_required, filter_array_required, filter_array_too_large, filter_array_must_be_homogeneous, filter_scalar_required, duplicate_filter, filter_operator_type_mismatch, filter_value_type_mismatch
Catálogounknown_event, unknown_field, field_not_groupable

Em field_not_groupable, reason pode ser high_cardinality, distinct_value_limit, unsupported_json ou unsupported_path.

Assuntos relacionados

  • Dashboards — fundamentos, criação e ciclo de vida [blocked]
  • Painéis, métricas, dimensões e visualizações [blocked]
  • Períodos, filtros, ordenação e resultados [blocked]