> ## Documentation Index
> Fetch the complete documentation index at: https://docs.thunderphone.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhook'lara Genel Bakış

> ThunderPhone'un gerçek zamanlı olayları nasıl ilettiği, imzaların nasıl doğrulanacağı ve eski teslim modelinin uç nokta tabanlı teslim modeliyle karşılaştırması.

ThunderPhone, çağrı sırasında gerçekleşen durumlarda sunucunuza HTTP `POST` istekleri gönderir — gelen bir çağrı başladığında, çağrı sona erdiğinde, bir değerlendirme çalışması tamamlandığında, bir uyarı tetiklendiğinde vb. **İki teslimat modeli** vardır:

<CardGroup cols={2}>
  <Card title="Webhook uç noktaları (önerilir)" icon="bolt" href="/tr/webhooks/endpoints">
    Birden fazla URL, uç nokta başına gizli anahtarlar, uç nokta başına olay filtreleri
    ve otomatik yeniden denemeler.
    `GET/POST/PATCH/DELETE /v1/developer/webhook-endpoints` üzerinden yönetin.
  </Card>

  <Card title="Tek URL eski webhook" icon="link" href="/api-reference/organizations#legacy-single-url-webhook">
    Kuruluş başına bir URL. **Engelleyici** yapılandırma alışverişleri dahil olmak üzere
    çağrı yaşam döngüsü olaylarını taşır. `GET/PUT /v1/webhook` üzerinden yönetilir.
  </Card>
</CardGroup>

[Olay kataloğundaki](/tr/webhooks/events) on olay türünün tümü webhook uç noktaları aracılığıyla
teslim edilir. Altı çağrı yaşam döngüsü olayı
(`telephony.incoming`, `telephony.complete`, `telephony.tool`,
`web.incoming`, `web.complete`, `web.tool`) **ayrıca** eski tek URL webhook'una da
gönderilir — hem eski bir URL'niz hem de eşleşen bir uç noktanız varsa, olayı
**her iki** yolda da alırsınız. Engelleyici davranış ([`telephony.incoming` / `web.incoming`
yapılandırma alışverişi](/tr/webhooks/call-incoming) ve webhook modunda
[araç yönlendirme](/tr/tools/overview)) yalnızca eski yolda bulunur;
her uç nokta teslimatı gönder ve unut bildirimidir.

## Yük biçimi

Uç nokta teslimatları `data`, `event_id` ve `type` içeren bir JSON nesnesidir:

```json theme={null}
{
  "data": {
    "call_id": 987654321,
    "from_number": "+14155550199",
    "to_number": "+15551234567"
  },
  "event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
  "type": "telephony.incoming"
}
```

`event_id`, yayınlanan her olay için benzersizdir. Yeniden denemelerde
**ve** olayı alan her uç noktada aynıdır — bunun üzerinden yinelenenleri ayıklayın.

Eski tek URL webhook'u aynı `type` ve `data` değerlerini gönderir, ancak
`event_id` **olmadan**:

```json theme={null}
{
  "type": "telephony.incoming",
  "data": { "call_id": 987654321, "from_number": "+14155550199", "to_number": "+15551234567" }
}
```

İletim sırasında her gövde kanonik olarak serileştirilir — anahtarlar alfabetik olarak
sıralanır, boşluk içermez ve UTF-8 kullanılır. Bu dokümanlardaki biçimlendirilmiş örnekler
yalnızca okunabilirlik içindir.

Olay türlerinin ve yük alanlarının tam listesi için [Olay kataloğuna](/tr/webhooks/events) bakın.

## İmza doğrulama

Her istek, `X-ThunderPhone-Signature` başlığında **ham istek
gövdesi** üzerinden oluşturulmuş bir HMAC-SHA256 imzası taşır. İmzalama anahtarı,
uç noktanın `secret` değeridir (veya eski teslimatlar için kuruluş düzeyindeki webhook
`secret` değerinizdir).

### Adımlar

1. Herhangi bir ayrıştırma işleminden **önce** ham istek gövdesini okuyun.
2. `hmac_sha256(secret, body).hexdigest()` hesaplayın.
3. Sabit zamanda `X-ThunderPhone-Signature` başlığıyla karşılaştırın.

İlettiğimiz baytları tam olarak imzalarız ve bu baytlar kanonik JSON
serileştirmesidir (sıralı anahtarlar, sıkıştırılmış ayırıcılar). Bu nedenle
ham gövdeye göre doğrulama her zaman çalışır — çerçeveniz size yalnızca
ayrıştırılmış JSON veriyorsa, bunu sıralı anahtarlar ve sıkıştırılmış
ayırıcılarla yeniden serileştirmek aynı baytları üretir. Her iki yöntem de
[doğrulama kılavuzunda](/tr/guides/verify-webhook-signatures) açıklanmıştır.

<CodeGroup>
  ```python Python theme={null}
  import hmac
  import hashlib

  def verify_signature(body: bytes, signature: str, secret: str) -> bool:
      expected = hmac.new(
          secret.encode("utf-8"),
          body,
          hashlib.sha256,
      ).hexdigest()
      return hmac.compare_digest(expected, signature or "")

  # Example Flask handler
  from flask import Flask, request, abort
  app = Flask(__name__)

  @app.post("/thunderphone-webhook")
  def handle():
      body = request.get_data()
      sig = request.headers.get("X-ThunderPhone-Signature", "")
      if not verify_signature(body, sig, WEBHOOK_SECRET):
          abort(401)
      event = request.get_json()
      # dispatch on event["type"] …
      return "", 204
  ```

  ```javascript Node.js (Express) theme={null}
  import crypto from "node:crypto";
  import express from "express";

  function verifySignature(body, signature, secret) {
    const expected = crypto
      .createHmac("sha256", secret)
      .update(body)
      .digest("hex");
    if (!signature || expected.length !== signature.length) return false;
    return crypto.timingSafeEqual(
      Buffer.from(expected),
      Buffer.from(signature),
    );
  }

  const app = express();
  app.post(
    "/thunderphone-webhook",
    express.raw({ type: "application/json" }),
    (req, res) => {
      const sig = req.header("X-ThunderPhone-Signature") || "";
      if (!verifySignature(req.body, sig, process.env.WEBHOOK_SECRET)) {
        return res.sendStatus(401);
      }
      const event = JSON.parse(req.body.toString("utf8"));
      // dispatch on event.type …
      res.sendStatus(204);
    },
  );
  ```
</CodeGroup>

## Teslimat semantiği

Bu semantik, **uç nokta** teslimatları için geçerlidir. Eski tek URL'li
webhook, yeniden denemesi olmayan tek bir eşzamanlı denemedir.

<AccordionGroup>
  <Accordion title="Yeniden denemeler">
    Her olay hemen bir kez denenir. Herhangi bir `2xx` yanıtı
    teslimatı onaylar. Diğer tüm sonuçlarda (2xx olmayan yanıt,
    bağlantı hatası, zaman aşımı), **ilk denemeden 1 dk, 5 dk, 30 dk, 2 sa, 6 sa,
    12 sa ve 24 sa sonra** yeniden deneriz — 24 saate yayılan
    8 deneme. Her deneme başarısız olursa teslimat durur ve uç nokta,
    [webhook uç noktalarında](/tr/webhooks/endpoints)
    `status="failing"` olarak işaretlenir. Yük kalıcı olarak kabul edilir edilmez
    `2xx` döndürün; eşzamansız olarak işleyin.
  </Accordion>

  <Accordion title="Sıralama">
    Teslimat sıralaması en iyi çabaya dayanır. Uygulamada olayları
    yayımlandıkları sırayla teslim ederiz, ancak yeniden denemeler başarısızlık
    durumunda sıralamayı değiştirebilir. Her zaman `call_id` / nesne kimliğine
    göre yinelenenleri kaldırın ve mutabakat sağlayın.
  </Accordion>

  <Accordion title="Yinelenenler">
    Teslimat **en az bir kez** gerçekleştirilir: hiç görmediğimiz bir yanıttan
    sonraki yeniden deneme bir olayı yineleyebilir. Her yeniden deneme aynı
    `event_id` değerini taşır; bu nedenle işlenen kimlikleri saklayın ve
    tekrarları atlayın. `event_id` ayrıca uç noktalar arasında da paylaşılır —
    aynı olaya abone olan iki uç nokta aynı `event_id` değerini alır.
  </Accordion>

  <Accordion title="Zaman aşımları">
    Uç nokta teslimatlarında deneme başına **30 sn** zaman aşımı vardır. Eski
    yolda, canlı çağrı davranışını yönlendiren engelleyici istekler —
    [`telephony.incoming` / `web.incoming`](/tr/webhooks/call-incoming)
    yapılandırma alışverişi — **10 sn** sonra zaman aşımına uğrar; ancak yavaş
    bir yanıt çağrının cevaplanmasını geciktirir, bu nedenle birkaç saniye içinde
    yanıt vermeyi hedefleyin. Webhook modundaki [araç yönlendirme](/tr/tools/overview)
    20 sn süre tanır.
  </Accordion>

  <Accordion title="Kaynak IP'ler">
    Giden webhook'lar ThunderPhone'un bulut IP aralığından kaynaklanır.
    Güvenlik duvarınız bir izin listesi gerektiriyorsa destek ekibiyle iletişime
    geçin; güncel aralıkları paylaşırız.
  </Accordion>
</AccordionGroup>

## Eski ve uç nokta tabanlı webhook'lar arasında seçim yapma

| Özellik                             | Eski (`/v1/webhook`)                                                       | Uç noktalar (`/v1/developer/webhook-endpoints`) |
| ----------------------------------- | -------------------------------------------------------------------------- | ----------------------------------------------- |
| URL sayısı                          | Kuruluş başına 1                                                           | Kuruluş başına çok sayıda                       |
| Olay kapsamı                        | Yalnızca `telephony.*` / `web.*`                                           | 10 olay türünün tümü                            |
| Olay filtresi                       | —                                                                          | Uç nokta başına                                 |
| Yeniden denemeler                   | Yok                                                                        | 24 saatte 8 deneme                              |
| Zarf                                | `type` + `data`                                                            | `type` + `data` + `event_id`                    |
| Gizli anahtar döndürme              | Tek gizli anahtarı değiştirir                                              | Uç nokta başına gizli anahtar                   |
| Silmeden devre dışı bırakma         | —                                                                          | `status=disabled`                               |
| Durum görünürlüğü                   | —                                                                          | `active` / `disabled` / `failing`               |
| Engelleyici yapılandırma alışverişi | Evet ([`telephony.incoming` / `web.incoming`](/tr/webhooks/call-incoming)) | Asla — yalnızca bildirimler                     |
| En uygun kullanım                   | Dinamik çağrı yapılandırması                                               | Üretimde olay tüketimi                          |

Yeni entegrasyonlar, olayları uç nokta tabanlı webhook'lar üzerinden
tüketmelidir. Yalnızca çağrıları cevaplama sırasında dinamik olarak
yapılandırıyorsanız veya webhook modunda araç yönlendirme kullanıyorsanız eski
bir URL'yi koruyun (veya ekleyin) — bu istek/yanıt alışverişleri yalnızca eski
yolda çalışır.

***

## İlgili

<CardGroup cols={2}>
  <Card title="Olay kataloğu" icon="list" href="/tr/webhooks/events">
    Tüm olay türleri ve yükleri.
  </Card>

  <Card title="Webhook uç noktaları" icon="bolt" href="/tr/webhooks/endpoints">
    Birden çok uç noktayı, olay filtrelerini ve gizli anahtarları yönetin.
  </Card>

  <Card title="telephony.incoming / web.incoming" icon="phone" href="/tr/webhooks/call-incoming">
    Çağrıları yapılandırmak için sunucunuzun yanıtlaması gereken engelleyici istek.
  </Card>

  <Card title="telephony.complete / web.complete" icon="phone" href="/tr/webhooks/call-complete">
    Transkript, kayıt ve metrikleri içeren çağrı sonrası yük.
  </Card>
</CardGroup>
