Domain API Hız Limiti, Soft Quota ve Throttling Politikası

Domain Name API hız limiti, soft quota ve throttling politikası

Bu sayfadaki her şey iki sayıya bakıyor: 2 ve 200. Saniyede iki istek, dakikada iki yüz kota puanı. Bu ikisini bilirseniz politikayı zaten biliyorsunuz — gerisi dört işlem ve birkaç kod parçası.

Domain Name API her bayi hesabına birbirinden bağımsız iki denetim uyguluyor. Birincisi katı bir hız limiti: aşarsanız HTTP 429 alırsınız. İkincisi soft quota ve birinciye hiç benzemiyor — hiçbir isteği reddetmiyor, yavaşlatıyor. Bu makalenin asıl konusu tam olarak bu fark, çünkü ikisini birbirine karıştıran bir entegrasyon var olmayan bir hatanın peşinde bir öğleden sonra harcıyor.

30 saniyelik özet

Saniyede en fazla 2 istek gönderin; daha hızlısı HTTP 429 döner. Bundan bağımsız olarak her çağrının bir puanı var: /domains/search ve /domains/info 1 puan, diğer tüm endpoint’ler 10 puan. 60 saniyede 200 puan hakkınız var. Bunu doldurduğunuzda hiçbir şey başarısız olmuyor — yanıtlarınız yalnızca yarım saniye kadar geç gelmeye başlıyor, aynı hızda devam ederseniz bu gecikme 5 saniyelik tavana kadar tırmanıyor. Hızınızı düşürdüğünüzde gecikme de geri iniyor. Her iki limit de bayi başına sayılıyor, API anahtarı başına değil.

İçindekiler

Bir Bakışta Kurallar

Politikanın söylediği her şey tek tabloda. Bu tabloyu entegrasyon ekibinize iletmeniz çoğu zaman yeterli oluyor.

Konu Kural
API adresi https://api.domainresellerapi.com/api/v1
Kim sayılıyor? __reseller başlığıyla tanımlanan bayi. Ek API anahtarı ek hak getirmiyor.
Hız limiti Saniyede 2 istek
Hız limiti aşılırsa HTTP 429 Too Many Requests — istek reddedilir
Soft quota 60 saniyede 200 puan
/domains/search ve /domains/info maliyeti 1 puan
Diğer tüm endpoint’lerin maliyeti 10 puan
Soft quota aşılırsa Yanıtlar geciktirilir, reddedilmez. Hata kodu dönmez.
Gecikme miktarı 0,5 sn civarında başlar, aynı hız sürerse 5 sn tavanına tırmanır
Toparlanma Kotanın altına indiğinizde gecikme de geri iner
1 puanlık çağrılarda güvenli hız Saniyede 2 — sizi durduran hız limitidir, kota asla
10 puanlık çağrılarda güvenli hız 3 saniyede 1 istek (dakikada 20)

İki Katman: Hız Limiti ve Soft Quota

Bu iki denetim farklı ölçülüyor, farklı tepki veriyor ve farklı çözülüyor. Bu konudaki neredeyse her destek talebi, ikisinin tek şey sanılmasıyla başlıyor.

Katı limit

Hız limiti — saniyede 2 istek

Bu limit isteği sayıyor, değerini değil. Saniyede iki istek, çalıştırdığınız tüm thread, worker, container ve cron işlerinin toplamı için geçerli tavandır.

  • Aşılırsa HTTP 429 döner ve istek çalışmaz
  • Anında tepki verir — tek bir yoğun saniye yeterlidir
  • Çözümü kodunuzdaki tek bir ortak limiter’dır
Yumuşak limit

Soft quota — 60 saniyede 200 puan

Bu limit değeri sayıyor, isteği değil. Ucuz bir sorgulama ile pahalı bir kayıt işlemi arkadaki sistemler için aynı yük değil; dolayısıyla aynı fiyatı taşımıyorlar.

  • Aşılırsa yanıtlarınız geciktirilir — hiçbir şey reddedilmez
  • Ceza değil fren; kendiliğinden bırakır
  • Çözümü hızı ayarlamak ya da daha az pahalı çağrı yapmaktır
Her iki limit de bayi hesabı başına sayılıyor. İkinci bir API anahtarı oluşturmak ikinci bir hak oluşturmuyor — her istek __reseller kimliğinizi taşıdığı için, hangi anahtarla imzalanmış olursa olsun hepsi aynı kovaya düşüyor.

Hangi İstek Kaç Puan?

İki endpoint ucuz, çünkü salt okunur ve müşterileriniz neyi satın alacağına karar verirken sitenizde canlı olarak tetikledikleri çağrılar bunlar. Diğer her şey bir registry’ye, bir fatura kaydına ya da bir sertifika otoritesine ulaşıyor; asıl maliyeti onlar taşıyor.

Endpoint Metot Maliyet
/api/v1/domains/search — tekli müsaitlik sorgusu POST 1 puan
/api/v1/domains/info — domain detayı GET 1 puan
/api/v1/domains/bulk-search POST 10 puan
/api/v1/domains/register, /renew, /transfer, /restore POST 10 puan
/api/v1/domains/dns/*, /zones, /forwards, /lock, /privacy tümü 10 puan
/api/v1/contacts/* tümü 10 puan
/api/v1/ssls/*, /hostings/*, /products/*, /order/*, /deposit/* tümü 10 puan
Yukarıda listelenmeyen her şey tümü 10 puan
bulk-search kuralı çoğu kişiyi şaşırtıyor. Dizide kaç isim olursa olsun sabit 10 puan. Başabaş noktası on isim: onun altında /domains/search döngüsü daha ucuz, tam onda berabere, onun üstünde bulk-search kazanıyor ve kazanmayı sürdürüyor. 200 ismi tek tek sorgulamak 200 puan, dört toplu çağrıyla sorgulamak 40 puan.

Gerçek Bütçeniz, Sayılarla

İki limit birbiriyle etkileşiyor ve hangisine takılacağınız tamamen ne çağırdığınıza bağlı. Masanızın üstüne asmaya değer tablo bu.

Ne çağırıyorsunuz? 200 puana kaç çağrı sığar Sizi önce hangi limit durdurur Sürdürülebilir güvenli hız
Yalnızca tekli sorgular (1’er puan) 200 Her zaman hız limiti Saniyede 2 = dakikada 120
Diğer her şey (10’ar puan) 20 Soft quota 3 saniyede 1 = dakikada 20
Karışık: domain başına bir sorgu + bir kayıt (11 puan) 18 domain Soft quota Yaklaşık 3,3 saniyede 1 domain

Çalışılmış örnek: 500 domain sorgulamak

/domains/search ile tek tek sorgularsanız 500 çağrı ve 500 puan eder. Kota bunu iki buçuk dakikada harcamanıza izin verirdi — ama saniyede 2 istekle duvar saati zaten 250 saniye, yani belirleyici olan hız limiti ve fren hiç devreye girmiyor. bulk-search ile 50’şerlik gruplar hâlinde aynı iş 10 çağrı, 100 puan ve yaklaşık 5 saniye. Aynı cevap, elli kat hızlı ve 500 yerine 100 puan harcıyor.

Çalışılmış örnek: 100 domain kaydetmek

Yüz kayıt işlemi 1.000 puan eder ve kota dakikada 200 puan serbest bırakır. Bu iş en az beş dakika sürer; paralelliğin miktarı bunu değiştirmez. Tam hızla gönderirseniz ilk on saniyede kotayı doldurur, kalan doksan saniyeyi büyüyen bir gecikmenin arkasında sürünerek geçirirsiniz. Üç saniyede bir gönderirseniz aynı beş dakikada bitirir, üstelik her yanıt zamanında gelir. Yavaş sürüm aslında daha yavaş değil — işin gerçekte ne kadar sürdüğü konusunda yalnızca daha dürüst.

Entegrasyonunuz yalnızca müsaitlik sorgusu yapıyorsa soft quota size ulaşamaz. Saniyede iki istek, her biri bir puan, dakikada 120 puan eder; tavan ise 200. Tekli sorguların kotayı doldurabileceği bir hız yok. Yani yalnızca sorgu yapan bir entegrasyonda yanıtlar yavaşlıyorsa sebep başka bir yerdedir.

Kota Dolduğunda Ne Oluyor?

Dramatik hiçbir şey olmuyor; sorun da tam olarak bu — fren sessiz çalışıyor ve sessiz belirtiler insanın bir öğleden sonrasına mal olan belirtiler.

Durumunuz API ne yapıyor
Son 60 saniyede 200 puanın altındasınız Hiçbir şey. Normal yanıt süreleri.
Kota yeni doldu Sonraki her yanıt yaklaşık 0,5 saniye bekletilir
Aynı hızda devam ediyorsunuz Bekletme adım adım büyür
Yine de devam ediyorsunuz Bekletme 5 saniyelik tavanına ulaşır ve orada kalır
Kotanın altına iniyorsunuz Bekletme geri iner ve normal zamanlama geri gelir
HTTP istemci zaman aşımınızı en az 10 saniyeye ayarlayın. Soft quota hiçbir zaman hata döndürmediği için 3 saniyede pes eden bir istemci, fren devreye girdiği anda zaman aşımı fırlatmaya başlar — üstelik hata mesajı kotayı değil ağı işaret eder. Bu politikanın kimseye kaybettirdiği zamanın büyük kısmı tam olarak bu yanlış teşhise gidiyor.

HTTP 429 Hatası Nasıl Çözülür?

Burada 429 her zaman tek bir anlama gelir: aynı saniye içinde sizin tarafınızdan ikiden fazla istek çıkmıştır. Kotayla ilgisi yoktur, kaç domain yönettiğinizle de ilgisi yoktur. Şu adımları sırayla uygulayın.

  • Göndermeyi durdurun. Endpoint’i zorlamaya devam etmek sizi çizginin üstünde tutar ve bir 429’u 429 seline çevirir.
  • Yanıtta Retry-After varsa ona uyun, yoksa en az bir saniye bekleyin.
  • Bir kez yeniden deneyin. Ani bir yığından sonra tek bir 429 normaldir ve tek deneme genelde yeterli olur.
  • Tekrarlıyorsa üstel geri çekilme uygulayın — 1 sn, 2 sn, 4 sn, 8 sn — makul bir tavanla.
  • Sonra asıl sebebi bulun. On vakanın dokuzunda sebep, her biri kendi limiter’ını taşıyan paralel worker’lardır; “saniyede 2” diyen dört worker aslında sekiz gönderiyordur.

Kod Örnekleri

İşe yarayan kalıp her zaman aynı: tüm süreç için tek kapı, istekler arasında asgari bir aralık ve ısrar etmek yerine bekleyen bir yeniden deneme. Aşağıdaki örnekler saniyede iki istek hızında ilerliyor; iş yükünüz 10 puanlık çağrılardan oluşuyorsa aralığı 3 saniyeye çıkarın, frene hiç rastlamazsınız.

C# (.NET)

// Tum surec icin tek kapi. Her worker buradan geciyor.
private static readonly SemaphoreSlim Gate = new(1, 1);
private static DateTime _next = DateTime.UtcNow;

// 500 ms -> 1 puanlik cagrilarda saniyede 2. 10 puanlik cagrilarda 3000 ms.
private static readonly TimeSpan MinInterval = TimeSpan.FromMilliseconds(500);

async Task<HttpResponseMessage> SendAsync(Func<HttpRequestMessage> build)
{
    var backoff = TimeSpan.FromSeconds(1);

    for (var attempt = 1; attempt <= 6; attempt++)
    {
        await Gate.WaitAsync();
        try
        {
            var wait = _next - DateTime.UtcNow;
            if (wait > TimeSpan.Zero) await Task.Delay(wait);
            _next = DateTime.UtcNow + MinInterval;
        }
        finally { Gate.Release(); }

        // HttpRequestMessage tek kullanimliktir, her denemede yenisini uretin.
        var response = await _http.SendAsync(build());
        if ((int)response.StatusCode != 429) return response;

        var after = response.Headers.RetryAfter?.Delta ?? backoff;
        response.Dispose();
        await Task.Delay(after);
        backoff = TimeSpan.FromSeconds(Math.Min(backoff.TotalSeconds * 2, 30));
    }

    throw new HttpRequestException("Hiz limiti 6 denemede acilmadi.");
}

PHP (WHMCS, WordPress, cPanel)

<?php
// 500000 mikrosaniye = 0,5 sn -> saniyede 2. 10 puanlik cagrilarda 3000000.
const DNA_MIN_INTERVAL_US = 500000;

function dna_request(string $method, string $path, ?array $body = null) {
    static $next = 0;

    $backoff = 1;
    for ($attempt = 1; $attempt <= 6; $attempt++) {
        $now = (int) (microtime(true) * 1000000);
        if ($now < $next) usleep($next - $now);
        $next = (int) (microtime(true) * 1000000) + DNA_MIN_INTERVAL_US;

        $ch = curl_init('https://api.domainresellerapi.com/api/v1' . $path);
        curl_setopt_array($ch, [
            CURLOPT_CUSTOMREQUEST  => $method,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT        => 30,   // 10'un altina asla inmeyin
            CURLOPT_HTTPHEADER     => [
                'Content-Type: application/json',
                '__reseller: ' . DNA_RESELLER_ID,
                'X-API-KEY: '  . DNA_API_KEY,
            ],
            CURLOPT_POSTFIELDS => $body === null ? null : json_encode($body),
        ]);

        $raw    = curl_exec($ch);
        $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
        curl_close($ch);

        if ($status !== 429) return json_decode($raw, true);

        sleep($backoff);
        $backoff = min($backoff * 2, 30);
    }

    throw new RuntimeException('Hiz limiti 6 denemede acilmadi.');
}

Python (script ve otomasyon)

import threading, time, requests

BASE = "https://api.domainresellerapi.com/api/v1"
HEADERS = {"__reseller": RESELLER_ID, "X-API-KEY": API_KEY}

# 0,5 sn -> 1 puanlik cagrilarda saniyede 2. 10 puanlik cagrilarda 3.0.
MIN_INTERVAL = 0.5
_lock, _next = threading.Lock(), 0.0


def dna_request(method, path, **kwargs):
    global _next
    backoff = 1.0

    for _ in range(6):
        with _lock:                       # tek kapi, butun thread'ler
            wait = _next - time.monotonic()
            if wait > 0:
                time.sleep(wait)
            _next = time.monotonic() + MIN_INTERVAL

        # timeout, 5 sn'lik soft quota tavanini rahatca asmali
        r = requests.request(method, BASE + path, headers=HEADERS,
                             timeout=30, **kwargs)
        if r.status_code != 429:
            return r.json()

        time.sleep(float(r.headers.get("Retry-After", backoff)))
        backoff = min(backoff * 2, 30)

    raise RuntimeError("Hiz limiti 6 denemede acilmadi.")

Node.js (JavaScript / TypeScript)

const BASE = 'https://api.domainresellerapi.com/api/v1';
const MIN_INTERVAL = 500;          // saniyede 2; 10 puanlik cagrilarda 3000
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));

// Node'da en basit tek kapi bir promise zinciridir: `tail`i beklemek
// kac cagiran paralel baslamis olursa olsun hepsini siraya sokar.
let tail = Promise.resolve();

function pace() {
  const turn = tail.then(() => sleep(MIN_INTERVAL));
  tail = turn;
  return turn;
}

export async function dnaRequest(method, path, body) {
  let backoff = 1000;

  for (let attempt = 1; attempt <= 6; attempt++) {
    await pace();

    const res = await fetch(BASE + path, {
      method,
      headers: {
        'Content-Type': 'application/json',
        __reseller: process.env.DNA_RESELLER_ID,
        'X-API-KEY': process.env.DNA_API_KEY,
      },
      body: body ? JSON.stringify(body) : undefined,
      signal: AbortSignal.timeout(30000),   // 10000'in altina asla inmeyin
    });

    if (res.status !== 429) return res.json();

    const after = Number(res.headers.get('Retry-After')) * 1000 || backoff;
    await sleep(after);
    backoff = Math.min(backoff * 2, 30000);
  }

  throw new Error('Hiz limiti 6 denemede acilmadi.');
}

İstek Akış Diyagramı

Her çağrı aynı yoldan geçiyor. İki kontrol noktası birbirinden bağımsız ve yalnızca biri sizi reddedebiliyor.

1. Sizin kuyruğunuz

Tek bir ortak kapı bir isteği serbest bırakır. Sürecinizdeki başka hiçbir şeyin bunu atlamasına izin verilmez.

2. Hız kontrolü

Bu saniyede 2 istekten fazla mı? Yanıt HTTP 429’dur ve istek burada durur.

3. Kota kontrolü

Puanlar dakikanıza eklenir. 200’ün üstünde mi? Yanıt bekletilir, sonra yine de gönderilir.

4. Sizin işleyiciniz

429 “geri çekil ve tekrar dene” demektir. Yavaş gelen bir 200 ise “yavaşla” demektir — bozulan bir şey yok.

Gerçekten İşe Yarayan Uygulamalar

  • Süreç başına tek limiter, worker başına değil. Her thread kendi limiter’ını taşıyorsa gerçek hızınız limit çarpı thread sayınızdır. 429’ların çoğunun tek sebebi bu.
  • On ismin üstünde bulk-search’e geçin. Tek çağrı, 10 puan, tek gidiş dönüş. Uzun listelerde tasarruf hızla katlanıyor.
  • Agresif önbellekleyin ve göndermeden önce tekrarları ayıklayın. Dört saniye önce sorguladığınız isim değişmedi ve uzun girdi listeleri tekrarlarla dolu.
  • İstemci zaman aşımını 10 saniye ya da üstünde tutun. 5 saniyelik tavanı rahatça aşması gerekiyor; yoksa fren size ağ hatası kılığında ulaşır.
  • Zamanlanmış işlerinizi dağıtın. Filonuzdaki her cron dakikanın başında başlıyorsa ani yığını bilerek inşa etmişsiniz demektir. Birkaç saniyelik rastgele kaydırma bedava ve sorunu çözüyor.
  • Kendi 429 oranınızı izleyin. Elinizdeki en erken sinyal budur ve müşteri bir şey fark etmeden çok önce tırmanır.
  • Kuyruklarınızı sayıya göre değil maliyete göre ayırın. Kayıt ve yenilemelere kendi yavaş şeridini verin, canlı müsaitlik sorguları tam hızda aksın. İkisini tek hızın arkasında karıştırmak, toplu işleriniz yüzünden sitenizi cezalandırır.

Sık Yapılan Entegrasyon Hataları

  • Her biri kendi başına “saniyede 2” uygulayan paralel worker’lar çalıştırmak; sekiz worker on altı istek gönderir.
  • Dört bulk-search çağrısının aynı soruyu yanıtlayacağı yerde 500 isimlik listede /domains/search döngüsü kurmak.
  • Soft quota gecikmesini ağ arızası sanıp zaman aşımını düşürmek; bu, yavaş bir başarıyı kesin bir hataya çevirir.
  • 429 sonrası anında yeniden denemek; bu, bir 429 daha almayı garantiler.
  • Aynı domain’i kısa bir pencere içinde defalarca yeniden sorgulamak.
  • Ek hak bekleyerek fazladan API anahtarı oluşturmak — sayaç anahtarı değil bayiyi takip ediyor.
  • async’in, thread’lerin ya da ayrı container’ların ayrı bütçe aldığını varsaymak. Almıyorlar; hepsi aynı __reseller başlığını taşıyor.

Sıkça Sorulan Sorular

Soru Yanıt
Domain Name API’ye saniyede kaç istek gönderebilirim? İki; bayi hesabınızın tamamı için sayılır. Bunun üstündeki her şey HTTP 429 döner.
Soft quota nedir? 60 saniyede 200 puanlık bir bütçedir. /domains/search ve /domains/info 1’er puan, diğer tüm endpoint’ler 10 puandır.
Soft quota’yı aşarsam ne olur? Yanıtlarınız geciktirilir; yaklaşık 0,5 saniyeden başlar ve aynı hızda devam ederseniz 5 saniyelik tavana kadar çıkar. Hiçbir istek reddedilmez, hiçbir hata dönmez.
Soft quota bir hata kodu döndürür mü? Hayır. Yalnızca gecikme ekler; HTTP istemci zaman aşımınızın en az 10 saniye olması gerekmesinin sebebi de budur.
Daha yüksek hak için birden fazla API anahtarı kullanabilir miyim? Hayır. Her iki limit de bayi hesabı başına sayılıyor. Her istek __reseller kimliğinizi taşıdığı için ek anahtarlar tek bütçeyi paylaşır.
Paralel ya da asenkron istekler ayrı bütçe alır mı? Hayır. Thread’ler, coroutine’ler, container’lar ve sunucular aynı hesap bütçesinden harcar. Tek bir ortak limiter kullanın.
bulk-search, search döngüsünden ucuz mu? On ismin üstünde evet, hem de çok — dizinin tamamı için sabit 10 puan. On ismin altında tekli sorgular daha ucuz.
100 domain kaydetmek ne kadar sürer? En az beş dakika. Kayıt 10 puan, 100 kayıt 1.000 puan eder ve kota dakikada 200 puan serbest bırakır.
Kotayı doldurmak hesabımın askıya alınmasına yol açar mı? Hayır. Soft quota ceza değil frendir. Çizginin üstünde olduğunuz sürece sizi yavaşlatır, altına indiğinizde kendiliğinden bırakır.
Daha yüksek hız limitini nasıl talep ederim? Kullanım senaryonuz, çağırdığınız endpoint’ler ve dakika başına beklediğiniz hacimle destek ekibimize yazın. Yüksek hacimli bayiler için özel limitler mevcut.

Bu Limitler Neden Var?

Sizi yavaşlatmak için değil — her şeyi otomatikleştirmeniz bizim için sorun değil, en büyük bayilerimizin çoğu da zaten öyle yapıyor. Kısıt daha yukarıda. API’mizin arkasında registry’ler var ve birkaçı bizden epey daha az hoşgörülü. Ani bir yığın bir registry’ye istediğinden hızlı ulaştığında kibarca yavaşlatmıyor; hata döndürmeye başlıyor. O hatalar da sizin müşterinizin kayıt denemesine düşüyor ve arıza registry’nin değil sizin görünüyor.

Soft quota, o basıncı size aktarmak yerine kendimiz soğurabilelim diye var. Yarım saniyelik ek gecikme, başarısız bir kayıttan çok daha iyi bir sonuç; çoğu API’nin tercih ettiği alternatiften, yani isteği doğrudan reddetmekten ise kat kat iyi. Toplu işinizin beş dakika sürmesini, iki dakika sürüp yolda on bir domain kaybetmesine tercih ederiz.

Ayrıca API’yi açık tutuyor. Freni olmayan ortak bir platform, sonunda otomasyona geçmek isteyen herkesin önüne onay kapıları ve manuel incelemeler koymak zorunda kalıyor. Fren, bizim “evet” demeyi sürdürebilmemizi sağlayan şey.

Daha Yüksek Limit Nasıl Talep Edilir?

İş yükünüz gerçekten saniyede 2 istekten ya da dakikada 200 puandan fazlasını gerektiriyorsa bize yazın. Hangi endpoint’leri çağırdığınızı, dakika başına beklediğiniz hacmi ve trafiğin düzenli mi yoksa yığınlar hâlinde mi geldiğini söyleyin — hesabınıza özel bir limit boyutlandırmak için ihtiyacımız olan her şey bu. Sayılarla gelin, görüşme genelde kısa sürüyor.