> ## 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.

# Klinikler ve X-Tenant

> Kullanıcının üyesi olduğu klinikleri listelemeyi, X-Tenant başlığını ve klinik bazında izinleri anlatır.

Flextell'de veriler kliniğe aittir. Bir kullanıcı birden fazla kliniğin üyesi olabilir ve her klinikte farklı rollere sahip olabilir. Bu sayfa, hangi kliniklerin var olduğunu nasıl öğreneceğinizi ve klinik verisi isteyen her çağrıda hangi klinikle çalıştığınızı `X-Tenant` başlığıyla nasıl belirteceğinizi anlatır.

## Klinik nedir

Klinik, Flextell'de hastaların, randevuların, kullanıcıların ve ayarların bağlı olduğu hesaptır. Panelde **Klinikler** olarak, API'de `tenant` olarak geçer. Kullanıcı bir kliniğe üyelik (davet kabulü veya klinik oluşturma) yoluyla bağlanır.

Bir klinik isteğinin sonucu üç şeyin kesişimiyle belirlenir:

1. Erişim token'ınızdaki **scope**'lar (uygulamanın ne isteyebileceği).
2. Kullanıcının **seçtiğiniz klinikteki** izinleri (kullanıcının ne yapabileceği).
3. Kullanıcının o kliniğe üyeliği.

Bir kullanıcının izinleri kliniğe göre değişir. Aynı kullanıcı A kliniğinde yönetici, B kliniğinde yalnızca görüntüleyici olabilir. Üçüncü taraf uygulamanız, kullanıcının üyesi olduğu her klinikte çalışabilir; ancak her klinikte yalnızca uygulamanın scope'larıyla ve kullanıcının o klinikteki rolleriyle sınırlıdır. Ayrıntı için [İzinler ve görünürlük](/api/izinler-ve-gorunurluk) ve [Scope'lar](/api/kimlik-dogrulama/scopelar) sayfalarına bakın.

## Klinikleri listeleme

Kullanıcının üyesi olduğu klinikleri `GET /api/v1/account/tenants` ile alın. Bu çağrı `account:read` scope'u ister ve `X-Tenant` **göndermez**. `X-Tenant` olarak kullanacağınız geçerli değerlerin kaynağı bu listedir.

| Metot | Endpoint | Açıklama | Scope |
| - | - | - | - |
| GET | `/api/v1/account/tenants` | Kullanıcının üyesi olduğu klinikler | `account:read` |
| GET | `/api/v1/account` | Kullanıcı profili; `tenants[]` alanında klinikleri de içerir | `account:read` |
| GET | `/api/v1/account/roles` | Seçili klinikteki rol ve izinler (`X-Tenant` gerekir) | `account:read` |

<CodeGroup>
  ```bash curl theme={null}
  curl "https://app.flextell.ai/api/v1/account/tenants" \
    -H "Authorization: Bearer <access_token>" \
    -H "Accept: application/json"
  ```

  ```json Yanıt theme={null}
  {
    "success": true,
    "data": [
      {
        "id": 123,
        "name": "Örnek Klinik",
        "slug": "ornek-klinik",
        "avatar_url": null,
        "is_active": true,
        "setup_required": false
      }
    ]
  }
  ```
</CodeGroup>

| Alan | Tür | Açıklama |
| - | - | - |
| `id` | sayı | Klinik kimliği. `X-Tenant` başlığına bu değeri yazın. |
| `name` | metin | Klinik adı. |
| `slug` | metin | Kısa ad. `X-Tenant` için **kullanılmaz**. |
| `avatar_url` | metin veya `null` | Klinik görseli için imzalı adres; yaklaşık 1 saat geçerlidir. Görsel yoksa `null`. |
| `is_active` | mantıksal | Kliniğin aktif olup olmadığı. |
| `setup_required` | mantıksal | Zorunlu kurulum adımları açıksa `true`. |

<Note>
  Liste, silinmiş klinikleri içermez. `GET /api/v1/account` yanıtındaki `tenants[]` alanında `setup_required` bulunmaz; bu alan yalnızca `GET /api/v1/account/tenants` yanıtında gelir.
</Note>

## X-Tenant başlığı

Klinik verisi okuyan veya yazan her endpoint, hangi klinikle çalıştığınızı `X-Tenant` başlığıyla ister. Değer, kliniğin **sayısal `id`** değeridir; `slug` değildir.

```bash theme={null}
curl "https://app.flextell.ai/api/v1/customers?per_page=15" \
  -H "Authorization: Bearer <access_token>" \
  -H "X-Tenant: 123" \
  -H "Accept: application/json"
```

