DataBolsa docs
Referência da APIDados de mercadoObjects

ÁLGEBRA DE CONJUNTOS sobre relações: interseção, união e diferença

Responde a classe de pergunta que dois montes separados não respondem. `op` escolhe a operação e o resto dos parâmetros é o mesmo nas três: - `op=intersect` (default) — quem está nos DOIS. Ex.: `a=assigned_to&b=issued` são as empresas que vendem recebível para FIDC **e** têm debênture emitida. - `op=union` — quem está em QUALQUER um dos dois. - `op=difference` — quem está em A e NÃO em B. É a pergunta de concentração: cedente EXCLUSIVO é risco que não aparece em média nenhuma. EXEMPLO COMPLETO da diferença, com os parâmetros exatos: cedentes do FIDC X que não cedem para o FIDC Y é `a=assigned_to&a_to_id=<X>&b=assigned_to&b_to_id=<Y>&op=difference&total=true`. Note que o VERBO é o mesmo nos dois lados — o que muda é a outra ponta. Comparar dois objetos concretos é para isso que `a_to_id`/`b_to_id` existem; sem eles você compara dois verbos, que é outra pergunta. E reporte `meta.total`, não o tamanho da página. `a_to_id`/`b_to_id` prendem a OUTRA ponta de cada relação — é o que permite comparar dois objetos concretos (cedentes do FIDC A contra os do FIDC B) em vez de dois verbos. Use `?total=true` para o tamanho do conjunto sem paginar.

GET
/v1/objects/intersect
AuthorizationBearer <token>

In: header

Query Parameters

cursor?string
limit?integer
Default100
Range1 <= value <= 1000
total?string

true = inclui meta.total (contagem do universo filtrado). Custa uma consulta a mais.

astring

Primeira relação.

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"
bstring

Segunda relação.

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"
a_direction?string
Default"out"
Value in"out" | "in"
b_direction?string
Default"out"
Value in"out" | "in"
a_to_id?string

Prende a outra ponta da relação A.

b_to_id?string

Prende a outra ponta da relação B.

a_to_kind?string

Recorta o TIPO da outra ponta de A. issued sai da companhia tanto para instrument quanto para equity_security: sem isto, 'quem cede para FIDC e emite DÍVIDA' inclui quem só emitiu ação.

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

Idem para a relação B.

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

O que a coisa É. Papel (emissor, cedente, administrador) NÃO é kind — é aresta. equity_security é a ação (PETR4), distinta da companhia que a emitiu.

offering é a oferta pública, e é o único que não é uma COISA: é uma RELAÇÃO que virou objeto. Ela liga emissor, instrumento e tempo, e carrega atributos próprios (volume, rito, status, quantidade, preço) que não cabem numa aresta. Atravesse issued na direção in para chegar ao emissor.

market_event é o segundo do mesmo feitio: um ACONTECIMENTO que virou objeto. Ele existe porque aresta liga dois objetos, e sem nó do lado do evento não havia como compor — getObjectEvents responde 'o que aconteceu com este objeto' e nunca 'quais empresas foram citadas nos mesmos eventos que esta'. Atravesse mentions na direção in para ir do objeto aos eventos que falam dele, e out para ir do evento aos objetos citados. Só o evento com objeto carimbado vira nó: os demais seguem legíveis por getObjectEvents e não viram ilha no censo.

fund_share_class é a SUBCLASSE de fundo da RCVM 175 — o que o investidor efetivamente subscreve, distinto da classe que tem o CNPJ. Mesma separação de equity_security × company: o que se compra não é o veículo. Atravesse contains na direção in para chegar à classe. Ela nasce sem medidas: os atributos (situação, público-alvo) ainda não são servidos, e ausência aqui é isso, não 'a subclasse não tem'.

indicator × data_series, a regra, porque a pergunta se repete. indicator é o CONCEITO — existe fora do DataBolsa, tem nome próprio no mercado e é o que um contrato cita: IPCA, Selic, CDI, TR, IGP-M, INPC, dólar PTAX. data_series é uma PUBLICAÇÃO numerada: uma fonte, uma unidade, uma transformação, um calendário — bcb_sgs:433 é a variação mensal do IPCA e bcb_sgs:13522 é o acumulado em 12 meses do MESMO conceito. O conceito tem uma série headline e quantas variantes a fonte publicar; a série nunca tem conceito além do que ela mede.

