Ordena e FILTRA uma coorte por medidas — nível ou variação
O quarto eixo. Os outros três já existiam e cada um sozinho: QUEM (`kind`, `subkind` e as relações do grafo), O QUÊ (`listFactCatalog`) e QUANDO (`at`, `from`). Faltava o que fazer com o CONJUNTO — e sem isso 'a companhia que mais perdeu margem' exigia ler o histórico de milhares de companhias, uma chamada cada. **Quase toda triagem tem DUAS medidas, e `where` é a segunda.** Ordene por uma e corte pelas outras na mesma chamada: `fact=fidc_impaired_ratio&measure=delta&where=fidc_portfolio>50000000` responde 'quem mais piorou ENTRE os grandes'. Sem isso o corte vira uma leitura por objeto — medido em 20/08/2026, a mesma pergunta custou 14 chamadas a quem não viu o parâmetro. `meta.filterable_facts` lista, na própria resposta, o que mais cabe ali, e cada linha volta com `where_values` — o valor dela em CADA corte, já calculado para filtrar. Não peça um segundo ranking para reler o segundo número. **`expand` traz o objeto ligado em cada linha.** `kind=offering&expand=issued` responde 'as maiores ofertas E quem emitiu cada uma' numa chamada só, com o nome e a chave do emissor na própria linha. **Para um PERÍODO, use `at` com `since`**: `at` é o teto da data-base e `since` o piso. Não existe `until` porque `at` já é ele. Em `delta` e `pct_change`, `since_from` é o piso da ponta INICIAL — sem ele a janela pedida não é a janela recebida. **Leia `unit` antes de comparar com outra medida.** `ratio` é fração (0,08 é 8%) e `pct` é percentual (8,0 é 8%). **`pct_change` não serve para medida que cruza o zero**: margem indo de -1% para -2% devolve +100% de 'crescimento'. Para essas, `delta`. **Quem não tem valor nas DUAS pontas não entra**, e não entrar não é valer zero — `cohort_size` é o denominador honesto. Cada linha declara `as_of` e `as_of_from` porque medida trimestral cai na última competência publicada até a data pedida, e duas companhias podem estar comparando trimestres diferentes. **`availability: unknown` significa que a fonte não publica data de entrega** e o corte é só pela data-base: um ranking numa data passada enxerga números que ainda não eram públicos. Com `filed`, o corte é point-in-time completo.
In: header
Query Parameters
O tipo dos objetos que entram na coorte.
"company" | "equity_security" | "fund" | "service_provider" | "instrument" | "index" | "crypto_asset" | "commodity" | "country" | "indicator" | "data_series" | "offering" | "fund_share_class" | "market_event"Recorte dentro do tipo.
A medida, pelo nome do listFactCatalog.
value ordena por nível; delta pela variação absoluta; pct_change pela relativa.
"value""value" | "delta" | "pct_change"Data-base da leitura em value; ponta FINAL nas demais. Ausente = o mais recente publicado.
at + since é a JANELA. at é o teto e since é o piso da data-base aceita, e os dois juntos recortam um período: at=2024-12-31&since=2024-01-01 devolve o que tem competência EM 2024 — 4.178 ofertas, medido. Sem since, um objeto que parou de reportar em 2020 entra com a competência dele e disputa o topo; sem at, entra o que veio depois. meta.as_of_range devolve a faixa efetiva da página, e ela é a conferência: min e max distantes dizem que a lista mistura competências.
^\d{4}-\d{2}-\d{2}$Ponta INICIAL. Obrigatória em delta e pct_change.
^\d{4}-\d{2}-\d{2}$Piso da data-base aceita na ponta INICIAL — o que since faz pela ponta final.
Sem ele a janela que você pediu não é a janela que você recebe. Objeto cuja última publicação antes de from é de anos atrás entra com aquele valor: medido em 20/08/2026, um FIDC subiu a 7º numa lista de 'maior piora no ÚLTIMO ANO' com ponta inicial em 2022-10-31 — e nos doze meses pedidos ele tinha MELHORADO 19 pp. Sinal trocado, sem erro nenhum. meta.as_of_from_range é o alarme: min distante de max diz que a lista mistura janelas.
^\d{4}-\d{2}-\d{2}$asc primeiro os menores — é assim que se pede 'a maior QUEDA' com delta.
"desc""asc" | "desc"201 <= value <= 200Traz, em CADA linha, os objetos ligados por este verbo — com id, nome e a CHAVE pela qual um humano os chama. kind=offering&expand=issued responde 'as maiores ofertas E quem emitiu cada uma' numa chamada; sem ele são N chamadas de listObjectLinks, medido em 5 de 12 numa sondagem de 20/08/2026. No máximo 3 vizinhos por linha: para a lista inteira de UM objeto, listObjectLinks pagina e declara o total.
"issued" | "assigned_to" | "holds" | "manages" | "administers" | "custodies" | "audits" | "same_owner" | "shareholder_of" | "indexed_to" | "rates" | "mentions" | "measures" | "forecasts" | "contains" | "member_of" | "exposed_to_issuer" | "succeeded_by" | "produces" | "covers"De que lado da aresta está o vizinho. in (default) é quem APONTA para a linha, e é o caso da oferta: a aresta é company --issued--> offering, então o emissor entra por aí.
"in""out" | "in"Restringe a coorte a quem tem esta relação com rel_to. Sem ela, a coorte é o tipo inteiro.
"issued" | "assigned_to" | "holds" | "manages" | "administers" | "custodies" | "audits" | "same_owner" | "shareholder_of" | "indexed_to" | "rates" | "mentions" | "measures" | "forecasts" | "contains" | "member_of" | "exposed_to_issuer" | "succeeded_by" | "produces" | "covers"O outro lado da relação — o índice, o fundo, a empresa.
Onde a COORTE está na aresta — não onde rel_to está. in (default) é o caso comum: rel_to aponta para os membros (o índice CONTÉM os papéis). out = os membros apontam para rel_to (os cedentes ATRIBUÍDOS a um fundo).
"in""out" | "in"Data-base MÍNIMA aceita na ponta final. Objeto que PAROU de reportar carrega o último valor para sempre: sem since, um FIDC cujo último informe é de 2023 disputa o topo com quem reportou este mês, e a resposta compara competências a três anos de distância. Cada linha declara seu as_of justamente para isso ser visível — since é como se pede que não aconteça.
^\d{4}-\d{2}-\d{2}$Tira da ordenação os valores fora da faixa plausível DA MEDIDA ORDENADA. Ordenar por variação traz o denominador colapsado para o TOPO — margem de empresa com receita residual, concentração de fundo com patrimônio perto de zero. meta.excluded_out_of_prior diz quantos saíram, porque 'nenhum implausível em 12' e 'nenhum em 3.000' não são a mesma afirmação — e vem null quando não houve medição (filtro não pedido, ou medida sem faixa declarada). Zero significa 'apliquei e não derrubei ninguém'.
O QUE ELE NÃO ENXERGA: o denominador. A faixa é da medida ORDENADA, e uma razão limitada a 0–1 é sempre plausível — mesmo num fundo cuja carteira é R$ 66,77. Medido em 20/08/2026: ranqueando piora de inadimplência, fundos com carteira de sessenta e seis reais e de ZERO entraram no top-16 com out_of_prior: false, porque 0,89 é um valor perfeitamente normal. O implausível estava no denominador, que este parâmetro não olha. Para isso use where sobre a medida de tamanho — where=fidc_portfolio>50000000 — que é o corte que a pergunta realmente pedia. meta.filterable_facts lista o que cabe ali.
CONDIÇÕES SOBRE OUTRAS MEDIDAS, na mesma coorte e na mesma janela do ranking. Formato <medida><operador><número>, várias separadas por vírgula — fidc_impaired_ratio<0.05,fidc_portfolio>1000000. Operadores: <, <=, >, >=.
NÍVEL ou VARIAÇÃO. x<5 compara o valor na data-base; delta(x)>0.02 compara a VARIAÇÃO entre from e at, e pct_change(x)>10 a variação relativa em %. Metade da triagem é sobre mudança e não sobre nível — inadimplência de 5% é normal em quem sempre esteve em 5% e é alarme em quem estava em 3%. Condição de variação exige from, e usa a MESMA janela do ranking.
Confira a ESCALA da medida antes de escrever o número. fidc_impaired_ratio é fração (0,05 é 5%) e fii_dy_12m é percentual (5 é 5%): o mesmo <5 corta em 500% numa e em 5% na outra, e as duas respondem 200 com uma lista plausível. meta.applied_where devolve a unidade contra a qual cada número foi comparado.
Objeto SEM valor na medida do filtro não passa — ausência não é zero, e não dá para afirmar que quem não publicou inadimplência está abaixo do corte. meta.filtered_out diz quantos o corte derrubou.
CORTE POR PALAVRA, no mesmo parâmetro: <propriedade>=<valor> e !=. As propriedades e os valores possíveis de cada tipo vêm em meta.filterable_properties desta mesma resposta, e são os mesmos de getObjectProperties — situation=Em Liquidação, area_type=country, is_critical=true.
| é OU dentro do mesmo campo: sector=Bancos|Seguros. Duas condições separadas por vírgula são E, então sem o pipe "as financeiras" não teria como ser pedido.
ASPAS quando o valor tem vírgula — sector="Construção Civil, Mat. Constr. e Decoração". São 471 companhias assim; sem aspas a vírgula parte a condição e a requisição é RECUSADA, nunca cortada pela metade.
Caixa e acento são ignorados no casamento, e meta.applied_property_where devolve o valor CANÔNICO que casou — é onde este corte engana. Em !=, objeto que não declara a propriedade PASSA: "não está em liquidação" inclui quem não declarou situação nenhuma.
Response Body
curl -X GET "https://api.databolsa.com/v1/objects/rank?kind=company&subkind=string&fact=string&measure=value&at=string&from=string&since_from=string&order=asc&limit=20&expand=issued&expand_direction=out&rel=issued&rel_to=string&rel_direction=out&since=string&exclude_out_of_prior=true&where=string"{
"data": [
{
"id": "string",
"name": "string",
"kind": "string",
"subkind": "string",
"value": 0,
"value_from": 0,
"value_to": 0,
"as_of": "string",
"statement_date": "string",
"statement_date_from": "string",
"as_of_from": "string",
"series": "string",
"out_of_prior": true,
"related": [
{
"rel": "string",
"direction": "out",
"id": "string",
"kind": "string",
"name": "string",
"key_type": "string",
"key": "string"
}
],
"where_values": [
{
"fact": "string",
"measure": "value",
"value": 0,
"as_of": "string"
}
]
}
],
"meta": {
"next_cursor": "string",
"count": 0,
"total": 0,
"subject": {
"property1": "string",
"property2": "string"
},
"fact": "string",
"unit": "brl",
"measure": "value",
"cadence": "daily",
"grain": "object",
"source": "string",
"availability": "filed",
"order": "asc",
"window_from": "string",
"window_to": "string",
"since": "string",
"as_of_range": {
"min": "string",
"max": "string"
},
"mixed_vintage": true,
"vintage_spread_days": 0,
"as_of_from_range": {
"min": "string",
"max": "string"
},
"excluded_out_of_prior": 0,
"cohort_size": 0,
"filterable_facts": [
"string"
],
"filterable_properties": [
{
"name": "string",
"vocabulary": [
"string"
]
}
],
"applied_property_where": [
{
"property": "string",
"op": "eq",
"values": [
"string"
],
"matched": [
"string"
],
"source": "string"
}
],
"filtered_out": 0,
"applied_where": [
{
"fact": "string",
"op": "lt",
"value": 0,
"measure": "value",
"unit": "brl",
"description": "string"
}
],
"description": "string"
}
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string"
}O VOCABULÁRIO dos verbos: o que cada relação afirma, e o que ela NÃO afirma
Leia isto ANTES de atravessar o grafo. O nome do verbo não basta: `manages` é o GESTOR e não o administrador fiduciário; `shareholder_of` é quadro societário SEM percentual e SEM qualificação, então nenhuma dessas arestas afirma controle; `same_owner` é simétrica e liga dois cedentes que compartilham sócio pessoa jurídica; `exposed_to_issuer` responde COM QUEM e nunca QUANTO. `shape` decide o que 'quantos' significa e qual `at` reproduz a contagem: `event` é total de todos os tempos, `snapshot` é o último retrato, `static` é o vigente — e verbo `static` RECUSA data passada, porque a fonte não publica série. `domain_kinds` e `range_kinds` dizem quais tipos podem estar em cada ponta, o que permite descartar uma travessia impossível antes de pagar por ela: `holds` termina em instrumento, fundo ou papel, nunca na companhia emissora. Catálogo fechado e pequeno, sem paginação. Traz também os verbos que ainda não têm nenhuma aresta — o range é declarado antes de o objeto nascer.
De um texto para o objeto — ticker, CNPJ, ISIN, código ou nome
Devolve CANDIDATOS, no plural e de propósito: 'Itaú' e 'BTG' são várias pessoas jurídicas distintas, e escolher uma em silêncio é o erro que o grafo existe para impedir. `confidence: low` marca chave ambígua (código reaproveitado após encerramento). **`match_kind` diz COMO casou**, e é por ele que se decide o quanto confiar. `exact_key` é o único em que o candidato foi identificado — e o único em que `matched_key_type`/`matched_key_value` significam alguma coisa. Os outros três são palpite ordenado do melhor para o pior: nome idêntico, nome que começa com o termo, e o resto. Trate `fuzzy_name` como candidato a confirmar, nunca como resposta. Buscar por NOME pode trazer o objeto certo fora da primeira posição (`Petrobras` casa a controlada Petroquisa e a própria companhia), então quem busca por nome deve olhar a lista. Quando existir identificador, use-o. **A AÇÃO É OBJETO SEPARADO DA COMPANHIA desde 16/08/2026.** `PETR4` resolve para o PAPEL (`kind: equity_security`), não para a Petrobras: preço, indicador e provento são dele e são diferentes dos de PETR3. Para chegar à emissora, atravesse `issued` na direção `in`; a companhia continua publicando `tickers` e `share_classes`. Código antigo do mesmo papel continua resolvendo — `VVAR3` e `VIIA3` chegam em `BHIA3`. Do mesmo jeito, o INDICADOR é o conceito (`ipca`) e a SÉRIE é a publicação dele (`bcb_sgs:433`, `kind: data_series`), ligados por `measures` — e por `forecasts` quando a série PROJETA o conceito em vez de medi-lo, como o Focus e o breakeven da curva. Código de série é MINÚSCULO e é encontrado como está — até 16/08/2026 a busca normalizava tudo para maiúscula e as 183 séries eram inalcançáveis por chave, sem erro nenhum.