Sunucu başlığı şöyle işler:

| Durum | Sonuç |
| - | - |
| Başlık yok veya boş | `400` `TENANT_HEADER_REQUIRED` |
| Değer yalnızca rakamlardan oluşmuyor veya sıfır | `404` `TENANT_NOT_FOUND` |
| Klinik yok, silinmiş ya da kullanıcı üye değil | `404` `TENANT_NOT_FOUND` |
| Klinik geçerli ve kullanıcı üye | İstek o klinik bağlamında çalışır |

<Info>
  Üye olmadığınız bir klinik için de `403` değil `404 TENANT_NOT_FOUND` döner. Böylece bir klinik kimliğinin var olup olmadığı dışarıdan anlaşılamaz.
</Info>

Seçtiğiniz klinik, isteğin tamamında rolleri, izinleri ve kayıt görünürlüğünü belirler. Klinik bağlamındaki her yanıtta `X-Timezone` başlığı kliniğin saat dilimini (ör. `Europe/Istanbul`) taşır. Başlığın genel kuralları için [İstek başlıkları](/api/istekler/basliklar) sayfasına bakın.

<Warning>
  İstek gövdesinde `tenant` adlı bir alan gönderirseniz, sunucu bu alanı seçili klinik bilgisiyle ezer. Gövdede `tenant` adını kullanmayın.
</Warning>

### Kullanıcının seçili kliniğe göre yapabilecekleri

`GET /api/v1/account/roles` çağrısı `X-Tenant` ile seçtiğiniz klinikteki rol adlarını ve izin adlarını döndürür. Kullanıcıya göstereceğiniz düğmeleri ve menüleri bu listeye göre açıp kapatabilirsiniz.

```bash theme={null}
curl "https://app.flextell.ai/api/v1/account/roles" \
  -H "Authorization: Bearer <access_token>" \
  -H "X-Tenant: 123" \
  -H "Accept: application/json"
```

```json theme={null}
{ "roles": ["super_admin"], "permissions": ["View:User", "View:Customer"] }
```

