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

# Başlıklar, dil ve CORS

> Her istekte kullanılan başlıkları, Accept-Language ile yanıt dilini, saat dilimi başlığını ve tarayıcıdan yapılan isteklerdeki CORS kurallarını anlatır.

Bu sayfa, `https://app.flextell.ai/api/v1` altındaki isteklerde hangi başlıkları göndermeniz gerektiğini, yanıtların hangi dilde döneceğini ve saat diliminin nasıl bildirildiğini anlatır. Tarayıcıdan (başka bir alan adından) istek yapan uygulamalar için CORS kuralları da burada.

## Zorunlu başlıklar

| Başlık | Ne zaman | Kural |
| - | - | - |
| `Authorization: Bearer <access_token>` | Herkese açık olanlar dışındaki tüm `/api/v1` endpoint'lerinde | Geçerli bir OAuth `access_token`. Token alma adımları için [Kimlik doğrulama](/api/kimlik-dogrulama/genel-bakis) bölümüne bakın. |
| `X-Tenant: <tenant_id>` | Klinik bağlamında çalışan tüm endpoint'lerde | Klinik ID'si, yalnızca rakam ve sıfırdan büyük. Eksik veya boşsa `400`, `TENANT_HEADER_REQUIRED`. Biçimi hatalı, bulunamayan, silinmiş ya da üyesi olmadığınız klinik için `404`, `TENANT_NOT_FOUND`. |
| `Content-Type` | Gövdesi olan isteklerde | JSON gövde için `application/json`. Dosya yüklemeleri `multipart/form-data` ile ve `POST` olarak gönderilir. |

<Info>
  `X-Tenant` değerini `GET /api/v1/account/tenants` yanıtından alırsınız. Başlığın ayrıntıları ve klinik seçimi için [Klinikler ve X-Tenant](/api/klinikler-ve-x-tenant) sayfasına bakın. `/oauth/clients*` ve `GET /oauth/scopes` endpoint'leri de `X-Tenant` ister; izin yalnızca o klinikte kontrol edilir.
</Info>

## İsteğe bağlı başlıklar

