certmundo.
es‑mx

6 min de lectura

¿Cómo consumir APIs REST con Python para automatizar datos?

Consumir una API REST con Python significa enviar solicitudes HTTP a un servidor y procesar la respuesta en formato JSON para usar esos datos en tus scripts.

Las APIs REST son la forma estándar en que los sistemas comparten datos en internet. Servicios como el tipo de cambio del Banco de México, los precios de Mercado Libre o los datos del SAT exponen APIs que puedes consultar automáticamente con Python.

¿Qué es una API REST?

Una API REST (Application Programming Interface) es un punto de acceso en internet que devuelve datos estructurados. Tú envías una solicitud HTTP y el servidor responde con datos en formato JSON.

El flujo básico es siempre el mismo:

  1. Tu script envía una solicitud GET o POST a una URL.
  2. El servidor procesa la solicitud.
  3. El servidor devuelve una respuesta en JSON.
  4. Tu script lee y usa esos datos.

La biblioteca requests

Python incluye la biblioteca requests para hacer solicitudes HTTP con pocas líneas. Si no la tienes instalada, ejecuta:

pip install requests

La estructura básica de una solicitud GET es:

import requests

respuesta = requests.get("https://api.ejemplo.com/datos")
datos = respuesta.json()

respuesta.json() convierte el texto JSON en un diccionario o lista de Python. Desde ese momento, trabajas con estructuras de datos normales.

Estructura de una solicitud completa

Una solicitud real tiene cuatro componentes clave:

Componente Descripción Ejemplo
URL base Dirección del servidor https://api.banxico.org.mx
Endpoint Ruta del recurso /SieAPIRest/service/v1/series
Parámetros Filtros opcionales en la URL ?token=abc123
Encabezados Metadatos de la solicitud {"Bmx-Token": "tu_token"}

Siempre revisa la documentación de la API para saber qué parámetros y encabezados requiere.

Ejemplo 1 — Consultar el tipo de cambio (Banxico)

El Banco de México ofrece una API pública para consultar el tipo de cambio USD/MXN. Este es un caso de uso directo para automatizar reportes financieros.

import requests

# Token de ejemplo — regístrate en banxico.org.mx para obtener el tuyo
token = "tu_token_aqui"
url = "https://www.banxico.org.mx/SieAPIRest/service/v1/series/SF43718/datos/oportuno"

encabezados = {
    "Bmx-Token": token
}

respuesta = requests.get(url, headers=encabezados)

if respuesta.status_code == 200:
    datos = respuesta.json()
    serie = datos["bmx"]["series"][0]
    fecha = serie["datos"][0]["fecha"]
    valor = serie["datos"][0]["dato"]
    print(f"Tipo de cambio al {fecha}: ${valor}")
else:
    print(f"Error: {respuesta.status_code}")

Salida esperada:

Tipo de cambio al 15/01/2025: $17.23

El status_code == 200 confirma que la solicitud fue exitosa. Cualquier otro código indica un error.

Ejemplo 2 — Consultar precios en una API pública

Este ejemplo usa la API pública open.er-api.com para obtener tasas de cambio. No requiere registro y es útil para practicar.

import requests

url = "https://open.er-api.com/v6/latest/USD"
respuesta = requests.get(url)

if respuesta.status_code == 200:
    datos = respuesta.json()
    tasa_mxn = datos["rates"]["MXN"]
    print(f"1 USD equivale a ${tasa_mxn:.2f}")
else:
    print("No se pudo conectar a la API.")

Salida esperada:

1 USD equivale a $17.45

datos["rates"]["MXN"] navega el diccionario JSON para extraer solo el valor que necesitas.

Ejemplo 3 — Automatizar un reporte con múltiples monedas

Este ejemplo aplica la misma lógica para generar un reporte automático de conversión de salarios. Imagina que FEMSA tiene empleados en varios países y necesitas convertir sus salarios a pesos.

import requests

url = "https://open.er-api.com/v6/latest/MXN"
respuesta = requests.get(url)

if respuesta.status_code != 200:
    print("Error al conectar con la API.")
else:
    tasas = respuesta.json()["rates"]

    salarios_mxn = {
        "Ciudad de México": 28500,
        "Monterrey": 31000,
        "Guadalajara": 26000
    }

    print("Reporte de salarios en USD:\n")
    for ciudad, salario in salarios_mxn.items():
        salario_usd = salario * tasas.get("USD", 0)
        print(f"{ciudad}: ${salario:,} MXN → ${salario_usd:,.2f} USD")

Salida esperada:

Reporte de salarios en USD:

Ciudad de México: $28,500 → $1,634.48 USD
Monterrey: $31,000 → $1,777.78 USD
Glajara: $26,000 → $1,491.40 USD

Este patrón —obtener datos de una API y cruzarlos con tus propios datos locales— es la base de la automatización empresarial.

Manejo de parámetros con params

Muchas APIs aceptan filtros en la URL llamados query parameters. En lugar de construir la URL manualmente, usa el argumento params:

import requests

url = "https://api.ejemplo.com/productos"
parametros = {
    "categoria": "electronica",
    "limite": 10,
    "orden": "precio_asc"
}

respuesta = requests.get(url, params=parametros)
print(respuesta.url)  # Muestra la URL completa con parámetros

requests construye la URL automáticamente: https://api.ejemplo.com/productos?categoria=electronica&limite=10&orden=precio_asc. Esto evita errores de formato en la URL.

Manejo de errores robusto

Una API puede fallar por varias razones: sin conexión, token vencido, límite de solicitudes alcanzado. Siempre maneja los errores de forma explícita.

import requests
from requests.exceptions import ConnectionError, Timeout

url = "https://open.er-api.com/v6/latest/USD"

try:
    respuesta = requests.get(url, timeout=5)
    respuesta.raise_for_status()  # Lanza excepción si el status es 4xx o 5xx
    datos = respuesta.json()
    print(f"Tasa MXN: ${datos['rates']['MXN']:.2f}")
except ConnectionError:
    print("Sin conexión a internet.")
except Timeout:
    print("La API tardó demasiado en responder.")
except requests.HTTPError as e:
    print(f"Error HTTP: {e}")

raise_for_status() es clave. Si el servidor devuelve un código 404 o 500, lanza una excepción automáticamente en lugar de continuar con datos incorrectos.

Autenticación con encabezados

Muchas APIs requieren un token de autenticación. Se envía en los encabezados de la solicitud.

import requests

token = "mi_token_secreto"
url = "https://api.miservicio.com/ventas"

encabezados = {
    "Authorization": f"Bearer {token}",
    "Content-Type": "application/json"
}

respuesta = requests.get(url, headers=encabezados)
datos = respuesta.json()

Nunca escribas el token directamente en el código. Usa variables de entorno o un archivo .env para proteger tus credenciales.

Errores comunes

1. No verificar el status_code antes de procesar

Si la API devuelve un error pero tú llamas .json() de todas formas, obtendrás datos incorrectos o una excepción difícil de depurar. Siempre verifica el código de respuesta primero.

# Incorrecto
datos = respuesta.json()  # Puede fallar si hubo error

# Correcto
if respuesta.status_code == 200:
    datos = respuesta.json()

2. Olvidar el argumento timeout

Sin timeout, tu script puede quedar bloqueado indefinidamente esperando una respuesta. Agrega siempre timeout=5 o timeout=10 según la API.

3. Exceder el límite de solicitudes (rate limit)

Muchas APIs limitan cuántas solicitudes puedes hacer por minuto. Si haces un ciclo que consulta la API muchas veces seguido, pueden bloquear tu IP. Usa time.sleep(1) entre solicitudes para respetar esos límites.

import time

for producto_id in lista_ids:
    respuesta = requests.get(f"https://api.ejemplo.com/producto/{producto_id}")
    datos = respuesta.json()
    procesar(datos)
    time.sleep(1)  # Pausa de 1 segundo entre solicitudes

4. Guardar el token en el código fuente

Si subes tu código a GitHub con el token visible, cualquiera puede usarlo. Usa el módulo os para leer el token desde variables de entorno:

import os
token = os.environ.get("MI_API_TOKEN")

Tabla de métodos HTTP más usados

Método Uso Ejemplo
GET Obtener datos Consultar tipo de cambio
POST Enviar datos nuevos Crear un registro
PUT Actualizar un registro completo Editar un producto
DELETE Eliminar un registro Borrar una entrada

En automatización de datos, GET es el más común. Los métodos POST y PUT se usan cuando tu script también escribe datos en el sistema.

Puntos clave

  • Usa requests.get() con el argumento headers para enviar tokens de autenticación y con params para agregar filtros a la URL.
  • Verifica siempre respuesta.status_code == 200 antes de llamar a .json(). Usa raise_for_status() para detectar errores HTTP automáticamente.
  • Agrega timeout a cada solicitud para evitar que tu script se bloquee esperando una respuesta que nunca llega.
  • Nunca escribas tokens o contraseñas directamente en el código. Usa variables de entorno con el módulo os.
  • Combina los datos de la API con tus propios datos locales —como salarios, inventarios o productos— para generar reportes automáticos que aporten valor real a tu empresa.

Puntos clave

  • Usa `requests.get()` con `headers` para enviar tokens de autenticación y con `params` para agregar filtros. Llama a `.json()` solo después de confirmar que `status_code == 200`.
  • Usa `raise_for_status()` para detectar automáticamente errores HTTP 4xx y 5xx sin necesidad de verificar el código manualmente en cada solicitud.
  • Agrega siempre el argumento `timeout` (por ejemplo, `timeout=5`) para evitar que tu script quede bloqueado si el servidor no responde.
  • Nunca escribas tokens o credenciales directamente en el código. Guárdalos en variables de entorno y léelos con `os.environ.get()`.
  • Usa `time.sleep()` entre solicitudes consecutivas para respetar el límite de peticiones de la API y evitar que tu IP sea bloqueada.

Comparte esta lección: