DataBolsa docs
Referência da APIDados de mercadoObjects

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.

GET
/v1/objects/rank
AuthorizationBearer <token>

In: header

Query Parameters

kindstring

O tipo dos objetos que entram na coorte.

Value in"company" | "equity_security" | "fund" | "service_provider" | "instrument" | "index" | "crypto_asset" | "commodity" | "country" | "indicator" | "data_series" | "offering" | "fund_share_class" | "market_event"
subkind?string

Recorte dentro do tipo.

factstring

A medida, pelo nome do listFactCatalog.

measure?string

value ordena por nível; delta pela variação absoluta; pct_change pela relativa.

Default"value"
Value in"value" | "delta" | "pct_change"
at?string

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.

Match^\d{4}-\d{2}-\d{2}$
from?string

Ponta INICIAL. Obrigatória em delta e pct_change.

Match^\d{4}-\d{2}-\d{2}$
since_from?string

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.

Match^\d{4}-\d{2}-\d{2}$
order?string

asc primeiro os menores — é assim que se pede 'a maior QUEDA' com delta.

Default"desc"
Value in"asc" | "desc"
limit?integer
Default20
Range1 <= value <= 200
expand?string

Traz, 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.

Value in"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"
expand_direction?string

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í.

Default"in"
Value in"out" | "in"
rel?string

Restringe a coorte a quem tem esta relação com rel_to. Sem ela, a coorte é o tipo inteiro.

Value in"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"
rel_to?string

O outro lado da relação — o índice, o fundo, a empresa.

rel_direction?string

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).

Default"in"
Value in"out" | "in"
since?string

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.

Match^\d{4}-\d{2}-\d{2}$
exclude_out_of_prior?boolean

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.

where?string

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 getObjectPropertiessituation=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írgulasector="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.