| Başlık | Ne zaman | Kural |
| - | - | - |
| `Accept-Language` | İsteğe bağlı | `tr` veya `en`. Ayrıntıları [Yanıt dili](#yanıt-dili) bölümünde. |
| `Accept: application/json` | Önerilir | JSON hata yanıtları için zorunlu değildir. Flextell paneli her istekte gönderir. |
| `Idempotency-Key` | Aşağıdaki endpoint'lerde | `POST /api/v1/account/tenants` için zorunlu. `POST /api/v1/billing/subscription/purchase` ve `POST /api/v1/billing/quota-packages/{id}/purchase` için başlık ya da gövdedeki `idempotency_key` alanı. İkisi birlikte gönderilirse başlık geçerlidir. 8–128 karakter; yalnızca harf, rakam ve `. _ : -`. Ayrıntılar için [Idempotency](/api/istekler/idempotency) sayfasına bakın. |

## Yanıt dili

API, hata mesajlarını ve kaynak mesajlarını `Accept-Language` başlığına göre `tr` veya `en` olarak döndürür.

* Başlık yoksa ya da boşsa yanıt **Türkçe** döner.
* Desteklenmeyen bir dil (örneğin `fr-FR`) yine Türkçe ile sonuçlanır.
* Bölge etiketleri ve `q` değerleri çalışır: `tr-TR,tr;q=0.9,en;q=0.8` Türkçe, `en-US` İngilizce sonuç verir.
* Sunucudan sunucuya çağrılar, `curl` ve Postman gibi araçlar `Accept-Language` göndermezse Türkçe yanıt alır. İngilizce istiyorsanız `Accept-Language: en` gönderin.

Yerelleştirilen metinler: varsayılan hata mesajları, kaynak mesajları, doğrulama (validation) mesajları ve silme ilişkisi etiketleri.

<Warning>
  Kodunuzda hata durumunu `message` metnine göre ayırmayın. Mesaj dile ve zamanla değişebilir; `error_code` alanına göre dallanın. Hata yapısı için [Hatalar](/api/istekler/hatalar) sayfasına bakın.
</Warning>

Aşağıdaki metinler `Accept-Language` değerinden bağımsız olarak her zaman İngilizce gelir:

* Yönlendirme düzeyindeki hatalar (örneğin olmayan bir adres).
* Yetkilendirme sunucusunun `Invalid scope(s) provided.` yanıtı.
* Adlandırılmış oran sınırlayıcıların mesajları (örneğin `Too many requests.`). Oran sınırları için [Oran sınırları](/api/istekler/oran-sinirlari) sayfasına bakın.

<Note>
  Kuyrukta oluşturulan dışa aktarmalar ve bunların bildirimleri, isteği yapanın başlığına değil kliniğin dil ayarına göre hazırlanır.
</Note>

## Saat dilimi başlığı

Saat dilimi için gönderdiğiniz bir istek başlığı yoktur. Klinik bağlamındaki her yanıt, kliniğin saat dilimini bildirir:

| Yer | Değer | Örnek |
| - | - | - |
| `X-Timezone` yanıt başlığı | Kliniğin IANA saat dilimi | `Europe/Istanbul` |
| `meta.timezone` alanı | Aynı değer; JSON yanıtlarda hata ve sayfalama `meta` nesnesi dahil | `"Europe/Istanbul"` |

`X-Timezone`, hata yanıtlarında ve dosya indirmelerinde de bulunur. Anlık zaman alanları bu saat diliminde, açık bir ofsetle yazılır: `2026-03-01T12:00:00+03:00`.

<Note>
  Klinik bağlamı olmayan endpoint'lerde (`/v1/account/*`, `/v1/general/*`, herkese açık formlar) `X-Timezone` ve `meta.timezone` yoktur. Bu endpoint'lerde anlık zamanlar UTC olarak, `2026-06-03T09:00:00.000000Z` biçiminde döner. Tarih ve saat kuralları için [Veri biçimleri](/api/istekler/veri-bicimleri) sayfasına bakın.
</Note>

## CORS

Tarayıcıdan istek yapıyorsanız CORS kuralları geçerlidir. Sunucu tarafı uygulamalar (backend, `curl`, Postman) CORS'tan etkilenmez.

| Kural | Değer |
| - | - |
| CORS uygulanan yollar | `api/*`, `oauth/*`, `.well-known/*` |
| İzin verilen metotlar | Tümü |
| İzin verilen başlıklar | Tümü; `X-Tenant`, `Idempotency-Key` ve `Accept-Language` ön kontrolden (preflight) geçer |
| İzin verilen origin'ler | Ortama göre tanımlanan bir liste |
| Çerez | Desteklenmez (`supports_credentials` kapalı); kimlik doğrulama yalnızca `Authorization: Bearer` ile yapılır |
| Preflight önbelleği | Yok (`max_age` 0); tarayıcı her istekten önce `OPTIONS` isteğini tekrarlar |
| Okunabilen yanıt başlıkları | Yalnızca tarayıcının standart olarak gösterdikleri |

<Warning>
  Başka bir origin'deki tarayıcı kodu `X-Timezone`, `X-RateLimit-Limit`, `X-RateLimit-Remaining` ve `Retry-After` başlıklarını okuyamaz. Saat dilimi için JSON gövdesindeki `meta.timezone` alanını kullanın. Tarayıcıdan çağırdığınız bir endpoint'te bu başlıklara bağlı bir mantık kurmayın.
</Warning>

<Note>
  Origin'iniz izin listesinde değilse tarayıcı isteği CORS hatasıyla engeller. Hangi origin'lerin tanımlı olduğunu öğrenmek veya origin'inizin eklenmesini istemek için [Destek](/api/destek) sayfasındaki yollarla iletişime geçin. Ortamlar için [Ortamlar](/api/ortamlar) sayfasına bakın.
</Note>

Web sitesi widget'ı kendi CORS kurallarına sahiptir: `GET`, `POST` ve `OPTIONS` metotları, `Content-Type`, `Accept`, `X-Widget-Token`, `Origin` ve `X-Requested-With` başlıkları, 3600 saniyelik preflight önbelleği. Ayrıntılar için [Web sitesi widget'ı](/api/webhooklar/web-sitesi-widgeti) sayfasına bakın.

## Örnek istek

Aşağıdaki istek, kliniğin randevu listesini İngilizce mesajlarla ister.

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

  ```javascript JavaScript theme={null}
  const response = await fetch("https://app.flextell.ai/api/v1/appointments", {
    headers: {
      Authorization: "Bearer <access_token>",
      "X-Tenant": "123",
      Accept: "application/json",
      "Accept-Language": "en",
    },
  });

  const body = await response.json();
  // Tarayıcıda X-Timezone okunamaz; meta.timezone kullanın.
  console.log(body.meta?.timezone);
  ```
</CodeGroup>

Yanıtta, sunucu tarafında şu başlık bulunur:

```text theme={null}
X-Timezone: Europe/Istanbul
```


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