İstek Limitleri
Milagron API, her anahtar için dakikalık istek sınırı uygular. Sınır aşıldığında istek 429 ile döner.
Varsayılan Limit
Her API anahtarının varsayılan limiti dakikada 60 istektir. Bu değer anahtar bazında 1 ile 10.000 arasında değiştirilebilir.
Yanıt Başlıkları
Başarılı her istekte kalan hakkınızı gösteren iki başlık döner:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Remaining, içinde bulunduğunuz dakikada kalan istek hakkınızdır. Bu değeri izleyerek limite dayanmadan yavaşlayabilirsiniz.
Limit Aşımı Yanıtı
HTTP/1.1 429 Too Many Requests
Retry-After: 23
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
{
"errors": [
{
"code": "TooManyRequests",
"message": "Rate limit exceeded"
}
]
}
Retry-After, sayacın sıfırlanmasına kaç saniye kaldığını söyler. Tekrar denemeden önce bu kadar beklemek en verimli yoldur.
Sayaç Nasıl Çalışır
Limit, sabit dakika pencereleriyle hesaplanır. Sayaç her dakikanın başında sıfırlanır, kayan pencere kullanılmaz.
Retry-After değerine uymak bu sorunu kendiliğinden çözer.
Beklemediğiniz Anda 429 Alıyorsanız
Limitin altında kaldığınızı düşündüğünüz hâlde 429 alıyorsanız sırayla şunlara bakın:
- Mesaj hangisi?
Rate limit exceededistek limitidir.Too many failed authentication attemptsise güvenlik kilidi ve tamamen ayrı bir sayaçtır. - Aynı anahtarı birden fazla süreç mi kullanıyor? Limit anahtar bazındadır, süreç bazında değil. Hepsi aynı havuzu tüketir.
- Başarısız istekleri tekrar deniyor musunuz? 4xx yanıtlar düzeltilmeden yeniden gönderildiğinde de limiti tüketir.
- İstekleriniz dakika başına yığılıyor olabilir. Yukarıdaki sabit pencere uyarısına bakın.
Güvenlik Kilidi
Aynı IP adresinden 10 dakika içinde 15 başarısız kimlik doğrulama denemesi yapılırsa o IP 10 dakika boyunca engellenir. Bu sayaç istek limitinden bağımsızdır ve yalnızca başarısız denemeleri sayar.
Öneriler
Yeniden denemeyi kademelendirin
429 aldığınızda hemen tekrar denemek yerine bekleme süresini kademeli olarak artırın:
async function apiCallWithRetry(url, options, maxRetries = 5) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const res = await fetch(url, options);
if (res.status !== 429) return res;
const wait = Math.min(1000 * Math.pow(2, attempt), 30000);
await new Promise(r => setTimeout(r, wait));
}
throw new Error('Rate limit exceeded after retries');
}
Tek tek değil, toplu gönderin
Her ürün için ayrı istek atmak yerine price-and-inventory ucuyla tek istekte 1000 kaleme kadar gönderebilirsiniz. Bu hem daha hızlıdır hem de limitinizi korur.
Durum sorgulama sıklığı
Toplu işlem durumunu iki saniyede bir sorgulamakla başlayın ve toplam 60 saniyeyi geçmeyin. İşlem completed veya failed duruma geçtiğinde sorgulamayı bırakın.