Acceso a la API

Buscador de Series

Documentación

Ayuda y Soporte

Términos y Condiciones

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.

In[1]:
# Instalar la librería bcchapi desde PyPI
!pip install bcchapi

Una vez instalada, puedes importar la librería en tu script o notebook:

In[2]:
# Importar la librería en tu código
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.

Nota: Si no tienes API Key Token, visita la sección Acceso a la API para ver cómo obtenerlo.

Puedes autenticarte poniendo tu token directamente:

In[3]:
# Instanciar la clase Siete con tu token
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):

In[3]:
# Buscar series relacionadas con TPM
resultado = siete.buscar("TPM")

print(f"Encontradas {len(resultado)} series")
resultado.head(3)
Out[3]:
Encontradas 13 series

seriesIdfrequencyCodespanishTitleenglishTitlefirstObservationlastObservationupdatedAtcreatedAt
0F022.TPM.TIN.D001.NO.Z.DDAILYTasa de política monetaria (TPM) (porcentaje)Monetary policy rate (MPR) (percentage)1997-02-072025-10-132025-10-102025-10-10
1F089.EOF.FI_TPM_CFL.1A.DDAILYEvolución encuesta de operadores fin. (EOF)...Evolution survey of financial operators (EOF)...2021-10-072025-09-042025-09-042025-09-04
2F089.EOF.FI_TPM_DD.1A.DDAILYEvolución encuesta de operadores fin. (EOF)...Evolution survey of financial operators (EOF)...2021-10-072025-09-042025-09-042025-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':

Importante: El parámetro 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:

In[4]:
# Consulta básica del dólar observado
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
Out[4]:
Datos obtenidos: 7 observaciones

Dólar
2024-10-01897.68
2024-10-02901.13
2024-10-03908.23
2024-10-04919.49
2024-10-05NaN
2024-10-06NaN
2024-10-07923.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:

In[5]:
# Buscar "dólar observado" en las series disponibles
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()
Out[5]:
Se encontraron 3 series relacionadas con 'dólar observado' Primeras 5 coincidencias:
seriesIdfrequencyCodespanishTitle
0F073.TCO.PRE.Z.DDAILYTipo de cambio nominal (dólar observado $CLP/USD)...
1F073.TCO.PRE.HIST.MMONTHLYTipo de cambio del dólar observado diario, serie histórica
2F073.TCO.PRE.Z.MMONTHLYTipo 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:

In[6]:
# Consultar datos del ú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)
Out[6]:
Datos obtenidos: 394 observaciones
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-21NaN
2025-09-22951.03
2025-09-23954.72
2025-09-24952.87
2025-09-25953.24
2025-09-26956.42
2025-09-27NaN
2025-09-28NaN
2025-09-29958.90
2025-09-30961.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:

In[7]:
# Estadísticas básicas
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}")
Out[7]:
Estadísticas del Dólar Observado:
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:

In[8]:
# Buscar IMACEC
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)
Out[8]:
Series encontradas para IMACEC: 4

