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

# Idempotency

> Tekrarlanan isteklerin çift kayıt oluşturmasını önlemek için idempotency anahtarı kullanmayı anlatır.

Ağ kesintisi ya da zaman aşımı sonrasında bir isteği tekrar göndermeniz gerekebilir. Idempotency anahtarı, aynı isteğin ikinci kez gönderilmesinin ikinci bir kayıt oluşturmasını önler: sunucu işlemi yeniden yapmaz, ilk sonucu döndürür.

Idempotency tüm endpoint'lerde otomatik çalışmaz. Yalnızca bu sayfada listelenen endpoint'ler anahtarı destekler.

<Warning>
  Listede olmayan bir `POST` isteğini tekrar gönderirseniz ikinci bir kayıt oluşur. Bu endpoint'lerde tekrar denemeden önce kaydın oluşup oluşmadığını ilgili liste endpoint'iyle kontrol edin.
</Warning>

## Idempotency anahtarı

Anahtar, sizin ürettiğiniz ve isteği tanımlayan bir metindir. Her yeni işlem için yeni bir anahtar üretin; aynı işlemi tekrar gönderirken **aynı anahtarı** kullanın.

| Kural | Değer |
| - | - |
| Uzunluk | 8 ile 128 karakter arası |
| İzin verilen karakterler | `A-Z`, `a-z`, `0-9`, `.`, `_`, `:`, `-` |
| Önerilen biçim | UUID (örn. `3f2b8c1e-5a47-4d0e-9c1b-7e6a2d9f4b10`) |

Anahtarı `Idempotency-Key` başlığıyla gönderin. Faturalama endpoint'lerinde aynı değeri gövdede `idempotency_key` alanıyla da gönderebilirsiniz. İkisini birlikte gönderirseniz başlık geçerli olur.

<Tip>
  Her denemede yeni anahtar üretmeyin. Anahtarı işlemi başlatırken üretip saklayın, tekrar denemelerde aynısını gönderin.
</Tip>

## Destekleyen endpoint'ler

| Endpoint | Anahtar | Anahtarın kapsamı | Scope |
| - | - | - | - |
| `POST /api/v1/account/tenants` (klinik oluşturma) | `Idempotency-Key` başlığı, zorunlu | Kullanıcı başına | `account:write` |
| `POST /api/v1/billing/subscription/purchase` (abonelik satın alma) | `Idempotency-Key` başlığı ya da `idempotency_key` alanı, zorunlu | Klinik başına | `billing:write` |
| `POST /api/v1/billing/quota-packages/{id}/purchase` (ek paket satın alma) | `Idempotency-Key` başlığı ya da `idempotency_key` alanı, zorunlu | Klinik başına | `billing:write` |
| `POST /api/v1/conversations/{id}/messages/quick-reply` (Hızlı Yanıt gönderme) | `quick_reply_send_id` alanı, isteğe bağlı | Sohbet ve gönderen başına | `conversations:write` |

Satın alma endpoint'leri için ayrıntılar [Abonelik ve faturalama](/api/kaynaklar/abonelik-ve-faturalama), klinik oluşturma için [Hesap](/api/kaynaklar/hesap), mesaj gönderme için [Sohbetler](/api/kaynaklar/sohbetler) ve [Mesajlar](/api/kaynaklar/mesajlar) sayfalarındadır.

### Klinik oluşturma

`Idempotency-Key` başlığı zorunludur. Anahtar, istekteki `name` ve `country_id` değerleriyle birlikte hatırlanır.

### Abonelik ve ek paket satın alma

Anahtar, seçtiğiniz plana (`plan_code`) ya da ek pakete bağlanır. Satın alma bir proforma oluşturur ve ödemeyi başlatmaz; ödeme ayrı bir istekle başlar.

Ek paket anahtarları proformayla birlikte süresiz saklanır. Aynı paketi bilerek ikinci kez almak istiyorsanız yeni bir anahtar kullanın.

### Hızlı Yanıt gönderme

Hızlı Yanıt gönderirken her seçim için istemcide bir UUID üretip `quick_reply_send_id` olarak gönderin. Birden fazla ekli Hızlı Yanıt'ta her dosyayı ayrı istekle, `file_id` ile gönderin; tüm isteklerde aynı `quick_reply_send_id` ve ortak bir `media_group_id` kullanın, sırayı `media_group_index` (0–99) ile verin.

Albüm olarak medya gönderen `POST /api/v1/conversations/{id}/messages/media` endpoint'i de aynı mantıkla çalışır: `media_group_id` ve `media_group_index` birlikte gönderilir, aynı grup ve sıra numarasıyla tekrar gönderim özgün `message_id`'yi döndürür.

<Note>
  `media_group_id`, `media_group_index` ve `quick_reply_send_id` göndermediğiniz düz metin, tekil medya ve sesli mesaj gönderimleri takip edilmez. Bu gönderimleri tekrar ederseniz mesaj yeniden gönderilir.
</Note>

## Aynı anahtarla tekrar

Aynı anahtarı aynı içerikle tekrar gönderdiğinizde sunucu yeni kayıt oluşturmaz.

| Endpoint | Aynı anahtar, aynı içerik |
| - | - |
| Klinik oluşturma | `201` ile aynı klinik döner. Kullanıcı o klinikte artık üye olsa bile sonuç değişmez. |
| Abonelik satın alma | `201` ile aynı proforma döner. |
| Ek paket satın alma | `201` ile aynı proforma döner. Paket sonradan pasife alınsa ya da silinse de özgün proforma döner. |
| Hızlı Yanıt gönderme | `202` ile özgün `message_id` döner, mesaj ikinci kez gönderilmez. Hızlı Yanıt'ın kullanım sayısı anahtar başına bir kez artar. |

```bash theme={null}
curl -X POST "https://app.flextell.ai/api/v1/billing/quota-packages/123/purchase" \
  -H "Authorization: Bearer <access_token>" \
  -H "X-Tenant: <tenant_id>" \
  -H "Idempotency-Key: 3f2b8c1e-5a47-4d0e-9c1b-7e6a2d9f4b10" \
  -H "Content-Type: application/json"
```

Bu isteği yanıt gelmeden zaman aşımına uğradıktan sonra aynı başlıkla yeniden gönderirseniz ikinci bir proforma oluşmaz.

### Hızlı Yanıt tekrarının sınırları

Hızlı Yanıt ve albüm gönderimlerinde tekrar koruması şu koşullara bağlıdır:

* Önceki deneme başarısız olduysa tekrar istek mesajı yeniden gönderir.
* Önceki deneme 10 dakikadan uzun süredir sırada ya da gönderiliyor durumunda kaldıysa tekrar istek mesajı yeniden gönderir.
* Kayıtlar 7 gün sonra silinir. Bu süreden sonra aynı `quick_reply_send_id` yeni bir gönderim sayılır.

<Info>
  Raw adresle sohbet başlatan `POST /api/v1/conversations` isteği anahtar gerektirmez. Aynı kanal ve normalleştirilmiş adres için tekrar çağrı, yeni sohbet açmak yerine mevcut sohbeti `201` ile döndürür. Ayrıntılar için [Sohbetler](/api/kaynaklar/sohbetler) sayfasına bakın.
</Info>

## Hatalar

| Kod | HTTP | Ne zaman |
| - | - | - |
| `VALIDATION_FAILED` | 422 | Anahtar eksik, 8 karakterden kısa, 128 karakterden uzun ya da izin verilmeyen karakter içeriyor. |
| `TENANT_CREATION_KEY_CONFLICT` | 409 | Klinik oluşturmada aynı anahtar farklı `name` ya da `country_id` ile kullanıldı. Hatırlanan klinik artık kullanıcıya bağlı değilse de aynı hata döner. |
| `PURCHASE_IDEMPOTENCY_CONFLICT` | 409 | Satın alma anahtarı başka bir plan ya da pakette kullanıldı. Abonelikte, anahtarın ilk proforması iptal edildiyse ya da silindiyse de aynı hata döner. |
| `MEDIA_GROUP_CONFLICT` | 422 | `media_group_id` başka bir sohbette ya da başka bir gönderen tarafından zaten kullanıldı. |

Eksik anahtar mesajları endpoint'e göre değişir:

| Endpoint | Mesaj |
| - | - |
| Klinik oluşturma | `Idempotency-Key başlığını gönderin.` (`errors.idempotency_key` altında) |
| Abonelik satın alma | `Satın alma işlem anahtarı gereklidir.` |
| Ek paket satın alma | `Provide an Idempotency-Key header or idempotency_key body field.` (her zaman İngilizce) |

`409` aldığınızda isteği olduğu gibi tekrar göndermeyin. Hata, anahtarın farklı bir işlem için kullanıldığını gösterir. İşlemi gerçekten yeni bir istek olarak göndermek istiyorsanız yeni bir anahtar üretin. Hata kodlarının genel yapısı için [Hata yapısı](/api/istekler/hatalar) ve [Hata kodları](/api/istekler/hata-kodlari) sayfalarına bakın. Başlıkların genel listesi [İstek başlıkları](/api/istekler/basliklar) sayfasındadır.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.