Que pasa uno tiene el mensaje "Too many requests" mientras se actualizan precios o stocks en Mercadolibre

12 de noviembre de 2025 por
Gustavo Orrillo
| Sin comentarios aún
 

Un problema muy común cuando uno actualiza en forma masiva publicaciones de Mercadolibre (por ejemplo precios o stocks) es la no actualización de publicaciones con el siguiente mensaje de error: Too Many Requests” (HTTP 429)

Que significa? Que uno llega a los rate limits que tiene con Mercadolibre para actualizar (o consultar) publicaciones. Es una medida que toma Mercadolibre para proteger su infraestructura. Por eso cada access token y usuario tiene un rate limit específico (depende del tipo de endpoint y del país). Pero en el endpoint items (que es el que se utiliza para actualizar o consultar publicaciones) no es precisamente muy alto.

Supongamos que queremos hacer una actualización al endpoint items:

response = requests.put(url, headers=headers, json=data)

Y Mercadolibre nos devuelve el error de rate-limits:

{
"message": "Too many requests",
"error": "too_many_requests",
"status": 429
}

Por eso, cuando obtenemos ese mensaje de error, debemos esperar y probar de vuelta un tiempo más tarde (solo algunos segundos, no es el fin del mundo). Ahora como podemos hacerlo de manera automática? Una forma muy sencilla es encapsular la llamada al endpoint y agregar la lógica de control en una función

import time
import requests

# metodo para actualizar la publicación de ML
def update_item(item_id, data, access_token):
url = f"https://api.mercadolibre.com/items/{item_id}"
headers = {"Authorization": f"Bearer {access_token}"}

​ # intenta actualizar el item cinco veces
for attempt in range(5):
​ # realiza el pedido de actualización
response = requests.put(url, json=data, headers=headers)
if response.status_code == 200:
# si esta OK devuelve el json de la respuesta
return [response.status_code,response.json()]
elif response.status_code == 429:
​ # si da error de rate limits, setea el tiempo de espera a 2 elevada al intento
wait = 2 ** attempt # exponential backoff
print(f"Rate limited. Esperando {wait}s antes de reintentar...")
time.sleep(wait)
else:
return [response.status_code,response.text]
return [429,'No se pudo actualizar %s después de 5 intentos'%(item_id)]

Y en nuestro código (de xmlrpc quiero suponer), en lugar de llamar al put de requests, se debe llamar al método update_item pasándole como parámetro el item_id, los datos a actualizar y el access_token. Es una actualización interesante para agregarle a meli_oerp

Sobre todo porque este mensaje de error es muy común.

Gustavo Orrillo 12 de noviembre de 2025
Compartir
Archivar
Identificarse dejar un comentario