İçeriğe atla
Cloudflare Wiki

    gez · aç · Esc kapat

    Turnstile

    Kullanıcıya bulmaca çözdürmeyen CAPTCHA alternatifi. Cloudflare'de olmayan sitelerde de çalışıyor ve challenge sayısı sınırsız — ücretsiz.

    • DurumGenel kullanımda
    • FiyatÜcretsiz — challenge ve doğrulama isteği sayısı sınırsız, kullanım bazlı faturalama yok
    • Ücretsiz katmanvar
    • Doğrulama

    Turnstile nedir?

    “Cloudflare’s smart CAPTCHA alternative.”

    “Turnstile can be embedded into any website without sending traffic through Cloudflare and works without showing visitors a CAPTCHA.”

    Klasik bir CAPTCHA insana soru soruyor: trafik ışıklarını seç, bozuk yazıyı oku. Turnstile tarayıcıya soru soruyor:

    “First, we run a series of small non-interactive JavaScript challenges to gather signals about the visitor or browser environment.”

    “These challenges include proof-of-work (computational puzzles), proof-of-space, probing for web APIs, and various other challenges for detecting browser-quirks and human behavior. As a result, we can fine-tune the difficulty of the challenge to the specific request and avoid showing a visual or interactive puzzle to a user.”

    Ve veri işleme tarafında net bir sınır çiziliyor:

    “Turnstile processes only the data strictly necessary to provide this security function. Turnstile does not access, store, or transmit user communications, form entries, or other page inputs.

    Nasıl çalışır?

    Üç widget modu

    ModTanımNe zaman
    Managed (önerilen)“Automatically chooses between non-interactive or checkbox challenge based on visitor risk level. No images or text to decipher.“Simple setup with adaptive security. Balances protection and user experience.”
    Non-Interactive“Displays visible widget with loading spinner. Runs challenges without requiring visitor interaction.”“Minimize friction while showing verification is occurring.”
    Invisible“Runs challenges completely in the background with no visible widget or loading indicators.”“Maximize visual experience with zero visible verification elements.”

    Managed modun en kötü durumu tek bir onay kutusu — “Turnstile will only require interaction if a further check is necessary… the visitor will be prompted to select a box.” Görsel bulmaca hiç yok. reCAPTCHA veya hCaptcha’nın resim ızgaralarına kıyasla bu, erişilebilirlik açısından gerçek bir fark.

    Widget hata durumları — sorun giderirken işine yarayacak:

    DurumAnlamı
    Unknown error“When an unknown error occurs during the challenge” — sayfayı yenile
    Interaction timed outOnay kutusu gösterildi ama kullanıcı uzun süre etkileşmedi
    Challenge timed out“the verification was completed but no further action has been taken” — örneğin giriş sayfasında Turnstile çözüldü ama kullanıcı uzun süre giriş yapmadı
    Outdated or unsupported browserEski veya desteklenmeyen tarayıcı

    İki anahtar ve zorunlu sunucu doğrulaması

    BileşenTanım
    Sitekey“Public key used to invoke the Turnstile widget on your site.”
    Secret key“Private key used for server-side token validation.”

    Widget challenges.cloudflare.com üzerinden yükleniyor — CSP kullanıyorsan bu alan adına izin vermen gerekiyor.

    Siteverify: POST https://challenges.cloudflare.com/turnstile/v0/siteverify

    ParametreZorunluTanım
    secret“Your widget’s secret key from the Cloudflare dashboard”
    response“The token from the client-side widget”
    remoteip“The visitor’s IP address”
    idempotency_key“A UUID you generate to safely retry validation requests”

    Hem application/x-www-form-urlencoded hem application/json kabul ediyor, her zaman JSON dönüyor.

    Yanıt:

    {
      "success": true,
      "challenge_ts": "2026-09-01T15:14:30.096Z",
      "hostname": "ornek.com.tr",
      "error-codes": [],
      "action": "giris",
      "cdata": "oturum-123456789",
      "metadata": { "ephemeral_id": "x:9f78e0ed210960d7693b167e" }
    }

    Hata kodları:

    KodAnlamı
    missing-input-secret / invalid-input-secretSecret eksik veya geçersiz
    missing-input-response / invalid-input-responseToken eksik, bozuk veya süresi geçmiş
    bad-requestİstek biçimi hatalı
    timeout-or-duplicate“Token has already been validated” — tekrar kullanım
    internal-errorİç hata, yeniden dene

    Idempotency: ağ hatası sonrası aynı token’ı yeniden doğrularken sahte bir timeout-or-duplicate almamak için bir UUID üretip tüm denemelerde aynısını gönderiyorsun. Cloudflare’in kendi örneği UUID’yi döngünün dışında üretiyor ve üstel geri çekilme kullanıyor. Anahtarın sunucu tarafında ne kadar saklandığı belgelenmemiş.

    action ve cData:

    • action — “A customer value that can be used to differentiate widgets under the same sitekey in analytics… up to 32 alphanumeric characters including _ and -.”
    • cData — “A customer payload that can be attached to the challenge throughout its issuance and which is returned upon validation… up to 255 alphanumeric characters including _ and -.”

    Caution — Both action and cData fields only accept alphanumeric characters, underscores (_), and hyphens (-).

    Form entegrasyonu varsayılanları: gizli alan otomatik oluşuyor (response-field: true), adı cf-turnstile-response. Yenileme davranışı: refresh-expired varsayılan auto, retry varsayılan auto, retry-interval varsayılan 8000 ms (maks 900000).

    Hostname yönetimi

    “By default, every widget requires at least one hostname to be configured. You cannot create a widget without specifying at least one authorized hostname.”

    “Wildcard characters (such as *) are not supported in the hostname field. However, adding a hostname automatically authorizes all of its subdomains.

    EklediğinKapsananKapsanmayan
    ornek.com.trornek.com.tr, www.ornek.com.tr, shop.ornek.com.tr, a.b.ornek.com.trbaşka alan adları
    www.ornek.com.trwww.ornek.com.tr, abc.www.ornek.com.trornek.com.tr, panel.ornek.com.tr

    Geçersiz biçimler: şema (http://ornek.com.tr), port (ornek.com.tr:443), yol (ornek.com.tr/giris).

    Pre-clearance ve WAF ilişkisi

    Ücretsiz planda da var — plan tablosunda “Pre-clearance support | Yes | Yes”.

    “Pre-clearance allows Turnstile to issue clearance cookies that can be used across your Cloudflare-protected domains.”

    Nasıl çalışıyor:

    1. Zone’undaki bir WAF kuralı normalde ziyaretçiyi tam sayfa bir Cloudflare challenge ekranıyla kesiyor.
    2. Turnstile pre-clearance modunda yapılandırıldığında, sayfa içindeki widget’ı çözmek aynı zamanda o zone için cf_clearance çerezini üretiyor.
    3. Sonraki isteklerde bu çerez WAF’ın challenge şartını karşılıyor — araya giren ekran hiç çıkmıyor.

    Asıl kullanım senaryosu:

    “Integrate Cloudflare challenges on single-page applications (SPAs) by allowing Turnstile to issue a Pre-Clearance cookie.”

    Pre-clearance olmadan bir SPA’nın fetch() çağrısı WAF challenge’ına takıldığında JSON yerine HTML challenge sayfası dönüyor ve uygulama kırılıyor.

    İçerik Güvenlik Politikası

    “Cloudflare recommends using the nonce-based approach documented with CSP3… Turnstile works with strict-dynamic.”

    Alternatif:

    Content-Security-Policy:
      script-src https://challenges.cloudflare.com;
      frame-src  https://challenges.cloudflare.com;
      connect-src 'self';            /* pre-clearance kullanıyorsan */

    Ve bir kısıt: You cannot set your own CSP and/or Referer-Policy via meta tags or Transform rules in challenge pages.

    Sınırlar

    ÜcretsizEnterprise
    Widget sayısı20sınırsız
    Widget başına hostname10200
    Challenge / doğrulama isteğisınırsızsınırsız
    Analitik geriye bakış7 gün30 gün
    Any Hostname
    Ephemeral ID
    Cloudflare markasını kaldırma
    Pre-clearance
    Token ömrü300 sn300 sn
    Token uzunluğu2.048 karakter2.048 karakter

    Ne zaman kullanılır, ne zaman kullanılmaz

    Kullanılır

    • Cloudflare’de olmayan bir sitede form koruması istiyorsan. Bu, ürünün en ayırt edici yanı.
    • Kayıt, giriş, iletişim ve yorum formlarında. Klasik CAPTCHA’nın yerini alıyor ve kullanıcıya bulmaca çözdürmüyor.
    • Bir SPA’de WAF challenge’ı fetch() çağrılarını kırıyorsa. Pre-clearance belgelenmiş çözüm.
    • Erişilebilirlik önemliyse. Managed modda en kötü durum bir onay kutusu; resim ızgarası yok.
    • Bütçe sıfırsa. Challenge sayısı sınırsız ve ölçümlü faturalama yok.

    Kullanılmaz

    Sunucu tarafı doğrulama yazamayacaksan. Widget tek başına hiçbir şey korumuyor. siteverify çağıramıyorsan bu ürünü kurmanın anlamı yok.

    Native mobil uygulamada SDK bekliyorsan. WebView zorunlu; resmî native SDK yok.

    file:// veya başka bir protokolde. “Turnstile is designed to function only on pages using http:// or https://.”

    Bot yönetimi bekliyorsan. Turnstile bir anı doğruluyor — o istek insan mı. Sürekli bot skorlaması, AI crawler yönetimi ve endpoint bazlı politika için Bot Management gerekiyor.

    Hız sınırlama yerine. Turnstile “bu bir insan mı” sorusuna cevap veriyor, “bu istemci çok mu hızlı” sorusuna değil. İkincisi Rate Limiting.

    Çözülen challenge’ı insanlık kanıtı sayacaksan. “A ‘solved’ Turnstile challenge does not automatically confirm the visitor is human… Bots might complete challenges, but Cloudflare can detect bot-like signals and mark the token as invalid.”

    WCAG seviyesine sözleşmede dayanacaksan. İki resmî sayfa AA ve AAA diyor; teyit almadan bir ihaleye yazma.

    20 widget’tan fazlasına ihtiyacın varsa ve Enterprise değilsen. Çok müşterili bir SaaS’ta bu sınır çabuk doluyor.

    Somut örnekler

    İstemci tarafı

    <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
    
    <form method="POST" action="/kayit">
      <input type="email" name="eposta" required />
    
      <div class="cf-turnstile"
           data-sitekey="SITEKEY"
           data-action="kayit"
           data-cdata="kampanya-2026"
           data-language="tr"
           data-theme="auto"></div>
    
      <button type="submit">Kaydol</button>
    </form>

    Gizli alan otomatik oluşuyor: cf-turnstile-response.

    Sunucu tarafı doğrulama (tam kontrol listesiyle)

    async function turnstileDogrula(token, istemciIp, beklenenAction, beklenenHostname) {
      const govde = new URLSearchParams();
      govde.append("secret", process.env.TURNSTILE_SECRET);
      govde.append("response", token);
      if (istemciIp) govde.append("remoteip", istemciIp);
      govde.append("idempotency_key", crypto.randomUUID());
    
      const yanit = await fetch(
        "https://challenges.cloudflare.com/turnstile/v0/siteverify",
        { method: "POST", body: govde }
      );
      const d = await yanit.json();
    
      if (!d.success) return { gecerli: false, sebep: d["error-codes"] };
    
      // Cloudflare bunları senin adına DOĞRULAMIYOR — kendin karşılaştır
      if (beklenenAction && d.action !== beklenenAction)
        return { gecerli: false, sebep: "action_uyusmuyor" };
      if (beklenenHostname && d.hostname !== beklenenHostname)
        return { gecerli: false, sebep: "hostname_uyusmuyor" };
    
      return { gecerli: true, cdata: d.cdata, zaman: d.challenge_ts };
    }

    Yeniden deneme — idempotency anahtarı döngü DIŞINDA

    async function tekrarliDogrula(token, istemciIp, maksDeneme = 3) {
      const anahtar = crypto.randomUUID();      // her denemede AYNI anahtar
      for (let deneme = 0; deneme < maksDeneme; deneme++) {
        try {
          return await siteverify(token, istemciIp, anahtar);
        } catch (e) {
          if (deneme === maksDeneme - 1) throw e;
          await new Promise((r) => setTimeout(r, Math.pow(2, deneme) * 1000));
        }
      }
    }

    Anahtarı döngünün içinde üretirsen ikinci deneme sahte bir timeout-or-duplicate alıyor.

    Süresi dolan token’ı yenilemek

    window.onloadTurnstileCallback = function () {
      turnstile.render("#turnstile-kabi", {
        sitekey: "SITEKEY",
        language: "tr",
        "expired-callback": () => turnstile.reset(),
        "timeout-callback": () => turnstile.reset(),
      });
    };

    Cloudflare’in test anahtarları

    SitekeyDavranışTip
    1x00000000000000000000AAher zaman geçergörünür
    2x00000000000000000000ABher zaman düşergörünür
    1x00000000000000000000BBher zaman geçerinvisible
    2x00000000000000000000BBher zaman düşerinvisible
    3x00000000000000000000FFetkileşimi zorlargörünür
    Secret keyDavranış
    1x0000000000000000000000000000000AAher zaman doğrular
    2x0000000000000000000000000000000AAher zaman reddeder
    3x0000000000000000000000000000000AA“token already spent” döndürür

    “Test sitekeys generate a dummy token: XXXX.DUMMY.TOKEN.XXXX” “Test keys work on any domain, including: localhost, 127.0.0.1, 0.0.0.0

    Ve bir kural: test secret’ı yalnızca dummy token kabul ediyor, üretim secret’ı yalnızca gerçek token.

    Demo 1: Cloudflare’den geçmeyen bir on-prem formda uçtan uca tur

    Bu demonun değeri, ürünün en ayırt edici iddiasını kanıtlaması: site Cloudflare’de olmak zorunda değil.

    Adım 1 — Cloudflare’den geçmediğini kanıtla

    # On-prem sunucunun doğrudan IP'siyle, hiçbir proxy olmadan
    dig +short ornek-onprem.local
    curl -sS -D- -o /dev/null http://192.168.1.50:8080/kayit | grep -i "server:"
    # Beklenen: nginx / Apache — "server: cloudflare" DEĞİL
    Yanıt başlıklarında cloudflare değil kendi web sunucusunun adı

    Adım 2 — Widget’ı yerleştir

    localhost test anahtarlarıyla değil, gerçek bir sitekey oluştur ve hostname’i ekle.

    Panelde widget oluşturulurken mod seçimi ve hostname alanı
    On-prem sayfada render olan Managed mod widget'ı

    Adım 3 — Token’ı yakala

    # Tarayıcı geliştirici araçlarında formu gönder ve gizli alanı oku
    document.querySelector('[name="cf-turnstile-response"]').value.length
    cf-turnstile-response gizli alanının değeri ve uzunluğu (2048'e kadar)

    Adım 4 — siteverify’ı çağır

    curl -sS -X POST "https://challenges.cloudflare.com/turnstile/v0/siteverify" \
      -d "secret=$TURNSTILE_SECRET" \
      -d "response=$TOKEN" \
      -d "remoteip=203.0.113.10" | jq
    success:true, challenge_ts, hostname ve action alanlarını içeren JSON

    Adım 5 — 🔴 Aynı token’ı ikinci kez gönder

    curl -sS -X POST "https://challenges.cloudflare.com/turnstile/v0/siteverify" \
      -d "secret=$TURNSTILE_SECRET" -d "response=$TOKEN" | jq '.["error-codes"]'
    success:false ve error-codes içinde timeout-or-duplicate

    Adım 6 — Beş dakikayı bekle

    TOKEN=$(...)          # yeni bir token al
    sleep 310
    curl -sS -X POST ".../siteverify" -d "secret=$TURNSTILE_SECRET" -d "response=$TOKEN" | jq
    5 dakikadan sonra aynı hata koduyla reddedilmesi

    Adım 7 — action ve hostname doğrulamasını kanıtla

    İki widget oluştur (data-action="giris" ve data-action="kayit"), giriş widget’ından aldığın token’ı kayıt uç noktasına gönder.

    siteverify'ın success:true döndürdüğü ama action alanının beklenenle uyuşmadığı

    Adım 8 — Analytics’te sıfır kontrolü

    Token Validation sayacının sıfırdan büyük olduğu — siteverify'ın gerçekten çağrıldığının kanıtı

    Bu demoda ölçülenler:

    ÖlçütSonuç
    Sunucu Cloudflare’de mihayır
    Widget yüklendi mi
    Token uzunluğu≤ 2.048
    İlk siteverifysuccess: true
    İkinci siteverify (aynı token)timeout-or-duplicate
    310 sn sonrareddediliyor
    Yanlış action ilesuccess: truekendin kontrol etmelisin
    Analytics Token Validation> 0

    Demo 2: Test anahtarlarıyla dört senaryoyu deterministik üretmek

    Bu demo hiç gerçek trafiğe ihtiyaç duymuyor ve her seferinde aynı sonucu veriyor.

    Adım 1 — Her zaman geçen widget

    <div class="cf-turnstile" data-sitekey="1x00000000000000000000AA" data-language="tr"></div>
    curl -sS -X POST ".../siteverify" \
      -d "secret=1x0000000000000000000000000000000AA" \
      -d "response=XXXX.DUMMY.TOKEN.XXXX" | jq
    Widget'ın anında çözülmesi ve siteverify'ın success:true dönmesi

    Adım 2 — Her zaman düşen widget

    <div class="cf-turnstile" data-sitekey="2x00000000000000000000AB" data-language="tr"></div>
    Widget'ın hata durumunu göstermesi

    Adım 3 — Etkileşimi zorlayan widget

    <div class="cf-turnstile" data-sitekey="3x00000000000000000000FF" data-language="tr"></div>
    Onay kutulu widget'ın Türkçe metinle göründüğü — resim ızgarası olmadığı

    Adım 4 — “Harcanmış token” secret’ı

    curl -sS -X POST ".../siteverify" \
      -d "secret=3x0000000000000000000000000000000AA" \
      -d "response=XXXX.DUMMY.TOKEN.XXXX" | jq
    timeout-or-duplicate hatasının deterministik olarak üretilmesi

    Adım 5 — Üretim ve test anahtarlarının karışmadığını göster

    # Üretim secret'ı + dummy token → reddedilmeli
    curl -sS -X POST ".../siteverify" -d "secret=$GERCEK_SECRET" \
      -d "response=XXXX.DUMMY.TOKEN.XXXX" | jq '.["error-codes"]'
    
    # Test secret'ı + gerçek token → reddedilmeli
    curl -sS -X POST ".../siteverify" -d "secret=1x0000000000000000000000000000000AA" \
      -d "response=$GERCEK_TOKEN" | jq '.["error-codes"]'
    İki çapraz denemenin de reddedildiği çıktı

    Adım 6 — Hostname kapsamını test et

    Widget’a yalnızca www.ornek.com.tr ekle, sonra widget’ı çıplak ornek.com.tr üzerinde çalıştır.

    www eklenmişken çıplak alan adında widget'ın çalışmaması

    Sonra ornek.com.tr ekle ve alt alan adlarının otomatik kapsandığını göster.

    Kök alan adı eklendiğinde shop. ve panel. alt alan adlarında da çalıştığı

    Bu demoda ölçülenler:

    AnahtarWidget davranışısiteverify sonucu
    1x…AA + 1x…AAanında geçersuccess: true
    2x…ABhata durumu
    3x…FFonay kutusu, Türkçesuccess: true
    3x…AA secrettimeout-or-duplicate
    Üretim secret + dummy tokenreddediliyor
    Test secret + gerçek tokenreddediliyor
    www.x eklenmiş, çıplak x’teçalışmıyor
    x eklenmiş, shop.x’teçalışıyor

    Fiyatlandırma

    ÜcretsizEnterprise
    FiyatFreeContact Sales
    Widget sayısı20sınırsız
    Tüm widget tipleri
    Sınırsız challenge (trafik veya doğrulama isteği)
    Hostname yönetimiwidget başına 10widget başına 200
    Any Hostname
    Analitik geriye bakış7 gün30 gün
    Pre-clearance
    Ephemeral ID
    Offlabel (marka kaldırma)
    WCAG 2.2 uyumu

    Ephemeral ID (yalnızca Enterprise): “Ephemeral IDs are dynamically generated for each Turnstile solve attempt. No cookies or local storage is required.IDs expire within a few days and cannot be used to identify individual users. Etkinleştirme kendi kendine yapılamıyor — hesap ekibi gerekiyor.

    Lisanslama ve hukuki çerçeve

    Hizmet tescillidir ve Cloudflare Hizmet Şartları’na tabidir.

    KVKK açısından güçlü dayanak. Turnstile’ın veri işleme sınırı açıkça yazılı:

    “Turnstile processes only the data strictly necessary to provide this security function. Turnstile does not access, store, or transmit user communications, form entries, or other page inputs.

    Yani formdaki kişisel veriler Cloudflare’e gitmiyor — yalnızca tarayıcı ortamı sinyalleri ve (gönderirsen) remoteip. Bu, bir CAPTCHA çözümü için oldukça dar bir kapsam ve aydınlatma metninde somut olarak yazılabilir.

    remoteip isteğe bağlı. Ziyaretçinin IP adresini siteverify’a göndermek zorunlu değil. Veri minimizasyonu açısından göndermemeyi tercih edebilirsin; doğrulama yine çalışıyor. Gönderirsen bir kişisel veri aktarımı yapmış oluyorsun.

    Ephemeral ID. Enterprise’da açılan bu özellik bile gizlilik odaklı tasarlanmış: çerez veya yerel depolama kullanmıyor, hesabına özgü ve “expire within a few days and cannot be used to identify individual users.”

    Sık yapılan hatalar

    siteverify’ı hiç çağırmamak. Widget tek başına hiçbir şey korumuyor. Analytics’te Token Validation sıfırsa durum budur.

    action ve hostname alanlarını doğrulamamak. Cloudflare bunları döndürüyor ama zorlamıyor.

    Aynı token’ı ikinci kez doğrulamak. timeout-or-duplicate.

    Idempotency anahtarını yeniden deneme döngüsünün içinde üretmek. Sahte timeout-or-duplicate alıyorsun.

    Beş dakikalık pencereyi hesaba katmamak. Uzun formlarda expired-callback ile turnstile.reset() çağır.

    action veya cData’ya Türkçe karakter, boşluk veya nokta koymak. Yalnızca alfanümerik, _ ve -.

    Hostname’e www yazıp çıplak alan adını unutmak. Alt alan adları otomatik kapsanıyor ama üst alan adı kapsanmıyor.

    Hostname’e şema, port veya yol yazmak. Geçersiz.

    Any Hostname’i açıp hostname doğrulamasını yazmamak. Koruma tamamen kalkıyor.

    CSP’ye challenges.cloudflare.com eklemeyi unutmak. Widget hiç yüklenmiyor.

    Pre-clearance kullanıp connect-src 'self' eklememek. cf_clearance çerezi sessizce kurulmuyor.

    Pre-clearance’ta yanlış zone’u seçmek. Alt alan adı ayrı bir zone ise o zone’u seçmen gerekiyor.

    Native mobil SDK aramak. Yok; WebView kullan.

    Çözülen challenge’ı insanlık kanıtı saymak. “does not automatically confirm the visitor is human.”

    Test ve üretim anahtarlarını karıştırmak. Test secret’ı yalnızca dummy token, üretim secret’ı yalnızca gerçek token kabul ediyor.

    Sıkça sorulan sorular

    Sitem Cloudflare'de değil, kullanabilir miyim?
    Evet — ve bu ürünün en değerli özelliği. Birebir: “Turnstile is designed to be an independent service. You can use Turnstile on any website, regardless of whether it is proxied through the Cloudflare network. This allows for flexible deployment across multi-cloud environments, on-premises infrastructure, or sites using other CDNs. The client-side widget and server-side validation steps are completely self-contained.” Cloudflare hesabı gerekiyor ama Cloudflare DNS'i veya proxy'si gerekmiyor.
    Widget'ı koydum, formum korunuyor mu?
    Hayır. Birebir: Mandatory server-side validation — You must call the Siteverify API to complete your Turnstile implementation. The client-side widget alone does not protect your forms. Üç sebep sayılıyor: token'lar taklit edilebiliyor, süreleri doluyor ve tek kullanımlık. Analytics'te Token Validation sayın sıfırsa siteverify'ı hiç çağırmıyorsun demektir.
    Token ne kadar geçerli?
    300 saniye (5 dakika) ve tek kullanımlık. Maksimum uzunluk 2.048 karakter. Süresi geçmiş veya ikinci kez gönderilmiş token timeout-or-duplicate hatasıyla reddediliyor. Kullanıcı formu beş dakikadan geç gönderirse widget'ı turnstile.reset() ile yenilemen gerekiyor.
    Üç widget modunun farkı ne?
    Managed (önerilen) — “Automatically chooses between non-interactive or checkbox challenge based on visitor risk level. No images or text to decipher. En kötü durumda tek bir onay kutusu, asla görsel bulmaca. Non-Interactive — yükleme göstergeli görünür widget, kullanıcı hiç etkileşmiyor. Invisible — hiçbir görsel iz yok.
    Invisible modun hukuki bir şartı var mı?
    Evet. Birebir: As a condition of enabling invisible mode, you must reference Cloudflare's Turnstile Privacy Addendum in your own privacy policy. Bu bir tavsiye değil, kullanım şartı. KVKK aydınlatma metnini hazırlarken bunu atlamaman gerekiyor.
    Türkçe destekleniyor mu?
    Evet. Desteklenen 39 dil arasında tr-tr / tr var. Varsayılan auto“to use the language that the visitor has chosen”. Zorlamak için data-language="tr".
    <code>action</code> ve <code>cData</code> alanları ne işe yarıyor?
    action analitikte widget'ları ayırmak için (maks 32 karakter), cData ise doğrulamada geri dönen özel yük (maks 255 karakter). İkisi de yalnızca alfanümerik, alt çizgi ve tire kabul ediyor. Kritik: Cloudflare bunları senin adına zorlamıyor — sunucu tarafında action ve hostname alanlarını kendin karşılaştırman gerekiyor.
    Kaç widget ve hostname oluşturabilirim?
    Ücretsiz: 20 widget, widget başına 10 hostname, analitik 7 gün. Enterprise: sınırsız widget, widget başına 200 hostname, analitik 30 gün. Challenge ve doğrulama isteği sayısı ikisinde de sınırsız.
    Hostname'de wildcard kullanabilir miyim?
    Hayır ama gerek de yok. Birebir: “Wildcard characters (such as *) are not supported… However, adding a hostname automatically authorizes all of its subdomains. ornek.com.tr eklersen www, shop, a.b.ornek.com.tr hepsi kapsanıyor. Ama www.ornek.com.tr eklersen çıplak alan adı kapsanmıyor. Şema, port ve yol geçersiz.
    siteverify'ın hız limiti var mı?
    Cloudflare yayımlamıyor — doğrulanamadı. Turnstile dokümantasyonunun tamamı tarandı; Cloudflare tarafından uygulanan bir siteverify hız limiti geçmiyor. Dikkat: api.cloudflare.com için geçerli olan “5 dakikada 1.200 istek” limiti farklı bir host'a ait (challenges.cloudflare.com değil) ve siteverify'a uygulanmaz.
    Mobil uygulamamda kullanabilir miyim?
    Yalnızca WebView ile. Birebir: For native mobile applications, Turnstile does not run natively. Instead, you use a WebView… to load a webpage that contains the Turnstile widget.” Resmî bir iOS veya Android native SDK yok. WebView'da JavaScript ve DOM storage açık olmalı, challenges.cloudflare.com'a erişim gerekiyor.
    Erişilebilirlik seviyesi ne?
    İki resmî sayfa çelişiyor ve ikisi de aynı tarihli. Ana doküman sayfası “Turnstile is WCAG 2.2 AA compliant” diyor; plan tablosu ise WCAG 2.2 AAA compliance | Yes | Yes” diyor. AA ile AAA farklı uyum seviyeleri. Bir ihale veya sözleşme gereksinimi için bu seviyeye güveniyorsan Cloudflare'den yazılı teyit al.
    Pre-clearance nedir, Enterprise mi gerektiriyor?
    Ücretsiz planda da var — yaygın bir yanlış inanış. Turnstile çözüldüğünde cf_clearance çerezi de üretiliyor ve zone'undaki WAF challenge'ını karşılıyor. Asıl kullanım senaryosu: “Integrate Cloudflare challenges on single-page applications (SPAs) — challenge sayfaları HTML döndürdüğü için fetch() çağrılarını kırıyor, pre-clearance bunu çözüyor. Tek istisna: bu, Turnstile'ın Cloudflare zone'u gerektiren tek özelliği.
    Challenge çözüldü, kullanıcı insan mı?
    Hayır — bu doğrudan uyarılıyor. Birebir: A ‘solved' Turnstile challenge does not automatically confirm the visitor is human. You must call the Siteverify API to validate the token and proceed only if the response returns success:true.” Ve: “Bots might complete challenges, but Cloudflare can detect bot-like signals and mark the token as invalid.”
    Gerçekten ücretsiz mi?
    Evet. Plan tablosunda “Unlimited challenges (traffic or verification requests)” hem Free hem Enterprise için Yes. Ayrıca /billing/understand/usage-based-billing/ tablosunda hiç geçmiyor ve cloudflare.com/plans/ sayfasında bir plan satırı olarak yok. Enterprise katmanı yalnızca beş şey ekliyor: sınırsız widget, 200 hostname, Any Hostname, Ephemeral ID ve Cloudflare markasını kaldırma.

    İlgili servisler

    • Bot ManagementHer request’e bot skoru verir; kazıyıcı, kimlik doldurma ve stok kapma trafiğini ayırır.
    • WAFSQL injection, XSS ve bilinen zafiyet istismarlarını request origin’e ulaşmadan engeller.
    • Rate LimitingIP, oturum veya özel anahtara göre request sayısını sınırlar.
    • WorkersJavaScript/TypeScript/Python kodunu Cloudflare’in 330+ şehirdeki sunucularında, sunucu yönetmeden çalıştırır.

    Bu sayfadaki fiyat ve özellik bilgileri 1 Eylül 2026 tarihinde Cloudflare’in resmî kaynaklarından doğrulanmıştır. Cloudflare fiyatlandırmasını önceden haber vermeden değiştirebilir; bağlayıcı bilgi içinresmî sayfaya bakın.

    Hata bildir

    Yanlış bir rakam, eskimiş bir bilgi veya bozuk bir bağlantı mı buldun? Bildir, kaynağıyla birlikte kontrol edelim.