Límites de solicitudes
Cada plan fija un ritmo en solicitudes por minuto: 20, 40 o 120. amodb cuenta las solicitudes en una ventana deslizante de 60 segundos. Cada respuesta lleva X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset. Si superas el límite recibes HTTP 429 con status_code 25 y un encabezado Retry-After en segundos. Las respuestas en caché también cuentan.
Límites por plan
| Solicitudes por minuto | Solicitudes al día al ritmo máximo |
|---|---|
| 20 | 28 800 |
| 40 | 57 600 |
| 120 | 172 800 |
Todos los planes incluyen los mismos endpoints y datos. Consulta los precios para ver los nombres y los precios de los planes.
Cómo funciona la ventana
amodb cuenta las solicitudes de cada clave durante los últimos 60 segundos. La ventana se desliza: una solicitud hecha a las 12:00:30 deja de contar a las 12:01:30. No hay reinicio al comienzo del minuto, así que un ritmo constante funciona mejor que las ráfagas.
La comprobación de la clave y el límite de solicitudes se ejecutan antes que la caché perimetral. Una respuesta servida desde la caché cuenta igualmente como una solicitud.
Encabezados de respuesta
Toda llamada hecha con una clave devuelve estos encabezados:
| Encabezado | Significado |
|---|---|
X-RateLimit-Limit | Solicitudes permitidas por 60 segundos para esta clave. |
X-RateLimit-Remaining | Solicitudes que quedan en la ventana actual. |
X-RateLimit-Reset | Segundos hasta que la solicitud contada más antigua salga de la ventana. |
Retry-After | Solo en 429: segundos que debes esperar antes de la siguiente llamada. |
Cuando alcanzas el límite
La respuesta es HTTP 429 con el cuerpo de error de TMDB:
{
"success": false,
"status_code": 25,
"status_message": "Your request count (41) is over the allowed limit of (40)."
}Espera los segundos de Retry-After y vuelve a intentarlo. No reintentes en un bucle cerrado.
async function amodb(path) {
for (let attempt = 0; attempt < 3; attempt++) {
const res = await fetch(`https://api.amodb.dev${path}`, {
headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` },
});
if (res.status !== 429) return res.json();
const wait = Number(res.headers.get("Retry-After") ?? 1);
await new Promise((r) => setTimeout(r, wait * 1000));
}
throw new Error("amodb: still rate limited after 3 attempts");
}import os
import time
import requests
def amodb(path):
for _ in range(3):
res = requests.get(
f"https://api.amodb.dev{path}",
headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
timeout=10,
)
if res.status_code != 429:
return res.json()
time.sleep(int(res.headers.get("Retry-After", "1")))
raise RuntimeError("amodb: still rate limited after 3 attempts")Mantente por debajo del límite
- Guarda las respuestas en caché de tu lado. Los detalles cambian poco; 6 horas es un valor seguro por defecto.
- Usa
append_to_responsepara obtener detalles, créditos e imágenes en una sola solicitud en lugar de tres. - Reparte los trabajos por lotes: con 40 solicitudes por minuto, envía una solicitud cada 1,5 segundos.
- Lee
X-RateLimit-Remainingy reduce el ritmo antes de que llegue a 0.