Developers
A qualidade dos teus dados, por API.
Lê scores, issues, contratos e vereditos do BeryX (antes chamado DataVault) a partir dos teus pipelines, do CI ou de um agente. REST, JSON, OpenAPI 3.1 — e tokens que só leem.
150 endpoints · versão 1.78.0 · atualizada a 13 de outubro de 2026
Começar
Da conta ao primeiro pedido em três passos.
Cria um token
Um admin do workspace cria-o em Definições → Tokens de API (planos Team e superiores). O valor dvk_… aparece uma única vez — guarda-o num cofre de segredos.
Chama a API
Envia o token no header Authorization: Bearer. Todas as respostas são JSON (exceto os exports .yml, .sql e .md).
Automatiza
Liga o veredito de um dataset ao teu CI, alimenta dashboards ou gera um cliente tipado a partir do contrato OpenAPI.
export DATAVAULT_TOKEN="dvk_…"
curl -s "https://api.praxis.lbostuff.tech/api/v1/datasets?limit=20" \
-H "Authorization: Bearer $DATAVAULT_TOKEN"import os
import httpx
client = httpx.Client(
base_url="https://api.praxis.lbostuff.tech/api/v1",
headers={"Authorization": f"Bearer {os.environ['DATAVAULT_TOKEN']}"},
timeout=30,
)
resp = client.get("/datasets", params={"limit": 100})
resp.raise_for_status()
print("total:", resp.headers["X-Total-Count"])
for ds in resp.json():
print(ds["name"], ds["latest_score"])const res = await fetch(
"https://api.praxis.lbostuff.tech/api/v1/issues?severity=critical&status=open",
{ headers: { Authorization: `Bearer ${process.env.DATAVAULT_TOKEN}` } },
);
if (!res.ok) throw new Error(`BeryX ${res.status}`);
const issues = await res.json();
for (const issue of issues) {
console.log(issue.dataset_name, issue.title);
}// npx openapi-typescript https://beryx.lbostuff.tech/developers/openapi.json -o datavault.d.ts
// npm i openapi-fetch
import createClient from "openapi-fetch";
import type { paths } from "./datavault";
const dv = createClient<paths>({
baseUrl: "https://api.praxis.lbostuff.tech",
headers: { Authorization: `Bearer ${process.env.DATAVAULT_TOKEN}` },
});
const { data, error } = await dv.GET("/api/v1/datasets/{dataset_id}/verdict", {
params: { path: { dataset_id: "…" } },
});# pipx install openapi-python-client
# openapi-python-client generate --url https://beryx.lbostuff.tech/developers/openapi.json
import os
from beryx_api_client import AuthenticatedClient
from beryx_api_client.api.datasets import list_datasets_api_v1_datasets_get
client = AuthenticatedClient(
base_url="https://api.praxis.lbostuff.tech",
token=os.environ["DATAVAULT_TOKEN"],
)
datasets = list_datasets_api_v1_datasets_get.sync(client=client, limit=100)Autenticação
Tokens de API: só leitura, por desenho.
Cada token pertence a um workspace e herda as suas permissões de leitura. Não abre a Consola, não altera dados e não vê credenciais das fontes.
- Formato dvk_ seguido de 48 caracteres hexadecimais. Guardamos apenas o hash SHA-256 — se o perderes, cria outro.
- Só GET, HEAD e OPTIONS, mais as poucas escritas marcadas na referência (gate RAG, disparo de scans, runs de orquestradores, data-diff e decisão de confiança em lote). Qualquer outro método devolve 403, mesmo que o endpoint exista.
- Revogação imediata em Definições → Tokens de API; a última utilização fica visível para auditoria.
- Criação e revogação ficam no registo de atividade do workspace.
Paginação
As listas aceitam limit e offset. O catálogo (GET /datasets) devolve o total no header X-Total-Count.
Header de autenticação
Authorization: Bearer dvk_3f9c…Códigos de erro
- 401
- Token em falta, inválido ou revogado.
- 402
- A funcionalidade não está incluída no plano do workspace (ex.: dossiê do AI Act).
- 403
- Método de escrita com um token, ou workspace suspenso.
- 404
- O recurso não existe ou pertence a outro workspace.
- 422
- Parâmetros inválidos — o corpo indica o campo e o motivo.
Todas as respostas trazem o header X-Request-ID. Os erros 4xx trazem detail (o motivo, legível), code (estável, para decidires no código; null se o erro não tiver um) e request_id, igual ao header. Cita o request_id ao suporte para encontrarmos o pedido nos logs.
HTTP/1.1 403 Forbidden
Content-Type: application/json
X-Request-ID: 7b0c1e4e-3f7a-4c1b-9a51-2d0f7f1e9c11
{
"detail": "Tokens de API são read-only — usa uma sessão de utilizador para mutações.",
"code": "token_read_only",
"request_id": "7b0c1e4e-3f7a-4c1b-9a51-2d0f7f1e9c11"
}Caso de uso
Um gate de qualidade no teu CI.
GET /datasets/{id}/verdict devolve pass, warn, fail ou unknown com as regras que falharam. Falha o deploy quando uma regra crítica falha ou o contrato de dados deixa de ser válido.
SDKs gerados do contrato
O openapi.json é gerado do código a cada release, por isso um cliente gerado nunca diverge da API. Os exemplos acima usam openapi-typescript e openapi-python-client; qualquer gerador OpenAPI 3.1 serve.
# .github/workflows/data-gate.yml → passo antes do deploy
verdict=$(curl -sf "https://api.praxis.lbostuff.tech/api/v1/datasets/$DATASET_ID/verdict" \
-H "Authorization: Bearer $DATAVAULT_TOKEN" | jq -r .verdict)
echo "BeryX: $verdict"
[ "$verdict" != "fail" ] || exit 1Estabilidade
O que acontece à tua integração quando a API muda.
O contrato é o que está neste portal. Uma versão minor só acrescenta; uma quebra só sai numa major, depois de uma depreciação anunciada. Resumo da política de versionamento — a versão em vigor é a 1.78.0.
180 dias
de aviso mínimo antes de uma operação depreciada deixar de responder
30 dias
de aviso antes de reduzirmos rate limits ou quotas
2 minor
do SDK Python suportadas ao mesmo tempo, com correções
O que é o contrato
Tudo o que está neste portal: as operações de
/api/v1que um token de API consegue chamar, com os seus parâmetros, campos e códigos de estado. O resto da API (a app web, a gestão da conta e dos tokens, as áreas internas) não está coberto e pode mudar sem aviso.Mudanças compatíveis (minor)
Uma versão minor só acrescenta: operações, parâmetros opcionais, campos nas respostas, valores novos de enums e códigos novos. O teu cliente deve ignorar campos que não conhece e tratar valores de enum desconhecidos. Os
codedas razões e dos bloqueadores (decisão de confiança, readiness) são estáveis; os envelopes comschema_version(factos de confiança, feeds de BI) só mudam deschema_versionnuma quebra.O que é uma quebra (major)
Remover ou renomear uma operação, um parâmetro ou um campo; mudar o seu tipo ou formato; tornar obrigatório o que era opcional ou recusar um pedido que era aceite; mudar o significado de um campo, de um
codeou de um estado HTTP. Uma quebra só sai de duas formas: numa versão de caminho nova (/api/v2), com/api/v1sem mudanças, ou numa versão major anunciada no changelog depois de uma depreciação. O nosso CI compara cada alteração com o contrato publicado e recusa uma quebra que não esteja anunciada.Depreciação
Anunciada no changelog (tipo
deprecated) pelo menos 180 dias antes do fim, com comunicação direta aos admins dos workspaces com tokens de API ativos. Durante a janela a operação continua a responder, com os headersDeprecation(RFC 9745 — desde quando),Sunset(RFC 8594 — quando deixa de responder) eLinkcomrel="deprecation"(a nota de migração). Exceção: uma correção de segurança pode encurtar a janela e fica no changelog com o tiposecurity.SDK
O SDK Python (
beryx-sdk) tem versões próprias. Suportamos as duas minor mais recentes (N e N-1): recebem correções e acompanham a API. Versões mais antigas continuam a funcionar enquanto a API não tiver quebras, mas sem correções.Rate limits e quotas
Os limites de pedidos (por token e por IP) e as quotas do plano podem mudar; uma redução é anunciada com pelo menos 30 dias de antecedência, exceto medidas contra abuso. Os valores em vigor vêm nas respostas (
X-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-Reset); acima do limite a API responde429comRetry-Aftere, acima de uma quota do plano,402.Reportar um problema
Uma resposta que contradiga este contrato é um bug nosso. Escreve para suporte@praxis.lbostuff.tech com o método e o caminho, o estado HTTP, a hora (UTC), o
X-Request-IDda resposta (nos erros vem também emrequest_id) e a resposta deGET /version(version,build_sha,api_version) — nunca o token. Vulnerabilidades: o contacto em /.well-known/security.txt.
Como sabes que algo vai ser removido
Uma operação depreciada continua a responder durante a janela, mas passa a trazer estes headers — e aparece no changelog abaixo com o tipo «Descontinuado». Vigia-os nos teus clientes: o CORS expõe-nos também no browser.
Ler a política completaExemplo de resposta de uma operação depreciada
HTTP/1.1 200 OK
Deprecation: @1790812800
Sunset: Thu, 01 Apr 2027 00:00:00 GMT
Link: <https://beryx.lbostuff.tech/developers#estabilidade>; rel="deprecation"; type="text/html"Changelog da API
O que mudou no contrato.
Mudanças que quebram compatibilidade são anunciadas aqui antes de chegarem a produção. Novidades do produto em geral: ver o changelog do BeryX.
v1.78.0
- Novo
access_roleemGET /api/v1/datasets/{dataset_id}: o papel de quem pede nesse dataset,viewer,editorouowner. É o mesmo papel com que a API decide os pedidos a esse dataset: as concessões das equipas nos domínios do dataset sobem o papel do workspace, e um domínio de acesso restrito só conta com uma concessão. Um tokendvk_*só de leitura continua só de leitura, qualquer que seja o papel. Cartão #586.
- Novo
v1.77.0
- Descontinuado
O produto passa a chamar-se «BeryX». Os nomes com «DataVault» nos contratos já em produção continuam a valer até 31 de maio de 2027. Os webhooks e o export SIEM enviam
X-BeryX-Event,X-BeryX-Delivery,X-BeryX-TimestampeX-BeryX-Signaturee, até essa data, também osX-DataVault-*com o mesmo valor; a assinatura é a mesma nos dois. As variáveis de ambiente do servidor, do servidor MCP, do SDK Python e do provider Terraform leemBERYX_<NOME>eDATAVAULT_<NOME>; com as duas definidas, ganha a nova, e a API e o worker avisam no arranque com os nomes antigos em uso. O servidor MCP chama-seberyx, e as configurações geradas em «Ligar o teu agente» usamberyxeBERYX_TOKEN. OGET /workspace/configdescarregaberyx.yaml; oberyx config plan|applye oscripts/workspace_config.py importsem caminho leem oberyx.yamle, se não existir, odatavault.yaml. No export para dbt (oschema.ymle os testes singulares dorules.dbt-tests.zip), a regra vai emconfig.meta.beryx, e a suite GX leva a tabela e ounsupportedemmeta.beryx; o import e o casamento dorun_results.jsonleemmeta.beryxemeta.datavault, com a nova a ganhar. O User-Agent dos webhooks passa aBeryX-Webhooks/1 DataVault-Webhooks/1: um filtro que procureDataVault-Webhookscontinua a aceitar as entregas. Não mudam: os nomes dos assets no Collibra, o namespace OpenLineage, o prefixodvk_dos tokens, os tipos de evento (datavault.alerts…) e os nomes dos ficheiros exportados (tests/datavault_*.sqle a suite<tabela>.datavault), para não duplicar os testes no teu repositório.
- Descontinuado
v1.76.0
- Segurança
POST /synthetic-packscorre a avaliação utilidade × privacidade deGET /datasets/{dataset_id}/syntheticsobre as linhas de cada tabela antes de escrever o ficheiro. Comprivacy_verdict = failnuma tabela, responde 409 e não envia ficheiro nenhum. Odetailtrazcode = synthetic_privacy_fail, omessageem pt-PT e, emtables, oname, odataset_id, akeye osparamsde cada tabela recusada. Oevaluationde cada tabela no manifesto deixa de virnulle traz o scorecard. Até aqui, o pack podia levar linhas que o export de um só dataset recusava. As chaves geradas de uma tabela referenciada também deixam de usar os valores que as colunas FK que apontam para ela não podem levar (amostras reais, extremos, PII real): um pack com esses valores no perfil muda de bytes. Cartão #561.
- Segurança
v1.75.0
- Novo
languageemGET /reportseGET /reports/{report_id}: a língua do texto decontent_md(pt,enoues). O LLM escreve na língua do workspace (workspace.default_locale) e o template offline escreve empt; os relatórios anteriores vêm comnulle estão empt. Os títulos das secções continuam em português. Cartão #355.
- Novo
v1.74.0
- Novo
GET /api/v1/suggestions: o filtrocategoryaceitaenrichment, a categoria das propostas de enriquecimento (valores de fontes de referência com a fonte, a data e a confiança, aplicados por PR ou SQL depois de aprovados). Só nascem quando alguém pede uma proposta no dataset; a IA não as cria. Cartão #389.
- Novo
v1.73.0
- Novo
Webhooks de saída:
code(código estável em inglês e snake_case, ex.:alerts_new,escalation_level,digest_weekly) eparams(só números e identificadores) em todos os eventos doWebhookPayload, etitle/bodyna língua do canal: olocaledoconfigdo canal, senãoworkspace.default_locale, senão pt-PT. Nos canais de email, cada destinatário recebe a mensagem na sua língua (localeda conta, senão a do workspace) e um endereço externo na do canal. Os códigos estão em docs/WEBHOOKS.md. Cartão #519. - Novo
Erros na língua do pedido: o
detailsai na língua da pessoa (localeda conta), senão na omissão do workspace, senão na do cabeçalhoAccept-Language(pt, en ou es; de e fr recebem en), senão em pt-PT. Cada erro do catálogo traz o seucodeestável, também os que até aqui tinhamcodenull. Vale também para o 402/403 do plano, o 429 do rate limit e da fila de scans, o 413 do corpo e amessagede umdetailestruturado ({code, message}), cujocodenão muda. Sem língua conhecida, o texto é o de antes. Cartão #519.
- Novo
v1.72.0
- Novo
GET /api/v1/datasets/{dataset_id}: osemanticde cada coluna do perfil ganharegion. No tipophoneé o país do plano de numeração (ISO 3166-1 alfa-2), lido do país dos dados; nos outros tipos e emphone_pt(que é PT) vem anull. Cartão #516.
- Novo
v1.71.0
- Novo
Língua, região e fuso:
locale(pt-PT, pt-BR, en-GB, en-US, es-ES, de-CH ou fr-CH) etimezone(IANA) emGET /auth/me, maisworkspace.default_localeeworkspace.timezone.PATCH /auth/megrava os da própria pessoa (só as chaves enviadas mudam; null volta à omissão do workspace) eGET/PUT /workspace/localegere as omissões do workspace (admin). Cartão #518. - Novo
Agendamentos com fuso:
timezone(IANA) no corpo dePATCH /connections/{connection_id}/scheduleescan_timezoneemGET /connections;timezoneemPOST/PATCH /report-schedulese na resposta. A hora (hour,scan_hour) lê-se nesse fuso e o próximo instante UTC calcula-se para cada ocorrência, por isso a hora local aguenta a mudança de hora. Os agendamentos existentes ficam emUTCe não mudam de hora; semtimezone, oPATCHmantém o fuso da conexão. Cartão #518.
- Novo
v1.70.0
- Novo
GET /api/v1/domains/suggestions: o domínio sugerido para os datasets sem domínio, pela maioria das ligações de linhagem a datasets já curados (pelo menos metade das ligações, sem empate). Cada sugestão traz os votos, o total de ligações, até 3 colunasvia, os tipos de aresta,inferred_onlye asignatureda evidência; os empates vêm emambiguous, com os candidatos. Admins veem todas; quem gere domínios só as desses domínios; os outros recebem403. Um vizinho invisível conta no total e vem como «Dataset restrito».has_lineagediz se há alguma ligação de linhagem a um dataset visível, porquecounts.with_lineagesó conta os datasets sem domínio. Cartão #468. - Novo
Qualidade dos metadados: o problema
missing_domainganha uma sugestão comchannel: "lineage"quando há datasets sem domínio com sugestão pela linhagem («Juntar pela linhagem — N com sugestão», comlinkpara/datasets?vista=dominioseendpointGET /api/v1/domains/suggestions). Valor novo no enumchanneldeMetadataSuggestionOut. Cartão #468.
- Novo
v1.69.0
- Novo
País dos dados (ISO 3166-1 alfa-2):
data_countryemGET /connectionseGET /connections/{connection_id}(o da fonte; null = o do workspace),data_countryemGET /datasetseGET /datasets/{dataset_id}(o próprio do dataset; null = herdado) ecountryno detalhe do dataset, com o paíseffectiveque os scans usam (dataset → conexão → workspace) e asourcede onde vem.GET /datasets/{dataset_id}/data-countrydá o mesmo objeto. O workspace temPTpor omissão, por isso nada muda até alguém escolher outro país; noutro país, os telefones de 9 dígitos sem indicativo e os códigos postais deixam de ser lidos como portugueses. Cartão #513.
- Novo
v1.68.0
- Novo
Schema de resposta em 30 operações que devolviam um objeto sem schema. Os campos são os que já vinham e o JSON não muda. São o veredito (
GET /datasets/{dataset_id}/verdicteGET /domains/{domain_id}/verdict), a decisão e os factos de confiança (GET /datasets/{dataset_id}/trust-decision,POST /trust-decisions,GET /datasets/{dataset_id}/trust-factseGET /domains/{domain_id}/trust-facts), a prontidão (GET /datasets/{dataset_id}/ai-readinesseGET /domains/{domain_id}/readiness), a pesquisa e a linhagem (GET /datasets/find,GET /datasets/{dataset_id}/lineage,…/lineage/traverse,…/lineage/impacte…/lineage/path), o contexto (GET /datasets/{dataset_id}/context), o data-diff (POST /datasets/{dataset_id}/diff/{other_id}), os contratos (GET /datasets/{dataset_id}/contract/versions,…/contract/versions/{number},…/contract/diff,…/contract/proposalse…/contract/proposals/{proposal_id}), a política de dados (GET /workspace/data-policyeGET /domains/{domain_id}/data-policy), o AI Act (GET /compliance/ai-systems,…/ai-systems/{system_id}e…/art10), os orquestradores (POST /integrations/dbt/run-results,GET /orchestrator-runsePOST /orchestrator-runs) e as leituras da extensão do VS Code (GET /ide/resolveeGET /ide/datasets/{dataset_id}/columns). Um cliente gerado a partir deste spec passa a ter estes campos, e a nossa verificação de quebras passa a ver dentro destas respostas. Cartão #455.
- Novo
v1.67.0
- Novo
GET /datasets/{dataset_id}/rules/export?format=dbt|sodacl|gx: as regras ativas do dataset como ficheiro para o teu repositório, em testes dbt (schema.yml, o mesmo deGET /datasets/{id}/rules.dbt.yml, que continua), checks SodaCL (missing_count,duplicate_count,invalid_countcomvalid regex/valid min/valid max,freshness,row_count) ou uma suite do Great Expectations 1.x (JSON). No SodaCL e no GX só sai o que oPOST /rules/importlê de volta como a mesma regra; o que fica de fora (regras de streams, validade por dígito de controlo, regras SQL, tolerâncias acima de zero…) vem com o motivo no cabeçalho do ficheiro (meta.datavault.unsupportedno GX) e conta-se nos headersX-Rules-Exported,X-Rules-UnsupportedeX-Rules-Unsupported-Types.GET /rules/export?format=sodacl: as regras dos datasets que quem pede vê, num só ficheiro SodaCL. OPOST /rules/importpassa a lerinvalid_countcom validade eduplicate_countde várias colunas no SodaCL,expect_compound_columns_to_be_uniqueno GX e frescura em minutos (30m), e o dedupe vê como a mesma regra a tolerância a zero e a ausente,columns: [x]ecolumn: x,12.0e12: reimportar o ficheiro não duplica regras. Sem LLM e sem tocar na fonte. Cartão #403.
- Novo
v1.66.0
- Novo
Problemas «esperados»: cada issue de
GET /issuese deGET /datasets/{id}ganharesolution_reason:expectedquando foi ignorado como esperado (uma migração, um fecho de mês), null nos restantes. NoGET /issues/sla-report, um issue esperado conta nosopenede no MTTA, mas fica fora dosresolved, do MTTR e doin_scope/breached. Cartão #401.
- Novo
v1.65.0
- Segurança
O
422da validação deixa de devolver o valor recebido: cada item dedetailtraztype,locemsg, e octxsó com os limites da regra (gt,ge,lt,le,multiple_of,min_length,max_length,max_digits,decimal_places). Oinputde um campo em falta era o corpo inteiro do pedido, e noPOST /auth/logine noPOST /auth/registerisso incluía a password. Os camposinputectxcontinuam no schemaValidationItematé à próxima major, mas oinputjá não vem. Cartão #450.
- Segurança
v1.64.0
- Novo
GET /incidentseGET /incidents/{incident_id}: raio de impacto do incidente.impact_scopeécolumnquando os problemas da raiz são de uma coluna (impact_columns) e há linhagem coluna-a-coluna (lida do SQL das views) a sair dela: aimpact_treesó leva os datasets que usam essas colunas e os de impacto possível, onde falta o mapa de colunas. Étableao nível da tabela, como antes, comimpact_note: no_column_lineagequando os problemas eram de uma coluna sem esse mapa, enonequando nada a jusante é afetado. Cada nó da árvore ganhaimpact(column= certo,table= possível) evia_columns; o incidente ganhadownstream_count,downstream_column_counteexposures_count. Num dataset restrito,via_columnsvem vazio. Cartão #402.
- Novo
v1.63.0
- Novo
GET /rules/{rule_id}/failing-rows.sql?dialect=&limit=: a query que lista as linhas que falham a regra, em texto, para correres no teu warehouse (o DataVault não a executa nem guarda linhas). Dialeto por omissão o da fonte do dataset (X-DataVault-Dialect), oupostgres,mysql,mssql,bigquery,snowflake,databricksesqlite; nomes sempre citados eLIMIT/TOPdo dialeto (limitde 1 a 1000, omissão 100). Uma regra sem tradução por linha (row_count_min, regras de streams, lista acima de 500 valores…) responde204com o motivo emX-DataVault-Reason. Um tokendvk_*pode chamá-la e o pedido fica no trilho de auditoria como leitura (failing_rows_sql_read). Cartão #400.
- Novo
v1.62.0
- Novo
SLA de resolução por severidade:
GET /issues/sla-report?period=AAAA-MM&group_by=domain|team|severitydevolve, por grupo e no total, os issues criados, fechados (resolvidos ou ignorados) e por resolver no fim do mês, quantos passaram o alvo (breached, sobrein_scope), o MTTA e o MTTR (mediana e p90, em horas de relógio do SLA: por resolver e sem os adiamentos) e o ageing das abertas (lt_1d,d1_3,d3_7,d7_30,gt_30d). Só conta os datasets que quem pede vê. Cada issue deGET /issuesganhasla_breached_at(quando passou o alvo da sua severidade; null dentro do SLA ou sem alvo) eGET /issuesaceitasla=breached. Cartão #396.
- Novo
v1.61.0
- Novo
POST /datasets/{dataset_id}/validate: valida até 5 000 registos (corpo até 2 MB; acima,413) contra as regras ativas do dataset e devolve, por registo, se passou e que regras falharam, com umcodeestável (invalid_check_digit,pattern_mismatch,not_in_reference…) e osparamsda regra; por regra, quantos registos passaram, falharam ou não se aplicam, com a tolerância da regra; e overdictdo lote (pass,warn,failouunknown). As regras do dataset inteiro (unique,freshness,row_count_min…) ficam comnot_applicable_code. Nada é guardado. Um tokendvk_*pode chamá-la, com rate limit próprio por token (429comRetry-After). Cartão #397.
- Novo
v1.60.0
- Alterado
Os erros
4xxpassam a ter sempre o mesmo corpo (schemaErrorResponse; no422e no402,ValidationErrorResponseePlanLimitErrorResponse, com os mesmos campos):detailcomo antes,code(código estável quando existe —auth_required,token_invalid,token_read_only,workspace_suspended,plan_limit,org_quota,validation_error,rate_limited,scan_queue_full,payload_too_large— senãonull) erequest_id, o mesmo valor do headerX-Request-ID. Os campos próprios de cada erro (planelimitno 402,retry_afterno 429) mantêm-se. Cartão #361. - Alterado
O OpenAPI documenta os erros:
401e403em todas as operações autenticadas,404nas que têm um id no caminho,402nas que dependem do plano (complanelimitno schema), o422com o mesmo envelope (cada item com os campos de antes:loc,msg,type,inputectx) e o headerX-Request-IDem todas as respostas. Os schemas principais (datasets, issues, scans, gate RAG, decisão de confiança) e as respostas do veredito, dos factos de confiança, da readiness, das versões de contrato, da reconciliação e da resolução no IDE trazem exemplos. Cartão #361.
- Alterado
v1.59.0
- Novo
Campos
confidence_band(high,low, ouexactquando as linhas do cluster são iguais nas colunas comparadas) ereference_precisionnos clusters deGET /duplicates: aconfidenceé a semelhança média dos pares, não uma probabilidade; a banda e a precisão de referência (fração de clusters com essa semelhança que eram duplicados reais) vêm de um benchmark sintético português, não dos dados do cliente. Aconfidencede um cluster fuzzy novo fica abaixo de 1, que passa a ser só dos exatos. Cartão #352.
- Novo
v1.58.0
- Novo
Campo
kindnos datasets (table,view,materialized_view,externalouunknown): o tipo do objeto na fonte. Umaviewouexternalperfila embasicsobre as primeiras linhas, salvo profundidade própriastandardoudeepdo dataset. Cartão #347. - Novo
Campos
primary_key,partitioneclusteringem cada coluna do detalhe de um dataset: o que a fonte declara sobre ela. Cartão #347. - Novo
Campo
cost_guardednos datasets:truequando os scans o perfilam embasicsobre as primeiras linhas e sem contar valores distintos (kindviewouexternal, sem profundidade própriastandardoudeep). Cartão #347. - Alterado
key_columnspassa a opcional no data-diff (POST /datasets/{id}/diff/{other}): sem ele, a chave é a chave primária declarada na base, se o candidato tiver as mesmas colunas; senão, 422 como antes. O relatório trazkey_source(requestouprimary_key). Cartão #347.
- Novo
v1.57.0
- Alterado
A dimensão
consistenciado score (score_history[].dimensions,GET /datasets/{id}) passa a descontar os issuesschema_drifteanomalyabertos ou reconhecidos do dataset, e não só o drift do próprio scan: 15 pontos por aviso e 30 por crítico, × (1 − idade/K), em que a idade são os scans desde a última deteção e K =DATAVAULT_CONSISTENCY_DECAY_SCANS(5). Um issue resolvido ou ignorado deixa de descontar no scan seguinte. O drift estrutural (colunas removidas, tipo alterado) continua a contar só no scan que o deteta. Os scores já gravados não mudam. Cartão #351. - Novo
Valor
consistency_issuenokinddos drivers deGET /datasets/{id}/score/explain: um issue aberto cujo desconto na consistência mudou, comissue_ideparamschange(opened,decaying,detected_again,gone),age_before,age_after,points_before,points_afteredecay_scans. Nota novaconsistency_model_changedquando um dos scores é anterior a esta versão. Cartão #351.
- Alterado
v1.56.0
- Novo
Números calculados sobre amostras dizem-no com os mesmos campos:
estimated,sample_sizee o intervalo de confiança a 95% (ci95, ou<campo>_ci95quando o objeto tem vários números).dimensions_meta.unicidade.ci95no score;semantic.estimatedesemantic.sample_sizeno perfil das colunas;sample_matchesesample_sizenas colunas do mapa de PII. Cartão #350.
- Novo
v1.55.0
- Novo
Valor
bi_refreshnotypedos issues: refresh falhado (subtypefailed) ou atrasado (delayed) de um dataset BI do Power BI, do Tableau ou do Looker, preso ao dataset de que ele depende;impact_jsontrazbi_dataset_id,bi_dataset_namee osdashboardsafetados. Cartão #271.
- Novo
v1.54.0
- Novo
Paginação uniforme:
GET /issues,GET /scans,GET /signalseGET /knowledgepassam a devolver o total filtrado no headerX-Total-Count, como já faziamGET /datasets,/rules,/suggestionse/reports.GET /scans,GET /signalseGET /orchestrator-runsaceitamoffset. Em todas as listagens,limitvai de 1 a 500 (GET /scans,GET /knowledgeeGET /orchestrator-runsparavam nos 200),offseté ≥ 0 e umlimitacima do teto dá 422. O corpo continua a ser uma lista e olimitpor omissão de cada listagem não muda. Na pesquisa híbrida deGET /knowledge, o total é o tamanho da lista fundida sobre a qual corre a paginação. Cartão #333.
- Novo
v1.53.0
- Novo
Feed BI
chargebackemGET /bi/chargeback: uso e custo do workspace do token por mês, com uma linha por workspace, por domínio e por equipa (month,dimension,workspace_id,workspace_name,entity_id,entity_name,scans,datasets,reports,llm_tokens,llm_tokens_byok,llm_cost_usd,llm_cost_eur,profile_bytes).entity_idvazio numa linha de domínio ou de equipa = sem domínio ou sem equipa. Um dataset em dois domínios conta metade em cada; a parte de um domínio vai para as equipasowner(semowner, para aseditor). Por omissão cobre os meses dos últimos 365 dias;domain_iddeixa só as linhas desse domínio. Cartão #259.
- Novo
v1.52.0
- Novo
Equipas como responsáveis: cada issue de
GET /issuesganhaassignee_team_ideassignee_team_name(a equipa responsável, além da pessoa; null sem equipa).GET /issueseGET /issues/boardaceitamassignee_team— o id de uma equipa,mine(as equipas de quem pede) ounone(sem equipa).GET /issues/boardganhateam_cells, as contagens estado × equipa (status,team_id,team_name,count;team_idnull = sem equipa). Atribuir a equipa é da UI e só aceita uma equipa que leia o dataset do issue. Cartão #240.
- Novo
v1.51.0
- Novo
Montra pública de um data product, com o mesmo modelo do badge do dataset (token opaco, fora do portal, sem conta):
GET /public/badge/domains/{token}.svgdevolve o badge estilo shields.io — à esquerda o cumprimento do SLA no mês («SLA 99,2 %») ou, sem SLA declarado, o score; à direita a readiness para BI, verde (ready), âmbar (ready_with_warnings) ou vermelho (not_ready) — comETageCache-Control: public, max-age=3600.GET /public/domains/{token}devolve o JSON da página/p/dominios/{token}: nome, descrição, nome do owner, versão e estado, score, SLA declarado e cumprimento do mês, readiness por caso de uso (rag,ml,agente,bi, com estado e códigos dos bloqueadores e avisos) e, por dataset, nome, veredito, score e os links públicos só se o dataset também estiver partilhado, maisgenerated_at; comETageCache-Control: no-cache. Nunca emails, ids internos, colunas ou amostras. Os dois partilham o rate limit por IP do badge do dataset; um token desconhecido ou revogado dá 404. A gestão (GET,PUTeDELETE /domains/{domain_id}/public-shareePOST …/public-share/rotate) é da UI: ver é de quem lê o domínio; ativar, rodar e revogar, de um admin, do owner do domínio ou de uma equipaowner. Cartão #180.
- Novo
v1.50.0
- Novo
Ensaio da remediação: cada item de
GET /suggestionsganharehearsal, o último ensaio só-leitura do passo de diagnóstico da sugestão (null se nunca foi ensaiada). Trazversion,status(queued,ok,blocked,timeoutouerror),affected_rows(linhas que o passo 1 devolve, contadas na fonte),total_rows(linhas do dataset no último scan),pct,requested_at,ran_at,duration_mseactor(o email do admin que o pediu). Quando não contou,reasontrazcode(no_diagnosis,aggregate,limit,not_select,forbidden,function_not_allowed,unknown_table,timeout,source_error,blackout…),paramsemessageem pt-PT, de recurso. Comstatus = ok, oimpactda sugestão passa a terestimated_rowsigual às linhas contadas,estimated_rows_samplecom a estimativa anterior erows_source = rehearsal. Só contagens: nunca valores nem o SQL. Cartão #178.
- Novo
v1.49.0
- Novo
Avaliação dos dados sintéticos:
GET /datasets/{dataset_id}/synthetic/evaluation?rows=&seed=devolve o scorecard das mesmas linhas queGET /syntheticenviaria com esse par.utility_score(0–100) mede a fidelidade ao perfil (nulos, quantis p05–p95 normalizados pelo IQR, distância de variação total aos histogramas e às quotas categóricas, correlações dos pares), comutility_componentseutility_weights.privacy_verdictéfailcomsample_leak,extreme_leakoupii_leak,warncomk_minabaixo dek_threshold(5), contado só sobre os quase-identificadores com valores do domínio real (numéricos, temporais ou categóricos), epassno resto. O motivo chega comokey(leaksemfail,k_belowemwarn, null empass) eparams(sample_columns,extreme_columnsepii_columnsemleaks;k_min,k_thresholdeqi_columnsemk_below), com que a UI compõe o texto, ereasoné o mesmo texto em pt-PT, de recurso. Só taxas, deltas, contagens e nomes de colunas. Cartão #174. - Alterado
GET /datasets/{dataset_id}/syntheticcorre a avaliação antes de enviar: comprivacy_verdict = failresponde 409 e não envia nenhuma linha (CSV ou JSON); odetailtrazcode = synthetic_privacy_fail, akeye osparamsdo motivo e omessageem pt-PT. Emformat=json, omanifesttraz o scorecard emmanifest.evaluation. O pack multi-tabela (POST /synthetic-packs) ainda não corre esta avaliação: oevaluationde cada tabela no manifesto do pack continua null. Cartão #174.
- Novo
v1.48.0
- Novo
Pack de dados sintéticos multi-tabela para dev/test e fixtures de CI:
POST /synthetic-packs(tagsynthetic, permitido a tokens) com exatamente um deconnection_id,domain_idoudataset_ids(atémax_tables, no máximo 20),rows_per_table(até 20 000 por omissão),seedeformat:zip(um CSV por tabela,schema.sqlcom chaves e FKs emanifest.jsoncom estratégias, FKs, avisos, seed e o aviso «dados sintéticos — não contém dados reais») ousqlite(as mesmas tabelas e o manifesto na tabela_datavault_manifest). As colunas ligadas pela linhagem (cliente_id→clientes) só levam chaves que existem na tabela de origem, com a taxa de nulos do perfil; num ciclo da linhagem, a FK que o fecha sai, com aviso. A mesma chamada sobre os mesmos perfis dá os mesmos bytes. Síncrono e com orçamento de tempo (30 s por omissão): excedido, 422 sem ficheiro. Um campo desconhecido no corpo dá 422. Cada workspace tem um limite de pedidos (20 em 10 minutos por omissão), partilhado por membros e tokens: acima, 429 comRetry-After. Um dataset ou domínio invisível para quem pede é «não encontrado». Cartão #175.
- Novo
v1.47.0
- Novo
Os bloqueadores e avisos do trust score (
blockers[]ewarnings[]deGET /datasets/{dataset_id}/truste dotrustdeGET /datasets/{dataset_id}) ganhamparams: os números com que o texto se compõe, porkey—critical_issuetrazcount;schema_change_unacknowledgedtrazcount,grace_dayseoldest_days;unused_datasetvem sem params. Omessagecontinua em pt-PT. Cartão #476.
- Novo
v1.46.0
- Novo
Travessia do grafo de linhagem, determinística e sem LLM (as mesmas consultas das tools
get_lineage,impact_of,path_betweenefind_datasetsdo assistente e do servidor MCP):GET /datasets/{dataset_id}/lineage/traverse?direction=&hops=(upstream e/ou downstream até 3 saltos, com o caminho «A → B → C», a origem de cada aresta emkinds, o mapa de colunas e os exposures a jusante),GET /datasets/{dataset_id}/lineage/impact?column=(datasets, exposures e destinos a jusante e, com a coluna, as colunas que derivam dela),GET /datasets/{dataset_id}/lineage/path?target_id=(caminho mais curto até 6 saltos, no sentido do fluxo ou no inverso) eGET /datasets/find(filtros compostos:query,layer,domain,has_pii,min_score,usage_class). Até 40 datasets e 60 arestas (truncated), só nomes: nunca o owner, o email nem o URL de um exposure. Um dataset invisível para quem pede é «Dataset restrito». Cartão #173.
- Novo
v1.45.0
- Novo
Versões do data product:
GET /domains/{domain_id}/versionslista as versões publicadas (a mais recente primeiro) comversion(MAJOR.MINOR),bump(majorquebra o consumidor: um dataset saiu, uma coluna do contrato ativo desapareceu ou o SLA enfraqueceu;minoré compatível),change_summarye contagens.GET /domains/{domain_id}/versions/{from_version}/diff/{to_version}devolve as mudanças entre duas versões no formato do diff de contratos, cada uma comimpact;from_version=latesteto_version=currentcomparam o estado atual com a última versão e trazemnext_version; de uma versão mais antiga atécurrent,next_versionénull.latestno destino oucurrentna origem dão 422. Cartão #168. - Novo
GET /domainseGET /domains/{domain_id}ganhamstatus(draft | published | deprecated),versionepublished_at(nullaté à 1.ª publicação). Os domínios que já existiam estãopublishedna1.0. Cartão #168. - Novo
GET /domains/{domain_id}/readinesstem dois códigos novos: o bloqueadordeprecated(data product descontinuado) e o avisodraft(em rascunho). Cartão #168.
- Novo
v1.44.0
- Novo
GET /knowledge/graphpassa a ser o grafo do património: nósdomain,exposure,metriceterm(ao lado deconnection,dataset,rule,issue,signalekb_entry) e arestasfeeds(linhagem upstream → downstream, comlineage_kind:inferred,declared,parsed,dbtouopenlineage; num par com várias, ganha a que não éinferred),member_of(dataset → domínio),consumed_by(dataset → exposure dbt),measures(métrica dbt → dataset de origem, resolvido pelo nome; um nome ambíguo fica sem aresta) emeans(termo não depreciado do glossário → dataset, pelas ligações aprovadas, com as colunas emcolumn).stats.by_edge_kindconta as arestas por tipo. No corte a 1500 nós ficam primeiro as fontes, os domínios e os datasets. Cartão #172. - Novo
GET /knowledge/graphaceitafocus=dataset:<id>: devolve só a vizinhança desse dataset ahopssaltos (1 a 3; 2 por omissão), com teto de 400 nós — ficam primeiro os mais próximos.kinds(tipos de nó separados por vírgulas) limita os tipos de nó; o do foco entra sempre.hopsfora de 1–3,kindscom um tipo desconhecido ou umfocusque não sejadataset:<id>dão 422; um dataset que não é do workspace dá 404. Cartão #172.
- Novo
v1.43.0
- Novo
POST /trust/consumptions: um agente, aplicação, pipeline ou notebook regista os datasets que consumiu (até 50), a finalidade e a decisão de confiança que viu (decision_seen; omitida, fica a decisão atual da Trust API e o seuas_ofemtrust_as_of). O consumidor nasce no primeiro registo e é identificado porname+kind. Comconsumer.run_ref, repetir o registo do mesmo run não cria consumos novos (replayed). Só ids e rótulos: campos desconhecidos dão 422. Oconsumer.namesó aceita letras (de qualquer língua), algarismos, espaços e_ . : / -; marcação de Slack, Teams ou markdown dá 422. Responde 201; 404 se um dataset não é do workspace; 429 comRetry-Afteracima do limite por workspace. É uma escrita permitida aos tokensdvk_*. Um consumo emuntrustedgera o eventoconsumer_untrusted_reade um aviso aos canais, sem abrir problema; os canais recebem no máximo um aviso por hora por consumidor e dataset. Cartão #166. - Novo
GET /consumerseGET /datasets/{dataset_id}/consumers: os consumidores registados, comconsumptions_7d,consumptions_30d,datasets_30d,decisions_7d(consumos dos últimos 7 dias por decisão),last_decision,last_purposeelast_consumed_at. No dataset, as contagens e a última decisão são as desse dataset.GET /consumerstrazX-Total-Count. Cartão #166. - Novo
Os consumidores afetados (
exposures) deGET /incidents,GET /incidents/{incident_id}eGET /issues/{issue_id}/impactganhamnode:exposure(dbt, como até aqui) ouconsumer(consumidor registado com consumos nos últimos 30 dias). Umconsumertrazframework,consumptions_7d,last_decisionelast_consumed_atdo dataset por onde o impacto chega, e otypeé o tipo do consumidor (agent,application,pipeline,notebook). Cartão #166.
- Novo
v1.42.0
- Novo
Limiares afinados pelo feedback:
GET /datasets/{dataset_id}/tuningdevolve, por métrica×coluna (subtypedos issues de anomalia), o degrau em vigor (threshold, na escala clássica do |z|: 3,5 é o limiar calibrado sem afinação), se está silenciada, quantas vezes foi ignorada e resolvida, e o que o próximo «ignorar» faz (next_on_ignore). Traz também os reajustes de regras à espera de aprovação (retunes). Cartão #157. - Novo
O cartão de explicação de uma anomalia (
GET /issues/{issue_id}/explanation) traztuned_threshold(o degrau afinado pelo feedback que entrou noz_threshold) etuned_threshold_label(«limiar afinado por feedback: 5,0»). Vêmnullquando a métrica não tem afinação. Cartão #157.
- Novo
v1.41.0
- Novo
GET /domains/{domain_id}/consumers: quem depende do data product. Utilizadores e consumidores externos registados à mão (source=manual) e os sistemas de IA e exposures dbt que usam os datasets do domínio (source=derived).by_kindconta os quatro tipos (user,ai_system,dbt_exposure,external),totalsoma-os esummaryé a frase de impacto («3 sistemas de IA e 2 dashboards dependem deste produto»),nullsem consumidores. Um consumidor comchannel_idrecebe o aviso de uma violação crítica do SLA. Cartão #165. - Novo
GET /domains/{domain_id}/readinessganhaconsumers:{total, by_kind}com os quatro tipos de consumidor sempre presentes. É informativo e não muda ostatus. Cartão #165.
- Novo
v1.40.0
- Novo
GET /rules: cada regra trazlast_result, o último resultado num scan, comstatus(passed,failedounot_evaluated),scan_id,evaluated_at,observedethreshold. Antes do primeiro scan com a regra vem anull. Uma regranot_evaluatedcorreu mas não se conseguiu verificar: não abre issue nem conta no score, ereasondiz porquê (por exemplo, uma regrareferentialcuja referência, noutra ligação, passa das 200 000 chaves). Se a razão nomear um dataset de referência que quem pede não vê, sai uma frase sem o nome. Cartão #164. - Novo
Regra
referential(integridade referencial entre datasets):rule_typeemGET /rulespassa a poder serreferential, comparamscolumn,ref_dataset_id,ref_columnemax_orphan_pct. EmGET /datasets/{dataset_id}/rules.dbt.ymlsai como testerelationships(to: ref('<tabela>'),field), e emGET /datasets/{dataset_id}/contracteGET /domains/{domain_id}/contractcomo checkinvalidValuescomarguments.references(<schema.tabela>.<coluna>). Uma referência a um dataset que quem pede não vê não dá nome nestes exports: sai do contrato, e norules.dbt.ymlfica só uma nota em comentário.
- Novo
v1.39.0
- Novo
GET /tickets/integrations/{integration_id}/targets: onde uma integração de tickets pode criar tickets, lido agora do fornecedor. No Jira, os projetos (keyé a chave do projeto) com os tipos de issue de cada um (issue_types, sem subtarefas); no Linear, as equipas (keyé o id da equipa eissue_typesvem vazio). Até 100 destinos.default_projectedefault_issue_typesão o destino configurado na integração (default_issue_typeénullno Linear). Só lê: GET no Jira, *query* GraphQL no Linear. 404 se a integração não for deste workspace, 402 se o plano não incluir os webhooks de alertas (a mesma condição dePOST /tickets), 502 se o fornecedor falhar ou se a proteção anti-SSRF recusar o endereço. Cartão #375.
- Novo
v1.38.0
- Novo
Marcação do conteúdo gerado por IA (Regulamento da IA, art. 50.º, n.º 2):
ai_generated,ai_modelegenerated_atnos relatórios e diagnósticos RCA (GET /reports,GET /reports/{report_id}) e nas sugestões (GET /suggestions,suggestionsemGET /datasets/{dataset_id}).ai_generatedéfalseno texto do modo offline, que é determinístico; aíai_modelegenerated_atvêm anull. Nas sugestões IA anteriores a esta versão, e nas que o assistente propõe,ai_modelvem anull. O modelo nunca traz ARNs nem ids de conta ou de projeto: um id de recurso cloud sai como a família do modelo (por exemplo,claude-sonnet-5) ou comoundisclosed. Cartão #511. - Novo
GET /datasets/{dataset_id}/readme:ai_generatedeai_modeldo rascunho (a data é ogenerated_atque já existia) epublished_ai_generatedepublished_ai_modelda versão publicada, que continua marcada depois de aprovada. O exportGET /datasets/{dataset_id}/readme.mdde um README gerado por IA começa com um front matter YAML (ai-generated,ai-model,ai-generated-at). - Novo
Exports
GET /reports/{report_id}/exporteGET /reports/{report_id}/export.pdf(e a partilha pública):<meta name="ai-generated">(trueoufalse) e, quando houve IA,ai-modeleai-generated-at, mais o rótulo visível «Gerado por IA (modelo, data)» no cabeçalho. No PDF os mesmos valores vão para os metadados do documento, com os nomes sem hífens (aigenerated,aimodel,aigeneratedat).
- Novo
v1.37.0
- Novo
GET /datasets/{dataset_id}/parsing: campos compostos do último perfil (moradas, nomes completos, telefones com indicativo, NIF e nome na mesma coluna, datas em texto livre e montantes com moeda). Cada coluna traz o tipo (kind), o locale (pt,esouen), a taxa de sucesso na amostra (success_rate,parsed/samples), a cobertura de cada coluna derivada (components), as máscaras dos valores que não se decompõem (failing_masks, dígito → 9, letra → A, sem valores) e a assinatura da sugestão com o SQL e o PySpark só de leitura (suggestion_signature,parse_standardize:<coluna>). Sem perfil,profiledéfalse.
- Novo
v1.36.0
- Novo
GET /tickets?entity_type=…&entity_id=…: os tickets externos (Jira, Linear ou outra ferramenta) ligados a um issue, a um incidente (inc-…), a uma sugestão, a uma proposta de contrato ou à classificação de uma coluna, comprovider,external_key,urlestatus(open,in_progress,doneouunknown). O estado ainda não é sincronizado com a ferramenta: um ticket criado pelo DataVault nasceopen; um ligado à mão, ou anterior a esta versão, ficaunknown. Cartão #374. - Novo
ticketsem cada issue (GET /issues, eopen_issuesemGET /datasets/{dataset_id}): um issue passa a poder ter vários tickets externos, do mais antigo para o mais recente. - Novo
Valores novos nos rastos:
field=ticket(ticket criado) outicket_link(ticket existente ligado) emGET /issues/{issue_id}/events, com a chave do ticket emto_value;to_status=ticketemGET /suggestions/{suggestion_id}/events(o estado da sugestão não muda). Trata um valor que não conheças como «outro». - Descontinuado
external_ticket_urlnos issues — usatickets. Continua a responder, com o URL do primeiro ticket ligado, e só sai numa versão major, não antes de 2027-04-05.
- Novo
v1.35.0
- Novo
POST /integrations/dbt/run-results: odbt test/dbt buildcorrido no pipeline do cliente devolve os resultados ao DataVault. Corpo{run_results, manifest, connection_id?}com otarget/run_results.json(schema v4 a v6) e otarget/manifest.jsondo mesmo projeto. Cada teste casa com o dataset (schema + alias) e com a regra — pelorule_idemconfig.meta.datavault, senão pela coluna e tipo de teste. Com regra, o resultado conta paraGET /datasets/{dataset_id}/verdict(uma regra crítica que falha no dbt dáfail; o envio seguinte compasslimpa-o); sem regra equivalente (testes singulares,relationships), abre ou resolve um issuerule_violationcomsubtypedbt_test(fail/error→critical,warn→warning). O mesmoinvocation_idreenviado não grava nada outra vez (statusduplicate). Com domínios restritos, só casa com os datasets em que quem envia pode escrever; os outros ficam comono_dataset, semdataset_idnemrule_id. Só metadados de execução: schema fechado — chaves desconhecidas, campos com linhas (failed_rows,rows…) ou umfailuresque não seja uma contagem dão 422. Aceita tokens de API. Cartão #394. - Novo
dbt_coreemOrchestratorSource(filtrosourcedeGET /orchestrator-runs): cadadbt testrecebido fica como um run com oinvocation_idcomoexternal_run_id. Cartão #394. - Alterado
GET /datasets/{dataset_id}/verdict: cada entrada defailedganhaengine—datavault(scan do DataVault) oudbt(dbt testdo cliente;observedé então a contagem de linhas falhadas). O veredito é o do último scan do DataVault, com o resultado dbt mais recente de cada regra por cima. Cartão #394.
- Novo
v1.34.0
- Novo
Veredito do data product:
GET /domains/{domain_id}/verdictagrega os vereditos dos datasets do domínio para o gate de CI —failse algum falha,warnse algum avisa,unknownse nenhum tem veredito (domínio sem datasets ou sem scans) epassnos outros casos. Devolvedomain_id,domain_name,verdict,with_policy,counts(quantos datasets empass,warn,faileunknown) edatasets[], ordenados por nome: cada um é oGET /datasets/{dataset_id}/verdictdesse dataset, maisdataset_idedataset_name.with_policy(omissãotrue) conta as violações da política de dados, como o veredito por dataset; comfalse, só a qualidade. Cartão #148. - Novo
Contratos ODCS do data product:
GET /domains/{domain_id}/contractdevolve um bundle YAML com vários documentos, um contrato ODCS v3.1.0 por dataset do domínio, separados por---e ordenados pelo nome do dataset (vazio num domínio sem datasets). Cartão #148. - Novo
O contrato ODCS de um dataset (
GET /datasets/{dataset_id}/contract) diz a que data product pertence:tenant(nome do workspace),domainedataProduct(nome do domínio, quando o dataset pertence a exatamente um; a vários, os nomes vão paracustomPropertiescomodatavault.domains) eteamcommembers: [{username, role: owner}], os owners pelo nome. Nunca leva emails. Cartão #148.
- Novo
v1.33.0
- Novo
tls_modeetls_verifiednas conexões (GET /connectionseGET /connections/{connection_id}), só em Postgres e MySQL/MariaDB.tls_modeé o modo configurado:verify-full(cifra e verifica o certificado e o hostname do servidor, o default das conexões novas),require(cifra sem verificar) oudisable(sem TLS). Vemnullnuma conexão criada antes desta versão, que mantém o comportamento antigo (cifra se puder, sem verificar).tls_verifiedsó étruecomverify-full. Nos outros conectores, os dois vêmnull. Cartão #449.
- Novo
v1.32.0
- Novo
Elementos de dados críticos (CDE) e dossiê regulatório.
GET /cdelista os elementos críticos — um dataset ou uma coluna marcado para o BCBS 239 (bcbs239), a Solvência II (solvency2) ou outra regulação (custom), com referência livre e owner —, filtráveis porregulationedataset_id, com o total no headerX-Total-Count.GET /cde/dossierdevolve o dossiê calculado na hora, por regulação e requisito (princípios 3 a 6 do BCBS 239; art. 19.º, n.os 1 a 3, do Regulamento Delegado (UE) 2015/35): cada elemento com os controlos por dimensão e o último resultado de cada regra, os problemas abertos, o SLA, a linhagem a um salto, o contrato ODCS e as lacunas, e o KPIcoverage_pct(dimensões exigidas com controlo e resultado nos últimos 30 dias). Filtrosregulationedomain_id.GET /cde/dossier.mdeGET /cde/dossier.csvexportam o mesmo dossiê. Estados por dimensão:gap,no_result,failing,passing; por requisito tambémhuman(avaliação humana). Nenhum estado afirma conformidade. Determinístico, sem IA generativa. Cartão #392.
- Novo
v1.31.0
- Novo
suggestions_statusnos datasets (GET /datasetseGET /datasets/{dataset_id}): as sugestões IA deixaram de atrasar o scan — o scan ficacompletedcom os perfis, issues, scores e sugestões heurísticas, e a IA é gerada depois, numa fila. Valores:pending(a gerar),ready,failed(ficam as heurísticas) oulimited(acima do teto de datasets com IA por scan — ficam as heurísticas);nullquando não há nada a gerar (IA desligada ou sugestões IA reutilizadas do scan anterior). Ostatsdo scan (GET /scans/{scan_id}) ganhaai_suggestions(max_datasets,queued,limited) quando o scan deixou datasets à espera da IA; oduration_sé a duração do scan, sem a IA. Cartão #385.
- Novo
v1.30.0
- Novo
resampleemPOST /scans(e noScanOutdevolvido):truefaz este scan ler uma amostra de linhas nova, com outra semente. Por omissão (false) cada dataset lê sempre a mesma amostra, para os clusters de duplicados e as violações de padrão não oscilarem entre scans sem os dados mudarem. Cartão #317. - Novo
sample_methodemdimensions_meta.unicidadedescore_history(GET /datasets/{dataset_id}): como a amostra foi escolhida —systemoubernoulli(amostragem nativaTABLESAMPLE/SAMPLEda fonte),hash(hash da chave primária),stride(uma linha em cada k de um ficheiro),head(as primeiras linhas) oufull.nullnos scores anteriores a esta versão. Cartão #317. - Alterado
A amostra de linhas dos scans (regras
pattern/required_fields, duplicados e a unicidade do score) deixa de ser «as primeiras N linhas que a fonte devolveu» e passa a ser escolhida pelo método do dialeto, com semente fixa por dataset;sample_sizededimensions_metapassa a ser o tamanho dessa amostra. O perfil da tabela (metricssem coluna) ganhasampleevalue_sample(method,rows,fraction,seed,deterministic,covers_table), oimpact_jsondo issue de duplicados ganhasamplee osdetailsdos resultados de regras avaliadas sobre a amostra também. A qualidade de rótulos lê com o mesmo método e olast_resultdeGET /datasets/{dataset_id}/label-qualityganhasample. No primeiro scan depois desta versão a amostra muda uma vez: clusters de duplicados,unicidadee percentagens de violação de padrão podem mudar sem os dados mudarem. Cartão #317.
- Novo
v1.29.0
- Novo
Webhooks de saída assinados (canal «Webhook genérico» dos alertas): cada entrega leva
X-DataVault-Event,X-DataVault-Delivery(UUID, igual em todas as tentativas),X-DataVault-TimestampeX-DataVault-Signature: v1=<HMAC-SHA256 do secret do canal sobre "{timestamp}.{corpo}">. Retry em 5xx, timeout e falhas de ligação (1 s, 5 s e 25 s); um 4xx é final. O corpo ganhaoccurred_at, e o contrato (eventos, JSON Schema doWebhookPayload, verificação em Python e Node, janela anti-replay de 5 minutos) está em docs/WEBHOOKS.md. O secret é mostrado uma vez na criação do canal ou emPOST /notification-channels/{id}/rotate-secret; canais anteriores enviam sem assinatura até o rodarem. Cartão #323. - Alterado
O digest semanal do webhook genérico passa a sair com
event: "datavault.digest"(antes,datavault.alertscom as listas vazias), e o «Testar canal» comdatavault.test. Cartão #323.
- Novo
v1.28.0
- Novo
GET /issues/{issue_id}/explanation: camposz_threshold(limiar |z| aplicado à baseline da anomalia),p_value(p-valor do modelo nulo calibrado para o tamanho da baseline) econfidence(high|medium|low, a partir do p-valor), e o objetobaseline(kind,weekday,weekday_label,points), que a resposta já calculava mas não expunha. Em anomalias anteriores,p_valueeconfidencevêmnullez_thresholdé 3,5. Cartão #319. - Alterado
Issues
anomaly(GET /issues): o limiar deixou de ser |z| ≥ 3,5 fixo. Passa a depender do número de pontos da baseline (20,2 com 5, 7,3 com 8, 5,2 com 12), que tem agora de ter pelo menos 5 pontos, e cada scan aplica Benjamini–Hochberg (α = 0,05) às séries de cada dataset. Esperam-se menos anomalias em séries com ruído. Oimpact_jsondas novas anomalias trazz_threshold,p_valueeconfidence. Método e números do harness: docs/METODOS.md, «Anomalias». Cartão #319.
- Novo
v1.27.0
- Novo
GET /datasets/{dataset_id}/score/explain?from=&to=: «porque mudou o score?» — o Δscore entre dois scans decomposto por dimensão (peso·Δdimensão) e, dentro de cada dimensão, pelos drivers (column_nulls,duplicates,rule_failing/rule_passing,rule_set_changed,freshness,drift, …) compointsem pontos de score, com sinal, eparamspara formatar a frase. Σ drivers +unexplained_points=delta. Por omissão compara os dois últimos scans concluídos; 422 sem dois scans com score. Cartão #318.
- Novo
v1.26.0
- Novo
dimensions_metaem cada ponto descore_historydeGET /datasets/{dataset_id}: as dimensões do score calculadas sobre uma amostra e não sobre a tabela inteira — hoje sóunicidade, comestimated,sample_size(as primeiras N linhas que a fonte devolveu, sem aleatoriedade) eduplicate_rows. Vazio ({}) quando todas cobrem a tabela inteira e nos scores anteriores a esta versão. Cartão #294. - Corrigido
Dimensão
unicidadedo score (dimensions.unicidadee, por arrasto,scoreelatest_score): quando os duplicados são procurados numa amostra — tabelas acima de 5 000 linhas ou ficheiros amostrados —, a taxa passa a ser a da amostra, a mesma base que o issue de duplicados já usava («% da amostra»). Antes, os duplicados da amostra eram divididos pelorow_countda tabela inteira e a dimensão ficava perto de 100 em tabelas grandes. **Os scores de tabelas grandes com duplicados descem** a partir do primeiro scan depois desta versão (ex.: 500 linhas redundantes nas 5 000 lidas de uma tabela de 1 M de linhas:unicidade90,0 em vez de 100,0,score−2,5 pontos); os scores já gravados não são recalculados. Reveja os limiaresmin_scorede SLAs e contratos nessas tabelas.
- Novo
v1.25.0
- Novo
GET /datasets/{dataset_id}/freshnesse o blocofreshnessemGET /datasets/{dataset_id}: a coluna que mede a frescura do dataset —column(fixada;null= escolhida em cada scan por nome e tipo:updated/modified>ingest/loaded>created>event> outros TIMESTAMP > DATE, sem colunas de prazo, validade, fim, nascimento ou apagamento),used_column,detected_columnesource(configured,detected,connector) do último perfil,latest_timestampem UTC,timezone(awareouassumed:<fuso>),source_timezone,future_columns(máximo mais de 24 h depois do perfil — ficam fora da escolha automática),candidatese a regrafreshnessdo dataset (rule_id,rule_column,rule_max_age_hours). Cartão #292. - Novo
source_timezonenas conexões (GET /connections,GET /connections/{connection_id}): o fuso IANA em que se leem os timestamps sem fuso da fonte (omissãoUTC, o comportamento de sempre). - Corrigido
Regra
freshness: o parâmetrocolumnpassa a medir essa coluna (antes era ignorado e media-se a primeira coluna de data da tabela); um timestamp mais de 24 h no futuro dá a regra como falhada comdetails.errorem vez de «fresca». Nas métricas de tabela dos perfis,latest_timestampvem em UTC com o desvio (+00:00) e acompanhado delatest_timestamp_columnelatest_timestamp_tz.
- Novo
v1.24.0
- Novo
GET /datasets/{dataset_id}/rules.dbt-tests.zip: as regrasexpressionecustom_sqlativas do dataset como testes singulares do dbt — um ZIP comtests/*.sql(o SELECT das linhas violadoras no dialeto da fonte, comref()no lugar da tabela; o texto de cada regra vai dentro de blocos Jinjaraw, e o dbt não executa Jinja escrito numa regra) e um README com as regras que ficaram de fora e porquê.
- Novo
v1.23.0
- Alterado
POST /scans(e os pedidos de scan por agendamento, webhook do dbt Cloud e SDK): quando o workspace já temmax_queued_scansscans pedidos em fila ou a correr (5 no plano por omissão; ver o catálogo de planos), a API responde429comRetry-After(segundos) e o corpo{"detail", "limit": "queued_scans", "queued", "max_queued", "retry_after_s"}— é backpressure de capacidade, não o rate limit por pedido (limitdistingue-os; o rate limit usaretry_after). Nada é rejeitado de forma definitiva: repetir o pedido depois deretry_after_svolta a enfileirar. Cartão #251 (escala enterprise).
- Alterado
v1.22.0
- Novo
GET /governance?months=1..12eGET /governance/domains/{domain_id}: eficácia do programa de governação (o painel do CDO). Cada KPI temcodeestável,group(coverage,resolution,sla,adoption,quality,incidents,usage),unit,direction,valuecom asampleque o sustenta,targetetarget_source(workspace→organization→default; no domínio com SLA declarado,domain_slaé a meta do SLO),status(on_target,at_risk,off_target,no_data,no_target),gap,previous/deltaetrendpor mês de calendário UTC (o corrente compartial). KPIs: cobertura de owner, documentação, classificação, contratos e regras (ownership_pct,documentation_pct,classification_pct,contracts_pct,rules_pct);cycle_time_hoursemttr_critical_hours;slo_attainment_pctedue_date_met_pct;suggestion_adoption_pctenever_again_adoption_pct;score_<dimensão>por dimensão do scorecard;critical_incidents(uma cascata de linhagem conta como um) eactive_users_pct/datasets_in_use_pct. O fluxo mede os últimos 30 dias (window=last_30d, vs. os 30 anteriores); cobertura, uso e scores o estado atual (window=now, vs. o fecho do mês anterior). O do workspace trazdomains(a matriz por domínio, com semáforo por KPI) etargets. Datasets em domínios restritos sem acesso não contam. - Novo
GET /governance/scorecard.csv(o scorecard executivo: uma linha por KPI com valor, meta e origem, estado, folga, variação e um valor por mês, e uma por domínio × KPI) eGET /governance/evidence.md(a evidência do programa em Markdown para o pack de procurement ou due diligence do cliente: resumo do semáforo, KPIs com meta e tendência, domínios e o método). Só agregados — sem nomes de datasets, colunas, amostras nem pessoas; células CSV protegidas contra injeção de fórmulas.
- Novo
v1.21.0
- Novo
GET /catalog/metadata-qualityeGET /domains/{domain_id}/metadata-quality: qualidade do catálogo e dos metadados (KPIs de governação).pct= checks cumpridos ÷ aplicáveis (os não aplicáveis ficam fora do denominador;nullsem nada medido), por dimensão (completeness,timeliness,consistency) e por check com código estável —has_owner,has_description,has_classification,has_domain,has_contract,has_rules,description_current(o schema não mudou depois da descrição/README),owner_active(owner não desativado, não saiu do workspace e com sessão nos últimos 90 dias),unused_has_owner(dataset sem uso medido tem owner ativo) ecolumn_docs_match_schema— comcoverage_pct(% dos datasets aplicáveis que cumprem).findingssão os problemas de metadados (missing_owner,description_stale,owner_inactive,unused_without_owner, …) com sugestões por canal (readme,catalog_import,manual) e o endpoint que resolve;target(meta,reached,gap_pp),trend(fotografia diária; a do workspace inteiro só para quem vê o workspace inteiro),domains(por domínio) eexternal_catalog(cobertura e termos de glossário lidos do catálogo externo ligado). O do workspace traz os 50 piores datasets emdatasets(datasets_truncated). Datasets em domínios restritos sem acesso não contam. - Novo
GET /catalog/metadata-quality.csv?level=datasets|summary: export CSV para um pack de governação ou de procurement — uma linha por dataset com o estado de cada check (cumprido,falhou,n/a) e os códigos dos problemas, ou o resumo do workspace e de cada domínio com a meta e a cobertura por check. Só metadados; células protegidas contra injeção de fórmulas.
- Novo
v1.20.0
- Novo
GET /datasets/{dataset_id}/pipeline-health: a saúde dos pipelines Fivetran/Airbyte que escrevem o dataset —status(o pior entreok,failed,delayed,paused,unknown;not_monitoredsem integrador ligado) e, por pipeline, último sucesso e última falha, mensagem do integrador, cadência e atraso tolerado, a ponta de destino e a de origem (updated_ateage_s: «origem atualizada há X, destino há Y»),lag_s(quanto o destino vai atrás da origem), a reconciliação de contagens entre os perfis das duas pontas (recon, comcomparable) e as tabelas que entraram/saíram do pipeline (schema_change);recent_runstraz os syncs mais recentes. Uma origem num domínio restrito aparece como «Dataset restrito», sem tabela, latência nem reconciliação. - Novo
GET /orchestrator-runsaceitasource=fivetranesource=airbyte: os syncs dos integradores ligados, lidos das APIs de metadados (só leitura), com o pipeline emjob_id/job_name. Os issues ganham o tipopipeline_sync(subtiposfailededelayed).
- Novo
v1.19.0
- Novo
Política de versionamento e depreciação da API (secção «Estabilidade» do portal): o que está neste portal é o contrato; uma versão minor só acrescenta; remover, renomear ou mudar o tipo ou o significado de um campo, parâmetro ou código é uma quebra e só acontece numa major. Uma operação depreciada é anunciada aqui (tipo
deprecated) e responde com os headersDeprecation(RFC 9745),Sunset(RFC 8594) eLinkcomrel="deprecation"pelo menos 180 dias antes de deixar de responder. O CORS expõe estes três headers. - Novo
GET /healthpassa a incluirapi_version— a versão desta API, a mesma deGET /version. - Novo
GET /connections/{connection_id}/query-logeGET /connections/{connection_id}/query-log/export: o que o DataVault executou na fonte, por forma de statement normalizada (sem valores) —operation(scan,discover,test),scan_id,query_tag,endpoint(primário ou réplica), execuções, erros, duração total e máxima (ms), linhas e primeira/última execução. Filtrosscan_id,operationedays(1–366); a lista pagina comlimit(omissão 100, máximo 500) /offsete o export devolve um download emformat=csv(omissão) ouformat=json. - Novo
GET /connectionseGET /connections/{connection_id}passam a trazer a política da fonte definida pelo DBA:blackout_timezone,blackout_windows(janelas recorrentes em hora local),blackout_active(a janela em curso, ounull),blackout_upcoming(próximas ocorrências),max_concurrent_queriesemax_sample_rows.GET /connections/typespassa a trazerlabel,groupedocs_anchorde cada conector. - Alterado
POST /scansresponde409comdetail = {code, message, …}quando a fonte está numa janela de blackout (code: blackout_active) ou já tem o máximo de scans em curso (code: source_busy); nenhuma query chega à fonte. Os campos novosoverride_blackouteoverride_reason(motivo com pelo menos 5 caracteres, auditado) forçam o scan dentro de uma janela, mas só para admins — com um token de API dão403.
- Novo
v1.18.0
- Novo
Servidor MCP remoto em produção:
https://mcp.praxis.lbostuff.tech/mcp(MCP Streamable HTTP, TLS). Autentica cada pedido com um token de APIdvk_(Authorization: Bearer) validado na API — sem token,401— e expõe as mesmas tools e resources só de leitura (incluindoget_verdicteget_trust_decision) sobre o workspace do token. Liga-se sem o código do backend:claude mcp add --transport http datavault https://mcp.praxis.lbostuff.tech/mcp --header "Authorization: Bearer dvk_…". Pedidos com um headerHostfora da allowlist recebem421(proteção anti-DNS-rebinding) e com umOriginde outro site403. - Alterado
GET /ide/agent-configpassa a devolver em produçãoremote_available: true,mcp_urlcom o MCP remoto elocal_server_cmd: null: as configurações geradas para Claude Code, Claude Desktop, Cursor, VS Code e Codex apontam para ele em vez dehttp://127.0.0.1:8765/mcp.
- Novo
v1.17.0
- Novo
Scorecard por dimensão de qualidade (DAMA/ISO 8000):
GET /datasets/{id}/dimensionsdevolve, para completude, unicidade, validade, atualidade, consistência, razoabilidade, exatidão e integridade, o score 0–100 do último scan (percentagem de checks aprovados), o n.º de checks, os issues abertos e o histórico por scan. Uma dimensão sem checks vem commeasured: falseescore: null(«não medido»), nunca 100.GET /dashboard/dimensionsagrega por workspace e por domínio, só com os datasets medidos (datasets_measureddedatasets_total), eGET /dashboard/dimensions.csvexporta uma linha por dataset × dimensão. O score composto não muda. - Novo
GET /issuesaceita?dimension=(ex.:completeness) e cada issue passa a trazer o campodimension, resolvido pelo mapa determinístico tipo/subtipo → dimensão: cada issue cai numa só dimensão. Uma dimensão desconhecida devolve 422.
- Novo
v1.16.0
- Novo
GET /version(sem autenticação):{version, build_sha, api_version}— a versão do produto (semver, 1.0.0 na primeira release estável), os 7 hex do commit a servir e a versão desta API, que continua com semver próprio.GET /healtheGET /health/readypassam a incluirbuild_sha. Útil para citar a versão em vigor num pedido de suporte ou num contrato.
- Novo
v1.15.0
- Novo
GET /rules,GET /suggestions,GET /reportseGET /duplicatespassam a devolver o total filtrado no headerX-Total-Count(os mesmos filtros do pedido, antes delimit/offset, e só o que o utilizador pode ver pelas permissões por domínio), comoGET /datasets. O corpo continua a ser a lista da página;limitpor omissão 50, máximo 500.
- Novo
v1.14.0
- Novo
GET /bieGET /bi/{feed}: feeds tabulares estáveis para Excel e Power BI —scores(último score por dataset, dia e domínio),issues,slo(dataset-dia),finops(retrato do custo por dataset),activity(issues e scans) e a dimensãodatasets. JSON ({feed, schema_version: 1, columns, total, limit, offset, next_offset, rows}) ou CSV (format=csv,bom=1opcional) na mesma rota; paginaçãolimit(≤ 10 000, omissão 5000) /offsetcom ordem estável; filtrossince,until(UTC, janela por omissão de 90 dias emscores/slo/activity),domain_id,dataset_idestatus(sóissues). Colunas fixas em snake_case, datas ISO em UTC e decimais com ponto; só se acrescentam colunas no fim.ETageIf-None-Match→304;X-Total-CounteX-Next-Offset. O catálogo traz o código Power Query (M). Só leitura, sem OData; aceita tokens de API.
- Novo
v1.13.0
- Novo
GET /ide/agent-config?tool=: configuração MCP pronta a colar para agentes de código (claude-code,claude-desktop,cursor,vscode,codex; omitido = todas) — ficheiro (.mcp.json,claude_desktop_config.json,.cursor/mcp.json,.vscode/mcp.json,~/.codex/config.toml), comando de instalação e snippets de regras (AGENTS.md,CLAUDE.md,.cursorrules,.github/copilot-instructions.md). Nunca devolve o token: traztoken_placeholdere, onde a ferramenta o permite, lê-o deDATAVAULT_TOKEN. Só leitura.
- Novo
v1.12.0
- Novo
GET /datasets/{id}/trust-factseGET /domains/{id}/trust-facts(?detail=minimal|full, omissãominimal): factos de confiança num envelope estável (schema_version: 1) — veredito com política e decisãoagente, score de qualidade e tendência 7d, trust score, contrato (estado e versão ativa), política (estado e regras violadas), contagens de sensibilidade por nível, AI-readiness por caso de uso, freshness vs alvo e attainment 30d, domínios e owner, n.º de upstream/downstream, último scan, issues abertos por severidade e links relativos; o do domínio junta um agregado e os factos de cada dataset. Só metadados:minimalnunca traz nomes de colunas.ETag(hash dos factos, semas_of) eIf-None-Match→304;Cache-Control: private, no-cache. Só leitura, sem LLM; aceita tokens de API.
- Novo
v1.11.0
- Novo
GET /domains/{id}/readiness?use_case=(rag,ml,agente,bi; omissãobi): readiness de um data product por caso de uso —ready | ready_with_warnings | not_ready,blockers[]ewarnings[]comcodeestável (no_datasets,no_scan,stale_scan,verdict_fail,verdict_warn,contract_invalid,ai_readiness_blocked,open_critical_issues,slo_breach_open,attainment_below_objective),dataset_id,dataset_nameemessage, detalhe por dataset, SLA do mês,checked_atevalid_until(próximo scan agendado). Só leitura, sem LLM; aceita tokens de API.
- Novo
v1.10.0
- Novo
Decisão de confiança (
GET /datasets/{id}/trust-decision,POST /trust-decisions): campos novosrequired_actions[](o que falta para subir de decisão; nunca vazio emuntrusted/unknown) evalid_until(as_of + ttl_seconds). Só acrescentados — os campos, códigos e TTL anteriores não mudam. Cada consulta feita com um token de API fica no trilho de auditoria (trust_decision_checked, sem PII; o lote é um só evento).
- Novo
v1.9.0
- Novo
GET /datasets/{id}/trust-decision?purpose=ePOST /trust-decisions(≤ 50 ids): decisão de confiança antes de consumir um dataset para uma finalidade (agente,rag,treino,bi) —trusted | caution | untrusted | unknown, razões comcodeestável emessage_pt, veredito, AI-readiness, freshness vs SLA, incidentes abertos, PII sem máscara, contrato ettl_seconds(também emCache-Control: max-age). Só leitura; oPOSTaceita tokens de API.
- Novo
v1.8.0
- Novo
GET /ide/resolve?ref=eGET /ide/datasets/{id}/columns: resumo de qualidade por tabela referenciada num ficheiro SQL/dbt (score, issues abertos, contrato ativo, PII, violações da política de dados) e perfil por coluna (tipo, nulos %, distintos, classificação) — base da extensão VS Code. - Alterado
POST /datasets/{id}/diff/{other_id}passa a aceitar tokens de API — o data-diff só lê as duas fontes e não persiste nada (CI e extensão VS Code).
- Novo
v1.7.0
- Novo
GET /datasets/{id}/contract/versions,GET /datasets/{id}/contract/versions/{n},GET /datasets/{id}/contract/diff?from=&to=eGET /datasets/{id}/contract/proposals[/{id}]: versões numeradas do contrato ODCS acordado com o produtor da fonte, diff secção a secção e propostas em revisão. - Alterado
GET /datasets/{id}/contractaceitasource=activepara descarregar o contrato aceite pelo produtor, eGET /datasets/{id}/verdictpassa a validar o dataset contra esse contrato (contract.active_version): coluna prometida que desapareceu ⇒fail; tipo divergente, obrigatória a aceitar nulos ou check sem regra ativa ⇒warn.
- Novo
v1.6.0
- Novo
Rate limiting em toda a API: cada token de API tem um limite próprio (300 pedidos/min por omissão, além do limite por IP) e o export RGPD e o pedido de relatórios têm limites adicionais. As respostas trazem
X-RateLimit-Limit,X-RateLimit-RemainingeX-RateLimit-Reset; acima do limite a API responde429comRetry-After(segundos) eretry_afterno corpo.
- Novo
v1.5.0
- Alterado
POST /scanspassa a aceitar tokens de API — orquestradores (Airflow, CI) disparam scans e esperam pelo veredito comGET /datasets/{id}/verdict. Sujeito à quota de scans do plano. - Novo
GET /orchestrator-runsePOST /orchestrator-runs: runs de orquestradores (dbt Cloud, Airflow) guardados como contexto do diagnóstico de causa-raiz («o job dbt X falhou 20 min antes desta issue»). OPOSTaceita tokens de API; só metadados do run.
- Alterado
v1.4.0
- Novo
GET /reports/{id}/trace: percurso de cada geração de relatório como grafo (fonte, âmbito, perfil, regras, anomalias, sinais, resumo, escrita, rótulo de IA, exportação, entrega), com tempos e alternativas usadas.lang=pt|en. - Novo
GET /routines/blocks: catálogo versionado dos passos do pipeline de relatórios — o que entra, o que sai, o que é configurável hoje e os selos de cada passo.
- Novo
v1.3.0
- Novo
POST /rag-gate: gate de qualidade para pipelines RAG — veredito aceitar/rever/rejeitar por documento (dados pessoais, duplicados do corpus, idioma, boilerplate) antes de indexar. Aceita tokens de API; nenhum conteúdo é guardado.
- Novo
v1.2.0
- Novo
GET /datasets/{id}/verdict: veredito compacto pass/warn/fail/unknown para gates de CI. - Novo
GET /datasets/{id}/schema-changes: histórico de mudanças de schema com impacto a jusante. - Novo
GET /incidentseGET /incidents/{id}: issues relacionadas agrupadas num só incidente via linhagem. - Novo
GET /knowledgeeGET /knowledge/graph: pesquisa na base de conhecimento e grafo de relações. - Novo
GET /dashboard/piieGET /dashboard/pii.csv: mapa de PII do workspace — datasets × tipos de dado pessoal (email, NIF, telefone, morada, saúde…), origem da deteção, cobertura por regras ativas e export CSV para o DPO. Só metadados, nunca os valores. - Novo
GET /dashboard/sloeGET /dashboard/slo.csv: cumprimento dasslaPropertiesde latência do contrato ODCS face à idade observada nos perfis — attainment mensal e por dataset, violações com os issues do dia e export CSV. - Novo
GET /lineage/sankey: linhagem por camada medallion (Bronze → Silver → Gold) com score, volume estimado e risco herdado de montante. - Novo
GET /catalog/treemap: o catálogo inteiro agregado por fonte e schema, com score e risco.
- Novo
v1.1.0
- Novo
GET /datasets/{id}/contract(ODCS v3.1) eGET /datasets/{id}/contract.dbt.yml: contrato de dados exportável. - Alterado
Tokens de API passam a estar disponíveis a partir do plano Team.
- Novo
v1.0.0
- Novo
Tokens de API
dvk_*só de leitura, criados e revogados por administradores do workspace. - Novo
Leitura de datasets, scans, issues, sugestões, regras, linhagem e AI-readiness em
/api/v1. - Segurança
Tokens guardados apenas como hash SHA-256; qualquer método além de GET devolve 403.
- Novo
Ainda não tens workspace?
Começa no plano gratuito e passa a Team quando precisares de tokens de API.