Primeras coincidencias:
seriesIdfrequencyCodespanishTitle
0F032.IMC.IND.Z.Z.EP13.Z.Z.0.MMONTHLYImacec empalmado, serie original (índice 2013=...
1F032.IMC.IND.Z.Z.EP13.Z.Z.1.MMONTHLYImacec empalmado, desestacionalizado (índice 2...
2F032.IMC.IND.Z.Z.EP18.Z.Z.0.MMONTHLYImacec empalmado, serie original (índice 2018=...
In[9]:
# Buscar PIB
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)
Out[9]:
Series encontradas para PIB: 68

Últimas coincidencias:
seriesIdfrequencyCodespanishTitle
58F032.PIB.FLU.R.CLP.2018.Z.Z.2025MAR.TQUARTERLYPIB, volumen a precios del año anterior encaden...
59F032.PIB.FLU.R.CLP.2018.Z.Z.2025MAY.TQUARTERLYPIB, volumen a precios del año anterior encaden...
60F032.PIB.FLU.R.CLP.2018.Z.Z.2025NOV.TQUARTERLYPIB, volumen a precios del año anterior encaden...
61F032.PIB.FLU.R.CLP.EP08.Z.Z.0.TQUARTERLYPIB, volumen a precios del año anterior encaden...
62F032.PIB.FLU.R.CLP.EP13.Z.Z.0.TQUARTERLYPIB, volumen a precios del año anterior encaden...
63F032.PIB.FLU.R.CLP.EP18.Z.Z.0.TQUARTERLYPIB, volumen a precios del año anterior encaden...
64F032.PIB.FLU.R.CLP.HIST.Z.Z.0.TQUARTERLYPIB, volumen a precios del año anterior encaden...
65F032.PIB.FLU.R.CLP.HIST.Z.Z.3.TQUARTERLYPIB, volumen a precios del año anterior encaden...
66F032.PIB.FLU.R.CLP.HIST13.Z.Z.0.TQUARTERLYPIB, volumen a precios del año anterior encaden...
67F032.PIB.FLU.R.CLP.HIST13.Z.Z.3.TQUARTERLYPIB, 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:

In[10]:
# Consultar IMACEC (mensual)
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()
Out[10]:
IMACEC: 21 observaciones mensuales
Período: 2024-01 a 2025-09
IMACEC
2025-05-01112.950836
2025-06-01108.388247
2025-07-01109.039654
2025-08-01110.446073
2025-09-01109.152886
In[11]:
# Consultar PIB (trimestral)
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
Out[11]:
PIB: 7 observaciones trimestrales
Período: 2024-01 a 2025-07
PIB
2024-01-0151629.653131
2024-04-0151347.892689
2024-07-0151072.569785
2024-10-0155879.020025
2025-01-0152974.863449
2025-04-0153039.105024
2025-07-0151879.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:

In[12]:
# Variación interanual del IMACEC
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()
Out[12]:
IMACEC - Variación interanual (%):
IMACEC_var
2025-05-013.45
2025-06-013.30
2025-07-011.84
2025-08-010.26
2025-09-012.70

Para el IMACEC (serie mensual), usamos .tail() para mostrar solo las últimas 5 variaciones interanuales que son las más recientes.

In[13]:
# Variación interanual del PIB
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()
Out[13]:
PIB - Variación interanual (%):
PIB_var
2024-07-01NaN
2024-10-01NaN
2025-01-012.61
2025-04-013.29
2025-07-011.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:

In[14]:
# Consultar ambas series con su frecuencia original
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)
Out[14]:
Datos combinados (frecuencia original):
IMACECPIB
2024-01-01107.86810851629.653131
2024-02-01104.151200NaN
2024-03-01115.035498NaN
2024-04-01111.15904751347.892689
2024-05-01109.182567NaN
2024-06-01104.928343NaN
2024-07-01107.07385251072.569785
2024-08-01110.163804NaN

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

https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx

Funciones Disponibles

  • SearchSeries - Buscar series por frecuencia en el catálogo
  • GetSeries - Obtener datos de una serie específica
Ventajas del servicio REST: Máxima flexibilidad, puede usarse en cualquier programa que soporte HTTP, como R, Stata, Matlab, Python, entre otros.

Todas las consultas al servicio REST requieren un API Key Token válido que debe incluirse como parámetro en cada URL.

Nota: Si no tienes un API Key Token, visita la sección Acceso a la API para ver cómo obtenerlo.

Puedes incluir el token directamente en la URL:

https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=tu_token&...

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:

URL:
https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=tu_token&function=SearchSeries&frequency=QUARTERLY
Respuesta JSON:
{
  "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:

URL:
https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=tu_token&function=GetSeries&timeseries=F022.TPM.TIN.D001.NO.Z.D&firstdate=2021-10-10&lastdate=2021-10-15
Respuesta JSON:
{
  "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:

URL:
https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=tu_token&function=SearchSeries&frequency=DAILY
Respuesta JSON:
{
  "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:

URL:
https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=tu_token&function=GetSeries&timeseries=F073.TCO.PRE.Z.D&firstdate=2024-10-01&lastdate=2024-10-07
Respuesta JSON:
{
  "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:

URL:
https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=tu_token&function=SearchSeries&frequency=MONTHLY
Respuesta JSON:
{
  "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:

URL:
https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=tu_token&function=SearchSeries&frequency=QUARTERLY
Respuesta JSON:
{
  "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).

URL:
https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=tu_token&function=GetSeries&timeseries=F032.IMC.IND.Z.Z.EP18.Z.Z.0.M&firstdate=2024-01-01&lastdate=2024-06-30
Respuesta JSON:
{
  "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.

URL:
https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=tu_token&function=GetSeries&timeseries=F032.PIB.FLU.R.CLP.EP18.Z.Z.0.T&firstdate=2024-01-01&lastdate=2024-06-30
Respuesta JSON:
{
  "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:

In[1]:
# Instalar librerías (ejecutar solo una vez)
install.packages("rjson")
install.packages("httr")

# Cargar librerías
library("rjson")
library(httr)
In[2]:
# API Key Token (reemplazar por el propio)
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:

In[3]:
# URL completa para búsqueda de series diarias
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))
Out[3]:
Se encontraron 1 series relacionadas con 'dólar observado'

           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:

In[4]:
# URL completa para obtener datos de la serie
url_datos_dolar <- paste0(
  "https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token,
  "&function=GetSeries&timeseries=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))
Out[4]:
Datos obtenidos: 394 observaciones
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:

In[5]:
# Estadísticas básicas (excluyendo valores NA)
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")
Out[5]:
Estadísticas del Dólar Observado:
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:

In[6]:
# Buscar IMACEC (frecuencia MONTHLY)
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))
Out[6]:
Series encontradas para IMACEC: 4

                       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)     …
In[7]:
# Buscar PIB (frecuencia QUARTERLY)
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))
Out[7]:
Series encontradas para PIB: 65

                       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):

In[8]:
# Consultar IMACEC (mensual)
url_datos_imacec <- paste0(
  "https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token,
  "&function=GetSeries&timeseries=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))
Out[8]:
IMACEC: 21 observaciones mensuales

   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
In[9]:
# Consultar PIB (trimestral)
url_datos_pib <- paste0(
  "https://si3.bcentral.cl/SieteRestWS/SieteRestWS.ashx?token=", token,
  "&function=GetSeries&timeseries=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)
Out[9]:
PIB: 7 observaciones trimestrales

  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:

In[10]:
# Preparar fechas para el merge
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))
Out[10]:
Datos combinados (frecuencia original):

       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

https://si3.bcentral.cl/SieteWS/SieteWS.asmx?wsdl

Métodos Disponibles

  • SearchSeries - Buscar series por frecuencia en el catálogo
  • GetSeries - Obtener datos de una serie específica
Consistencia con REST: Los métodos del servicio SOAP son exactamente los mismos que los del servicio REST. Tienen los mismos nombres, parámetros y devuelven la misma información, solo cambia la forma de invocarlos.
Ventajas del servicio SOAP: Generación automática de código cliente, tipado fuerte, y mejor integración en entornos empresariales y frameworks como .NET y Java EE.

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.

Nota: Si no tienes credenciales de la BDE, revisa primero las instrucciones de ¿Tienes cuenta en la BDE? para crear tu cuenta y luego las de ¿Cómo habilitar la API? para habilitar su uso. Completados esos pasos, tu usuario y contraseña de la BDE serán tus credenciales para consumir la API.

Parámetros de autenticación requeridos

  • user: Tu email registrado en la BDE
  • pass: 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.

Implementación práctica: Para ver cómo se usan las credenciales en la práctica, consulta la sección "Ejemplo en C#".

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:

SearchSeriesResponse
 └── 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
Importante: En el array 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:

GetSeriesResponse
 └── 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
Nota importante: Siempre revisa 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.

https://si3.bcentral.cl/SieteWS/SieteWS.asmx?wsdl
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:

C#:
// Credenciales (reemplazar por las propias)
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
In[1]:
using (SieteWS client = new SieteWS())
{
    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
In[1]:
using (var client = new SieteWSSoapClient(SieteWSSoapClient.EndpointConfiguration.SieteWSSoap))
{
    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}");
    }
}
Out[1]:
F073.TCO.PRE.Z.D: Tipo de cambio nominal (dólar observado $CLP/USD); tipo de cambio; ; precio; diario; ; Banco Central de Chile; ;
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
In[2]:
string[] seriesDolar = { "F073.TCO.PRE.Z.D" };
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
In[2]:
string[] seriesDolar = { "F073.TCO.PRE.Z.D" };
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}");
    }
}
Out[2]:
Datos obtenidos: 394 observaciones
Ú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
In[3]:
var valores = observaciones.Where(o => !double.IsNaN(o.value)).Select(o => o.value).ToArray();
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
In[3]:
var valores = observaciones.Where(o => !double.IsNaN(o.value)).Select(o => o.value).ToArray();
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}");
Out[3]:
Estadísticas del Dólar Observado:
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
In[4]:
using (SieteWS client = new SieteWS())
{
    // 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
In[4]:
using (var client = new SieteWSSoapClient(SieteWSSoapClient.EndpointConfiguration.SieteWSSoap))
{
    // 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}");
    }
}
Out[4]:
F032.IMC.IND.Z.Z.EP13.Z.Z.0.M: Imacec empalmado, serie original (índice 2013=100)
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
In[5]:
// Consultar IMACEC (mensual)
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
In[5]:
// Consultar IMACEC (mensual)
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}");
    }
}
Out[5]:
IMACEC: 21 observaciones mensuales
Ú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
In[6]:
string[] seriesIMACEC = { "F032.IMC.IND.Z.Z.EP18.Z.Z.0.M" };
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
In[6]:
string[] seriesIMACEC = { "F032.IMC.IND.Z.Z.EP18.Z.Z.0.M" };
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}");
    }
}
Out[6]:
Datos combinados (frecuencia original):

        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: