EDI Analytics API
v1
Inicio rápido OpenAPI

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.

URL base https://api.edi.finance Mercados US · BR · MX · PE Formato JSON (camelCase) Autenticación cookie de sesión Especificación OpenAPI 3 ↗

Inicio rápido

Autentíquese una sola vez — la cookie de sesión lleva sus permisos de acceso en cada llamada posterior.

bash
# 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:

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.

bash
# 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.

json
{
  "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)

ValorSignificado
FYAños fiscales, tal como fueron reportados.
QTRTrimestres 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.
LTMSuma 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.
YTDAcumulado dentro de cada año fiscal.
SEMIEn 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)

ValorObservaciones conservadas
D / ADCada 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 · AYAncladas: 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

ValorSignificado
SPLITAjustado por splits (predeterminado; coincide con los cierres de plaza almacenados).
DIV_SPIN_SPLITSAjustado por dividendos, escisiones (spinoffs) y splits.
UNSPLIT · SPLIT_SPINOFFEn 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

POST/api/analytics/v1/resolve

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

json
// 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"} ] } ] }

Catálogo de métricas

GET/api/analytics/v1/catalog/metrics

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

FiltroSignificado
datasetfinancials_standardized · prices · valuation · derived · returns · entity_attributes · …
searchBusca coincidencias en código, nombre y alias (?search=revenue).
valueTypecurrency · percent · ratio · price · shares · text · …
entityTypecompany · etf · fund · bond · manager
includeDeprecatedLas métricas descontinuadas llevan un replacementMetricCode.
limit / offsetPaginació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

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

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

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 — 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 },  ] }

Estados financieros

POST/api/content/fundamentals/v1/fundamentals

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

json
// 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 },  ] }

Matriz

POST/api/analytics/v1/matrix

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

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 — 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" } ] }

Screener

POST/api/content/screener/v1/search

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

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 — 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 } },  ] }

Fondos

POST/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:

EndpointDevuelve
POST /summaryAtributos de registro: nombre, clasificación, operador/administrador, benchmark, estatus, moneda nativa.
POST /pricesSeries de NAV (fields: ["nav", "netAssets"]) con el vocabulario completo de frecuencia.
POST /returnsRendimientos 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 /flowsAportes / rescates / flujo neto diarios — solo BR (reporte diario de la CVM); los demás mercados devuelven un error de fila, nunca silencio.
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" }

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.

PasoLlamadaRespuesta
1. EnviarPOST a cualquier endpoint de datos con "batch":"Y"202 + encabezado Location; el cuerpo incluye el id del trabajo
2. ConsultarGET /api/analytics/v1/batch-status?id=…202 mientras corre · 201 al terminar (+Location) · 200 con status:"error" en caso de falla
3. RecuperarGET /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 valorTipo de cambio aplicado
Observaciones de precioTipo 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, textoNunca 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ódigoSignificadoEquivalencia en Excel
UNRESOLVED_IDENTIFIERSin coincidencia para el identificador (en el mercado solicitado, si se indicó), o sin datos en la ventana.#N/A
AMBIGUOUS_IDENTIFIERMúltiples candidatos; califique con un sufijo de mercado o use un entityId.#SPILL!
INVALID_IDENTIFIERIdentificador vacío o mal formado.#VALUE!
UNSUPPORTED_MARKETCódigo de mercado fuera de US · BR · MX · PE · CL · CO.#N/A
UNSUPPORTED_METRICMétrica desconocida, o una combinación métrica/período que este endpoint no atiende.#NAME?
FX_UNAVAILABLELa divisa solicitada no puede cotizarse para algunas filas.#N/A
EXECUTION_ERRORFalló 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

EndpointSíncronoPor lotes (batch:"Y")
/resolve2,000 identificadores
/prices — un solo día1,000 ids2,000 ids
/prices — varios días100 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 filas por páginaigual, 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:

excel
=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: