Лимити на заявките
Всеки план определя скорост в заявки в минута: 20, 40 или 120. amodb брои заявките в плъзгащ се прозорец от 60 секунди. Всеки отговор носи X-RateLimit-Limit, X-RateLimit-Remaining и X-RateLimit-Reset. Над лимита получавате HTTP 429 със status_code 25 и заглавка Retry-After в секунди. Кешираните отговори също се броят.
Лимити по план
| Заявки в минута | Заявки на ден при пълна скорост |
|---|---|
| 20 | 28,800 |
| 40 | 57,600 |
| 120 | 172,800 |
Всеки план включва едни и същи ендпойнти и данни. Имената и цените на плановете са на страницата с цените.
Как работи прозорецът
amodb брои заявките на всеки ключ за последните 60 секунди. Прозорецът се плъзга: заявка, направена в 12:00:30, спира да се брои в 12:01:30. Няма нулиране в началото на минутата, затова равномерното темпо работи по-добре от пиковете.
Проверката на ключа и лимитът на заявките се изпълняват преди кеша в edge. Отговор от кеша пак се брои като една заявка.
Заглавки на отговора
Всяко извикване с ключ връща тези заглавки:
| Заглавка | Значение |
|---|---|
X-RateLimit-Limit | Разрешени заявки на 60 секунди за този ключ. |
X-RateLimit-Remaining | Оставащи заявки в текущия прозорец. |
X-RateLimit-Reset | Секунди, докато най-старата отчетена заявка напусне прозореца. |
Retry-After | Само при 429: секунди за изчакване преди следващото извикване. |
Когато достигнете лимита
Отговорът е HTTP 429 с тялото на грешка на TMDB:
{
"success": false,
"status_code": 25,
"status_message": "Your request count (41) is over the allowed limit of (40)."
}Изчакайте Retry-After секунди и опитайте отново. Не повтаряйте в бърз цикъл.
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")Как да останете под лимита
- Кеширайте отговорите при себе си. Детайлите се променят рядко; 6 часа са безопасна стойност по подразбиране.
- Ползвайте
append_to_response, за да получите детайли, участници и изображения с една заявка вместо три. - Разпределяйте пакетните задачи: при 40 заявки в минута изпращайте по една заявка на всеки 1.5 секунди.
- Четете
X-RateLimit-Remainingи забавете темпото, преди да стигне до 0.