Daí a consequência que surpreende: o que o DataBolsa CALCULA é data_series, não indicator, mesmo quando tem nome de conceito. juro_real_ex_ante, earnings_yield_agregado e os escores de regime são receitas nossas — a linhagem sai em lineage — e não coisas que uma escritura possa citar. São 7 conceitos e centenas de séries, e isso é o desenho, não cobertura faltando. Resolva pelo NOME e leia o kind que voltar, em vez de filtrar por kind=indicator esperando encontrar tudo.

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

Recorta dentro do tipo — fidc, fii, debenture

at?string

Corte temporal (AAAA-MM-DD). SEM ele a resposta é 'quem JÁ se relacionou', não 'quem se relaciona' — a diferença é grande e silenciosa.

O RECORTE DEPENDE DA FORMA DO VERBO (shape, publicado em listObjectRelations):

  • event (issued, indexed_to, succeeded_by): aconteceu numa data e não deixa de ter acontecido — entra tudo que ocorreu até at, sem limite superior. Aresta sem data declarada NÃO entra: o registro de ações não publica data de emissão, e afirmar que ela já existia numa data passada é afirmação que a fonte não faz.
  • snapshot (holds, contains, assigned_to, exposed_to_issuer): retrato por competência, e nenhum retrato se afirma válido depois de ser tirado. A janela é contida (relação que saiu e voltou não aparece no buraco), e at mais recente que a última competência recua até ela — a resposta diz em meta.as_of qual data foi realmente aplicada. Cada verbo tem a competência DELE: holds fecha no trimestre da CDA, contains no pregão do dia.
  • static (manages, administers, custodies, audits, same_owner, shareholder_of, measures, forecasts): o registro publica só o VIGENTE — 111.729 arestas sem início declarado. Com o verbo preso em rel, at no passado responde 400 em vez de devolver o gestor de hoje como gestor de 2020. Sem verbo preso, essas arestas são removidas do conjunto e meta.excluded_shapes diz que foram.

AS IRMÃS NÃO COMPARTILHAM O DEFAULT. Sem at: esta operação, listGlobalLinks, intersectObjects e findObjectPaths respondem 'quem JÁ se relacionou'; getObjectLinkStats resume o retrato VIGENTE (última competência do próprio conjunto); traverseObjectPath atravessa o retrato vigente POR SUJEITO em cada salto. As diferenças são deliberadas — histórico acumulado, resumo e travessia respondem perguntas distintas — e cada rota declara a sua no próprio at. Medido em 23/08/2026: 1 aresta no resumo contra 100+ na listagem, para o mesmo objeto, os dois certos.

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

Como ordenar. name (default) é alfabética. a_count/b_count/total ordenam pelo GRAU — quantas contrapartes distintas o objeto tem em cada relação — e é assim que se pede 'as três maiores da interseção' numa chamada só, em vez de paginar o universo e agregar no cliente. Em union e differencea_count faz sentido: não há lado B a pesar.

Default"name"
Value in"name" | "a_count" | "b_count" | "total"
op?string

intersect = nos dois; union = em qualquer um; difference = em A e não em B.

Default"intersect"
Value in"intersect" | "union" | "difference"

Response Body

curl -X GET "https://api.databolsa.com/v1/objects/intersect?cursor=string&limit=100&total=string&a=issued&b=issued&a_direction=out&b_direction=out&a_to_id=string&b_to_id=string&a_to_kind=company&b_to_kind=company&kind=company&subkind=string&at=string&order=name&op=intersect"
{
  "data": [
    {
      "id": "string",
      "kind": "string",
      "subkind": "string",
      "name": "string",
      "cnpj": "string",
      "tickers": [
        "string"
      ],
      "a_count": 0,
      "b_count": 0
    }
  ],
  "meta": {
    "next_cursor": "string",
    "count": 0,
    "total": 0,
    "subject": {
      "property1": "string",
      "property2": "string"
    },
    "as_of": "string",
    "as_of_by_rel": {
      "property1": "string",
      "property2": "string"
    },
    "excluded_shapes": [
      "event"
    ],
    "order": "name"
  }
}
{
  "type": "string",
  "title": "string",
  "status": 0,
  "detail": "string",
  "instance": "string"
}

As PROPRIEDADES do objeto — o que ele é, em palavras

A terceira forma de dizer algo sobre uma coisa. `getObjectFacts` serve NÚMERO (tem unidade, escala, data-base, anda no tempo); `listObjectLinks` serve LIGAÇÃO (aponta para outro objeto); esta rota serve PALAVRA de vocabulário fechado — situação, forma de condomínio, público-alvo, segmento de listagem, rito da oferta. **Leia `vocabulary` antes de concluir qualquer coisa de um valor.** Ele traz os valores POSSÍVEIS quando a fonte tem lista fechada, e é o que separa 'existem cinco situações' de 'existem vinte'. Um exemplo que morde: a situação de fundo tem cinco valores e NENHUM deles é 'Encerrado' — referência de mercado que exibe isso está derivando de outro lugar. Onde a lista é grande e viva (70 setores, 66 classificações ANBIMA), `vocabulary` é nulo de propósito: vocabulário declarado e desatualizado é pior que vocabulário ausente. **O valor sai como a tabela o tem**, sempre texto — booleano vem `"true"`/`"false"`, e onde a CVM publica `S`/`N` é `S`/`N` que sai. Esta rota não traduz, porque traduzir aqui faria ela discordar da rota de domínio sobre a mesma coluna. **Propriedade nula não vira linha.** Publicá-la diria 'esta coisa não tem público-alvo' quando o que houve foi a fonte não declarar — 475 das 9.119 subclasses não declaram previdência, e isso não as torna não-previdenciárias. **O que NÃO está aqui, e por quê:** administrador, gestor, auditor e custodiante de um fundo, e o coordenador líder de uma oferta, parecem propriedade e são ARESTA — apontam para outro objeto. Hoje ainda são texto na tabela de origem; publicá-los como propriedade normalizaria o erro em vez de resolvê-lo.

Que MEDIDAS existem no grafo, e em que escala cada uma

O catálogo, independente de objeto: todo `fact` que `getObjectFacts` pode devolver e `getObjectHistory` pode servir, com a régua e os tipos de objeto a que se aplica. Leia a coluna `unit` antes de comparar duas medidas. `ratio` é fração (0,08 é 8%) e `pct` é percentual (8,0 é 8%): `dy_12m` de ação é fração e `fii_dy_12m` de FII é percentual, então comparar os dois crus erra por 100×. **`dimension`, `scale` e `period` são a régua completa, e `period` é o eixo que `unit` não tem como dizer.** `dy_12m` cobre DOZE MESES, `fii_dividend_yield_month` cobre UM e `revenue_cagr_3y` é anualizado sobre TRÊS ANOS — três janelas que chegam na mesma resposta e que nenhuma unidade distingue. É a mesma armadilha do IPCA na `bcb_sgs:433` (o mês, ~0,4) contra a `bcb_sgs:13522` (doze meses, ~4,7). **O valor é servido AS-FILED e `scale` diz como lê-lo — ela não foi aplicada.** `portfolio_value_kbrl` é `currency` em `thousand`: os 508.272.696 da mediana são 508 BILHÕES de reais, não 508 milhões. E `scale` desmente sufixo de coluna quando a fonte mente: `fidc_acquired_impaired_pct` termina em `_pct` e vem em `unit` (fração, mediana 0,0204), enquanto `fidc_collateral_pct`, na MESMA tabela, é percentual de verdade. **`unit: native` não é uma escala — é a ausência de uma.** Diz que a escala não é do FATO, é de cada SÉRIE: `value` e `indicator_value` cobrem 431 séries macro em que a mesma medida sai em percentual numa e em fração decimal noutra — o IPCA acumulado em 12 meses é 4,44 na `bcb_sgs:13522` e 0,0444 em `macro:ipca_12m`. O catálogo não tem como resolver isso sem saber de QUE série se fala; quem resolve é `getObjectFacts` no objeto da série, que devolve a `unit` já resolvida e os eixos declarados em `axes`. Tratar `native` como unidade é o erro de 100× outra vez, agora sem nada na resposta para acusá-lo.