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). |
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. |
limit / offset | Paginación; meta.pagination.total es el conteo filtrado. |
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.
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 (
REVENUEreportado vs. de consenso) se resuelven por una precedencia documentada — ganan los estados financieros reportados. Envíe{"metric": "REVENUE", "dataset": "estimates"}para forzarlo explícitamente. - 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, 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.
Fondos
/api/content/funds/v1/…Datos de fondos de mercado local en Brasil (más de 65,000 fondos registrados ante la CVM),
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 (reporte diario de la CVM); los demás mercados devuelven un error de fila, nunca silencio. |
// 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.
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.
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.
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! |
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_matrix — cada uno devuelve una grilla 2-D lista para un dataframe o un arreglo
dinámico.
Excel. El complemento (add-in) registra fórmulas sobre exactamente esta API:
=EDI("AAPL-US", "MARKET_CAP") → 4,925,847,973,597 =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.- 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.