# Özel webhooklar

Tamamlanan her gönderimi herhangi bir HTTPS uç noktasına — backend'inize, sunucusuz fonksiyonunuza ya da proxy'nize — POST edin.

## Özel webhooklar

Tamamlanan her gönderimi imzalı bir POST isteği olarak herhangi bir HTTPS uç noktasına gönderin — backend'inize, otomasyon platformunuza veya sunucusuz fonksiyonunuza.

<h2 id="how-it-works">Nasıl çalışır</h2>

<p>
  Her gönderimde Formstep, webhook URL’nize bir JSON gövdesi POST eder. İstek HMAC-SHA256 ile imzalanır, başarısız olursa yeniden denenir ve
  entegrasyonun etkinlik günlüğüne kaydedilir. Bu sayfa kurulumu anlatır. Tam payload, başlıklar ve imza algoritması{' '}
  <a href="/tr/developers/webhooks-reference">webhook referansında</a> yer alır.
</p>

<h2 id="add">Webhook ekle</h2>

> ℹ️ **Birden fazla webhook**
> <p>Tek bir forma birden fazla webhook ekleyebilirsiniz. Her biri her etkinlik için bağımsız olarak tetiklenir.</p>

<h2 id="url-rules">Formstep’in kabul ettiği URL’ler</h2>

<ul>
  <li>
    Her yerde <code>https://</code>, geliştirme sırasında <code>localhost</code> ve <code>*.localhost</code> için ise <code>http://</code>.
  </li>
  <li>URL’de kimlik bilgisi olmamalı ve en fazla 2.048 karakter olmalı.</li>
  <li>
    Özel veya iç adresler kabul edilmez. Ana bilgisayar adı çözümlenir ve <em>her</em> teslimattan hemen önce yeniden kontrol edilir; bu
    yüzden kurulumdan sonra bir DNS kaydı iç bir adrese yönlendirilse bile reddedilmeye devam eder.
  </li>
</ul>

<p>Reddedilen bir URL geçici değil, bir yapılandırma sorunudur: teslimat yeniden denenmez, kalıcı olarak başarısız olur.</p>

<h2 id="payload">Ne alırsınız</h2>

<p>
  Her istek aynı olay zarfıdır — <code>id</code>, <code>type</code>, <code>createdAt</code>, <code>apiVersion</code>, <code>test</code> ve{' '}
  <code>data</code>. <code>data</code> içinde form, gönderim (kimlik, katılımcı e-postası, gönderim zamanı, PDF bağlantısı, dil),{' '}
  <a href="/tr/requests/field-keys">alan anahtarına</a> göre anahtarlanmış bir <code>answers</code> nesnesi ve aynı anahtarları okunabilir
  metin olarak taşıyan bir <code>display</code> nesnesi bulunur. Her yanıt, her haritada bir kez yer alır.
</p>

<p>
  Tam <a href="/tr/developers/webhooks-reference#payload">payload biçimi</a>,{' '}
  <a href="/tr/developers/webhooks-reference#fields-vs-answers">answers ve display</a> ve bir{' '}
  <a href="/tr/building-forms/repeating-groups">tekrarlayan grubun</a> nasıl temsil edildiği için referansa bakın.
</p>

<p>
  Formunuz için tam gövdeyi önizlemek üzere entegrasyonu açın ve imzalama gizli anahtarının altındaki <strong>Örnek yük</strong>’ü
  genişletin. Güncel eşlemenizi örnek yanıtlarla birlikte gösterir.
</p>

<h2 id="signatures">İmzaları doğrulama</h2>

<p>
  Her istek bir <code>X-Formstep-Signature</code> başlığı içerir: <code>t=TIMESTAMP,sha256=HEX</code>, imzalama gizli anahtarınızla
  hesaplanan <code>TIMESTAMP.BODY</code>’nin bir HMAC-SHA256’sı. Gizli anahtarın kendisi hiçbir zaman gönderilmez. Referansta{' '}
  <a href="/tr/developers/webhooks-reference#signing">kopyalayıp yapıştırabileceğiniz bir doğrulama kod parçası</a> bulunur.
</p>

> ⚠️ **Üretimde her zaman doğrulayın**
> <p>Doğrulama yapılmazsa, URL’nizi keşfeden herkes sahte gönderim paylaşabilir. İmzası eksik veya geçersiz olan istekleri reddedin.</p>

<h2 id="abandoned-responses">Terk edilmiş yanıt etkinlikleri</h2>

<p>
  Özel webhooklar yalnızca tamamlanan gönderimler ve düzenlemeler için tetiklenir — terk edilmiş taslaklar için asla. Özel bir webhook, her
  ikisini de alan tek alıcıdır: bir Zapier, Make veya n8n aboneliği ilk gönderimleri ya da düzenlemeleri seçer, asla ikisini birden. Terk
  edilmiş taslaklar için bir <strong>Terk edilmiş gönderiler</strong> adımına sahip bir sağlayıcı kullanın: Google Sheets, Airtable, Notion,
  Slack, Discord, Linear veya GitHub Issues. Her biri kendi bekleme penceresini ve, uygulanabildiği yerde, kendi ileti şablonunu kullanır.
  Bu adım Pro veya Business gerektirir.
</p>

<h2 id="retries">Yeniden denemeler ve hatalar</h2>

<ul>
  <li>
    Herhangi bir <code>2xx</code> teslimatı başarılı sayılır.
  </li>
  <li>
    En fazla 5 deneme: ilki hemen tetiklenir, yeniden denemeler en az 1, 2, 4 ve 8 dakika bekler. Formstep, süresi gelen yeniden denemeleri
    her 30 dakikada bir arar, bu yüzden son deneme ilkinden yaklaşık iki saat sonra gelir. Bir <code>429</code> veya <code>5xx</code>{' '}
    üzerindeki <code>Retry-After</code> başlığı daha uzun bir bekleme istediğinde dikkate alınır.
  </li>
  <li>
    <code>429</code>, <code>5xx</code>, zaman aşımları ve bağlantı hataları yeniden denenir. Diğer her <code>4xx</code> hemen başarısız
    olur.
  </li>
  <li>
    Art arda 5 başarısızlıktan sonra entegrasyon otomatik olarak duraklatılır ve kuran kişiye bir e-posta gider. Uç noktayı düzeltin,
    ardından <strong>Yeniden Etkinleştir</strong>’e basın.
  </li>
  <li>
    <code>401</code>, <code>403</code> ve <code>404</code> entegrasyonu bir hata durumu ve aynı e-posta ile hemen durdurur — beş
    başarısızlığın beklenmesine gerek yoktur.
  </li>
  <li>
    Tüm 5 denemesini tüketen teslimatlar entegrasyonda bir banner’da toplanır. <strong>Tümünü Yeniden Dene</strong> bunları yeniden kuyruğa
    alır ve duraklatılmış bir entegrasyonu yeniden etkinleştirir.
  </li>
</ul>

<h2 id="testing">Test etme</h2>

<p>
  <strong>Test olayı gönder</strong>, Sonlandır adımında ve kaydedilmiş entegrasyonda tekrar görünür. Gerçek bir teslimat gibi imzalanmış ve
  özel başlıklarınızla birlikte sentezlenmiş bir örnek gönderimi POST eder — metin için <code>"John Doe"</code>, sayılar için{' '}
  <code>42</code>, e-posta için <code>john@example.com</code>. Kaydedilmiş entegrasyondan çalıştırıldığında etkinlik günlüğüne ayrıca bir
  bağlantı testi kaydı yazar.
</p>

<p>Yerel geliştirme için geliştirme sunucunuzu bir tünel ile dışarıya açın:</p>

```
# ngrok
ngrok http 3000

# cloudflare tunnel

cloudflared tunnel --url http://localhost:3000
```

<h2 id="faq">SSS</h2>

  <p>
    Evet. Her birinin kendi URL’si, imzalama gizli anahtarı ve özel başlıkları vardır. Tüm etkin webhooklar her gönderim için bağımsız
    olarak tetiklenir.
  </p>

  <p>
    Evet — kurulum sırasında veya sonradan entegrasyondan en fazla 5 tane eklenebilir. <code>Content-Type</code> otomatik ayarlanır ve onu
    geçersiz kılma girişimleri yok sayılır.
  </p>

  <p>
    Hayır. İmzalama gizli anahtarı webhook oluşturulduğunda bir kez üretilir ve değiştirilemez. Yeni bir gizli anahtar gerekiyorsa webhook’u
    silip yenisini oluşturun.
  </p>

  <p>Evet. Entegrasyonu açın, URL’yi düzenleyin ve kaydedin. İmzalama gizli anahtarı ve etkinlik geçmişi onunla birlikte kalır.</p>

  <p>
    Yalnızca geliştirme sırasında <code>localhost</code> ve <code>*.localhost</code> için. Diğer tüm URL’ler HTTPS kullanmalıdır.
  </p>

  <p>
    Form ayarları → Entegrasyonlar bölümünden silin. Formstep istekleri göndermeyi hemen durdurur ve entegrasyonun etkinlik geçmişi onunla
    birlikte silinir.
  </p>

<h2 id="next-steps">Sonraki adımlar</h2>
<div class="not-prose grid gap-3 sm:grid-cols-2">
  - [Webhook referansı](/tr/developers/webhooks-reference) — Payload, başlıklar ve imza doğrulama
  - [Airtable](/tr/integrations/airtable) — Gönderimleri bir Airtable tabanına aktarın
  - [Linear](/tr/integrations/linear) — Gönderimleri Linear sorunlarına dönüştürün
  - [Tekrarlayan gruplar](/tr/building-forms/repeating-groups) — Katılımcıların ihtiyaç duydukları kadar kayıt eklemesine izin verin
</div>