Bu çağrı da klinik kapsamındadır; kliniğin aboneliği bitmişse veya gecikmiş ödeme varsa `402` döner (bkz. [Hatalar](#hatalar)).

## Klinik gerektirmeyen endpoint'ler

Aşağıdaki endpoint grupları `X-Tenant` istemez:

| Grup | Not |
| - | - |
| `/api/v1/account*` | Tek istisna `GET /api/v1/account/roles`; o `X-Tenant` ister. |
| `/api/v1/general/*` | Ülke, para birimi gibi ortak arama listeleri. Yalnızca bearer token gerekir. |
| `/api/v1/channels/capabilities` | Kanal yetenekleri. |
| `/api/v1/invitations/preview` | Davet önizlemesi (herkese açık). |
| `/api/v1/public/forms/*` | Herkese açık hasta formları. |
| `/api/v1/integrations/inbound/*` | Gelen entegrasyon webhook'ları. |

Diğer tüm klinik endpoint'leri `X-Tenant` ister. Bunlara `/api/v1/oauth/*` (OAuth uygulamaları ve `GET /api/v1/oauth/scopes`) ve `/api/v1/announcements` de dahildir. OAuth uygulamalarını yönetirken izin de başlıkta verdiğiniz klinik için kontrol edilir; başka bir klinikteki izin bu istek için geçerli olmaz. Bkz. [OAuth uygulamaları](/api/kaynaklar/oauth-uygulamalari).

<Note>
  Duyurular (`/api/v1/announcements`) içerik olarak tüm kliniklere ortaktır; yine de çağrı `X-Tenant` ve `View:Announcement` izni ister. Bu izin tüm klinik rollerinde bulunur.
</Note>

## Klinik değiştirme

Klinik değiştirmek için yeni bir token almanız gerekmez. Aynı access token tüm kliniklerde geçerlidir; yalnızca `X-Tenant` değerini değiştirirsiniz. Önerilen akış:

<Steps>
  <Step title="Kullanıcıyı doğrulayın">
    [Yetkilendirme kodu ve PKCE](/api/kimlik-dogrulama/yetkilendirme-kodu-ve-pkce) akışıyla token alın. Token'ın `account:read` scope'unu içerdiğinden emin olun.
  </Step>

  <Step title="Klinikleri listeleyin">
    `GET /api/v1/account/tenants` çağrısını `X-Tenant` olmadan yapın.
  </Step>

  <Step title="Kliniği seçin">
    Kullanıcıya liste gösterin ya da tek klinik varsa doğrudan onu kullanın. Seçilen kliniğin `id` değerini saklayın.
  </Step>

  <Step title="Her istekte gönderin">
    Klinik endpoint'lerine yaptığınız her çağrıya `X-Tenant: <tenant_id>` ekleyin. Başka bir kliniğe geçerken yalnızca bu değeri değiştirin ve izin listesini `GET /api/v1/account/roles` ile yeniden yükleyin.
  </Step>
</Steps>

Flextell paneli oturum açtıktan sonra klinik listesini alır, son seçilen kliniği hatırlar ve yoksa listedeki ilk kliniği seçer; seçili klinik artık erişilebilir değilse sizi klinik seçmeye yönlendirir. Mobil uygulama aynı mantıkla çalışır ve klinik adı yerine **Firma** der. Uygulamanızda da aynı yaklaşımı izleyebilirsiniz.

<Warning>
  Kullanıcı kliniğe üyeliğini yitirirse veya klinik silinirse, sakladığınız `id` ile yapılan istekler `404 TENANT_NOT_FOUND` döner. Bu durumda listeyi yeniden alın ve kullanıcıdan kliniği yeniden seçmesini isteyin.
</Warning>

## Hatalar

Klinik endpoint'lerinde istek şu sırayla denetlenir ve ilk başarısız denetim yanıtı belirler:

`401` (token) → `429` (oran sınırı) → `400`/`404` (`X-Tenant`) → `402` (abonelik) → `428` (kurulum) → `403` (scope) → `403` (izin) → `404`/`422` (kaynak ve doğrulama)

Tek istisna `GET /api/v1/account/roles`: bu çağrıda scope denetimi `X-Tenant` denetiminden önce yapılır.

| Kod | HTTP | Ne zaman |
| - | - | - |
| `UNAUTHENTICATED` | 401 | Token yok, geçersiz, süresi dolmuş veya iptal edilmiş. `Kimlik doğrulaması gerekli.` |
| `TENANT_HEADER_REQUIRED` | 400 | `X-Tenant` yok veya boş. `X-Tenant başlığı zorunludur.` |
| `TENANT_NOT_FOUND` | 404 | Değer sayısal değil, klinik yok ya da silinmiş, kullanıcı üye değil. `Klinik bulunamadı.` |
| `SUBSCRIPTION_REQUIRED` | 402 | Kliniğin aboneliği sona ermiş. `data` alanı abonelik özetini taşır. |
| `ACCESS_RESTRICTED_BY_OVERDUE_PAYMENT` | 402 | Gecikmiş ödeme var. `data.proforma_invoice_id` ve `data.due_date` döner. |
| `SETUP_REQUIRED` | 428 | Zorunlu kurulum adımları tamamlanmamış. `data.next_step` bir sonraki adımı belirtir. |
| `FORBIDDEN` | 403 | Token'da gerekli scope yok (`Invalid scope(s) provided.`) ya da kullanıcının o klinikte izni yok (`Bu işlem için yetkiniz yok.`). |

Hata zarfı ve genel hata kodları için [Hatalar](/api/istekler/hatalar) ve [Hata kodları](/api/istekler/hata-kodlari) sayfalarına bakın. `402` ve `428` kilitlerinin ayrıntıları ve hangi yolların bu kilitlerden muaf olduğu [Erişim kilitleri](/api/istekler/erisim-kilitleri) sayfasındadır.

<Tip>
  `404 TENANT_NOT_FOUND` aldığınızda önce `X-Tenant` değerinin `slug` değil sayısal `id` olduğunu, ardından kullanıcının o kliniğin üyesi olduğunu kontrol edin. Üyelik için `GET /api/v1/account/tenants` çağrısına bakın.
</Tip>

## İlgili sayfalar

<CardGroup cols={2}>
  <Card title="İzinler ve görünürlük" icon="shield-check" href="/api/izinler-ve-gorunurluk">
    Klinik bazında izinlerin ve kayıt görünürlüğünün nasıl çalıştığı.
  </Card>

  <Card title="Scope'lar" icon="key-round" href="/api/kimlik-dogrulama/scopelar">
    Uygulamanızın isteyebileceği scope'lar.
  </Card>

  <Card title="Erişim kilitleri" icon="lock" href="/api/istekler/erisim-kilitleri">
    402 ve 428 yanıtları.
  </Card>

  <Card title="Hesap" icon="user" href="/api/kaynaklar/hesap">
    Hesap ve klinik endpoint'leri.
  </Card>
</CardGroup>


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