EDI Analytics API
v1
Início rápido OpenAPI

EDI Analytics API

Acesso programático aos mesmos motores que sustentam a plataforma EDI: resolução de valores mobiliários nos Estados Unidos, Brasil, México e Peru; cotações globais de fechamento; fundamentos padronizados com inteligência de períodos fiscais; matrizes as-of multidomínio; e execução assíncrona em lote. Uma requisição produz o mesmo número no Excel, em Python, no Quant Workstation e em um relatório agendado — a paridade é estrutural, não dependente de testes.

URL base https://api.edi.finance Mercados US · BR · MX · PE Formato JSON (camelCase) Autenticação cookie de sessão Especificação OpenAPI 3 ↗

Início rápido

Autentique-se uma vez — o cookie de sessão carrega suas permissões de acesso em todas as chamadas subsequentes.

bash
# 1. Faça login (armazena o cookie de sessão)
curl -c cookies.txt -X POST https://api.edi.finance/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email": "you@yourfirm.com", "password": "…"}'

# 2. Resolva identificadores em ids canônicos de entidade
curl -b cookies.txt -X POST https://api.edi.finance/api/analytics/v1/resolve \
  -H "Content-Type: application/json" \
  -d '{"identifiers": [{"value": "PETR4-BR"}, {"value": "AAPL"}]}'

# 3. Uma grade de comparáveis multimercado em USD, em uma única chamada
curl -b cookies.txt -X POST https://api.edi.finance/api/analytics/v1/matrix \
  -H "Content-Type: application/json" \
  -d '{"ids": ["AAPL-US","BBAS3-BR","BIMBOA-MX"],
       "metrics": ["close","MARKET_CAP","SECTOR"],
       "asOf": "2026-07-30", "currency": "USD"}'

Ou com o cliente de referência em Python:

python
from edi_analytics import EdiAnalyticsClient, spill_matrix

client = EdiAnalyticsClient("https://api.edi.finance")
client.login("you@yourfirm.com", "…")

env = client.matrix(ids=["AAPL-US", "BBAS3-BR"],
                    metrics=["close", "MARKET_CAP", "SECTOR"])
grid = spill_matrix(env, ids=["AAPL-US", "BBAS3-BR"],
                    metrics=["close", "MARKET_CAP", "SECTOR"])

Autenticação de serviço — chaves de API

Para scripts, SDKs e integrações servidor a servidor, crie uma chave de API (ela age em seu nome, com as suas permissões) e envie-a como X-API-Key ou Authorization: Bearer — sem cookies. As chaves são exibidas uma única vez na criação, podem expirar e são revogáveis; o gerenciamento de chaves sempre exige uma sessão autenticada, nunca uma chave.

bash
# Crie uma chave (autenticado por sessão) e use-a onde quiser
curl -b cookies.txt -X POST https://api.edi.finance/api/analytics/v1/keys \
  -H "Content-Type: application/json" -d '{"label": "research pipeline", "expiresInDays": 365}'

curl -H "X-API-Key: edi_sk_…" -X POST https://api.edi.finance/api/analytics/v1/resolve \
  -H "Content-Type: application/json" -d '{"identifiers": [{"value": "AAPL"}]}'

Python: EdiAnalyticsClient("https://api.edi.finance", api_key="edi_sk_…") — dispense o login() por completo.

Conceitos fundamentais

O envelope

Todo endpoint de dados retorna o mesmo envelope de três partes. As linhas em data são planas e autodescritivas — serializam de forma idêntica para JSON, CSV e intervalos de spill do Excel.

json
{
  "data":   [ /* linhas planas de observação */ ],
  "errors": [ /* falhas no nível da linha — nunca uma falha da requisição */ ],
  "meta":   { "pagination": { "total": 412 }, "registryVersion": "2026.07.16.1A" }
}

Identificadores e o eco do requestId

Todo endpoint aceita diretamente identificadores de tipos mistos — tickers qualificados por mercado (PETR4-BR, BIMBOA-MX), tickers simples, ISINs, CUSIPs, CIKs e ids canônicos de entidade. Cada linha de resposta carrega tanto requestId (o seu identificador, exatamente como enviado — a chave de junção de volta para a célula da sua planilha ou o índice do seu dataframe) quanto entityId (a nossa chave canônica, estável através de mudanças de ticker e classes de ações).

Falha parcial é a norma

Um ticker inválido jamais pode derrubar uma pasta de trabalho de 500 células. Identificadores não resolvíveis, métricas desconhecidas e conversões sem cotação retornam como entradas em errors — cada uma com um requestId, um code estável e um detail legível — enquanto todas as demais linhas retornam normalmente.

Proveniência

Toda resposta informa a versão do registro de métricas que a precificou (meta.registryVersion), e as linhas carregam a moeda efetivamente retornada. Os números são auditáveis entre clientes: a mesma requisição produz o mesmo valor em qualquer lugar, por construção.

Vocabulário

Os parâmetros de requisição abaixo significam a mesma coisa em todo endpoint que os aceita.

Periodicidade (fundamentos)

ValorSignificado
FYExercícios fiscais, conforme reportados.
QTRTrimestres fiscais verdadeiros. 10-Qs armazenados como acumulado do ano são desacumulados no servidor; o Q4 deriva do total do exercício quando não reportado.
LTMSoma móvel dos últimos quatro trimestres em cada encerramento de trimestre (fluxos). Itens pontuais retornam seu valor na data de encerramento daquele trimestre.
YTDAcumulado dentro de cada exercício fiscal.
SEMIEm preparação — aguarda normalização semestral.

basis seleciona o eixo de reapresentação: original (padrão) ou restated (em preparação — aguarda modelagem de vintages).

Frequência (cotações & séries)

ValorObservações mantidas
D / ADTodos os pregões observados.
W · M · CQ · CSA · CYÚltimo pregão de cada semana ISO / mês civil / trimestre / semestre / ano.
AM · AQ · ASA · AYAncoradas: avançando a partir do seu startDate (um início em 16 de junho gera 16/jun, 16/jul, …), tomando a última observação na data-âncora ou antes dela.

Ajuste de preço

ValorSignificado
SPLITAjustado por desdobramentos (padrão; corresponde aos fechamentos armazenados das bolsas). Apenas listagens dos EUA — MX/BR/PE guardam a cadeia ajustada em separado e retornam erro de linha indicando DIV_SPIN_SPLITS.
DIV_SPIN_SPLITSAjustado por dividendos, cisões (spinoffs) e desdobramentos.
UNSPLIT · SPLIT_SPINOFFEm preparação — exigem histórico de fatores de ajuste.

Moeda

currency tem como padrão LOCAL: os valores retornam em sua moeda nativa de cotação ou de reporte, informada por linha — uma planilha brasileira nunca recebe USD silenciosamente. Qualquer código ISO (USD, BRL, MXN, EUR, …) é convertido no servidor; veja conversão de moeda para saber qual taxa de câmbio se aplica em cada caso.

Resolução de valores mobiliários

POST/api/analytics/v1/resolve

A camada de identidade sob todas as demais chamadas. Envie até 2.000 identificadores de tipos mistos; receba de volta entidades canônicas com a estrutura empresa vs. listagem. Linhas que compartilham um entityId são classes de ações / listagens do mesmo emissor, enumeradas em listings.

json
// POST /api/analytics/v1/resolve
{ "identifiers": [ {"value": "PETR4-BR"}, {"value": "US0378331005"}, {"value": "037833100", "type": "CUSIP"} ] }

// 200 — uma linha por candidato
{ "data": [
    { "requestId": "PETR4-BR", "entityId": "BR-9512", "ticker": "PETR4",
      "market": "BR", "matchedBy": "ticker", "candidateCount": 1,
      "listings": [ {"ticker": "PETR3", "market": "BR"}, {"ticker": "PETR4", "market": "BR"} ] } ] }

Catálogo de métricas

GET/api/analytics/v1/catalog/metrics

O registro oficial de todas as métricas que os motores conseguem calcular — o mesmo registro contra o qual executam o screener da plataforma, os painéis quant e a bancada de fórmulas, incluindo as métricas de fórmula personalizadas da sua organização. Faça autocompletar a partir daqui e uma requisição jamais nomeará uma métrica que os motores não conheçam.

FiltroSignificado
datasetfinancials_standardized · prices · valuation · derived · returns · entity_attributes · …
searchBusca por código, nome e aliases (?search=revenue).
valueTypecurrency · percent · ratio · price · shares · text · …
entityTypecompany · etf · fund · bond · manager
includeDeprecatedMétricas descontinuadas carregam um replacementMetricCode.
kindline (uma linha da demonstração, reportada ou padronizada) · amount (um valor calculado) · ratio · market · attribute · holdings.
industryProfileindustrial · bank · insurance · reit · fund: apenas as métricas que existem para esse tipo de emissor. Crédito / Depósitos é uma métrica bancária; a liquidez corrente não é.
marketUS · MX · BR · PE · CL: as métricas multimercado mais as arquivadas nesse mercado (linhas como reportadas, posições institucionais, aluguel de ações).
limit / offsetPaginação; meta.pagination.total é a contagem filtrada.

Cada linha indica também seu lugar na taxonomia de métricas: folderPath (linhas sob Demonstrações financeiras, indicadores sob Índices e indicadores, uma pasta por família de índices, linhas como reportadas por regulador), kind, basis (standardized · as_reported · derived · observed), statement, market, industryProfiles (vazio significa todo tipo de emissor) e canonicalDataset, presente na cópia de um código que pertence a outro conjunto de dados. Os nomes trazem aliases em espanhol e português: ?search=d%C3%ADvida%20l%C3%ADquida encontra NET_DEBT.

Cada linha informa seu dataset, motor, tipo de valor, unidade, tipos de entidade suportados, tipos de tempo (as-of / série temporal), modos de período e status.

Cotações globais

POST/api/content/global-prices/v1/prices

OHLCV de fechamento em todos os mercados cobertos, com contenção de listagens cruzadas embutida: uma linha de São Paulo que compartilha o ticker com uma emissão americana jamais pode se emendar na série dos EUA. Observações duplicadas são deduplicadas em uma única linha canônica por pregão.

json
// POST /api/content/global-prices/v1/prices
{ "ids": ["BBAS3-BR"], "startDate": "2026-01-01", "endDate": "2026-07-30",
  "frequency": "M", "fields": ["price", "volume"] }

// 200 — observações de fim de mês, moeda nativa informada por linha
{ "data": [
    { "requestId": "BBAS3-BR", "entityId": "BR-1023", "date": "2026-06-30",
      "currency": "BRL", "price": 19.91, "volume": 31200400 }, … ] }

Fundamentos

POST/api/content/fundamentals/v1/fundamentals

Dados fiscais padronizados com a inteligência de períodos da plataforma. O servidor é o dono da semântica de períodos — armazenamento como acumulado do ano, inferência do encerramento do exercício fiscal, derivação do Q4, janelas LTM — para que nenhuma fórmula precise sê-lo.

json
// POST /api/content/fundamentals/v1/fundamentals
{ "ids": ["AAPL-US"], "metrics": ["REVENUE"], "periodicity": "LTM",
  "fiscalPeriod": { "start": "2025-01-01", "end": "2026-07-30" } }

// 200 — receita móvel dos últimos doze meses em cada encerramento de trimestre fiscal
{ "data": [
    { "requestId": "AAPL-US", "metric": "REVENUE", "periodicity": "LTM",
      "fiscalYear": 2026, "fiscalPeriod": "Q2", "fiscalEndDate": "2026-03-28",
      "currency": "USD", "value": 451442000000 }, … ] }

Taxonomias de demonstrações, demonstrações completas e períodos fiscais

Três complementos de descoberta e consulta do endpoint de fundamentos:

EndpointRetorna
GET /taxonomies?market=BR&template=banksO plano de contas efetivamente reportado por aquele mercado e formato — market: US·BR·MX·PE, template: industrials·banks·insurance, statement opcional. Cada linha traz código da conta, rótulo, demonstração e quantas empresas a reportam — para conhecer as contas disponíveis antes de consultar dados. Um balanço de Bancos BR (aplicações interfinanceiras, operações de crédito…) não é o de bancos dos EUA.
POST /statementsA demonstração financeira completa (IS, BS, CF ou FULL) de cada id em uma única chamada, no período implicado por asOf — mode: "annual" (último exercício fiscal, padrão) ou "latest" (último período divulgado, valores conforme reportados). A conversão cambial respeita a demonstração: balanço ao câmbio de fechamento do período, fluxos à média do período.
POST /segmentsAbertura de receita por segmento de negócio, produto e geografia para emissores dos EUA (a partir de arquivos estruturados): os nomes de segmento do próprio emissor, valores conforme reportados, eliminações excluídas. dimension: business·product·geographic; qualquer métrica do catálogo.
POST /periodsOs períodos fiscais reportados por cada empresa (ano, período, datas, contagem de contas) — cobertura antes de consultar.
json
// POST /api/content/fundamentals/v1/statements — uma chamada, a demonstração completa
{ "ids": ["BBAS3-BR"], "statement": "FULL", "asOf": "2026-07-30", "currency": "USD" }

Indicadores

POST /ratios — o catálogo de indicadores como série: uma aba inteira (group), ou indicadores nomeados de qualquer aba, com todas as linhas de fluxo lidas em uma mesma base de período. É a janela de Indicadores da aplicação web servida pela API — a mesma chamada ao motor, então um número aqui e um número lá não podem divergir. A matriz continua servindo qualquer indicador em uma única data de referência; este endpoint é para o histórico.

json
// POST /api/content/fundamentals/v1/ratios
{ "ids": ["AAPL-US", "BIMBOA-MX"], "ratios": ["GROSS_MARGIN", "ROE", "PB"],
  "periodBasis": "ltm", "scale": "quarterly" }

// 200 — uma linha por (id, indicador, período); um indicador de fluxo carrega a base em que foi lido
{ "data": [
    { "requestId": "AAPL-US", "ratio": "GROSS_MARGIN", "group": "profitability",
      "period": "FY2026 Q3", "periodEnd": "2026-06-27", "value": 0.4865,
      "valueType": "percent", "periodBasis": "ltm", "scale": "quarterly" },
    { "requestId": "AAPL-US", "ratio": "PB", "group": "valuation",
      "period": "2026-08-31", "periodEnd": "2026-08-31", "value": 43.05,
      "valueType": "multiple", "periodBasis": null, "scale": "monthly",
      "scaleClampReason": "tab_grid" }, … ],
  "errors": [] }
ParâmetroSignificado
groupvaluation · profitability · returns · leverage · liquidity · efficiency · cash_flow · per_share · growth. Omita quando ratios nomeia os códigos: a aba de um indicador é uma propriedade do indicador, e uma requisição que mistura abas é respondida aba por aba.
periodBasisltm (padrão) · ytd · 3m · fy — como cada linha de fluxo (receita, EBITDA, fluxo de caixa) é lida. Indicadores de balanço são pontuais no tempo e não se movem com ela; suas linhas carregam periodBasis: null para que o leitor saiba por que a linha ficou parada.
scalequarterly (padrão) · annual para as abas fundamentais; daily · weekly · monthly para valuation, cujo numerador se move a cada pregão e não tem período fiscal. Crescimento é apenas anual. A escala é ajustada ao que a aba e o emissor conseguem honrar, e cada linha diz isso em scaleClampReason: tab_grid, ou issuer_reports_annually para os emissores que não publicam demonstrações intermediárias.
asOf, startData de referência (padrão hoje) e até onde recuar; sem start o alcance é o próprio da escala — dez anos de trimestres, quinze de exercícios fiscais, dois de dias.
currencyConverte apenas as linhas de magnitude monetária (dívida total, valor de mercado, valores por ação); um indicador nunca é convertido.

Point-in-time

POST /point-in-time — fundamentos como eram conhecidos em uma data, para backtesting sem viés de antecipação (emissores dos EUA). Duas garantias: um período fiscal é invisível até a data de publicação do seu protocolo (o trimestre de dezembro da Apple não existe antes de 30 de janeiro), e se um número for reapresentado depois, serve-se o valor vigente em pitDate — as linhas trazem firstPublished, lastPublished (aditamentos) e valueVintage (as_known quando há vigência capturada; a captura de reapresentações acumula desde 2026-08-02). pitDataItems=true no catálogo lista as métricas com capacidade PIT. FY e QTR; componha LTM no cliente a partir de trimestres PIT.

Matriz

POST/api/analytics/v1/matrix

Muitos ativos × muitas métricas em uma única data as-of, em uma requisição — a primitiva da grade de comparáveis. As métricas podem misturar datasets livremente: cotações, fundamentos, múltiplos de valuation, medidas derivadas e atributos de texto retornam todos pelo mesmo envelope.

json
// POST /api/analytics/v1/matrix
{ "ids": ["AAPL-US", "BBAS3-BR", "BIMBOA-MX"],
  "metrics": ["close", "MARKET_CAP", "PE_LTM", "SECTOR"],
  "asOf": "2026-07-30", "currency": "USD" }

// 200 — uma célula por (id, métrica); as-of = última observação na data ou antes dela
{ "data": [
    { "requestId": "AAPL-US",   "metric": "MARKET_CAP", "dataset": "derived",
      "valueType": "currency", "value": 4925847973597 },
    { "requestId": "BBAS3-BR",  "metric": "close",  "dataset": "prices", "value": 4.11 },
    { "requestId": "BIMBOA-MX", "metric": "SECTOR", "dataset": "entity_attributes",
      "valueType": "text", "value": "Food & Beverage" } ] }

Screener

POST/api/content/screener/v1/search

Execute screens no mesmo motor do screener da plataforma — condições sobre métricas financeiras, métricas de preço, múltiplos de valuation e as métricas de fórmula personalizadas da sua organização, com filtros de setor, bolsa, país e universo. Endpoints complementares: POST /count retorna a contagem de correspondências sem materializar linhas (conecte-o a um indicador ao vivo de "N empresas correspondem"), e GET /fields lista todos os campos filtráveis.

json
// POST /api/content/screener/v1/search
{ "conditions": [ { "metric": "MARKET_CAP", "operator": "gt", "value": 100000000000 },
                  { "metric": "ROE", "operator": "gte", "value": 0.15 } ],
  "metrics": ["REVENUE", "PE"], "sortBy": "MARKET_CAP", "currency": "USD", "limit": 50 }

// 200 — uma linha por ativo correspondente; meta.pagination.total = total de correspondências
{ "data": [
    { "ticker": "AAPL", "entityId": "0000320193", "sector": "Technology",
      "nativeCurrency": "USD", "marketCap": 4925847973597,
      "metrics": { "REVENUE": 451442000000, "PE": 43.9 } }, … ] }

Screening em data passada

POST /api/content/screener/v1/point-in-time — roda um screening como ele teria rodado numa data passada. O screener normal é do tempo presente: rodá-lo com limiares antigos informa quais dos sobreviventes de hoje passariam hoje.

Três propriedades, cada uma uma forma distinta de errar em silêncio. Um período fiscal não existe até que o documento que o carrega seja publicado, então um screening de 2019 não pode ver números arquivados em 2020. O universo é quem negociava naquela data, retirado dos próprios preços, de modo que empresas que depois saíram da bolsa estão nele. E uma métrica que não pode ser resolvida naquela data volta como erro de linha, nunca como o valor atual com data antiga.
Métricas que dependem de preço são recusadas. MARKET_CAP, PE, PB, PS e EV retornam erro de linha em vez de um número. Formar um valor de mercado histórico exige preço e quantidade de ações na mesma base de desdobramentos, e o histórico de preços não está: parte é como negociado e parte está ajustada a uma data de atualização que varia por ticker. O resultado seria correto para alguns emissores e errado pelo fator do desdobramento para outros, sem nada na resposta que diga qual.

Fundos

POST/api/content/funds/v1/…

Dados de fundos dos mercados locais no Brasil (mais de 65.000 fundos registrados), México e Peru, com as convenções de identificador que cada mercado realmente usa: fundos BR resolvem por CNPJ em qualquer formato (00.000.684/0001-21 ou 00000684000121), fundos MX e PE por ticker ou id de entidade. Quatro endpoints compartilham um único contrato:

EndpointRetorna
POST /summaryAtributos cadastrais: nome, classificação, gestor/administrador, benchmark, situação, moeda nativa.
POST /pricesSéries de cota/NAV (fields: ["nav", "netAssets"]) com o vocabulário completo de frequência.
POST /returnsRetornos periódicos calculados a partir da cota na frequência amostrada. As cotas dos fundos são do tipo acumulação, portanto trata-se de retornos totais.
POST /flowsCaptações / resgates / fluxo líquido diários — somente BR, onde o mercado informa diariamente; os demais mercados retornam um erro de linha, nunca silêncio.
POST /holdingsCarteira dos fundos BR/MX/PE e dos ETFs dos EUA no último informe até asOf: nome, identificadores, classe de ativo, quantidade, valor de mercado, peso. top limita as linhas (padrão 50).

Participações institucionais ficam em /api/content/ownership/v1: POST /holders retorna quem detém um ativo (por gestor: vale o último protocolo do trimestre-alvo — aditamentos prevalecem), e POST /manager-holdings retorna a carteira de um gestor pelo CIK. O universo completo de gestores declarantes (~9.000) está coberto para cada trimestre já vencido; como essas divulgações vencem 45 dias após o fim do trimestre, as listas de detentores usam por padrão o último trimestre totalmente vencido — passe includePartial: true durante a janela de protocolo para ver o trimestre em andamento. Os valores estão em USD; os pesos são percentual do valor reportado.

json
// POST /api/content/funds/v1/prices
{ "ids": ["00000684000121", "+TASAD1F1"], "fields": ["nav", "netAssets"],
  "startDate": "2026-01-01", "endDate": "2026-07-30", "frequency": "M", "currency": "USD" }

Dados de referência

Identidade histórica e o registro documental que a sustenta. Ambos respondem à mesma pergunta: o que este identificador significava naquela data — a chave de cruzamento que qualquer base histórica externa ao nosso universo precisa.

Histórico de identificadores

POST /api/content/reference/v1/identifier-history — cada ticker, ISIN, CUSIP, CIK, bolsa e MIC que um papel já carregou, com intervalos de vigência, desde 1926. Cada linha traz o código do evento corporativo que causou a mudança, de modo que uma troca de nome se distingue de uma fusão.

Por que importa. Um blotter de 2019 referencia símbolos que hoje pertencem a outras empresas. Cruzá-lo com identificadores atuais falha em silêncio: nada dá erro, o backtest apenas fica errado. asOf retorna os intervalos vigentes naquela data.
json
// POST /api/content/reference/v1/identifier-history
{ "ids": [ "AAPL" ], "asOf": "2019-06-28" }

Índice de documentos regulatórios

POST /api/content/reference/v1/filings — 2,2 milhões de arquivamentos regulatórios dos EUA de 20.205 emissores desde 1993: tipo de formulário, data, fim do período, número de accession, tipo de emenda e URL do documento. O relógio de eventos para estratégias baseadas em anúncios, e a trilha de auditoria por trás de cada dado fundamental que servimos.

formTypes compara por prefixo: 10-K inclui 10-K/A. Uma emenda é o mesmo evento rearquivado, e costuma ser justamente a reapresentação procurada.

Fatores de ajuste de proventos

/corporate-actions agora retorna priceFactor, shareFactor, cashComponent, affectsSplitAdjusted, affectsTotalReturn e factorStatus ao lado dos termos do evento, para que você reconstrua sua própria série ajustada e a concilie com a nossa.

Os termos não determinam o fator. O desdobramento da NVIDIA em 2024 está registrado como bonificação com ratioOld: 1 e ratioNew: 9, e o fator de preço é 0,1 — um 10 para 1. Derivar o multiplicador do ratio daria 9×. Quando um fator não pôde ser calculado, os campos são nulos e factorStatus diz o motivo, em vez de a linha sumir.

Calendários de negociação

POST /api/content/reference/v1/calendar — os pregões que cada mercado realmente opera, para EUA, BR, MX e PE, dos anos noventa até 2029. Os dias sem pregão trazem o motivo; use includeNonTrading para obter o calendário completo.

Por que isto não é um filtro de dias úteis. A Quinta-feira Santa fecha México e Peru, e não os EUA nem o Brasil. Em 2006 o Dia da Constituição e o natalício de Benito Juárez passaram para segundas-feiras determinadas. O Brasil fechou nos feriados da cidade e do estado de São Paulo até 2021 e desde então opera neles, e fecha no último dia útil do ano em vez do dia 31. Cada um desses casos é uma resposta errada que uma semana de cinco dias produz em silêncio.

Aritmética em dias de pregão

POST /api/content/reference/v1/calendar/offset — desloque N dias de pregão a partir de uma data âncora. Liquidação em T+2, agendamento de rebalanceamentos e janelas de eventos são a mesma pergunta, e todas ficam erradas quando respondidas em dias corridos.

Negociações de insiders

POST /api/content/ownership/v1/insider-transactions — 1,75 milhão de registros do Formulário 4 desde 2004, com a relação do declarante com o emissor (conselheiro, diretor, detentor de 10%) incorporada.

Duas distinções que os arquivamentos não fazem sozinhos e que, de outro modo, teriam de ser reconstruídas:

Renda fixa

POST /api/content/fixed-income/v1/search · /reference · /prices — papéis mexicanos, corporativos peruanos e debêntures brasileiras. 2,2 milhões de observações de preço; um universo de títulos é descoberto, não conhecido por ticker, então comece pelo search.

Os três mercados não cotam as mesmas grandezas. México e Peru publicam uma taxa até o vencimento. O Brasil não: uma debênture negocia contra o DI, de modo que indexBasis traz "DI + 1,6%" e spreadOverIndex carrega o spread indicativo sobre ele. yieldToMaturity é null numa linha brasileira, porque 0,74 ao lado dos 6,52 do México diria que o crédito brasileiro rende um sétimo do mexicano, em vez de DI mais 0,74.

Taxas de fundos

POST /api/content/funds/v1/fees — taxas de administração e de performance, despesas totais, cargas e giro. Classes americanas a partir das divulgações do prospecto (7,58 milhões de fatos sobre 64.931 classes), fundos brasileiros a partir das suas próprias divulgações regulatórias.

Tudo em percentual, e cada linha diz isso. As divulgações americanas arquivam frações (0,0003 para o VTI) e as brasileiras arquivam percentual (2,5). Servidos como estão armazenados ficariam a um fator de quatrocentos de distância enquanto se leem como oitenta.

Mudanças de participação

POST /api/content/ownership/v1/changes — o que as instituições fizeram num ativo entre dois trimestres: quem entrou, aumentou, reduziu ou saiu, ordenado pelo que de fato se moveu.

Um gestor que não entregou não é um vendedor. Essas divulgações vencem 45 dias após o fim do trimestre, então dentro de uma janela de entrega a maioria dos gestores simplesmente não aparece no trimestre mais recente, e uma diferença ingênua lê cada um deles como uma saída total. Ambos os períodos usam por padrão trimestres já vencidos, e uma ausência só é EXITED quando o gestor de fato entregou aquele trimestre; quem não entregou nada é NOT_FILED.

Execução em lote

Todo endpoint de dados aceita "batch": "Y" com o corpo de requisição idêntico — vire uma única flag quando a pasta de trabalho crescer além dos limites síncronos. O ramo em lote executa o mesmo caminho de código do síncrono, então os resultados são idênticos por construção.

EtapaChamadaResposta
1. EnviarPOST em qualquer endpoint de dados com "batch":"Y"202 + cabeçalho Location; o corpo carrega o id do job
2. ConsultarGET /api/analytics/v1/batch-status?id=…202 enquanto executa · 201 quando concluído (+Location) · 200 com status:"error" em caso de falha
3. BuscarGET /api/analytics/v1/batch-result?id=…200 com o envelope padrão

Os jobs pertencem à conta que os enviou e expiram após 24 horas. Jobs com falha entregam um envelope EXECUTION_ERROR pelo mesmo contrato.

Exportação em massa

A execução em lote escala uma planilha. A exportação em massa resolve o problema oposto: carregar um conjunto de dados no seu próprio repositório e mantê-lo atualizado. Um job, um arquivo comprimido e um cursor exato de onde continuar.

PassoChamadaResposta
0. DescobrirGET /api/content/bulk/v1/datasetsConjuntos exportáveis, a projeção exata de colunas e se aceitam carga incremental
1. EnviarPOST /api/content/bulk/v1/export202 + Location; o corpo traz o id
2. ConsultarGET /api/content/bulk/v1/status?id=…status, rowCount, byteCount, nextChangedSince
3. BaixarGET /api/content/bulk/v1/download?id=…O arquivo — CSV comprimido ou NDJSON
bash
# Carga inicial: todo o histórico de preços em um arquivo
curl -b cookies.txt -X POST https://api.edi.finance/api/content/bulk/v1/export \\
  -H "Content-Type: application/json" -d '{"dataset": "prices_eod"}'

# Toda noite: apenas o que foi escrito desde a última carga
curl -b cookies.txt -X POST https://api.edi.finance/api/content/bulk/v1/export \\
  -H "Content-Type: application/json" \\
  -d '{"dataset": "prices_eod", "changedSince": "2026-08-21T23:16:18.915379Z"}'
nextChangedSince é o contrato. Um job concluído informa a maior marca de escrita que realmente incluiu. Reenvie esse valor e a próxima carga recomeça exatamente onde a anterior parou: nada escrito durante a execução é perdido ou repetido. Usar o próprio relógio, ou now, perde linhas em silêncio.

Situação dos conjuntos de dados

GET /api/analytics/v1/datasets — por conjunto: janela de cobertura, última carga, contagem de linhas e entidades, quais endpoints o servem e um veredicto de atualidade.

Conversão de moeda

A conversão é feita no servidor e é sensível à semântica — o tipo certo de taxa de câmbio se aplica a cada valor:

Tipo de valorTaxa aplicada
Observações de preçoTaxa à vista na data de cada observação.
Fundamentos de fluxo (DRE/DFC)Taxa média do período ao longo da janela fiscal.
Fundamentos de estoque (BP)Taxa à vista no encerramento do período fiscal.
Células de matriz (tipo moeda/preço)Taxa à vista na data as-of.
Volume, razões, percentuais, textoNunca convertidos.

Taxas cruzadas compõem-se via USD. Uma conversão que não pode ser precificada — moeda de origem desconhecida, par não suportado, nenhuma taxa dentro da janela de defasagem — é um erro de linha FX_UNAVAILABLE com as linhas afetadas descartadas: você nunca recebe silenciosamente valores nativos sem conversão.

CSV em toda parte. Envie Accept: text/csv a qualquer endpoint de dados e as linhas planas do envelope voltam como arquivo CSV — mapas aninhados viram colunas com ponto, erros por linha acompanham como comentários # e o registryVersion é carimbado no final. O caminho mais rápido de qualquer endpoint para uma planilha ou dataframe.

Pesquisa — pacote acadêmico

A superfície de pesquisa acadêmica — painéis ponto-no-tempo sobre universos históricos livres de viés de sobrevivência, fixados por Research Snapshots citáveis — está listada no índice de endpoints abaixo em /api/research/…. Mesma autenticação de todos os endpoints; enquanto a seção Academia estiver em fase de testes, os endpoints de pesquisa exigem também o papel de pesquisa na sua conta.

Downloads — o pacote acadêmico

Auto-hospedado e versionado com a plataforma: o wheel do SDK edifinance, os notebooks de ensino em três idiomas (inglês, espanhol, português — pastas de Excel de amostra incluídas), e os doze capítulos de metodologia. O SDK não está no PyPI enquanto a Academia estiver em fase de testes — instale-o direto daqui (funciona também no Colab).

bash
# o SDK ainda não está no PyPI — instale a partir da plataforma
pip install https://api.edi.finance/static/academic/edifinance-0.1.1-py3-none-any.whl

Índice completo de endpoints

Every operation the service routes, 113 of them, generated from the route table itself. The sections above describe the ones most clients start with; everything here is live and callable.

MethodPathSummary
analytics
GET/api/analytics/v1/batch-resultDownload a finished batch job's envelope.
GET/api/analytics/v1/batch-statusStatus codes: 202 while pending/running, 201 when the result exists (Location points at /batch-result), 200 with status=error.
GET/api/analytics/v1/catalog/equity-presetsCanonical equity presets; metric instances resolve through the catalog.
GET/api/analytics/v1/catalog/fund-presetsCanonical Fund Quant presets resolved against market source capability.
GET/api/analytics/v1/catalog/metricsThe unified metric catalog: every metric this API can serve, with its category, datasets, entity types and value type, plus its place in the Research Library taxonomy (folderPath, kind, basi
GET/api/analytics/v1/datasetsCoverage and freshness per dataset: how far it reaches, when it last moved.
GET/api/analytics/v1/healthLiveness plus a per-store check -- database, facts, prices, FX, batch workers -- so a degraded dependency is visible before it is inferred from empty responses.
POST/api/analytics/v1/inspectCell-level provenance for one (id, metric) pair: what the identifier resolved to, which dataset served the value, and which engine owns it.
GET/api/analytics/v1/keysThe caller's API keys and their status.
POST/api/analytics/v1/keysIssue an API key.
DELETE/api/analytics/v1/keys/{key_id}Revoke one API key immediately.
GET/api/analytics/v1/keys/{key_id}/usageDaily usage rollups for one of the caller's keys (session-only).
POST/api/analytics/v1/matrixCross-domain retrieval: any set of ids against any set of metrics, each cell routed to the dataset that owns it.
POST/api/analytics/v1/resolveResolve tickers, ISINs, CUSIPs, CIKs or entity ids to the platform's canonical security, with the candidates when one is ambiguous.
POST/api/research/dataset-buildRun a build and return a PREVIEW plus the full diagnostics.
GET/api/research/dataset-definitionsNamed, reusable panel definitions: universe, metrics, window, frequency, PIT mode, currency.
POST/api/research/dataset-definitionsCreate a named panel definition.
POST/api/research/dataset-exportDownload a full panel as CSV or XLSX (§67).
GET/api/research/dataset-runsRecent builds with row counts, dataset hashes, full diagnostics, and any minted snapshot codes.
GET/api/research/event-studiesSeeded event-study definitions: model, benchmark, windows, and event counts.
POST/api/research/event-studyThin transport over the event-study engine (§82 names this route; the engine predates it).
POST/api/research/excel/panelThe =EDI.DATASET() backend: derive-or-reuse a definition (the SDK's exact naming scheme, "xl_" prefixed so Excel-born definitions are recognisable), build, and answer as a grid.
GET/api/research/excel/snapshot/{snapshot_code}The =EDI.SNAPSHOT() backend -- the provenance inspector (§36) as a key/value grid: what a citation code pins, and whether it is reproducible, as EVIDENCE fields rather than a bare claim.
GET/api/research/excel/universeThe =EDI.UNIVERSE() backend.
GET/api/research/metricsMetrics that actually have facts, with their coverage.
GET/api/research/research-snapshotsResearch Snapshots: citation code, status, knowledge date, universe, registry hashes, and dataset hash.
POST/api/research/snapshots/{snapshot_code}/replayOne-call snapshot replay (§27): re-run the build a citation pins and return the comparison as evidence.
GET/api/research/universesUniverse definitions with markets, benchmark linkage, and snapshot counts.
bulk
GET/api/content/bulk/v1/datasetsWhich datasets can be exported, with their column projection.
GET/api/content/bulk/v1/downloadStream the finished export file.
POST/api/content/bulk/v1/exportQueue a whole-dataset export; poll status, then download one file.
GET/api/content/bulk/v1/statusProgress of one export, or every export this account has queued.
fixed-income
POST/api/content/fixed-income/v1/pricesDaily bond observations: price, yield, duration, spread.
POST/api/content/fixed-income/v1/referenceTerms for specific bonds: coupon, maturity, par, amount issued, ratings.
POST/api/content/fixed-income/v1/searchFind bonds across MX, PE, BR and CL by issuer, currency, maturity or ISIN.
formula
GET/api/content/formula/v1/catalog/metricsMetrics a formula may reference, with their argument shapes.
GET/api/content/formula/v1/definitionsFormulas visible to the caller: their own, plus anything shared with them.
GET/api/content/formula/v1/definitions/{formula_id}One formula's current definition.
GET/api/content/formula/v1/definitions/{formula_id}/versionsEvery saved version of a formula, newest first.
POST/api/content/formula/v1/executeEvaluate a formula for a set of securities and dates.
POST/api/content/formula/v1/validateParse and type-check an expression without running it.
fundamentals
POST/api/content/fundamentals/v1/fundamentalsStandardized fundamentals on one fiscal basis: FY, QTR, LTM or YTD.
POST/api/content/fundamentals/v1/periodsWhich fiscal periods exist for a security, and their end dates -- the calendar to ask fundamentals questions against.
POST/api/content/fundamentals/v1/point-in-timeFundamentals as they stood on a past date, resolved through the publication ladder so a restatement cannot leak backwards.
POST/api/content/fundamentals/v1/ratiosFinancial ratios as a series: one tab of the ratio catalog, or named ratios, at one period basis (LTM, YTD, 3M, FY) on the fiscal or price grid.
GET/api/content/fundamentals/v1/ratios/fieldsEvery ratio the ratios endpoint serves: tab, formula, value type, grid scales and the issuer types it exists for.
POST/api/content/fundamentals/v1/segmentsReported business and geographic segments.
POST/api/content/fundamentals/v1/statementsFull financial statements as a hierarchy of line items, standardized or as reported.
GET/api/content/fundamentals/v1/taxonomiesStatement taxonomies available per market, and the line items in each.
funds
POST/api/content/funds/v1/aumAssets under management history.
POST/api/content/funds/v1/feesWhat a fund costs to hold: expense ratios, fees and loads.
POST/api/content/funds/v1/flowsNet subscriptions and redemptions per period.
POST/api/content/funds/v1/holdingsDisclosed portfolio holdings for a fund at a reporting date.
POST/api/content/funds/v1/portfolio/analyticsRisk and exposure analytics computed over a fund's disclosed holdings.
POST/api/content/funds/v1/pricesFund NAV and market price history.
POST/api/content/funds/v1/rankingsPeer rankings within a fund category over a chosen window.
POST/api/content/funds/v1/registryBulk share-class registry for a market, including point-in-time returns.
POST/api/content/funds/v1/returnsFund returns as reported and as computed from NAV.
POST/api/content/funds/v1/summaryIdentity and headline facts for a fund or share class.
fx
POST/api/content/fx/v1/averageThe average FX rate over a period -- the right basis for translating a flow, where a spot rate is right for a balance.
POST/api/content/fx/v1/historyAn FX pair over time.
POST/api/content/fx/v1/rateA spot FX rate on a date.
POST/api/content/fx/v1/translateTranslate an amount between currencies at a stated date and basis, so the rate used is on the response rather than assumed.
global-prices
POST/api/content/global-prices/v1/corporate-actionsSplits, dividends and other corporate actions with the price and share factors derived from them.
POST/api/content/global-prices/v1/pricesEnd-of-day prices across all covered markets.
POST/api/content/global-prices/v1/returnsPeriod returns over named windows, price or total return.
POST/api/content/global-prices/v1/returns-rangeReturns between two explicit dates.
POST/api/content/global-prices/v1/returns/snapshotStandard return windows for a set of securities in one row each: the performance strip, without a request per window.
indices
POST/api/content/indices/v1/changesAdditions and deletions between two constituent dates.
POST/api/content/indices/v1/constituentsIndex constituents and weights at a date.
POST/api/content/indices/v1/historyAn index level series over time.
POST/api/content/indices/v1/levelsIndex levels.
POST/api/content/indices/v1/membershipThe index memberships a security has held, with entry and exit dates.
POST/api/content/indices/v1/searchFind indices by name, market or provider.
POST/api/content/indices/v1/weightOne security's weight in an index over time.
lending
POST/api/content/lending/v1/historySecurities-lending history.
POST/api/content/lending/v1/summaryCurrent securities-lending state for a security: balance, rate and availability where the market publishes them.
macro
POST/api/content/macro/v1/historyA macro series over time.
POST/api/content/macro/v1/observationsThe latest observation of a macro series.
POST/api/content/macro/v1/searchFind macro series by name, country or source.
market-analytics
POST/api/content/market-analytics/v1/correlationA correlation matrix across securities over a window.
POST/api/content/market-analytics/v1/performancePerformance statistics against a benchmark, including the risk-free leg where a Sharpe ratio is asked for.
POST/api/content/market-analytics/v1/regressionRegress a security against factors or a benchmark.
POST/api/content/market-analytics/v1/riskRisk statistics over a return window: volatility, drawdown, VaR, beta.
ownership
POST/api/content/ownership/v1/changesWhat institutions did in a security between two quarters.
POST/api/content/ownership/v1/holdersInstitutional holders of a security from 13F, N-PORT and BR/MX/PE local-fund disclosures.
POST/api/content/ownership/v1/insider-transactionsInsider activity, classified so the transaction codes do not have to be.
POST/api/content/ownership/v1/manager-holdingsOne manager's disclosed book: every position they reported for a quarter.
POST/api/content/ownership/v1/shareholdersRegistered and beneficial shareholders as disclosed to the local regulator, for markets that publish them.
peers
POST/api/content/peers/v1/searchCanonical peer set for one security (peer_universe.build_peer_universe).
portfolio
POST/api/content/portfolio/v1/analyticsRisk, exposure and performance analytics for a supplied portfolio of weights or positions.
POST/api/content/portfolio/v1/optimizeOptimize weights under constraints, over the same risk math the Construction workstation uses.
POST/api/content/portfolio/v1/walk-forwardOptimize at each as-of date on what was knowable then, hold the weights out of sample to the next, and chain the held-out segments -- beside 1/N over each step's eligible names and the bench
rates
POST/api/content/rates/v1/curveA yield curve: every tenor at one date.
POST/api/content/rates/v1/historyAn interest rate over time.
POST/api/content/rates/v1/rateAn interest rate on a date.
POST/api/content/rates/v1/spreadThe spread between two tenors on one curve, or across two curves.
reference
POST/api/content/reference/v1/calendarTrading sessions per market.
POST/api/content/reference/v1/calendar/offsetMove N trading days from an anchor date.
POST/api/content/reference/v1/filingsThe regulatory filing index for a security: what was filed, and when.
POST/api/content/reference/v1/identifier-historyEvery identifier a security has carried, with validity intervals.
regime
POST/api/content/regime/v1/historyThe regime classification over time.
POST/api/content/regime/v1/snapshotWhich market regime is in force now, and on what evidence.
POST/api/content/regime/v1/statsHow an asset behaved conditional on regime.
screener
POST/api/content/screener/v1/countHow many securities match a screen, without returning them.
POST/api/content/screener/v1/distinct-countDistinct values of one field across a screen -- how many sectors, how many countries -- without pulling the rows.
GET/api/content/screener/v1/fieldsFields available to screen on, with their types and permitted operators.
POST/api/content/screener/v1/point-in-timeRun a screen as it would have run on a past date.
POST/api/content/screener/v1/searchScreen the universe on any catalog metric and return the matching securities with the requested columns.
POST/api/content/screener/v1/statisticsAggregate statistics over a screen: count, mean, median, percentiles.
sustainability
GET/api/content/sustainability/v1/fieldsAvailable fields with units, definitions and current issuer coverage.
POST/api/content/sustainability/v1/historyDisclosed history for one measure, one point per reported period.
POST/api/content/sustainability/v1/summaryLatest disclosed workforce or environmental measure for an issuer.

Taxonomia de erros

CódigoSignificadoMapeamento no Excel
UNRESOLVED_IDENTIFIERNenhuma correspondência para o identificador (no mercado solicitado, se informado), ou nenhum dado na janela.#N/A
AMBIGUOUS_IDENTIFIERMúltiplos candidatos; qualifique com um sufixo de mercado ou use um entityId.#SPILL!
INVALID_IDENTIFIERIdentificador vazio ou malformado.#VALUE!
UNSUPPORTED_MARKETCódigo de mercado fora de US · BR · MX · PE · CL · CO.#N/A
UNSUPPORTED_METRICMétrica desconhecida, ou uma combinação de métrica/período que este endpoint não atende.#NAME?
FX_UNAVAILABLEA moeda solicitada não pode ser precificada para algumas linhas.#N/A
EXECUTION_ERRORUm job em lote ou handler falhou; detail explica.#VALUE!
429 + Retry-AfterLimite de taxa por chave excedido (padrão 1.200 requisições/minuto; overrides por chave na criação, aprovação de admin acima do padrão). Respeite Retry-After antes de tentar novamente.o suplemento tenta novamente até quatro vezes por conta própria; só então EDI rate limit reached

Falhas no nível da requisição usam os status HTTP padrão: 400 requisição malformada · 401 não autenticado · 404 id de lote desconhecido/expirado.

Limites de requisição

EndpointSíncronoEm lote (batch:"Y")
/resolve2.000 identificadores—
/prices — dia único1.000 ids2.000 ids
/prices — múltiplos dias100 ids1.000 ids
/fundamentals250 ids × 50 métricas5.000 ids × 50 métricas
/matrix500 ids × 50 métricas2.000 ids × 50 métricas
/screener/search1.000 linhas por páginaigual, enfileirado

Clientes & Excel

Python. O cliente de referência (edi_analytics.py) encapsula o login, o envelope e o polling de lotes, e traz os helpers de spill usados pela integração com o Excel — spill_scalar, spill_series, spill_fundamentals, spill_ratios, spill_matrix, spill_fibonacci — cada um retornando uma grade 2-D pronta para um dataframe ou uma matriz dinâmica.

Excel. O suplemento registra fórmulas exatamente sobre esta API. Comece pelo guia de instalação para Excel, que cobre tanto a implantação por um administrador do Microsoft 365 quanto a instalação individual. Também é possível baixar diretamente o manifesto de produção ou a pasta de trabalho de demonstração.

Microsoft 365 gerenciado pela empresa? Peça ao administrador para implantar o manifesto por meio de Aplicativos integrados. Os usuários receberão a faixa EDI sem manipular manifestos nem configurar pastas confiáveis.
excel
=EDI.VALUE("AAPL-US", "MARKET_CAP")                → um valor
=EDI.HISTORY("BBAS3-BR", "price", "2026-01-01", "2026-07-30", "M")   → spill de 7×2
=EDI.FUNDAMENTALS("AAPL-US", "REVENUE", "LTM")   → spill de períodos fiscais
=EDI.MATRIX(A2:A20, B1:F1)                          → spill de uma grade de comparáveis

Entradas inválidas degradam célula a célula (#N/A, #NAME?) — nunca uma atualização de pasta de trabalho que falha por inteiro. O suplemento agrupa as requisições de fórmula pela execução em lote automaticamente.

Qualquer outra stack. O documento OpenAPI 3 alimenta clientes gerados para outras linguagens.

Experimente

Entre com sua conta EDI e execute requisições ao vivo contra a API — todos os exemplos desta página são executáveis. As requisições rodam com as suas permissões de acesso, exatamente como rodariam a partir do Excel ou de um script.

Recursos em preparação

Estes eixos de requisição fazem parte do contrato, mas são deliberadamente rejeitados (HTTP 400, com mensagem explicativa) até que o maquinário que os sustenta entre em produção — você pode programar contra o vocabulário hoje sem risco de respostas erradas silenciosas: