Documentación
Puedes usar la API mediante la librería Python bcchapi o directamente como Web Service REST o SOAP. Selecciona una opción para ver los detalles.
La librería bcchapi facilita el acceso a la API BDE desde Python mediante clases y métodos estandarizados.
Los resultados se entregan como objetos DataFrame de pandas, listos para análisis y visualización.
La librería bcchapi está disponible en el Python Package Index (PyPI) y facilita el acceso a la Base de Datos Estadísticos desde Python.
!pip install bcchapi
Una vez instalada, puedes importar la librería en tu script o notebook:
import bcchapi
Ahora puedes usar la librería bcchapi siguiendo los pasos siguientes.
El objeto principal de la librería es Siete y este se instancia agregando tu API Key Token para luego buscar y consultar series de la Base de Datos Estadísticos.
Puedes autenticarte poniendo tu token directamente:
siete = bcchapi.Siete(token="tu_token")
Una vez creada la instancia de la clase Siete, tienes acceso a métodos especializados para interactuar con la Base de Datos Estadísticos del Banco Central de Chile. Los dos métodos principales son:
Método 1: siete.buscar()
Permite encontrar series en el catálogo del Banco Central de Chile mediante palabras clave contenidas en sus títulos. Es el primer paso para identificar las series que posteriormente se quieren consultar con el método cuadro() para obtener los datos.
Parámetros:
- contiene (str) Texto a localizar en el título de la serie (español por defecto).
- ingles (bool) Buscar texto en títulos en inglés (False por defecto).
- cache (bool) Usar caché local para acelerar proceso de busqueda (True por defecto).
Salida: Un DataFrame con los códigos de las series y su metadata: títulos en español e inglés, frecuencia, fecha de primera observación, última observación, creación y actualización.
Ejemplo: Búsqueda de series que contienen "TPM" (primeras 3 coincidencias):
resultado = siete.buscar("TPM")
print(f"Encontradas {len(resultado)} series")
resultado.head(3)
| seriesId | frequencyCode | spanishTitle | englishTitle | firstObservation | lastObservation | updatedAt | createdAt | |
|---|---|---|---|---|---|---|---|---|
| 0 | F022.TPM.TIN.D001.NO.Z.D | DAILY | Tasa de política monetaria (TPM) (porcentaje) | Monetary policy rate (MPR) (percentage) | 1997-02-07 | 2025-10-13 | 2025-10-10 | 2025-10-10 |
| 1 | F089.EOF.FI_TPM_CFL.1A.D | DAILY | Evolución encuesta de operadores fin. (EOF)... | Evolution survey of financial operators (EOF)... | 2021-10-07 | 2025-09-04 | 2025-09-04 | 2025-09-04 |
| 2 | F089.EOF.FI_TPM_DD.1A.D | DAILY | Evolución encuesta de operadores fin. (EOF)... | Evolution survey of financial operators (EOF)... | 2021-10-07 | 2025-09-04 | 2025-09-04 | 2025-09-04 |
Método 2: siete.cuadro()
Obtiene las observaciones de una o más series (utilizando sus códigos) y construye un DataFrame indexado por fecha, listo para utilizar. Permite definir el rango de fecha a consultar, convertir la frecuencia de la serie y calcular variaciones.
Parámetros:
- series (list): Lista de códigos de series a consultar
- desde (str, opcional): Fecha inicial en formato 'YYYY-MM-DD'. Si no se indica, retorna desde la primera observación de la serie.
- hasta (str, opcional): Fecha final en formato 'YYYY-MM-DD'. Si no se indica, retorna hasta la última observación de la serie.
- nombres (list, opcional): Permite personalizar el nombre de la serie a consultrar.
- frecuencia (str, opcional): Permite convertir la frecuencia de la serie a mensual, trimestral o anual, indicando inicio (S) o fin (E) de período. ('ME'=fin de mes, 'MS'=inicio de mes, 'QE'=fin de trimestre, 'QS'=inicio de trimestre, 'YE'=fin de año, 'YS'=inicio de año)
- observado (str/dict, opcional): Función de agregación al cambiar frecuencia. Opciones: "mean" (promedio), "sum" (suma), "last" (último valor)
- variacion (int, opcional): Número de períodos hacia atrás para calcular la variación. Solo utiliza los datos dentro del rango solicitado (desde/hasta).
Sobre el parámetro 'variacion':
variacion siempre cuenta meses hacia atrás,
independiente de la frecuencia original de la serie:
variacion=1→ 1 mes atrás (para series mensuales = mes anterior)variacion=3→ 3 meses atrás (trimestre anterior)variacion=12→ 12 meses atrás (variación interanual)
Salida: DataFrame indexado por fecha con cada serie como columna (usando el código o alias definido en nombres). Si se aplican transformaciones como cambio de frecuencia o cálculo de variaciones, el resultado las refleja.
Ejemplo: Consulta del dólar observado para un rango semanal:
datos = siete.cuadro(
series=["F073.TCO.PRE.Z.D"], # Dólar observado
desde="2024-10-01",
hasta="2024-10-07",
nombres=["Dólar"]
)
print(f"Datos obtenidos: {len(datos)} observaciones")
datos
| Dólar | |
|---|---|
| 2024-10-01 | 897.68 |
| 2024-10-02 | 901.13 |
| 2024-10-03 | 908.23 |
| 2024-10-04 | 919.49 |
| 2024-10-05 | NaN |
| 2024-10-06 | NaN |
| 2024-10-07 | 923.74 |
Ejemplo 1: Buscar y Consultar el Dólar Observado
En este ejemplo aprenderemos a buscar los valores del dólar observado: primero identificando qué serie nos sirve y luego obteniendo sus valores.
Paso 1: Buscar la serie
Primero buscamos series relacionadas con "dólar observado" para identificar el código correcto de la serie que necesitamos:
resultado_busqueda = siete.buscar("dólar observado")
print(f"Se encontraron {len(resultado_busqueda)} series relacionadas con 'dólar observado'")
print("\nPrimeras 5 coincidencias:")
resultado_busqueda[['seriesId', 'frequencyCode', 'spanishTitle']].head()
| seriesId | frequencyCode | spanishTitle | |
|---|---|---|---|
| 0 | F073.TCO.PRE.Z.D | DAILY | Tipo de cambio nominal (dólar observado $CLP/USD)... |
| 1 | F073.TCO.PRE.HIST.M | MONTHLY | Tipo de cambio del dólar observado diario, serie histórica |
| 2 | F073.TCO.PRE.Z.M | MONTHLY | Tipo de Cambio del Dólar Observado |
Paso 2: Consultar los datos
De los resultados anteriores, usaremos el primer código F073.TCO.PRE.Z.D que corresponde al dólar observado diario. Ahora consultamos los datos para el último año:
datos_dolar = siete.cuadro(
series=["F073.TCO.PRE.Z.D"],
desde="2024-09-01",
hasta="2025-09-30"
)
print(f"Datos obtenidos: {len(datos_dolar)} observaciones")
print(f"Período: {datos_dolar.index.min()} a {datos_dolar.index.max()}")
print("\nÚltimas 10 observaciones:")
datos_dolar.tail(10)
Período: 2024-09-02 00:00:00 a 2025-09-30 00:00:00
Últimas 10 observaciones:
| F073.TCO.PRE.Z.D | |
|---|---|
| 2025-09-21 | NaN |
| 2025-09-22 | 951.03 |
| 2025-09-23 | 954.72 |
| 2025-09-24 | 952.87 |
| 2025-09-25 | 953.24 |
| 2025-09-26 | 956.42 |
| 2025-09-27 | NaN |
| 2025-09-28 | NaN |
| 2025-09-29 | 958.90 |
| 2025-09-30 | 961.24 |
Paso 3: Calcular estadísticas básicas
Con los datos ya obtenidos, calculamos algunas estadísticas descriptivas básicas para analizar el comportamiento del dólar en el período consultado:
print("Estadísticas del Dólar Observado:")
print(f"Valor mínimo: ${datos_dolar.min().iloc[0]:.2f}")
print(f"Valor máximo: ${datos_dolar.max().iloc[0]:.2f}")
print(f"Valor promedio: ${datos_dolar.mean().iloc[0]:.2f}")
print(f"Última observación: ${datos_dolar.iloc[-1, 0]:.2f}")
Valor mínimo: $896.25
Valor máximo: $1012.76
Valor promedio: $955.93
Última observación: $961.24
Ejemplo 2: Comparar PIB e IMACEC
En este ejemplo trabajaremos con dos indicadores económicos importantes que tienen frecuencias diferentes: IMACEC (mensual) y PIB (trimestral). Esto nos permitirá mostrar cómo manejar series con distintas periodicidades.
Paso 1: Buscar las series
Primero buscamos ambas series por separado para identificar sus códigos correctos:
resultado_imacec = siete.buscar("Imacec empalmado")
print(f"Series encontradas para IMACEC: {len(resultado_imacec)}")
print("\nPrimeras coincidencias:")
resultado_imacec[['seriesId', 'frequencyCode', 'spanishTitle']].head(5)
Primeras coincidencias:
| seriesId | frequencyCode | spanishTitle | |
|---|---|---|---|
| 0 | F032.IMC.IND.Z.Z.EP13.Z.Z.0.M | MONTHLY | Imacec empalmado, serie original (índice 2013=... |
| 1 | F032.IMC.IND.Z.Z.EP13.Z.Z.1.M | MONTHLY | Imacec empalmado, desestacionalizado (índice 2... |
| 2 | F032.IMC.IND.Z.Z.EP18.Z.Z.0.M | MONTHLY | Imacec empalmado, serie original (índice 2018=... |
resultado_pib = siete.buscar("PIB, volumen a precios del año anterior encadenado")
print(f"Series encontradas para PIB: {len(resultado_pib)}")
print("\nÚltimas coincidencias:")
resultado_pib[['seriesId', 'frequencyCode', 'spanishTitle']].tail(10)
Últimas coincidencias:
| seriesId | frequencyCode | spanishTitle | |
|---|---|---|---|
| 58 | F032.PIB.FLU.R.CLP.2018.Z.Z.2025MAR.T | QUARTERLY | PIB, volumen a precios del año anterior encaden... |
| 59 | F032.PIB.FLU.R.CLP.2018.Z.Z.2025MAY.T | QUARTERLY | PIB, volumen a precios del año anterior encaden... |
| 60 | F032.PIB.FLU.R.CLP.2018.Z.Z.2025NOV.T | QUARTERLY | PIB, volumen a precios del año anterior encaden... |
| 61 | F032.PIB.FLU.R.CLP.EP08.Z.Z.0.T | QUARTERLY | PIB, volumen a precios del año anterior encaden... |
| 62 | F032.PIB.FLU.R.CLP.EP13.Z.Z.0.T | QUARTERLY | PIB, volumen a precios del año anterior encaden... |
| 63 | F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T | QUARTERLY | PIB, volumen a precios del año anterior encaden... |
| 64 | F032.PIB.FLU.R.CLP.HIST.Z.Z.0.T | QUARTERLY | PIB, volumen a precios del año anterior encaden... |
| 65 | F032.PIB.FLU.R.CLP.HIST.Z.Z.3.T | QUARTERLY | PIB, volumen a precios del año anterior encaden... |
| 66 | F032.PIB.FLU.R.CLP.HIST13.Z.Z.0.T | QUARTERLY | PIB, volumen a precios del año anterior encaden... |
| 67 | F032.PIB.FLU.R.CLP.HIST13.Z.Z.3.T | QUARTERLY | PIB, volumen a precios del año anterior encaden... |
Paso 2: Consultar cada serie por separado
De los resultados anteriores, utilizaremos:
- IMACEC año base 2018:
F032.IMC.IND.Z.Z.EP18.Z.Z.0.M(frecuencia mensual) - PIB:
F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T(frecuencia trimestral)
Consultamos cada serie individualmente para ver sus frecuencias originales:
imacec = siete.cuadro(
series=["F032.IMC.IND.Z.Z.EP18.Z.Z.0.M"],
desde="2024-01-01",
hasta="2025-09-30",
nombres=["IMACEC"]
)
print(f"IMACEC: {len(imacec)} observaciones mensuales")
print(f"Período: {imacec.index.min().strftime('%Y-%m')} a {imacec.index.max().strftime('%Y-%m')}")
imacec.tail()
Período: 2024-01 a 2025-09
| IMACEC | |
|---|---|
| 2025-05-01 | 112.950836 |
| 2025-06-01 | 108.388247 |
| 2025-07-01 | 109.039654 |
| 2025-08-01 | 110.446073 |
| 2025-09-01 | 109.152886 |
pib = siete.cuadro(
series=["F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T"],
desde="2024-01-01",
hasta="2025-09-30",
nombres=["PIB"]
)
print(f"PIB: {len(pib)} observaciones trimestrales")
print(f"Período: {pib.index.min().strftime('%Y-%m')} a {pib.index.max().strftime('%Y-%m')}")
pib
Período: 2024-01 a 2025-07
| PIB | |
|---|---|
| 2024-01-01 | 51629.653131 |
| 2024-04-01 | 51347.892689 |
| 2024-07-01 | 51072.569785 |
| 2024-10-01 | 55879.020025 |
| 2025-01-01 | 52974.863449 |
| 2025-04-01 | 53039.105024 |
| 2025-07-01 | 51879.676786 |
Paso 3: Calcular variaciones interanuales por separado
Ahora calculamos la variación interanual (12 meses hacia atrás) para ambas series. Es importante recordar que la variación se calcula solo dentro del rango de fechas consultado:
imacec_var = siete.cuadro(
series=["F032.IMC.IND.Z.Z.EP18.Z.Z.0.M"],
desde="2024-01-01",
hasta="2025-09-30",
nombres=["IMACEC_var"],
variacion=12 # 12 meses hacia atrás
)
print("IMACEC - Variación interanual (%):")
(imacec_var * 100).round(2).tail()
| IMACEC_var | |
|---|---|
| 2025-05-01 | 3.45 |
| 2025-06-01 | 3.30 |
| 2025-07-01 | 1.84 |
| 2025-08-01 | 0.26 |
| 2025-09-01 | 2.70 |
Para el IMACEC (serie mensual), usamos .tail() para mostrar solo las últimas 5 variaciones interanuales que son las más recientes.
pib_var = siete.cuadro(
series=["F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T"],
desde="2024-01-01",
hasta="2025-09-30",
nombres=["PIB_var"],
variacion=12 # 12 meses hacia atrás
)
print("PIB - Variación interanual (%):")
(pib_var * 100).round(2).tail()
| PIB_var | |
|---|---|
| 2024-07-01 | NaN |
| 2024-10-01 | NaN |
| 2025-01-01 | 2.61 |
| 2025-04-01 | 3.29 |
| 2025-07-01 | 1.58 |
Para el PIB (serie trimestral), también usamos .tail() pero aquí vemos algunos valores NaN. Como el PIB es trimestral, tenemos menos observaciones en el mismo rango de tiempo (solo 6 trimestres vs 20 meses del IMACEC). Los primeros trimestres de 2024 muestran NaN porque no tienen observaciones 12 meses hacia atrás dentro del rango consultado. Solo desde 2025-T1 aparecen valores válidos porque ya existen los datos de 2024-T1 para comparar.
Paso 4: Consultar ambas series con frecuencia original
Finalmente, podemos consultar ambas series simultáneamente. La librería permite mezclar series con frecuencias distintas en una sola consulta:
datos_combinados = siete.cuadro(
series=[
"F032.IMC.IND.Z.Z.EP18.Z.Z.0.M", # IMACEC (mensual)
"F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T" # PIB (trimestral)
],
desde="2024-01-01",
hasta="2025-09-30",
nombres=["IMACEC", "PIB"]
)
print("Datos combinados (frecuencia original):")
datos_combinados.tail(8)
| IMACEC | PIB | |
|---|---|---|
| 2024-01-01 | 107.868108 | 51629.653131 |
| 2024-02-01 | 104.151200 | NaN |
| 2024-03-01 | 115.035498 | NaN |
| 2024-04-01 | 111.159047 | 51347.892689 |
| 2024-05-01 | 109.182567 | NaN |
| 2024-06-01 | 104.928343 | NaN |
| 2024-07-01 | 107.073852 | 51072.569785 |
| 2024-08-01 | 110.163804 | NaN |
Como vemos en el resultado, es posible combinar series con diferentes frecuencias. El IMACEC tiene valores mensuales, mientras que el PIB solo tiene valores trimestrales (enero, abril, julio, octubre). Por eso en las fechas intermedias (febrero, marzo, mayo, junio, agosto) aparecen valores NaN para el PIB, ya que esos meses no corresponden a su frecuencia trimestral.
Ejemplo Completo Descargable
Descarga el notebook interactivo con los ejemplos detallados y ejecutables:
Incluye ejemplos detallados del dólar observado, PIB, IMACEC, manejo de diferentes frecuencias y explicaciones paso a paso.
La API BDE se puede consumir como servicio web (interfaz que permite la comunicación entre aplicaciones a través de internet) mediante dos protocolos: REST y SOAP. REST utiliza URLs simples y es más popular en lenguajes como Python y R, mientras que SOAP usa un archivo WSDL y es común en entornos como C# o Java.
El servicio REST del Banco Central de Chile permite acceder directamente a la Base de Datos Estadísticos mediante URLs con parámetros. Los resultados se entregan en formato JSON, compatible con cualquier lenguaje de programación que soporte HTTP.
El servicio REST está disponible a través de un único endpoint que acepta diferentes funciones mediante parámetros URL. Es una alternativa directa para desarrolladores que prefieren construir sus propias consultas HTTP sin depender de librerías especializadas.
Endpoint Principal
Funciones Disponibles
SearchSeries- Buscar series por frecuencia en el catálogoGetSeries- Obtener datos de una serie específica
Todas las consultas al servicio REST requieren un API Key Token válido que debe incluirse como parámetro en cada URL.
Puedes incluir el token directamente en la URL:
El servicio REST del Banco Central de Chile ofrece dos métodos principales para interactuar con la Base de Datos Estadísticos. Cada método se especifica mediante el parámetro function en la URL:
Método 1: SearchSeries
Permite obtener el catálogo completo de series disponibles filtrado por frecuencia temporal. Es útil para explorar qué series están disponibles antes de consultar sus datos específicos. Los datos relevantes se encuentran en la propiedad SeriesInfos del JSON de respuesta.
Parámetros:
- token (str, obligatorio): Tu API Key Token personal
- function (str, obligatorio): Debe ser "SearchSeries"
- frequency (str, obligatorio): Frecuencia temporal (DAILY, MONTHLY, QUARTERLY, ANNUAL)
Salida: JSON con el listado completo de series de la frecuencia solicitada. Los datos están en SeriesInfos, incluyendo código de serie, títulos en español e inglés, frecuencia, fechas de primera y última observación, y fechas de creación y actualización.
Ejemplo: Buscar todas las series trimestrales disponibles:
"Codigo": 0,
"Descripcion": "Success",
"Series": {
"descripEsp": null,
"descripIng": null,
"seriesId": null,
"Obs": null
},
"SeriesInfos": [ // ← Aquí están los datos relevantes
{
"seriesId": "F061.1.FLU.S.USD.Z.T",
"frequencyCode": "QUARTERLY",
"spanishTitle": "Cuenta corriente, 1996-2011 (BP)",
"englishTitle": "Current account, 1996-2011 (BP)",
"firstObservation": "01-01-1996",
"lastObservation": "01-07-2011",
"updatedAt": "09-01-2015",
"createdAt": "09-01-2015"
},
{
"seriesId": "F061.1A.FLU.S.USD.Z.T",
"frequencyCode": "QUARTERLY",
"spanishTitle": "Comercio de bienes y servicios, 1996-2011 (BP)",
"englishTitle": "Current account - Goods and services, 1996-2011 (BP)",
"firstObservation": "01-01-1996",
"lastObservation": "01-07-2011",
"updatedAt": "09-01-2015",
"createdAt": "09-01-2015"
},
// ... más series
{
"seriesId": "F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T",
"frequencyCode": "QUARTERLY",
"spanishTitle": "PIB, volumen a precios del año anterior encadenado, referencia 2018 (miles de millones de pesos encadenados)",
"englishTitle": "GDP, chained volume at previous year prices, reference 2018, linked series (billions of chained-pesos)",
"firstObservation": "01-01-1996",
"lastObservation": "01-04-2025",
"updatedAt": "18-08-2025",
"createdAt": "18-08-2025"
}
// ... más series
]
}
Método 2: GetSeries
Obtiene las observaciones de una serie estadística específica. Permite definir rangos de fechas para limitar la consulta y obtener solo el período de interés. Los datos relevantes se encuentran en la propiedad Obs dentro de Series del JSON de respuesta.
Parámetros:
- token (str, obligatorio): Tu API Key Token personal
- function (str, opcional): "GetSeries" (valor por defecto si se omite)
- timeseries (str, obligatorio): Código de la serie (ej: F073.TCO.PRE.Z.D)
- firstdate (str, opcional): Fecha inicial en formato YYYY-MM-DD
- lastdate (str, opcional): Fecha final en formato YYYY-MM-DD
Salida: JSON con las observaciones de la serie solicitada. Los datos están en Series.Obs, incluyendo fechas, valores y códigos de estado. También incluye metadata de la serie como títulos en español e inglés.
Ejemplo: Consultar Tasa de Política Monetaria del 10 al 15 de octubre 2021:
"Codigo": 0,
"Descripcion": "Success",
"Series": {
"descripEsp": "Tasa de política monetaria (TPM) (porcentaje)",
"descripIng": "Monetary policy rate (MPR) (percentage)",
"seriesId": "F022.TPM.TIN.D001.NO.Z.D",
"Obs": [ // ← Aquí están los datos relevantes
{
"indexDateString": "12-10-2021",
"value": "1.5",
"statusCode": "OK"
},
{
"indexDateString": "13-10-2021",
"value": "1.5",
"statusCode": "OK"
},
{
"indexDateString": "14-10-2021",
"value": "2.75",
"statusCode": "OK"
},
{
"indexDateString": "15-10-2021",
"value": "2.75",
"statusCode": "OK"
}
]
},
"SeriesInfos": []
}
Ejemplo 1: Buscar y Consultar el Dólar Observado
En este ejemplo aprenderemos a buscar los valores del dólar observado: primero identificando qué serie nos sirve y luego obteniendo sus valores.
Paso 1: Buscar la serie
Primero buscamos todas las series diarias para encontrar el dólar observado. Usamos SearchSeries con frecuencia DAILY:
"Codigo": 0,
"Descripcion": "Success",
"Series": {
"descripEsp": null,
"descripIng": null,
"seriesId": null,
"Obs": null
},
"SeriesInfos": [ // ← Aquí están los metadatos de las series
{
"seriesId": "G073.TCMX.IND.199801.D",
"frequencyCode": "DAILY",
"spanishTitle": "Índice TCM-X (2 enero 1998=100)",
"englishTitle": "MER-X index (2 January 1998=100)",
"firstObservation": "02-01-2002",
"lastObservation": "22-10-2025",
"updatedAt": "21-10-2025",
"createdAt": "21-10-2025"
},
{
"seriesId": "F062.A5.STO.PF.USD.D",
"frequencyCode": "DAILY",
"spanishTitle": "PII Activos de reservas, 1996-2011, serie semanal",
"englishTitle": "PII Activos de reservas, 1996-2011, serie semanal",
"firstObservation": "31-12-1995",
"lastObservation": "07-10-2025",
"updatedAt": "15-10-2025",
"createdAt": "15-10-2025"
},
// ... más series
{
"seriesId": "F073.TCO.PRE.Z.D",
"frequencyCode": "DAILY",
"spanishTitle": "Tipo de cambio nominal (dólar observado $CLP/USD); tipo de cambio; ; precio; diario; ; Banco Central de Chile; ; ",
"englishTitle": "Nominal exchange rate (Observed dollar $CLP/USD); exchange rate; ; price; daily; ; central bank of chile; ; ",
"firstObservation": "09-08-1982",
"lastObservation": "22-10-2025",
"updatedAt": "21-10-2025",
"createdAt": "21-10-2025"
}
// ... más series
]
}
En la respuesta JSON, buscaremos en el array SeriesInfos las series que digan "dólar observado" en su spanishTitle. El código que nos interesa es F073.TCO.PRE.Z.D.
Paso 2: Consultar los datos
Ahora consultamos los datos del dólar observado para una semana específica usando GetSeries:
"Codigo": 0,
"Descripcion": "Success",
"Series": {
"descripEsp": "Tipo de cambio nominal (dólar observado $CLP/USD); tipo de cambio; ; precio; diario; ; Banco Central de Chile; ; ",
"descripIng": "Nominal exchange rate (Observed dollar $CLP/USD); exchange rate; ; price; daily; ; central bank of chile; ; ",
"seriesId": "F073.TCO.PRE.Z.D",
"Obs": [ // ← Aquí están los datos relevantes
{
"indexDateString": "01-10-2024",
"value": "897.68",
"statusCode": "OK"
},
{
"indexDateString": "02-10-2024",
"value": "901.13",
"statusCode": "OK"
},
{
"indexDateString": "03-10-2024",
"value": "908.23",
"statusCode": "OK"
},
{
"indexDateString": "04-10-2024",
"value": "919.49",
"statusCode": "OK"
},
{
"indexDateString": "05-10-2024",
"value": "NaN",
"statusCode": "ND"
},
{
"indexDateString": "06-10-2024",
"value": "NaN",
"statusCode": "ND"
},
{
"indexDateString": "07-10-2024",
"value": "923.74",
"statusCode": "OK"
}
]
},
"SeriesInfos": []
}
La respuesta JSON contiene las observaciones en Series.Obs, donde cada observación tiene fecha (indexDateString), valor (value) y estado (statusCode). Los valores muestran la evolución del tipo de cambio durante esa semana.
Ejemplo 2: Comparar PIB e IMACEC
En este ejemplo consultaremos dos indicadores con frecuencias diferentes: IMACEC (mensual) y PIB (trimestral).
Paso 1: Buscar las series por separado
Primero buscamos las series mensuales para encontrar el IMACEC:
"SeriesInfos": [
// ... más series
{
"seriesId": "F032.IMC.IND.Z.Z.EP18.Z.Z.0.M",
"frequencyCode": "MONTHLY",
"spanishTitle": "Imacec empalmado, serie original (índice 2018=100)",
"englishTitle": "Monthly indicator of economic activity Imacec, linked series (2018 index=100)"
}
// ... más series
]
}
Buscamos series que contengan "Imacec empalmado" en su spanishTitle para encontrar el código del Imacec año base 2018: F032.IMC.IND.Z.Z.EP18.Z.Z.0.M.
Luego buscamos las series trimestrales para encontrar el PIB:
"SeriesInfos": [
// ... más series
{
"seriesId": "F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T",
"frequencyCode": "QUARTERLY",
"spanishTitle": "PIB, volumen a precios del año anterior encadenado, referencia 2018 (miles de millones de pesos encadenados)",
"englishTitle": "GDP, chained volume at previous year prices, reference 2018, linked series (billions of chained-pesos)"
}
// ... más series
]
}
Buscamos series que contengan "PIB, volumen a precios del año anterior encadenado" en su spanishTitle para encontrar el código del PIB año base 2018: F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T.
Paso 2: Consultar cada serie por separado
El servicio REST solo permite consultas independientes, por lo que debemos consultar ambas series por separado:
IMACEC (mensual): Consultamos el Imacec de Enero a Junio 2024, obteniendo 6 observaciones (una por mes).
"Series": {
"descripEsp": "Imacec empalmado, serie original (índice 2018=100)",
"seriesId": "F032.IMC.IND.Z.Z.EP18.Z.Z.0.M",
"Obs": [
{ "indexDateString": "01-01-2024", "value": "107.86810800473", "statusCode": "OK" },
{ "indexDateString": "01-02-2024", "value": "104.15119989615", "statusCode": "OK" },
{ "indexDateString": "01-03-2024", "value": "115.03549781737", "statusCode": "OK" },
{ "indexDateString": "01-04-2024", "value": "111.1590474829", "statusCode": "OK" },
{ "indexDateString": "01-05-2024", "value": "109.18256697619", "statusCode": "OK" },
{ "indexDateString": "01-06-2024", "value": "104.92834280488", "statusCode": "OK" }
]
}
}
PIB (trimestral): Consultamos el PIB de Enero a Junio 2024. En este caso solo obtenemos 2 observaciones ya que la frecuencia es trimestral.
"Series": {
"descripEsp": "PIB, volumen a precios del año anterior encadenado, referencia 2018 (miles de millones de pesos encadenados)",
"seriesId": "F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T",
"Obs": [
{ "indexDateString": "01-01-2024", "value": "51629.653130861", "statusCode": "OK" },
{ "indexDateString": "01-04-2024", "value": "51347.892688956", "statusCode": "OK" }
]
}
}
El PIB trimestral tiene observaciones solo en enero y abril para este período, mientras que el IMACEC tiene datos mensuales completos de enero a junio.
Este ejemplo muestra cómo consumir el servicio REST del Banco Central de Chile desde R usando las librerías rjson y httr. Los pasos siguen la misma lógica que los ejemplos anteriores pero implementados en R para un flujo de trabajo completo.
Preparación del Entorno
Primero instalamos y cargamos las librerías necesarias:
install.packages("rjson")
install.packages("httr")
# Cargar librerías
library("rjson")
library(httr)
token <- "tu_token"
Ejemplo 1: Buscar y Consultar el Dólar Observado
Paso 1: Buscar la serie
Primero buscamos series relacionadas con "dólar observado" usando SearchSeries con frecuencia diaria:
url_busqueda_dolar <- paste0(
"https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token,
"&function=SearchSeries&frequency=DAILY"
)
# Realizar la consulta
json_data_dolar <- rjson::fromJSON(file = url_busqueda_dolar)
# Procesar SeriesInfos del JSON
series_diarias <- as.data.frame(do.call(rbind, lapply(json_data_dolar$SeriesInfos, as.vector)))
series_diarias$spanishTitle <- as.character(series_diarias$spanishTitle)
# Filtrar series que contienen "dólar observado"
idx_dolar <- grep("dólar observado", series_diarias$spanishTitle, ignore.case = TRUE)
series_dolar <- series_diarias[idx_dolar, ]
cat("Se encontraron", nrow(series_dolar), "series relacionadas con 'dólar observado'\n")
print(head(series_dolar, 3))
seriesId freq spanishTitle
1055 F073.TCO.PRE.Z.D DAILY Tipo de cambio nominal (dólar observado...)
englishTitle firstObs lastObs updated
1055 Nominal exchange rate (Observed dollar...) 09-08-1982 23-10-2025 22-10-2025
Paso 2: Consultar los datos
Ahora consultamos los datos del dólar observado para el último año usando el código F073.TCO.PRE.Z.D:
url_datos_dolar <- paste0(
"https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token,
"&function=GetSeries×eries=F073.TCO.PRE.Z.D",
"&firstdate=2024-09-01&lastdate=2025-09-30"
)
# Realizar la consulta
json_data_serie <- rjson::fromJSON(file = url_datos_dolar)
# Procesar las observaciones (Series.Obs del JSON)
observaciones <- as.data.frame(do.call(rbind, lapply(json_data_serie$Series$Obs, as.vector)))
observaciones$value <- as.numeric(observaciones$value)
observaciones$indexDateString <- as.character(observaciones$indexDateString)
cat("Datos obtenidos:", nrow(observaciones), "observaciones\n")
cat("Período:", min(observaciones$indexDateString), "a", max(observaciones$indexDateString), "\n")
print(tail(observaciones, 10))
Período: 01-09-2024 a 30-09-2025
indexDateString value statusCode
385 21-09-2025 NaN ND
386 22-09-2025 951.03 OK
387 23-09-2025 954.72 OK
388 24-09-2025 952.87 OK
389 25-09-2025 953.24 OK
390 26-09-2025 956.42 OK
391 27-09-2025 NaN ND
392 28-09-2025 NaN ND
393 29-09-2025 958.90 OK
394 30-09-2025 961.24 OK
Paso 3: Calcular estadísticas básicas
Con los datos obtenidos, calculamos estadísticas descriptivas básicas:
valores_validos <- observaciones$value[!is.na(observaciones$value)]
cat("Estadísticas del Dólar Observado:\n")
cat("Valor mínimo: $", round(min(valores_validos), 2), "\n")
cat("Valor máximo: $", round(max(valores_validos), 2), "\n")
cat("Valor promedio: $", round(mean(valores_validos), 2), "\n")
cat("Última observación: $", round(tail(valores_validos, 1), 2), "\n")
Valor mínimo: $ 896.25
Valor máximo: $ 1012.76
Valor promedio: $ 955.92
Última observación: $ 961.24
Ejemplo 2: PIB e IMACEC con frecuencias distintas
En este ejemplo trabajaremos con dos indicadores económicos que tienen frecuencias diferentes: IMACEC (mensual) y PIB (trimestral).
Paso 1: Buscar las series
Primero buscamos ambas series por separado según su frecuencia:
url_busqueda_imacec <- paste0(
"https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token,
"&function=SearchSeries&frequency=MONTHLY"
)
json_data_imacec <- rjson::fromJSON(file = url_busqueda_imacec)
series_mensuales <- as.data.frame(do.call(rbind, lapply(json_data_imacec$SeriesInfos, as.vector)))
series_mensuales$spanishTitle <- as.character(series_mensuales$spanishTitle)
idx_imacec <- grep("imacec empalmado", series_mensuales$spanishTitle, ignore.case = TRUE)
series_imacec <- series_mensuales[idx_imacec, ]
cat("Series encontradas para IMACEC:", nrow(series_imacec), "\n")
print(head(series_imacec, 5))
seriesId freq spanishTitle …
4583 F032.IMC.IND.Z.Z.EP13.Z.Z.0.M MONTHLY Imacec empalmado, serie original (índice 2013=100) …
4584 F032.IMC.IND.Z.Z.EP13.Z.Z.1.M MONTHLY Imacec empalmado, desestacionalizado (índice 2013=100) …
4601 F032.IMC.IND.Z.Z.EP18.Z.Z.0.M MONTHLY Imacec empalmado, serie original (índice 2018=100) …
4602 F032.IMC.IND.Z.Z.EP18.Z.Z.1.M MONTHLY Imacec empalmado, desestacionalizado (índice 2018=100) …
url_busqueda_pib <- paste0(
"https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token,
"&function=SearchSeries&frequency=QUARTERLY"
)
json_data_pib <- rjson::fromJSON(file = url_busqueda_pib)
series_trimestrales <- as.data.frame(do.call(rbind, lapply(json_data_pib$SeriesInfos, as.vector)))
series_trimestrales$spanishTitle <- as.character(series_trimestrales$spanishTitle)
idx_pib <- grep("PIB, volumen a precios del año anterior encadenado", series_trimestrales$spanishTitle, ignore.case = TRUE)
series_pib <- series_trimestrales[idx_pib, ]
cat("Series encontradas para PIB:", nrow(series_pib), "\n")
print(tail(series_pib, 5))
seriesId freq spanishTitle …
2412 F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T QUARTERLY PIB, volumen a precios del año anterior encadenado… …
2414 F032.PIB.FLU.R.CLP.HIST.Z.Z.0.T QUARTERLY PIB, volumen a precios del año anterior encadenado… …
2415 F032.PIB.FLU.R.CLP.HIST.Z.Z.3.T QUARTERLY PIB, volumen a precios del año anterior encadenado… …
2416 F032.PIB.FLU.R.CLP.HIST13.Z.Z.0.T QUARTERLY PIB, volumen a precios del año anterior encadenado… …
2417 F032.PIB.FLU.R.CLP.HIST13.Z.Z.3.T QUARTERLY PIB, volumen a precios del año anterior encadenado… …
Paso 2: Consultar cada serie por separado
De los resultados anteriores, utilizaremos F032.IMC.IND.Z.Z.EP18.Z.Z.0.M (IMACEC) y F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T (PIB):
url_datos_imacec <- paste0(
"https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token,
"&function=GetSeries×eries=F032.IMC.IND.Z.Z.EP18.Z.Z.0.M",
"&firstdate=2024-01-01&lastdate=2025-09-30"
)
json_imacec_datos <- rjson::fromJSON(file = url_datos_imacec)
obs_imacec <- as.data.frame(do.call(rbind, lapply(json_imacec_datos$Series$Obs, as.vector)))
obs_imacec$value <- as.numeric(obs_imacec$value)
obs_imacec$indexDateString <- as.character(obs_imacec$indexDateString)
colnames(obs_imacec)[colnames(obs_imacec) == "value"] <- "IMACEC"
cat("IMACEC:", nrow(obs_imacec), "observaciones mensuales\n")
print(tail(obs_imacec, 5))
indexDateString IMACEC statusCode
17 01-05-2025 112.9508 OK
18 01-06-2025 108.3882 OK
19 01-07-2025 109.0397 OK
20 01-08-2025 110.4461 OK
21 01-09-2025 109.1529 OK
url_datos_pib <- paste0(
"https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token,
"&function=GetSeries×eries=F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T",
"&firstdate=2024-01-01&lastdate=2025-09-30"
)
json_pib_datos <- rjson::fromJSON(file = url_datos_pib)
obs_pib <- as.data.frame(do.call(rbind, lapply(json_pib_datos$Series$Obs, as.vector)))
obs_pib$value <- as.numeric(obs_pib$value)
obs_pib$indexDateString <- as.character(obs_pib$indexDateString)
colnames(obs_pib)[colnames(obs_pib) == "value"] <- "PIB"
cat("PIB:", nrow(obs_pib), "observaciones trimestrales\n")
print(obs_pib)
indexDateString GDP statusCode
1 01-01-2024 51629.65 OK
2 01-04-2024 51347.89 OK
3 01-07-2024 51072.57 OK
4 01-10-2024 55879.02 OK
5 01-01-2025 52974.86 OK
6 01-04-2025 53039.11 OK
7 01-07-2025 51879.68 OK
Paso 3: Combinar ambas series con frecuencias distintas
Aunque el servicio REST requiere consultar cada serie por separado, podemos combinarlas en un DataFrame usando R para mostrar ambas series juntas:
obs_imacec$fecha_date <- as.Date(obs_imacec$indexDateString, format = "%d-%m-%Y")
obs_pib$fecha_date <- as.Date(obs_pib$indexDateString, format = "%d-%m-%Y")
# Crear secuencia de fechas mensuales
fechas_completas <- seq(from = as.Date("2024-01-01"),
to = as.Date("2025-08-01"),
by = "month")
# DataFrame base con todas las fechas mensuales
datos_combinados <- data.frame(
fecha = format(fechas_completas, "%d-%m-%Y"),
fecha_date = fechas_completas,
stringsAsFactors = FALSE
)
# Agregar IMACEC y PIB
datos_combinados <- merge(datos_combinados, obs_imacec[, c("fecha_date", "IMACEC")],
by = "fecha_date", all.x = TRUE)
datos_combinados <- merge(datos_combinados, obs_pib[, c("fecha_date", "PIB")],
by = "fecha_date", all.x = TRUE)
# Seleccionar columnas finales
datos_combinados <- datos_combinados[, c("fecha", "IMACEC", "PIB")]
cat("Datos combinados (frecuencia original):\n")
print(head(datos_combinados, 8))
fecha IMACEC PIB
1 01-01-2024 107.8681 51629.65
2 01-02-2024 104.1512 NA
3 01-03-2024 115.0355 NA
4 01-04-2024 111.1590 51347.89
5 01-05-2024 109.1826 NA
6 01-06-2024 104.9283 NA
7 01-07-2024 107.0739 51072.57
8 01-08-2024 110.1638 NA
Como vemos en el resultado, es posible combinar series con diferentes frecuencias. El IMACEC tiene valores mensuales, mientras que el PIB solo tiene valores trimestrales (enero, abril, julio, octubre). Por eso en las fechas intermedias aparecen valores NA para el PIB, ya que, esos meses no corresponden a su frecuencia trimestral.
Ejemplo Completo Descargable
Descarga el script completo con todos los ejemplos ejecutables:
Incluye ejemplos detallados del dólar observado, PIB, IMACEC, manejo de diferentes frecuencias y construcción transparente de URLs REST con R.
El servicio SOAP del Banco Central de Chile permite acceder a los datos estadísticos mediante un archivo WSDL (Web Services Description Language). Esta interfaz es ideal para entornos de desarrollo empresarial como C# y Java, donde se puede generar automáticamente un cliente a partir del WSDL.
El archivo WSDL describe completamente el servicio SOAP, incluyendo los métodos disponibles, sus parámetros y formatos de respuesta. Los entornos de desarrollo pueden importar este archivo para generar automáticamente las clases cliente necesarias.
WSDL Principal
Métodos Disponibles
SearchSeries- Buscar series por frecuencia en el catálogoGetSeries- Obtener datos de una serie específica
El servicio SOAP funciona con la autenticación tradicional de usuario y contraseña de la BDE, no con token. Estas se envían como parámetros en cada llamada a los métodos.
Parámetros de autenticación requeridos
user: Tu email registrado en la BDEpass: Tu contraseña de acceso a la BDE
Estos parámetros deben incluirse en cada llamada SOAP junto con los parámetros específicos del método que desees usar.
El servicio SOAP del Banco Central de Chile ofrece dos métodos principales para interactuar con la Base de Datos Estadísticos. Estos métodos se invocan a través de clientes SOAP generados automáticamente en la mayoría de entornos de desarrollo, permitiendo llamadas directas a las funciones del servicio:
Método 1: SearchSeries
Permite obtener el catálogo completo de series disponibles filtrado por frecuencia temporal. Es útil para explorar qué series están disponibles antes de consultar sus datos específicos. Los datos relevantes se encuentran en la propiedad SeriesInfos del objeto SearchSeriesResult de respuesta.
Parámetros:
- user (string, obligatorio): Email de usuario registrado
- pass (string, obligatorio): Contraseña del usuario
- frequency (string, obligatorio): Frecuencia temporal (DAILY, MONTHLY, QUARTERLY, ANNUAL)
Salida: Objeto SOAP con el listado completo de series de la frecuencia solicitada. Los datos están en SeriesInfos, incluyendo código de serie, títulos en español e inglés, frecuencia, fechas de primera y última observación, y fechas de creación y actualización.
Estructura de salida:
└── SearchSeriesResult (Respuesta)
├── Codigo (0 = OK, ≠0 = Error)
├── Descripcion
└── SeriesInfos (ArrayOfInternetSeriesInfo)
├── internetSeriesInfo (una por serie)
│ ├── seriesId
│ ├── frequency (DAILY, MONTHLY, QUARTERLY, etc.)
│ ├── frequencyCode
│ ├── spanishTitle
│ ├── englishTitle
│ ├── firstObservation
│ ├── lastObservation
│ ├── updatedAt
│ └── createdAt
└── ...
Método 2: GetSeries
Obtiene los datos históricos (observaciones) de una serie estadística específica. Permite definir rangos de fechas para limitar la consulta y obtener solo el período de interés. Los datos relevantes se encuentran en la propiedad obs dentro de Series del objeto Respuesta de respuesta.
Parámetros:
- user (string, obligatorio): Email de usuario registrado
- password (string, obligatorio): Contraseña del usuario
- firstDate (string, opcional): Fecha inicial en formato YYYY-MM-DD
- lastDate (string, opcional): Fecha final en formato YYYY-MM-DD
- seriesIds (array, obligatorio): Array de códigos de series a consultar
seriesIds solo se puede incluir una serie por solicitud. Si se envía más de una serie en el array, la consulta devolverá un error. Para consultar múltiples series, debe realizar solicitudes separadas para cada serie.
Salida: Objeto SOAP con los datos históricos de las series solicitadas en el rango de fechas especificado. Los datos están en Series, donde cada fameSeries contiene las observaciones (obs) con fechas y valores numéricos.
Estructura de respuesta:
└── GetSeriesResult (Respuesta)
├── Codigo (0 = OK, ≠0 = Error)
├── Descripcion
├── Series
│ └── fameSeries (una por serie solicitada)
│ ├── seriesKey
│ ├── precision
│ └── obs (observaciones)
│ ├── indexDateString (fecha)
│ ├── seriesKey
│ ├── statusCode
│ └── value (double, valor numérico)
└── SeriesInfos
└── internetSeriesInfo (metadatos por serie)
├── seriesId
├── frequency (DAILY, MONTHLY, QUARTERLY, etc.)
├── frequencyCode
├── spanishTitle
├── englishTitle
├── firstObservation
├── lastObservation
├── updatedAt
└── createdAt
Codigo y Descripcion en la respuesta. Codigo = 0 significa éxito, cualquier otro valor indica error o ausencia de resultados. En Descripcion se indicará si la operación fue exitosa o el tipo de error en caso contrario.
Este ejemplo muestra cómo consumir el servicio SOAP desde una aplicación C# usando el cliente generado automáticamente a partir del WSDL. Aquí se ve en la práctica cómo se usan las credenciales y se accede a los datos.
Generar el cliente
El proceso de generación del cliente SOAP tiene diferentes enfoques dependiendo de la versión de .NET:
- .NET Framework: Referencia Web tradicional (Add Service Reference)
- .NET 5/6/7/8: WCF Connected Services
Los detalles específicos del proceso de configuración se encuentran en el manual técnico disponible más abajo.
Diferencias en el código según versión .NET
Una vez generado el cliente, existen diferencias importantes en la implementación dependiendo de la versión de .NET a utilizar:
| Aspecto | .NET Framework | .NET 5/6/7/8 |
|---|---|---|
| Método Main | static void Main(string[] args) |
static async Task Main() |
| Instanciar cliente | SieteWS client = new SieteWS(); |
SieteWSSoapClient client = new SieteWSSoapClient(SieteWSSoapClient.EndpointConfiguration.SieteWSSoap); |
| Llamada métodos | client.SearchSeries(...)client.GetSeries(...) |
await client.SearchSeriesAsync(...)await client.GetSeriesAsync(...) |
Nota: Estas diferencias se deben a cambios en la arquitectura .NET. En .NET 5/6/7/8 todos los métodos son asíncronos por defecto.
Configuración inicial
Primero definimos las credenciales que usaremos en todos los ejemplos:
string user = "usuario@ejemplo.com";
string pass = "tu_contraseña";
Ejemplo: Buscar y Consultar el Dólar Observado
Paso 1: Buscar la serie
Primero buscamos series relacionadas con "dólar observado" usando SearchSeries con frecuencia diaria:
.NET Framework
{
Respuesta busquedaDolar = client.SearchSeries(user, pass, "DAILY");
int seriesEncontradas = 0;
if (busquedaDolar.Codigo == 0)
{
foreach (internetSeriesInfo serie in busquedaDolar.SeriesInfos)
{
if (serie.spanishTitle.ToLower().Contains("dólar observado"))
{
seriesEncontradas++;
Console.WriteLine($"{serie.seriesId}: {serie.spanishTitle}");
}
}
Console.WriteLine($"Se encontraron {seriesEncontradas} series relacionadas con 'dólar observado'");
}
else
{
Console.WriteLine($"Error en la consulta: {busquedaDolar.Descripcion}");
}
}
.NET 5/6/7/8
{
Respuesta busquedaDolar = await client.SearchSeriesAsync(user, pass, "DAILY");
int seriesEncontradas = 0;
if (busquedaDolar.Codigo == 0)
{
foreach (internetSeriesInfo serie in busquedaDolar.SeriesInfos)
{
if (serie.spanishTitle.ToLower().Contains("dólar observado"))
{
seriesEncontradas++;
Console.WriteLine($"{serie.seriesId}: {serie.spanishTitle}");
}
}
Console.WriteLine($"Se encontraron {seriesEncontradas} series relacionadas con 'dólar observado'");
}
else
{
Console.WriteLine($"Error en la consulta: {busquedaDolar.Descripcion}");
}
}
Se encontraron 1 series relacionadas con 'dólar observado'
Paso 2: Consultar los datos
Ahora consultamos los datos del dólar observado para el último año usando el código F073.TCO.PRE.Z.D:
.NET Framework
string firstDate = "2024-09-01";
string lastDate = "2025-09-30";
using (SieteWS client = new SieteWS())
{
Respuesta datosDolar = client.GetSeries(user, pass, firstDate, lastDate, seriesDolar);
if (datosDolar.Codigo == 0)
{
var observaciones = datosDolar.Series[0].obs;
Console.WriteLine($"Datos obtenidos: {observaciones.Length} observaciones");
Console.WriteLine("Últimos 10 valores:");
for (int i = Math.Max(0, observaciones.Length - 10); i < observaciones.Length; i++)
{
Console.WriteLine($"{observaciones[i].indexDateString}: {observaciones[i].value}");
}
}
else
{
Console.WriteLine($"Error en consulta: {datosDolar.Descripcion}");
}
}
.NET 5/6/7/8
string firstDate = "2024-09-01";
string lastDate = "2025-09-30";
using (var client = new SieteWSSoapClient(SieteWSSoapClient.EndpointConfiguration.SieteWSSoap))
{
Respuesta datosDolar = await client.GetSeriesAsync(user, pass, firstDate, lastDate, seriesDolar);
if (datosDolar.Codigo == 0)
{
var observaciones = datosDolar.Series[0].obs;
Console.WriteLine($"Datos obtenidos: {observaciones.Length} observaciones");
Console.WriteLine("Últimos 10 valores:");
for (int i = Math.Max(0, observaciones.Length - 10); i < observaciones.Length; i++)
{
Console.WriteLine($"{observaciones[i].indexDateString}: {observaciones[i].value}");
}
}
else
{
Console.WriteLine($"Error en consulta: {datosDolar.Descripcion}");
}
}
Últimos 10 valores:
21-09-2025: NaN
22-09-2025: 951,03
23-09-2025: 954,72
24-09-2025: 952,87
25-09-2025: 953,24
26-09-2025: 956,42
27-09-2025: NaN
28-09-2025: NaN
29-09-2025: 958,9
30-09-2025: 961,24
Paso 3: Calcular estadísticas básicas
Con los valores obtenidos, filtramos los valores válidos y calculamos estadísticas básicas:
.NET Framework
Console.WriteLine("\\nEstadísticas del Dólar Observado:");
Console.WriteLine($"Valor mínimo: ${valores.Min():F2}");
Console.WriteLine($"Valor máximo: ${valores.Max():F2}");
Console.WriteLine($"Valor promedio: ${valores.Average():F2}");
Console.WriteLine($"Última observación: ${valores.Last():F2}");
.NET 5/6/7/8
Console.WriteLine("\\nEstadísticas del Dólar Observado:");
Console.WriteLine($"Valor mínimo: ${valores.Min():F2}");
Console.WriteLine($"Valor máximo: ${valores.Max():F2}");
Console.WriteLine($"Valor promedio: ${valores.Average():F2}");
Console.WriteLine($"Última observación: ${valores.Last():F2}");
Valor mínimo: $896,25
Valor máximo: $1012,76
Valor promedio: $955,93
Última observación: $961,24
Ejemplo 2: PIB e IMACEC con frecuencias distintas
En este ejemplo trabajaremos con dos indicadores económicos que tienen frecuencias diferentes: IMACEC (mensual) y PIB (trimestral). Esto muestra cómo combinar series con diferentes periodicidades.
Paso 1: Buscar las series
Primero buscamos ambas series por separado según su frecuencia:
.NET Framework
{
// Buscar IMACEC (frecuencia MONTHLY)
Respuesta busquedaImacec = client.SearchSeries(user, pass, "MONTHLY");
if (busquedaImacec.Codigo == 0)
{
int seriesImacec = 0;
foreach (internetSeriesInfo serie in busquedaImacec.SeriesInfos)
{
if (serie.spanishTitle.ToLower().Contains("imacec empalmado"))
{
seriesImacec++;
Console.WriteLine($"{serie.seriesId}: {serie.spanishTitle}");
}
}
Console.WriteLine($"Series encontradas para IMACEC: {seriesImacec}");
}
else
{
Console.WriteLine($"Error en consulta: {busquedaImacec.Descripcion}");
}
// Buscar PIB (frecuencia QUARTERLY)
Respuesta busquedaPIB = client.SearchSeries(user, pass, "QUARTERLY");
if (busquedaPIB.Codigo == 0)
{
int seriesPIB = 0;
foreach (internetSeriesInfo serie in busquedaPIB.SeriesInfos)
{
if (serie.spanishTitle.ToLower().Contains("pib, volumen a precios del año anterior encadenado, referencia"))
{
seriesPIB++;
Console.WriteLine($"{serie.seriesId}: {serie.spanishTitle}");
}
}
Console.WriteLine($"Series encontradas para PIB: {seriesPIB}");
}
else
{
Console.WriteLine($"Error en consulta: {busquedaPIB.Descripcion}");
}
}
.NET 5/6/7/8
{
// Buscar IMACEC (frecuencia MONTHLY)
Respuesta busquedaImacec = await client.SearchSeriesAsync(user, pass, "MONTHLY");
if (busquedaImacec.Codigo == 0)
{
int seriesImacec = 0;
foreach (internetSeriesInfo serie in busquedaImacec.SeriesInfos)
{
if (serie.spanishTitle.ToLower().Contains("imacec empalmado"))
{
seriesImacec++;
Console.WriteLine($"{serie.seriesId}: {serie.spanishTitle}");
}
}
Console.WriteLine($"Series encontradas para IMACEC: {seriesImacec}");
}
else
{
Console.WriteLine($"Error en consulta: {busquedaImacec.Descripcion}");
}
// Buscar PIB (frecuencia QUARTERLY)
Respuesta busquedaPIB = await client.SearchSeriesAsync(user, pass, "QUARTERLY");
if (busquedaPIB.Codigo == 0)
{
int seriesPIB = 0;
foreach (internetSeriesInfo serie in busquedaPIB.SeriesInfos)
{
if (serie.spanishTitle.ToLower().Contains("pib, volumen a precios del año anterior encadenado, referencia"))
{
seriesPIB++;
Console.WriteLine($"{serie.seriesId}: {serie.spanishTitle}");
}
}
Console.WriteLine($"Series encontradas para PIB: {seriesPIB}");
}
else
{
Console.WriteLine($"Error en consulta: {busquedaPIB.Descripcion}");
}
}
F032.IMC.IND.Z.Z.EP13.Z.Z.1.M: Imacec empalmado, desestacionalizado (índice 2013=100)
F032.IMC.IND.Z.Z.EP18.Z.Z.0.M: Imacec empalmado, serie original (índice 2018=100)
F032.IMC.IND.Z.Z.EP18.Z.Z.1.M: Imacec empalmado, desestacionalizado (índice 2018=100)
Series encontradas para IMACEC: 4
F032.PIB.FLU.R.CLP.2008.Z.Z.0.T: PIB, volumen a precios del año anterior encadenado, referencia 2008 (millones de pesos encadenado)
F032.PIB.FLU.R.CLP.2008.Z.Z.1.T: PIB, volumen a precios del año anterior encadenado, referencia 2008 (desestacionalizada)
F032.PIB.FLU.R.CLP.EP08.Z.Z.0.T: PIB, volumen a precios del año anterior encadenado, referencia 2008 (millones de pesos encadenado)
F032.PIB.FLU.R.CLP.EP13.Z.Z.0.T: PIB, volumen a precios del año anterior encadenado, referencia 2013 (miles de millones de pesos encadenados)
F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T: PIB, volumen a precios del año anterior encadenado, referencia 2018 (miles de millones de pesos encadenados)
Series encontradas para PIB: 5
Paso 2: Consultar cada serie por separado
De los resultados anteriores, utilizaremos F032.IMC.IND.Z.Z.EP18.Z.Z.0.M (IMACEC) y F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T (PIB):
.NET Framework
string[] seriesIMACEC = { "F032.IMC.IND.Z.Z.EP18.Z.Z.0.M" };
using (SieteWS client = new SieteWS())
{
Respuesta datosIMACEC = client.GetSeries(user, pass, "2024-01-01", "2025-09-30", seriesIMACEC);
if (datosIMACEC.Codigo == 0)
{
var obsIMACEC = datosIMACEC.Series[0].obs;
Console.WriteLine($"IMACEC: {obsIMACEC.Length} observaciones mensuales");
Console.WriteLine("Últimas 5 observaciones:");
for (int i = Math.Max(0, obsIMACEC.Length - 5); i < obsIMACEC.Length; i++)
{
Console.WriteLine($"{i + 1} {obsIMACEC[i].indexDateString} {obsIMACEC[i].value:F4}");
}
}
else
{
Console.WriteLine($"Error en consulta: {datosIMACEC.Descripcion}");
}
}
// Consultar PIB (trimestral)
string[] seriesPIB = { "F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T" };
using (SieteWS client = new SieteWS())
{
Respuesta datosPIB = client.GetSeries(user, pass, "2024-01-01", "2025-09-30", seriesPIB);
if (datosPIB.Codigo == 0)
{
var obsPIB = datosPIB.Series[0].obs;
Console.WriteLine($"PIB: {obsPIB.Length} observaciones trimestrales");
foreach (var obs in obsPIB)
{
Console.WriteLine($"{obs.indexDateString} {obs.value:F2}");
}
}
else
{
Console.WriteLine($"Error en consulta: {datosPIB.Descripcion}");
}
}
.NET 5/6/7/8
string[] seriesIMACEC = { "F032.IMC.IND.Z.Z.EP18.Z.Z.0.M" };
using (var client = new SieteWSSoapClient(SieteWSSoapClient.EndpointConfiguration.SieteWSSoap))
{
Respuesta datosIMACEC = await client.GetSeriesAsync(user, pass, "2024-01-01", "2025-09-30", seriesIMACEC);
if (datosIMACEC.Codigo == 0)
{
var obsIMACEC = datosIMACEC.Series[0].obs;
Console.WriteLine($"IMACEC: {obsIMACEC.Length} observaciones mensuales");
Console.WriteLine("Últimas 5 observaciones:");
for (int i = Math.Max(0, obsIMACEC.Length - 5); i < obsIMACEC.Length; i++)
{
Console.WriteLine($"{i + 1} {obsIMACEC[i].indexDateString} {obsIMACEC[i].value:F4}");
}
}
else
{
Console.WriteLine($"Error en consulta: {datosIMACEC.Descripcion}");
}
}
// Consultar PIB (trimestral)
string[] seriesPIB = { "F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T" };
using (var client = new SieteWSSoapClient(SieteWSSoapClient.EndpointConfiguration.SieteWSSoap))
{
Respuesta datosPIB = await client.GetSeriesAsync(user, pass, "2024-01-01", "2025-09-30", seriesPIB);
if (datosPIB.Codigo == 0)
{
var obsPIB = datosPIB.Series[0].obs;
Console.WriteLine($"PIB: {obsPIB.Length} observaciones trimestrales");
foreach (var obs in obsPIB)
{
Console.WriteLine($"{obs.indexDateString} {obs.value:F2}");
}
}
else
{
Console.WriteLine($"Error en consulta: {datosPIB.Descripcion}");
}
}
Últimas 5 observaciones:
17 01-05-2025 112,9508
18 01-06-2025 108,3882
19 01-07-2025 109,0397
20 01-08-2025 110,4461
21 01-09-2025 109,1529
PIB: 7 observaciones trimestrales
1 01-01-2024 51629,65
2 01-04-2024 51347,89
3 01-07-2024 51072,57
4 01-10-2024 55879,02
5 01-01-2025 52974,86
6 01-04-2025 53039,11
7 01-07-2025 51879,68
Paso 3: Combinar ambas series con frecuencias distintas
Finalmente, combinamos IMACEC (mensual) y PIB (trimestral) para análisis conjunto:
.NET Framework
string[] seriesPIB = { "F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T" };
using (SieteWS client = new SieteWS())
{
Respuesta datosIMACEC = client.GetSeries(user, pass, "2024-01-01", "2025-09-30", seriesIMACEC);
var obsIMACEC = datosIMACEC.Series[0].obs;
Respuesta datosPIB = client.GetSeries(user, pass, "2024-01-01", "2025-09-30", seriesPIB);
var obsPIB = datosPIB.Series[0].obs;
// Preparar datos combinados
var datosCombinados = new List<dynamic>();
// Generar fechas base mensuales
var fechasBase = new List<DateTime>();
for (var fecha = new DateTime(2024, 1, 1); fecha <= new DateTime(2025, 8, 1); fecha = fecha.AddMonths(1))
{
fechasBase.Add(fecha);
}
// Combinar datos IMACEC y PIB
foreach (var fecha in fechasBase)
{
string fechaStr = fecha.ToString("dd-MM-yyyy");
var imacecObs = obsIMACEC.FirstOrDefault(o => o.indexDateString == fechaStr);
var pibObs = obsPIB.FirstOrDefault(o => o.indexDateString == fechaStr);
datosCombinados.Add(new
{
Fecha = fechaStr,
IMACEC = imacecObs?.value.ToString("F4") ?? "NA",
PIB = pibObs?.value.ToString("F2") ?? "NA"
});
}
Console.WriteLine("Datos combinados (frecuencia original):");
Console.WriteLine();
Console.WriteLine(" fecha IMACEC PIB");
// Mostrar solo los 8 primeros
for (int i = 0; i < Math.Min(8, datosCombinados.Count); i++)
{
var dato = datosCombinados[i];
Console.WriteLine($"{i + 1} {dato.Fecha} {dato.IMACEC,8} {dato.PIB,8}");
}
}
.NET 5/6/7/8
string[] seriesPIB = { "F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T" };
using (var client = new SieteWSSoapClient(SieteWSSoapClient.EndpointConfiguration.SieteWSSoap))
{
Respuesta datosIMACEC = await client.GetSeriesAsync(user, pass, "2024-01-01", "2025-09-30", seriesIMACEC);
var obsIMACEC = datosIMACEC.Series[0].obs;
Respuesta datosPIB = await client.GetSeriesAsync(user, pass, "2024-01-01", "2025-09-30", seriesPIB);
var obsPIB = datosPIB.Series[0].obs;
// Preparar datos combinados
var datosCombinados = new List<dynamic>();
// Generar fechas base mensuales
var fechasBase = new List<DateTime>();
for (var fecha = new DateTime(2024, 1, 1); fecha <= new DateTime(2025, 8, 1); fecha = fecha.AddMonths(1))
{
fechasBase.Add(fecha);
}
// Combinar datos IMACEC y PIB
foreach (var fecha in fechasBase)
{
string fechaStr = fecha.ToString("dd-MM-yyyy");
var imacecObs = obsIMACEC.FirstOrDefault(o => o.indexDateString == fechaStr);
var pibObs = obsPIB.FirstOrDefault(o => o.indexDateString == fechaStr);
datosCombinados.Add(new
{
Fecha = fechaStr,
IMACEC = imacecObs?.value.ToString("F4") ?? "NA",
PIB = pibObs?.value.ToString("F2") ?? "NA"
});
}
Console.WriteLine("Datos combinados (frecuencia original):");
Console.WriteLine();
Console.WriteLine(" fecha IMACEC PIB");
// Mostrar solo los 8 primeros
for (int i = 0; i < Math.Min(8, datosCombinados.Count); i++)
{
var dato = datosCombinados[i];
Console.WriteLine($"{i + 1} {dato.Fecha} {dato.IMACEC,8} {dato.PIB,8}");
}
}
fecha IMACEC PIB
1 01-01-2024 107,8681 51629,65
2 01-02-2024 104,1512 NA
3 01-03-2024 115,0355 NA
4 01-04-2024 111,1590 51347,89
5 01-05-2024 109,1826 NA
6 01-06-2024 104,9283 NA
7 01-07-2024 107,0739 51072,57
8 01-08-2024 110,1638 NA
A continuación se deja para descarga el WSDL del servicio, una aplicación de C# de ejemplo y además un manual técnico que indica cómo utilizar el servicio SOAP en C# con ejemplos de cómo utilizar el WSDL y los métodos en Visual Studio para distintas versiones de .NET:
