EDI Analytics API
Acceso programático a los mismos motores que impulsan la plataforma EDI: resolución de valores en Estados Unidos, Brasil, México y Perú; precios globales de fin de jornada; estados financieros estandarizados con inteligencia de períodos fiscales; matrices entre dominios a fecha de corte; y ejecución asíncrona por lotes. Una misma solicitud produce la misma cifra en Excel, Python, la Quant Workstation y un reporte programado — la paridad es estructural, no algo que se verifica a posteriori.
Inicio rápido
Autentíquese una sola vez — la cookie de sesión lleva sus permisos de acceso en cada llamada posterior.
# 1. Inicie sesión (guarda la cookie de sesión) 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. Resuelva identificadores a ids canónicos de entidad 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. Una grilla de comparables entre mercados en USD, en una sola llamada 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"}'
O con el cliente de referencia en 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"])
Autenticación de servicio — claves de API
Para scripts, SDKs e integraciones servidor a servidor, cree una clave de API (actúa en su
nombre, con sus permisos) y envíela como X-API-Key o
Authorization: Bearer — sin cookies. Las claves se muestran una sola vez al
crearse, pueden expirar y son revocables; la gestión de claves siempre exige una sesión
iniciada, nunca una clave.
# Cree una clave (autenticado con sesión) y úsela donde quiera 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_…") —
omita login() por completo.
Conceptos fundamentales
El sobre de respuesta
Todos los endpoints de datos devuelven el mismo sobre de tres partes. Las filas en
data son planas y autodescriptivas — se serializan de forma idéntica a JSON, CSV y
rangos de derrame (spill) de Excel.
{
"data": [ /* filas de observación planas */ ],
"errors": [ /* fallas a nivel de fila — nunca una falla de la solicitud */ ],
"meta": { "pagination": { "total": 412 }, "registryVersion": "2026.07.16.1A" }
}Identificadores y el eco del requestId
Todos los endpoints aceptan directamente identificadores de tipos mixtos — tickers calificados
por mercado (PETR4-BR, BIMBOA-MX), tickers sin sufijo, códigos ISIN,
CUSIP, CIK e ids canónicos de entidad. Cada fila de respuesta lleva tanto requestId
(su identificador, exactamente como lo envió — la clave de unión de regreso a la celda de su hoja
de cálculo o al índice de su dataframe) como entityId (nuestra clave canónica,
estable frente a cambios de ticker y clases de acciones).
La falla parcial es la norma
Un ticker inválido jamás debe tumbar un libro de 500 celdas. Los identificadores no
resolubles, las métricas desconocidas y las conversiones que no pueden cotizarse regresan como
entradas en errors — cada una con un requestId, un code
estable y un detail legible — mientras todas las demás filas se devuelven con
normalidad.
Procedencia
Cada respuesta declara la versión del registro de métricas con la que fue valorizada
(meta.registryVersion), y las filas indican la divisa efectivamente devuelta. Las
cifras son auditables entre clientes: la misma solicitud produce el mismo valor en todas partes,
por construcción.
Vocabulario
Los parámetros de solicitud siguientes significan lo mismo en todos los endpoints que los aceptan.
Periodicidad (estados financieros)
| Valor | Significado |
|---|---|
FY | Años fiscales, tal como fueron reportados. |
QTR | Trimestres fiscales verdaderos. Los 10-Q almacenados como acumulados del año se desacumulan del lado del servidor; el Q4 se deriva del total del año fiscal cuando no se reporta. |
LTM | Suma móvil de los últimos cuatro trimestres al cierre de cada trimestre (flujos). Las partidas de punto en el tiempo devuelven su valor al cierre de ese trimestre. |
YTD | Acumulado dentro de cada año fiscal. |
SEMI | En preparación — a la espera de la normalización semestral. |
basis selecciona el eje de reexpresión: original (predeterminado) o
restated (en preparación — a la espera del modelado de vintages).
Frecuencia (precios y series)
| Valor | Observaciones conservadas |
|---|---|
D / AD | Cada día de negociación observado. |
W · M · CQ · CSA · CY | Último día de negociación de cada semana ISO / mes calendario / trimestre / semestre / año. |
AM · AQ · ASA · AY | Ancladas: avanzando en pasos desde su startDate (un inicio el 16 de junio produce 16 jun, 16 jul, …), tomando la última observación en cada fecha ancla o antes de ella. |
Ajuste de precios
| Valor | Significado |
|---|---|
SPLIT | Ajustado por splits (predeterminado; coincide con los cierres de plaza almacenados). Solo listados de EE. UU. — MX/BR/PE guardan la cadena ajustada por separado y devuelven un error de fila indicando DIV_SPIN_SPLITS. |
DIV_SPIN_SPLITS | Ajustado por dividendos, escisiones (spinoffs) y splits. |
UNSPLIT · SPLIT_SPINOFF | En preparación — requieren el historial de factores de ajuste. |
Moneda
currency tiene como valor predeterminado LOCAL: los valores se
devuelven en su moneda nativa de cotización o de reporte, indicada en cada fila — un libro
brasileño nunca recibe USD de forma silenciosa. Cualquier código ISO (USD,
BRL, MXN, EUR, …) se convierte del lado del servidor;
consulte conversión de divisas para saber qué tipo de cambio aplica en
cada caso.
Resolución de valores
/api/analytics/v1/resolveLa capa de identidad que sostiene todas las demás llamadas. Envíe hasta 2,000 identificadores
de tipos mixtos y reciba entidades canónicas con estructura empresa-versus-listado. Las filas que
comparten un entityId son clases de acciones / listados del mismo emisor, enumerados
bajo listings.
// POST /api/analytics/v1/resolve { "identifiers": [ {"value": "PETR4-BR"}, {"value": "US0378331005"}, {"value": "037833100", "type": "CUSIP"} ] } // 200 — una fila 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"} ] } ] }
- Los tickers sin sufijo se resuelven contra su mercado predeterminado, y en su defecto contra US. Califíquelos con un sufijo (
-BR,-MX,-PE,-US) para ser explícito; los tickers con guion comoBRK-Bse conservan intactos. candidateCount > 1marca un identificador ambiguo — los endpoints de datos los reportan como errores de fila en lugar de adivinar.- La forma del identificador se clasifica automáticamente; envíe
type(TICKER·ISIN·CUSIP·CIK·ENTITY_ID) para forzarla.
Catálogo de métricas
/api/analytics/v1/catalog/metricsEl registro autoritativo de todas las métricas que los motores pueden calcular — el mismo registro contra el que se ejecutan el screener de la plataforma, los paneles cuantitativos y el banco de fórmulas, incluidas las métricas de fórmula personalizadas de su organización. Si su autocompletado se alimenta de aquí, una solicitud nunca podrá nombrar una métrica que los motores no conozcan.
| Filtro | Significado |
|---|---|
dataset | financials_standardized · prices · valuation · derived · returns · entity_attributes · … |
search | Busca coincidencias en código, nombre y alias (?search=revenue). |
valueType | currency · percent · ratio · price · shares · text · … |
entityType | company · etf · fund · bond · manager |
includeDeprecated | Las métricas descontinuadas llevan un replacementMetricCode. |
kind | line (una partida del estado, reportada o estandarizada) · amount (un monto calculado) · ratio · market · attribute · holdings. |
industryProfile | industrial · bank · insurance · reit · fund: solo las métricas que existen para ese tipo de emisor. Cartera / Captación es una métrica bancaria; la razón circulante no lo es. |
market | US · MX · BR · PE · CL: las métricas multimercado más las presentadas en ese mercado (partidas como se reportaron, tenencias institucionales, préstamo de valores). |
limit / offset | Paginación; meta.pagination.total es el conteo filtrado. |
Cada fila indica además su lugar en la taxonomía de métricas: folderPath (partidas
bajo Estados financieros, indicadores bajo Razones e indicadores, una carpeta por familia
de razones, partidas como se reportaron por regulador), kind, basis
(standardized · as_reported · derived · observed),
statement, market, industryProfiles (vacío significa todo tipo de
emisor) y canonicalDataset, presente en la copia de un código que pertenece a otro conjunto
de datos. Los nombres llevan alias en español y portugués: ?search=deuda%20neta encuentra
NET_DEBT.
Cada fila declara su dataset, motor, tipo de valor, unidad, tipos de entidad admitidos, tipos de tiempo (a fecha de corte / serie de tiempo), modos de período y estatus.
Precios globales
/api/content/global-prices/v1/pricesOHLCV de fin de jornada en todos los mercados cubiertos, con contención de listados cruzados incorporada: una línea de São Paulo que comparte ticker con una emisión estadounidense nunca puede empalmarse en la serie de EE. UU. Las observaciones duplicadas se deduplican a una fila canónica por día de negociación.
// POST /api/content/global-prices/v1/prices { "ids": ["BBAS3-BR"], "startDate": "2026-01-01", "endDate": "2026-07-30", "frequency": "M", "fields": ["price", "volume"] } // 200 — observaciones de fin de mes, moneda nativa indicada en cada fila { "data": [ { "requestId": "BBAS3-BR", "entityId": "BR-1023", "date": "2026-06-30", "currency": "BRL", "price": 19.91, "volume": 31200400 }, … ] }
fields:price·priceOpen·priceHigh·priceLow·volume.adjustselecciona la base del precio.- Se admiten los once valores de frecuencia, con cortes de calendario y anclaje a la fecha de inicio.
- Con una
currency, cada observación se convierte al tipo de cambio spot de la fecha de esa observación; el volumen nunca se convierte.
Estados financieros
/api/content/fundamentals/v1/fundamentalsDatos fiscales estandarizados con la inteligencia de períodos de la plataforma. El servidor es el dueño de la semántica de períodos — almacenamiento acumulado del año, inferencia del cierre de año fiscal, derivación del Q4, ventanas LTM — para que ninguna fórmula tenga que serlo.
// POST /api/content/fundamentals/v1/fundamentals { "ids": ["AAPL-US"], "metrics": ["REVENUE"], "periodicity": "LTM", "fiscalPeriod": { "start": "2025-01-01", "end": "2026-07-30" } } // 200 — ingresos móviles de los últimos doce meses al cierre de cada trimestre fiscal { "data": [ { "requestId": "AAPL-US", "metric": "REVENUE", "periodicity": "LTM", "fiscalYear": 2026, "fiscalPeriod": "Q2", "fiscalEndDate": "2026-03-28", "currency": "USD", "value": 451442000000 }, … ] }
fiscalPeriod.start/endson fechas calendario; el servidor las resuelve a períodos fiscales completados. Ventana predeterminada: cinco años hacia atrás.- Las filas reportan la moneda de reporte del emisor, o la
currencyque usted solicitó después de la conversión. - Las métricas desconocidas son errores de fila por métrica; el resto de la solicitud se devuelve igualmente.
Taxonomías de estados, estados completos y períodos fiscales
Tres complementos de descubrimiento y consulta del endpoint de fundamentales:
| Endpoint | Devuelve |
|---|---|
GET /taxonomies?market=BR&template=banks | El plan de cuentas que efectivamente reportan ese mercado y formato — market: US·BR·MX·PE, template: industrials·banks·insurance, statement opcional. Cada fila trae código de cuenta, etiqueta, estado y cuántas empresas la reportan — para conocer las cuentas disponibles antes de consultar datos. Un balance de Bancos BR (activos interbancarios, cartera de créditos…) no es el de bancos de EE. UU. |
POST /statements | El estado financiero completo (IS, BS, CF o FULL) de cada id en una sola llamada, al período implicado por asOf — mode: "annual" (último ejercicio fiscal, predeterminado) o "latest" (último período presentado, valores tal como se reportaron). La conversión de moneda respeta el estado: balance al tipo de cambio de cierre del período, flujos al promedio del período. |
POST /segments | Desglose de ingresos por segmento de negocio, producto y geografía para emisores de EE. UU. (a partir de archivos estructurados): los nombres de segmento del propio emisor, valores tal como se reportaron, eliminaciones excluidas. dimension: business·product·geographic; cualquier métrica del catálogo. |
POST /periods | Los períodos fiscales reportados por cada empresa (año, período, fechas, cantidad de cuentas) — cobertura antes de consultar. |
// POST /api/content/fundamentals/v1/statements — una llamada, el estado completo { "ids": ["BBAS3-BR"], "statement": "FULL", "asOf": "2026-07-30", "currency": "USD" }
Ratios
POST /ratios — el catálogo de ratios como
serie: una pestaña completa (group), o ratios nombrados de cualquier pestaña,
con todas las partidas de flujo leídas en una misma base de período. Es la ventana de Ratios de la
aplicación web servida por API — la misma llamada al motor, así que una cifra aquí y una cifra allí
no pueden discrepar. La matriz sigue sirviendo cualquier ratio a una sola
fecha de referencia; este endpoint es para la historia.
// POST /api/content/fundamentals/v1/ratios { "ids": ["AAPL-US", "BIMBOA-MX"], "ratios": ["GROSS_MARGIN", "ROE", "PB"], "periodBasis": "ltm", "scale": "quarterly" } // 200 — una fila por (id, ratio, período); un ratio de flujo lleva la base con la que se leyó { "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ámetro | Significado |
|---|---|
group | valuation · profitability · returns · leverage · liquidity · efficiency · cash_flow · per_share · growth. Omítalo cuando ratios nombra los códigos: la pestaña de un ratio es una propiedad del ratio, y una solicitud que mezcla pestañas se responde pestaña por pestaña. |
periodBasis | ltm (predeterminado) · ytd · 3m · fy — cómo se lee cada partida de flujo (ingresos, EBITDA, flujo de caja). Los ratios de balance son de punto en el tiempo y no se mueven con ella; sus filas llevan periodBasis: null para que el lector sepa por qué la fila no cambió. |
scale | quarterly (predeterminado) · annual para las pestañas fundamentales; daily · weekly · monthly para valuación, cuyo numerador se mueve cada día de negociación y no tiene período fiscal. Crecimiento es solo anual. La escala se ajusta a lo que la pestaña y el emisor pueden cumplir, y cada fila lo declara en scaleClampReason: tab_grid, o issuer_reports_annually para los emisores que no presentan estados intermedios. |
asOf, start | Fecha de referencia (predeterminado hoy) y hasta dónde retroceder; sin start el alcance es el propio de la escala — diez años de trimestres, quince de años fiscales, dos de días. |
currency | Convierte solo las filas de magnitud monetaria (deuda total, capitalización, importes por acción); un ratio nunca se convierte. |
periodes un período fiscal (FY2026 Q3) en las cuadrículas fiscales y una fecha ISO en la cuadrícula de precios.periodEndfecha cada fila, porque los períodos no son comparables entre emisores: el FY2026 Q3 de Apple terminó el 2026-06-27 y el de un cierre de diciembre terminó el 2026-09-30.valueType: "percent"es una fracción — un margen bruto de 48,65 % es0.4865, la misma cifra que la matriz y el catálogo dan para el mismo código.- Retenido no es faltante. El margen bruto de un banco y el ratio préstamos/depósitos de una industrial vuelven como errores de fila
NO_DATAque dicen por qué; cada (id, ratio) solicitado produce un valor o un error, nunca una celda ausente en silencio. - GET
/ratios/fieldslista cada ratio que sirve el endpoint con su pestaña, fórmula, tipo de valor, escalas y los tipos de emisor para los que existe — léalo antes de construir una consulta.
Point-in-time
POST /point-in-time — fundamentales tal como se
conocían en una fecha, para backtesting sin sesgo de anticipación (emisores de EE. UU.). Dos
garantías: un período fiscal es invisible hasta la fecha de publicación de su presentación (el
trimestre de diciembre de Apple no existe antes del 30 de enero), y si una cifra se reexpresa
después, se sirve el valor vigente en pitDate — las filas traen
firstPublished, lastPublished (enmiendas) y valueVintage
(as_known cuando aplica una vigencia capturada; la captura de reexpresiones acumula
desde el 2026-08-02). pitDataItems=true en el catálogo lista las métricas con
capacidad PIT. FY y QTR; componga LTM del lado cliente con trimestres PIT.
Matriz
/api/analytics/v1/matrixMuchos valores × muchas métricas a una sola fecha de corte, en una sola solicitud — la primitiva de la grilla de comparables. Las métricas pueden mezclar datasets libremente: precios, estados financieros, múltiplos de valuación, medidas derivadas y atributos de texto regresan todos por el mismo sobre.
// 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 — una celda por (id, métrica); as-of = última observación en la fecha o antes { "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" } ] }
- Los nombres de métrica que colisionan entre datasets se resuelven por una precedencia documentada — ganan los estados financieros reportados. Envíe un par
{"metric": "…", "dataset": "…"}explícito para forzarlo;GET /catalog/metricsindica qué datasets sirven cada nombre. - Las métricas de estados financieros aceptan
periodMode: "fy"para valores del último año fiscal; use el endpoint de estados financieros para series QTR/LTM/YTD de partidas, el endpoint de ratios para series de ratios en la base de período que elija, o las métricas de valuación precalculadas (PE_LTM,EV_EBITDA_LTM, …). - Las celdas cuyo cálculo resulta nulo se omiten, no son errores — una hoja de cálculo las rellena con
#N/A.
Screener
/api/content/screener/v1/searchEjecute filtros (screens) sobre el mismo motor que el screener de la plataforma — condiciones
sobre métricas financieras, métricas de precio, múltiplos de valuación y las métricas de fórmula
personalizadas de su organización, con filtros de sector, bolsa, país y universo. Endpoints
complementarios:
POST /count devuelve el conteo de coincidencias sin
materializar filas (conéctelo a un indicador en vivo de «N empresas coinciden»), y
GET /fields lista todos los campos filtrables.
// 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 — una fila por valor coincidente; meta.pagination.total = conteo total de coincidencias { "data": [ { "ticker": "AAPL", "entityId": "0000320193", "sector": "Technology", "nativeCurrency": "USD", "marketCap": 4925847973597, "metrics": { "REVENUE": 451442000000, "PE": 43.9 } }, … ] }
- Operadores:
gt·gte·lt·lte·eq·neq. Una empresa a la que le falta una métrica condicionada no pasa el filtro. currencyaquí tiene como valor predeterminado USD (no LOCAL): los umbrales de un screening comparan entre emisores, lo que exige una moneda común. Las filas siguen indicando sunativeCurrency;meta.fxRateDaterevela la fecha del tipo de cambio utilizado.tickersrestringe el universo de candidatos;batch:"Y"encola los screenings grandes a través de la ejecución por lotes.- Los listados cancelados se excluyen por defecto. Omitir
excludeStatusaplica la lectura de la plataforma de "no consta como muerto": se descartan los listados cuyo estado escancelled/cancelado. Miles de emisores estadounidenses deslistados conservan sus últimos estados financieros (para el trabajo point-in-time), y un screening de ratios listaría de otro modo empresas muertas desde 2012 — una prueba de negociación reciente no las detectaría, porque muchas siguen cotizando centavos en el mercado extrabursátil. PaseexcludeStatus: []para incluirlas, ostatuspara seleccionar por estado explícitamente;tradedWithinDayssigue siendo la prueba de liquidez aparte y opcional.
Screening a fecha pasada
POST /api/content/screener/v1/point-in-time — ejecuta un screening tal como se
habría ejecutado en una fecha pasada. El screener normal es de tiempo presente: correrlo con
umbrales antiguos indica cuáles de los supervivientes de hoy pasarían hoy.
- Cada fila lleva
fiscalYear,fundamentalsPeriodEnd,fundamentalsPublishedyavailabilityBasis: el screening es reproducible porque se ve qué presentación juzgó a cada valor. currencyes USD por defecto y convierte al tipo de cambio de la fecha consultada, no al de hoy. Los ratios nunca se convierten.- Un emisor cuya moneda no pueda valorarse en esa fecha se excluye y se informa como error
FX_UNAVAILABLE, nunca se compara sobre otra base.
MARKET_CAP, PE, PB, PS y EV
devuelven un error de fila en lugar de un número. Formar una capitalización histórica exige que
precio y número de acciones estén en la misma base de splits, y el histórico de precios no lo
está: una parte es tal como se negoció y otra está ajustada a una fecha de actualización que
varía por ticker. El resultado sería correcto para unos emisores y erróneo por el factor del
split para otros, sin nada en la respuesta que lo indique.Fondos
/api/content/funds/v1/…Datos de fondos de mercado local en Brasil (más de 65,000 fondos registrados),
México y Perú, con las convenciones de identificadores que cada mercado realmente utiliza: los
fondos BR se resuelven por CNPJ en cualquier formato
(00.000.684/0001-21 o 00000684000121), los fondos MX y PE por ticker o
id de entidad. Cuatro endpoints comparten un mismo contrato:
| Endpoint | Devuelve |
|---|---|
POST /summary | Atributos de registro: nombre, clasificación, operador/administrador, benchmark, estatus, moneda nativa. |
POST /prices | Series de NAV (fields: ["nav", "netAssets"]) con el vocabulario completo de frecuencia. |
POST /returns | Rendimientos periódicos calculados a partir del NAV a la frecuencia muestreada. Los NAV de los fondos son de tipo acumulación, por lo que se trata de rendimientos totales. |
POST /flows | Aportes / rescates / flujo neto diarios — solo BR, donde el mercado reporta a diario; los demás mercados devuelven un error de fila, nunca silencio. |
POST /holdings | Cartera de los fondos BR/MX/PE y de los ETFs de EE. UU. al último reporte en o antes de asOf: nombre, identificadores, clase de activo, cantidad, valor de mercado, peso. top limita las filas (50 por defecto). |
Tenencias institucionales viven en
/api/content/ownership/v1: POST /holders
devuelve quién posee un valor (por gestor: gana la última presentación del trimestre objetivo — las
enmiendas prevalecen), y POST /manager-holdings
devuelve la cartera de un gestor por CIK. El universo completo de gestores declarantes (~9.000)
está cubierto para cada trimestre ya vencido; como estas divulgaciones vencen 45 días después del
cierre del trimestre, las listas de tenedores apuntan por defecto al último trimestre
completamente vencido — pase includePartial: true durante una ventana de
presentación para ver el trimestre en curso. Los valores están en USD; los pesos son porcentaje
del valor reportado.
// POST /api/content/funds/v1/prices { "ids": ["00000684000121", "+TASAD1F1"], "fields": ["nav", "netAssets"], "startDate": "2026-01-01", "endDate": "2026-07-30", "frequency": "M", "currency": "USD" }
- Las series BR corresponden a la clase principal del fondo; los fondos PE llevan moneda por emisión (PEN o USD), indicada en cada fila.
currencyconvierte los campos monetarios (NAV, activos netos, flujos) al tipo de cambio spot de cada observación, exactamente como en precios globales.
Datos de referencia
Identidad histórica y el registro documental que la respalda. Ambos responden a la misma pregunta: qué significaba este identificador entonces — la clave de cruce que necesita cualquier conjunto de datos histórico ajeno a nuestro universo.
Historial de identificadores
POST /api/content/reference/v1/identifier-history — cada ticker, ISIN, CUSIP, CIK,
mercado y MIC que ha llevado un valor, con sus intervalos de vigencia, desde 1926. Cada fila
incluye el código del evento corporativo que provocó el cambio, de modo que un cambio de nombre se
distingue de una fusión.
asOf devuelve los intervalos vigentes en
esa fecha.// POST /api/content/reference/v1/identifier-history { "ids": [ "AAPL" ], "asOf": "2019-06-28" }
identifierTypesfiltra porTICKER·ISIN·CUSIP·CIK·EXCHANGE·MIC·MIC_SEGMENT·SECURITY_DESCRIPTION— los mismos términos que acepta/resolve, así que un valor devuelto puede reenviarse tal cual.startDate/endDateseleccionan intervalos vigentes en algún momento de la ventana, no los que comenzaron dentro de ella.- Procede del maestro de valores de EDI: listados de EE. UU. Cualquier otro mercado devuelve un error de fila, no un resultado vacío — que sería indistinguible de «nunca cambió».
Índice de documentos regulatorios
POST /api/content/reference/v1/filings — 2,2 millones de presentaciones ante la
regulatorios de EE. UU. de 20.205 emisores desde 1993: tipo de formulario, fecha, cierre de periodo, número de
accession, tipo de enmienda y URL del documento. El reloj de eventos para estrategias basadas en
anuncios, y la trazabilidad de cada dato fundamental que servimos.
formTypes compara por prefijo: 10-K incluye 10-K/A. Una
enmienda es el mismo evento representado, y suele ser justamente la reexpresión que se busca.
Factores de ajuste de derechos corporativos
/corporate-actions ahora devuelve priceFactor,
shareFactor, cashComponent, affectsSplitAdjusted,
affectsTotalReturn y factorStatus junto a los términos del evento, para
que pueda reconstruir su propia serie ajustada y conciliarla con la nuestra.
ratioOld: 1 y ratioNew: 9, y el
factor de precio es 0,1 — un 10 por 1. Derivar el multiplicador del ratio daría 9×.
Cuando un factor no pudo calcularse, los campos son nulos y factorStatus indica el
motivo, en lugar de omitir la fila.Calendarios bursátiles
POST /api/content/reference/v1/calendar — las sesiones que cada mercado opera
realmente, para EE. UU., BR, MX y PE, desde los años noventa hasta 2029. Los días no hábiles
llevan el motivo; use includeNonTrading para obtener el calendario completo.
originesobserved(una sesión con precios en nuestro almacén),scheduled(derivada de reglas, la única disponible para fechas futuras) oboth. Quien planifique un rebalanceo a dos años puede distinguirlas.- Cuando las reglas y los precios discrepan, la fila conserva lo observado e indica el
conflict. Un día de duelo nacional se anuncia, no se deduce de una regla. sessionseñala los cierres anticipados de EE. UU. Ningún otro mercado los publica con la fiabilidad necesaria para afirmar lo mismo.
Aritmética en días de negociación
POST /api/content/reference/v1/calendar/offset — desplace N días de negociación
desde una fecha ancla. La liquidación T+2, la programación de rebalanceos y las ventanas de
eventos son la misma pregunta, y todas resultan erróneas si se responden en días naturales.
- Un
offsetde0ajusta a la sesión vigente en la fecha ancla o antes — lo que significa una fecha «as of» cuando cae en feriado. - Si el calendario se agota antes que el desplazamiento,
resultDatees nulo ytradingDaysAvailableindica hasta dónde llegó. Ajustar al borde devolvería una fecha verosímil y equivocada.
Operaciones de insiders
POST /api/content/ownership/v1/insider-transactions — 1,75 millones de registros
del Formulario 4 desde 2004, con la relación del declarante con el emisor (consejero, directivo,
titular del 10%) incorporada.
Dos distinciones que las presentaciones no hacen por sí solas y que, de lo contrario, habría que reconstruir:
- No todo código es una operación. El Formulario 4 mezcla compras y ventas de mercado
(P/S) con concesiones (A), ejercicios de opciones (M/X) y retenciones fiscales (F). Sumarlos
produce una cifra que parece actividad de negociación y no lo es: cada fila lleva una
clasificación
activityy el endpoint filtra por defecto a mercado abierto. - Las filas de derivados son objetos distintos. Sumar acciones de derivados y no
derivados cuenta dos veces un ejercicio y la operación que lo liquida.
securityBucketes explícito y filtrable.
Renta fija
POST /api/content/fixed-income/v1/search ·
/reference · /prices — papel mexicano,
corporativos peruanos y debentures brasileñas. 2,2 M de observaciones de
precio; un universo de bonos se descubre, no se conoce por ticker, así que
conviene empezar por search.
indexBasis dice "DI + 1,6%" y
spreadOverIndex lleva el spread indicativo sobre ella.
yieldToMaturity es null en una fila brasileña,
porque un 0,74 junto al 6,52 mexicano afirmaría que el crédito brasileño
rinde una séptima parte del mexicano, en vez de DI más 0,74.- Las duraciones vienen en años en todos los casos. Brasil publica dias úteis, convertidos con 252, el propio divisor de la curva DI.
- El porcentaje sobre par se sirve solo donde la fuente lo publica (PE, BR).
México maneja 114 valores nominales distintos, así que una razón derivada
de su maestro sería una normalización que nadie puede sostener;
parValueviaja en la fila de referencia. - Nada se convierte de divisa: un rendimiento es una tasa y una duración es tiempo. Cada fila declara su moneda.
- Las calificaciones vuelven como un mapa por agencia: seis califican papel mexicano y no coinciden entre sí.
Comisiones de fondos
POST /api/content/funds/v1/fees — ratios de gastos, comisiones
de gestión y de éxito, cargas y rotación. Clases estadounidenses a partir de
la información del prospecto (7,58 M de hechos sobre 64.931 clases), fondos
brasileños a partir de sus propias divulgaciones regulatorias.
grossExpenseRatioynetExpenseRationunca se colapsan en una sola cifra: la diferencia es una exención, y las exenciones caducan.- Todos los campos de una fila provienen de un documento, cuya fecha está en la fila. Leer el valor más reciente de cada campo por separado producía esquemas de comisiones que ningún prospecto llegó a declarar.
asOfelige la divulgación más reciente publicada en esa fecha o antes.
Cambios de propiedad
POST /api/content/ownership/v1/changes — qué hicieron las
instituciones en un valor entre dos trimestres: quién entró, amplió, recortó o
salió, ordenado por lo que efectivamente se movió.
EXITED solo cuando el gestor sí presentó ese
trimestre; quien no presentó nada es NOT_FILED.- Ambas carteras se arman con la autoridad de tenencias institucionales de la plataforma: una enmienda NEW HOLDINGS es aditiva, no sustitutiva, de modo que una cartera es la presentación base más todas las enmiendas aditivas posteriores. Leída como reemplazo, la cartera de un gestor salía en 47,0 mm USD frente a unos 4.042,9 mm USD reales.
- Acciones:
NEW·ADDED·TRIMMED·EXITED·NOT_FILED·UNCHANGED, filtrables.
Investigación
La superficie de investigación académica: paneles punto-en-el-tiempo sobre universos históricos seguros frente al sesgo de supervivencia, fijados por Research Snapshots citables. Cada respuesta de dataset antepone sus diagnósticos — cobertura del universo, hechos retenidos por PIT, métricas vacías — porque un panel luce igual de completo al 6% que al 96% de cobertura sin ellos. Los métodos están documentados en los doce capítulos de metodología del paquete académico.
Acceso. La misma autenticación que todos los endpoints (clave API o sesión). Mientras la sección Academia esté en fase de prueba, los endpoints de investigación requieren además el rol de investigación en su cuenta.
Descargas — el paquete académico
Autoalojado y versionado con la plataforma: la rueda (wheel) del SDK edifinance, los cuadernos de enseñanza en tres idiomas (inglés, español, portugués — libros de Excel de muestra incluidos), y los doce capítulos de metodología. El SDK no está en PyPI mientras Academia esté en fase de prueba — instálalo directo desde aquí (funciona también en Colab).
# el SDK no está en PyPI todavía — instálalo desde la plataforma
pip install https://api.edi.finance/static/academic/edifinance-0.1.1-py3-none-any.whl- edi-academic-package.zip — todo: la rueda del SDK, cuadernos (en/es/pt), capítulos de metodología, libros de Excel.
- edifinance-0.1.1-py3-none-any.whl — solo el SDK de Python.
- notebooks/README.md — el inventario de cuadernos; archivos individuales bajo
/static/academic/notebooks/.
Universos históricos
/api/research/universesDefiniciones de universo con conteo de snapshots. Resolver una a una fecha produce una
membresía inmutable: el estado se guarda a esa fecha (un valor deslistado en 2022
es active en un snapshot de 2019), y los miembros sin precios se marcan
price_coverage: none, nunca se eliminan — eliminarlos es el sesgo de
supervivencia que este motor existe para prevenir.
# membresía a una fecha, en forma de tabla
curl -s "https://api.edi.finance/api/research/excel/universe?code=BR_ALL_EQUITY&as_of=2022-12-31" \
-H "X-API-Key: $EDI_KEY"Constructor de datasets — paneles PIT
/api/research/dataset-buildConstruye un panel desde una definición nombrada (créela vía
POST /api/research/dataset-definitions) y devuelve una vista previa acotada más
diagnósticos del panel completo. En modo PIT, un hecho cuya disponibilidad no puede
probarse se retiene y se cuenta — nunca se sirve por conjetura. La cobertura PIT es honesta
por mercado: EE. UU. y Brasil con soporte completo; México parcial; Perú sin soporte.
# instalación del SDK: ver Descargas arriba (aún no en PyPI) from edifinance import ResearchClient rc = ResearchClient(api_key="…") df = rc.panel(universe="BR_ALL_EQUITY", metrics=["REVENUE", "NET_INCOME"], start="2019-12-31", end="2023-12-31", point_in_time=True) df.attrs["diagnostics"] # cobertura, hechos retenidos, código de snapshot
- Las definiciones son nombradas y reutilizables; el SDK deriva nombres deterministas para que llamadas idénticas compartan una definición.
- Con
snapshot_labelse genera un Research Snapshot citable de la corrida. - Excel:
=EDI.DATASET(…)despliega el mismo panel con una línea de procedencia como fila 1.
Research Snapshots
/api/research/research-snapshotsUn snapshot (EDI-RS-<año>-<token>) fija todo lo necesario para recrear un
análisis: fecha de conocimiento, el snapshot de universo congelado, hashes de
contenido de los registros de métricas y factores, políticas de moneda y ajuste, el
payload de la solicitud y un hash del dataset independiente del orden. Los snapshots
publicados son inmutables por trigger de base de datos — una cita resuelve para siempre.
Procedencia de un código: GET /api/research/excel/snapshot/{code} (también
=EDI.SNAPSHOT(code) en Excel).
Estudios de eventos
/api/research/event-studyEjecuta un estudio ya sembrado: retornos anormales por modelo de mercado o ajustados por mercado, AAR/CAAR con prueba t transversal, ventanas en días de negociación, fechas de evento mapeadas a la siguiente sesión (los eventos de presentación en EE. UU. usan la marca de tiempo de aceptación regulatoria — dos tercios llegan tras el cierre y pertenecen a la sesión siguiente). Los eventos descartados se cuentan por motivo. La validación permanente del motor es una prueba placebo: fechas aleatorias no deben encontrar nada.
curl -s -X POST https://api.edi.finance/api/research/event-study \
-H "X-API-Key: $EDI_KEY" -H "Content-Type: application/json" \
-d '{"definition_name": "us_earnings_announcements"}'Ejecución por lotes
Todos los endpoints de datos aceptan "batch": "Y" con el cuerpo de solicitud
idéntico — cambie una sola bandera cuando un libro crezca más allá de los límites síncronos.
La rama por lotes ejecuta la misma ruta de código que la síncrona, por lo que los resultados son
idénticos por construcción.
| Paso | Llamada | Respuesta |
|---|---|---|
| 1. Enviar | POST a cualquier endpoint de datos con "batch":"Y" | 202 + encabezado Location; el cuerpo incluye el id del trabajo |
| 2. Consultar | GET /api/analytics/v1/batch-status?id=… | 202 mientras corre · 201 al terminar (+Location) · 200 con status:"error" en caso de falla |
| 3. Recuperar | GET /api/analytics/v1/batch-result?id=… | 200 con el sobre estándar |
Los trabajos pertenecen a la cuenta que los envía y expiran a las 24 horas. Los trabajos
fallidos entregan un sobre EXECUTION_ERROR por el mismo contrato.
Exportación masiva
La ejecución por lotes escala un libro de Excel. La exportación masiva resuelve el problema contrario: cargar un conjunto de datos en su propio almacén y mantenerlo al día. Un trabajo, un archivo comprimido y un cursor exacto desde el que continuar.
| Paso | Llamada | Respuesta |
|---|---|---|
| 0. Descubrir | GET /api/content/bulk/v1/datasets | Conjuntos exportables, su proyección exacta de columnas y si admiten carga incremental |
| 1. Enviar | POST /api/content/bulk/v1/export | 202 + Location; el cuerpo lleva el id |
| 2. Consultar | GET /api/content/bulk/v1/status?id=… | status, rowCount, byteCount, nextChangedSince |
| 3. Descargar | GET /api/content/bulk/v1/download?id=… | El archivo — CSV comprimido o NDJSON |
# Carga inicial: todo el histórico de precios en un archivo curl -b cookies.txt -X POST https://api.edi.finance/api/content/bulk/v1/export \ -H "Content-Type: application/json" -d '{"dataset": "prices_eod"}' # Cada noche: solo lo escrito desde la última descarga 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 es el contrato. Un trabajo completado informa
la marca de escritura más alta que realmente incluyó. Reenvíela tal cual y la siguiente descarga
continúa exactamente donde terminó la anterior: nada escrito durante la ejecución se pierde ni se
repite. Usar su propio reloj, o now, pierde filas en silencio.- Nueve conjuntos hoy:
prices_eod,corporate_actions,corporate_action_factors,identifier_history,filings_index,insider_transactions,fundamentals_standardized,index_levels,fund_monthly_returns. - Una ventana de fechas y
changedSinceson alternativas, nunca ambas: una selecciona un periodo, la otra lo que ha cambiado. - Los conjuntos sin marca de escritura rechazan
changedSincede forma explícita en lugar de devolverlo todo cada vez, que parecería un feed incremental en funcionamiento. - Las columnas son una proyección declarada por conjunto: una columna añadida internamente nunca aparece sin aviso en su almacén. Los archivos caducan a las 48 horas.
- Se ejecutan dos exportaciones simultáneas en toda la plataforma; una tercera recibe
429conRetry-After.
Estado de los conjuntos de datos
GET /api/analytics/v1/datasets — por conjunto: ventana de cobertura, última carga,
recuentos de filas y entidades, qué endpoints lo sirven y un veredicto de frescura.
lastObservationes la última fecha hábil presente en los datos;lastLoadedAtes la última escritura. Responden a preguntas distintas — un cargador que corrió hace una hora sin escribir nada nuevo es un fallo distinto de uno que lleva una semana sin ejecutarse — por eso son campos separados, ylastLoadedScopeindica qué midió exactamente la sonda de escritura.freshnessesFRESH·LAGGING·STALE·UNKNOWN, evaluado contra unexpectedLagBusinessDayspropio de cada conjunto. Un único umbral no sirve para un feed diario de precios y para una declaración trimestral de participaciones, así que también se devuelve el desfase en días hábiles para que aplique su propio criterio.rowCountIsEstimateddistingue una estimación del planificador de un recuento exacto.computedAtes la actualización que produjo la fila: un refrescador detenido informa su propia antigüedad en vez de hacer pasar cobertura vieja por actual.
Conversión de divisas
La conversión se realiza del lado del servidor y es sensible a la semántica — a cada valor se le aplica el tipo de cambio correcto:
| Tipo de valor | Tipo de cambio aplicado |
|---|---|
| Observaciones de precio | Tipo de cambio spot en la fecha de cada observación. |
| Partidas de flujo (estado de resultados / flujo de efectivo) | Tipo de cambio promedio del período sobre la ventana fiscal. |
| Partidas de saldo (balance general) | Tipo de cambio spot al cierre del período fiscal. |
| Celdas de matriz (tipo divisa/precio) | Tipo de cambio spot a la fecha de corte (as-of). |
| Volumen, razones, porcentajes, texto | Nunca se convierten. |
Los tipos de cambio cruzados se componen a través del USD. Una conversión que no puede
cotizarse — moneda de origen desconocida, par no admitido, sin tipo de cambio dentro de la ventana
de vigencia — es un error de fila FX_UNAVAILABLE y las filas afectadas se descartan:
usted nunca recibe de forma silenciosa valores nativos sin convertir.
CSV en todas partes. Envíe Accept: text/csv a cualquier endpoint de
datos y las filas planas del sobre vuelven como archivo CSV — los mapas anidados se aplanan a
columnas con punto, los errores por fila acompañan como líneas de comentario # y
registryVersion queda estampado al final. El camino más rápido de cualquier endpoint
a una hoja de cálculo o dataframe.
Í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.
| Method | Path | Summary |
|---|---|---|
| analytics | ||
| GET | /api/analytics/v1/batch-result | Download a finished batch job's envelope. |
| GET | /api/analytics/v1/batch-status | Status 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-presets | Canonical equity presets; metric instances resolve through the catalog. |
| GET | /api/analytics/v1/catalog/fund-presets | Canonical Fund Quant presets resolved against market source capability. |
| GET | /api/analytics/v1/catalog/metrics | The 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/datasets | Coverage and freshness per dataset: how far it reaches, when it last moved. |
| GET | /api/analytics/v1/health | Liveness 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/inspect | Cell-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/keys | The caller's API keys and their status. |
| POST | /api/analytics/v1/keys | Issue an API key. |
| DELETE | /api/analytics/v1/keys/{key_id} | Revoke one API key immediately. |
| GET | /api/analytics/v1/keys/{key_id}/usage | Daily usage rollups for one of the caller's keys (session-only). |
| POST | /api/analytics/v1/matrix | Cross-domain retrieval: any set of ids against any set of metrics, each cell routed to the dataset that owns it. |
| POST | /api/analytics/v1/resolve | Resolve tickers, ISINs, CUSIPs, CIKs or entity ids to the platform's canonical security, with the candidates when one is ambiguous. |
| POST | /api/research/dataset-build | Run a build and return a PREVIEW plus the full diagnostics. |
| GET | /api/research/dataset-definitions | Named, reusable panel definitions: universe, metrics, window, frequency, PIT mode, currency. |
| POST | /api/research/dataset-definitions | Create a named panel definition. |
| POST | /api/research/dataset-export | Download a full panel as CSV or XLSX (§67). |
| GET | /api/research/dataset-runs | Recent builds with row counts, dataset hashes, full diagnostics, and any minted snapshot codes. |
| GET | /api/research/event-studies | Seeded event-study definitions: model, benchmark, windows, and event counts. |
| POST | /api/research/event-study | Thin transport over the event-study engine (§82 names this route; the engine predates it). |
| POST | /api/research/excel/panel | The =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/universe | The =EDI.UNIVERSE() backend. |
| GET | /api/research/metrics | Metrics that actually have facts, with their coverage. |
| GET | /api/research/research-snapshots | Research Snapshots: citation code, status, knowledge date, universe, registry hashes, and dataset hash. |
| POST | /api/research/snapshots/{snapshot_code}/replay | One-call snapshot replay (§27): re-run the build a citation pins and return the comparison as evidence. |
| GET | /api/research/universes | Universe definitions with markets, benchmark linkage, and snapshot counts. |
| bulk | ||
| GET | /api/content/bulk/v1/datasets | Which datasets can be exported, with their column projection. |
| GET | /api/content/bulk/v1/download | Stream the finished export file. |
| POST | /api/content/bulk/v1/export | Queue a whole-dataset export; poll status, then download one file. |
| GET | /api/content/bulk/v1/status | Progress of one export, or every export this account has queued. |
| fixed-income | ||
| POST | /api/content/fixed-income/v1/prices | Daily bond observations: price, yield, duration, spread. |
| POST | /api/content/fixed-income/v1/reference | Terms for specific bonds: coupon, maturity, par, amount issued, ratings. |
| POST | /api/content/fixed-income/v1/search | Find bonds across MX, PE, BR and CL by issuer, currency, maturity or ISIN. |
| formula | ||
| GET | /api/content/formula/v1/catalog/metrics | Metrics a formula may reference, with their argument shapes. |
| GET | /api/content/formula/v1/definitions | Formulas 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}/versions | Every saved version of a formula, newest first. |
| POST | /api/content/formula/v1/execute | Evaluate a formula for a set of securities and dates. |
| POST | /api/content/formula/v1/validate | Parse and type-check an expression without running it. |
| fundamentals | ||
| POST | /api/content/fundamentals/v1/fundamentals | Standardized fundamentals on one fiscal basis: FY, QTR, LTM or YTD. |
| POST | /api/content/fundamentals/v1/periods | Which fiscal periods exist for a security, and their end dates -- the calendar to ask fundamentals questions against. |
| POST | /api/content/fundamentals/v1/point-in-time | Fundamentals as they stood on a past date, resolved through the publication ladder so a restatement cannot leak backwards. |
| POST | /api/content/fundamentals/v1/ratios | Financial 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/fields | Every ratio the ratios endpoint serves: tab, formula, value type, grid scales and the issuer types it exists for. |
| POST | /api/content/fundamentals/v1/segments | Reported business and geographic segments. |
| POST | /api/content/fundamentals/v1/statements | Full financial statements as a hierarchy of line items, standardized or as reported. |
| GET | /api/content/fundamentals/v1/taxonomies | Statement taxonomies available per market, and the line items in each. |
| funds | ||
| POST | /api/content/funds/v1/aum | Assets under management history. |
| POST | /api/content/funds/v1/fees | What a fund costs to hold: expense ratios, fees and loads. |
| POST | /api/content/funds/v1/flows | Net subscriptions and redemptions per period. |
| POST | /api/content/funds/v1/holdings | Disclosed portfolio holdings for a fund at a reporting date. |
| POST | /api/content/funds/v1/portfolio/analytics | Risk and exposure analytics computed over a fund's disclosed holdings. |
| POST | /api/content/funds/v1/prices | Fund NAV and market price history. |
| POST | /api/content/funds/v1/rankings | Peer rankings within a fund category over a chosen window. |
| POST | /api/content/funds/v1/registry | Bulk share-class registry for a market, including point-in-time returns. |
| POST | /api/content/funds/v1/returns | Fund returns as reported and as computed from NAV. |
| POST | /api/content/funds/v1/summary | Identity and headline facts for a fund or share class. |
| fx | ||
| POST | /api/content/fx/v1/average | The 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/history | An FX pair over time. |
| POST | /api/content/fx/v1/rate | A spot FX rate on a date. |
| POST | /api/content/fx/v1/translate | Translate 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-actions | Splits, dividends and other corporate actions with the price and share factors derived from them. |
| POST | /api/content/global-prices/v1/prices | End-of-day prices across all covered markets. |
| POST | /api/content/global-prices/v1/returns | Period returns over named windows, price or total return. |
| POST | /api/content/global-prices/v1/returns-range | Returns between two explicit dates. |
| POST | /api/content/global-prices/v1/returns/snapshot | Standard 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/changes | Additions and deletions between two constituent dates. |
| POST | /api/content/indices/v1/constituents | Index constituents and weights at a date. |
| POST | /api/content/indices/v1/history | An index level series over time. |
| POST | /api/content/indices/v1/levels | Index levels. |
| POST | /api/content/indices/v1/membership | The index memberships a security has held, with entry and exit dates. |
| POST | /api/content/indices/v1/search | Find indices by name, market or provider. |
| POST | /api/content/indices/v1/weight | One security's weight in an index over time. |
| lending | ||
| POST | /api/content/lending/v1/history | Securities-lending history. |
| POST | /api/content/lending/v1/summary | Current securities-lending state for a security: balance, rate and availability where the market publishes them. |
| macro | ||
| POST | /api/content/macro/v1/history | A macro series over time. |
| POST | /api/content/macro/v1/observations | The latest observation of a macro series. |
| POST | /api/content/macro/v1/search | Find macro series by name, country or source. |
| market-analytics | ||
| POST | /api/content/market-analytics/v1/correlation | A correlation matrix across securities over a window. |
| POST | /api/content/market-analytics/v1/performance | Performance statistics against a benchmark, including the risk-free leg where a Sharpe ratio is asked for. |
| POST | /api/content/market-analytics/v1/regression | Regress a security against factors or a benchmark. |
| POST | /api/content/market-analytics/v1/risk | Risk statistics over a return window: volatility, drawdown, VaR, beta. |
| ownership | ||
| POST | /api/content/ownership/v1/changes | What institutions did in a security between two quarters. |
| POST | /api/content/ownership/v1/holders | Institutional holders of a security from 13F, N-PORT and BR/MX/PE local-fund disclosures. |
| POST | /api/content/ownership/v1/insider-transactions | Insider activity, classified so the transaction codes do not have to be. |
| POST | /api/content/ownership/v1/manager-holdings | One manager's disclosed book: every position they reported for a quarter. |
| POST | /api/content/ownership/v1/shareholders | Registered and beneficial shareholders as disclosed to the local regulator, for markets that publish them. |
| peers | ||
| POST | /api/content/peers/v1/search | Canonical peer set for one security (peer_universe.build_peer_universe). |
| portfolio | ||
| POST | /api/content/portfolio/v1/analytics | Risk, exposure and performance analytics for a supplied portfolio of weights or positions. |
| POST | /api/content/portfolio/v1/optimize | Optimize weights under constraints, over the same risk math the Construction workstation uses. |
| POST | /api/content/portfolio/v1/walk-forward | Optimize 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/curve | A yield curve: every tenor at one date. |
| POST | /api/content/rates/v1/history | An interest rate over time. |
| POST | /api/content/rates/v1/rate | An interest rate on a date. |
| POST | /api/content/rates/v1/spread | The spread between two tenors on one curve, or across two curves. |
| reference | ||
| POST | /api/content/reference/v1/calendar | Trading sessions per market. |
| POST | /api/content/reference/v1/calendar/offset | Move N trading days from an anchor date. |
| POST | /api/content/reference/v1/filings | The regulatory filing index for a security: what was filed, and when. |
| POST | /api/content/reference/v1/identifier-history | Every identifier a security has carried, with validity intervals. |
| regime | ||
| POST | /api/content/regime/v1/history | The regime classification over time. |
| POST | /api/content/regime/v1/snapshot | Which market regime is in force now, and on what evidence. |
| POST | /api/content/regime/v1/stats | How an asset behaved conditional on regime. |
| screener | ||
| POST | /api/content/screener/v1/count | How many securities match a screen, without returning them. |
| POST | /api/content/screener/v1/distinct-count | Distinct values of one field across a screen -- how many sectors, how many countries -- without pulling the rows. |
| GET | /api/content/screener/v1/fields | Fields available to screen on, with their types and permitted operators. |
| POST | /api/content/screener/v1/point-in-time | Run a screen as it would have run on a past date. |
| POST | /api/content/screener/v1/search | Screen the universe on any catalog metric and return the matching securities with the requested columns. |
| POST | /api/content/screener/v1/statistics | Aggregate statistics over a screen: count, mean, median, percentiles. |
| sustainability | ||
| GET | /api/content/sustainability/v1/fields | Available fields with units, definitions and current issuer coverage. |
| POST | /api/content/sustainability/v1/history | Disclosed history for one measure, one point per reported period. |
| POST | /api/content/sustainability/v1/summary | Latest disclosed workforce or environmental measure for an issuer. |
Taxonomía de errores
| Código | Significado | Equivalencia en Excel |
|---|---|---|
UNRESOLVED_IDENTIFIER | Sin coincidencia para el identificador (en el mercado solicitado, si se indicó), o sin datos en la ventana. | #N/A |
AMBIGUOUS_IDENTIFIER | Múltiples candidatos; califique con un sufijo de mercado o use un entityId. | #SPILL! |
INVALID_IDENTIFIER | Identificador vacío o mal formado. | #VALUE! |
UNSUPPORTED_MARKET | Código de mercado fuera de US · BR · MX · PE · CL · CO. | #N/A |
UNSUPPORTED_METRIC | Métrica desconocida, o una combinación métrica/período que este endpoint no atiende. | #NAME? |
FX_UNAVAILABLE | La divisa solicitada no puede cotizarse para algunas filas. | #N/A |
EXECUTION_ERROR | Falló un trabajo por lotes o un handler; detail lo explica. | #VALUE! |
429 + Retry-After | Límite de tasa por clave excedido (1.200 solicitudes/minuto por defecto; overrides por clave al crearla, aprobación de admin por encima del valor por defecto). Respete Retry-After antes de reintentar. | el complemento reintenta hasta cuatro veces por su cuenta; solo entonces EDI rate limit reached |
Las fallas a nivel de solicitud usan los códigos HTTP estándar: 400 solicitud mal
formada · 401 no autenticado · 404 id de lote desconocido o expirado.
Límites de solicitud
| Endpoint | Síncrono | Por lotes (batch:"Y") |
|---|---|---|
| /resolve | 2,000 identificadores | — |
| /prices — un solo día | 1,000 ids | 2,000 ids |
| /prices — varios días | 100 ids | 1,000 ids |
| /fundamentals | 250 ids × 50 métricas | 5,000 ids × 50 métricas |
| /matrix | 500 ids × 50 métricas | 2,000 ids × 50 métricas |
| /screener/search | 1,000 filas por página | igual, encolado |
Clientes y Excel
Python. El cliente de referencia (edi_analytics.py) encapsula el
inicio de sesión, el sobre de respuesta y el sondeo de lotes, e incluye los ayudantes de derrame
(spill) que usa la integración con Excel —
spill_scalar, spill_series, spill_fundamentals,
spill_ratios, spill_matrix, spill_fibonacci — cada uno devuelve una grilla 2-D lista para un dataframe o un arreglo
dinámico.
Excel. El complemento registra fórmulas sobre exactamente esta API. Comience con la guía de instalación para Excel, que cubre tanto la implementación por un administrador de Microsoft 365 como la instalación individual. También puede descargar directamente el manifiesto de producción o el libro de demostración.
=EDI.VALUE("AAPL-US", "MARKET_CAP") → un valor =EDI.HISTORY("BBAS3-BR", "price", "2026-01-01", "2026-07-30", "M") → derrama 7×2 =EDI.FUNDAMENTALS("AAPL-US", "REVENUE", "LTM") → derrama períodos fiscales =EDI.MATRIX(A2:A20, B1:F1) → derrama una grilla de comparables
Las entradas inválidas se degradan celda por celda (#N/A, #NAME?) —
nunca una actualización fallida del libro. El complemento agrupa automáticamente las solicitudes
de fórmulas a través de la ejecución por lotes.
Todo lo demás. El documento OpenAPI 3 permite generar clientes para otras tecnologías.
Pruébelo
Inicie sesión con su cuenta EDI y ejecute solicitudes en vivo contra la API — todos los ejemplos de esta página son ejecutables. Las solicitudes se ejecutan con sus permisos de acceso, exactamente como lo harían desde Excel o un script.
Capacidades en preparación
Estos ejes de solicitud forman parte del contrato pero se rechazan deliberadamente (HTTP 400, con un mensaje explicativo) hasta que su maquinaria de soporte esté lista — usted puede programar contra el vocabulario hoy sin riesgo de respuestas incorrectas silenciosas:
basis: "restated"— estados financieros reexpresados, a la espera del modelado de vintages.periodicity: "SEMI"— emisores con reporte semestral, a la espera de la normalización.adjust: "UNSPLIT"/"SPLIT_SPINOFF"— a la espera del historial de factores de ajuste en la ruta de servicio. Los factores en sí ya están disponibles en /corporate-actions y por exportación masiva.- Estimaciones de consenso — no hay fuente detrás del dataset. Solo se sirven estados financieros reportados.
- Endpoints de punto en el tiempo (
/point-in-time,/periods) — reservados para backtesting libre de sesgo de anticipación. - Los dominios de contenido de fondos y screener.