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:
- Tu script envía una solicitud
GEToPOSTa una URL. - El servidor procesa la solicitud.
- El servidor devuelve una respuesta en JSON.
- 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 argumentoheaderspara enviar tokens de autenticación y conparamspara agregar filtros a la URL. - Verifica siempre
respuesta.status_code == 200antes de llamar a.json(). Usaraise_for_status()para detectar errores HTTP automáticamente. - Agrega
timeouta 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.