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

# Hesap

> Oturum açmış kullanıcının hesap bilgilerini, klinik üyeliklerini, rollerini, bildirim tercihlerini ve hesap silmeyi anlatır.

`/v1/account` kaynağı, access token'ın sahibi olan kullanıcıyı yönetir. Hesap kişiye aittir ve tüm kliniklerde ortaktır: ad, e-posta, şifre, profil fotoğrafı, iki adımlı doğrulama ve bildirim tercihleri bir kez tutulur. Klinik üyeliği ve roller ise klinik başınadır.

Bu kaynaktaki uç noktalar `X-Tenant` başlığı istemez. Tek istisna `GET /v1/account/roles` uç noktasıdır. Başlığın nasıl çalıştığı için [Klinikler ve X-Tenant](/api/klinikler-ve-x-tenant) sayfasına bakın.

## Endpoint özeti

Tüm istekler `Authorization: Bearer <access_token>` başlığı taşır. Scope'ların anlamı için [Scope'lar](/api/kimlik-dogrulama/scopelar) sayfasına bakın.

| Metot | Endpoint | Açıklama | Scope |
| - | - | - | - |
| GET | `/v1/account` | Kullanıcının bilgilerini ve klinik listesini getirir. | `account:read` |
| PUT | `/v1/account` | `name` ve `email` alanlarını günceller. | `account:write` |
| POST | `/v1/account/avatar` | Profil fotoğrafı yükler. | `account:write` |
| DELETE | `/v1/account/avatar` | Profil fotoğrafını kaldırır. | `account:write` |
| GET | `/v1/account/onboarding` | Profil tamamlanma durumunu, üyelik durumunu ve bekleyen davet sayısını getirir. | `account:read` |
| GET | `/v1/account/tenants` | Kullanıcının üye olduğu klinikleri listeler. | `account:read` |
| POST | `/v1/account/tenants` | Yeni klinik oluşturur. `Idempotency-Key` başlığı zorunludur. | `account:write` |
| GET | `/v1/account/roles` | Seçili klinikteki rolleri ve izinleri getirir. `X-Tenant` zorunludur. | `account:read` |
| GET | `/v1/account/notification-preferences` | Bildirim tercihlerini listeler. | `account:read` |
| PUT | `/v1/account/notification-preferences` | Bildirim tercihlerini günceller. | `account:write` |
| PUT | `/v1/account/password` | Şifreyi değiştirir. | `account:write` + `account:sensitive` |
| GET | `/v1/account/two-factor` | İki adımlı doğrulama durumunu getirir. | `account:read` |
| POST | `/v1/account/two-factor` | İki adımlı doğrulamayı başlatır. | `account:write` + `account:sensitive` |
| POST | `/v1/account/two-factor/confirm` | Authenticator kodu ile kurulumu onaylar. | `account:write` + `account:2fa` |
| POST | `/v1/account/two-factor/disable` | İki adımlı doğrulamayı kapatır. | `account:write` + `account:sensitive` |
| POST | `/v1/account/two-factor/recovery-codes/regenerate` | Kurtarma kodlarını yeniler. | `account:write` + `account:sensitive` |
| GET | `/v1/account/browser-sessions` | Tarayıcı oturumlarını listeler. | `account:read` |
| POST | `/v1/account/browser-sessions/logout` | Diğer tarayıcı oturumlarını kapatır. | `account:write` + `account:sensitive` |
| DELETE | `/v1/account` | Hesabı siler. | `account:delete` + `account:sensitive` |

<Note>
  Hesap silme için ayrı bir scope gerekir. Yalnızca `account:write` taşıyan token `403` alır. Uygulamanızın bu scope'u kullanabilmesi için uygulama kaydında `account:delete` scope'unu da seçin.
</Note>

## Hesap bilgileri

`GET /v1/account` yanıtı şu alanları içerir:

| Alan | Tür | Açıklama |
| - | - | - |
| `id`, `name`, `email` | sayı, metin, metin | Kullanıcı kimliği, adı ve e-postası. |
| `title`, `phone`, `bio`, `language`, `blood_group` | metin | Profil alanları. |
| `emergency_contact_name`, `emergency_contact_surname`, `emergency_contact_phone_number` | metin | Acil durum kişisi. |
| `avatar_url` | metin veya `null` | İmzalı fotoğraf adresi. Süresi yaklaşık 6 saattir. Fotoğraf yoksa `null` döner. |
| `is_active` | boolean | Hesabın aktif olup olmadığı. |
| `last_login_at`, `last_login_ip` | tarih, metin | Son giriş. |
| `tenants` | dizi | Kullanıcının kliniklerinin listesi. |
| `created_at`, `updated_at` | tarih | UTC zaman damgaları. |

Hesap uç noktalarında zaman damgaları UTC döner, çünkü bu isteklerde klinik bağlamı yoktur.

`PUT /v1/account` yalnızca `name` ve `email` alanlarını kabul eder. Diğer alanlar sessizce yok sayılır. İkisi de gönderildiğinde zorunludur ve en fazla 255 karakter olabilir. E-posta, silinmemiş kullanıcılar arasında benzersiz olmalıdır.

<Warning>
  E-posta adresini değiştirirseniz e-posta doğrulaması sıfırlanır. Sonraki davetleri kabul etmek için davet kodunu veya bağlantısını kullanmanız gerekir.
</Warning>

Profil fotoğrafı için `POST /v1/account/avatar` isteğini `multipart/form-data` olarak gönderin. `file` alanı zorunludur. İzin verilen biçimler `jpg`, `jpeg`, `png` ve `webp`, en büyük boyut 5 MB'tır. Yanıt güncel hesap nesnesidir.

`GET /v1/account/onboarding` yanıtında `default_country_id`, `default_country`, `missing_profile_fields`, `has_tenant`, `can_create_tenant`, `email_verified` ve `pending_invitation_count` alanları bulunur. `missing_profile_fields` yalnızca `name` içerebilir.

## Klinikler ve roller

`GET /v1/account/tenants` kullanıcının üye olduğu tüm klinikleri döner; pasif klinikler de `is_active: false` ile listelenir. `id` değeri, diğer isteklerde `X-Tenant` başlığına yazacağınız değerdir.

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

`GET /v1/account/roles` seçili klinikte kullanıcının rollerini ve etkin izinlerini döner. İzinler klinik başınadır: bir klinikte verilen izin diğer klinikte geçerli olmaz.

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

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

Bu uç nokta klinik grubunda olduğu için aboneliği biten veya ödemesi gecikmiş bir klinik için `402` döner. İzin adlarının kullanımı için [İzinler ve görünürlük](/api/izinler-ve-gorunurluk) sayfasına bakın.

`POST /v1/account/tenants` ile yeni klinik açarken `Idempotency-Key` başlığı zorunludur (8–128 karakter; harf, rakam ve `. _ : -`). Gövdede `name` ve `country_id` gönderin. Aynı anahtar ve aynı gövde aynı kliniği `201` ile tekrar döner. Aktif bir klinikte zaten üyeyseniz `409 TENANT_CREATION_MEMBERSHIP_EXISTS` alırsınız. Bir kullanıcı dakikada en fazla 2 klinik oluşturabilir. Genel kurallar için [Idempotency](/api/istekler/idempotency) sayfasına bakın.

<Info>
  Başka bir kullanıcıyı kliniğe eklemek veya davet etmek için [Kullanıcılar, roller ve davetler](/api/kaynaklar/kullanicilar-roller-davetler) sayfasındaki uç noktaları kullanın.
</Info>

## Bildirim tercihleri

Tercihler kullanıcıya aittir ve tüm kliniklerde geçerlidir. Model "kapatma" esaslıdır: bir tür siz kapatmadıkça açıktır.

`GET /v1/account/notification-preferences` her bildirim türü için bir öğe döner:

```json theme={null}
{
  "success": true,
  "data": [
    {
      "type": "appointment_created",
      "label": "Yeni randevu oluşturuldu",
      "category": "appointment",
      "category_label": "Randevu",
      "enabled": true
    }
  ]
}
```

`PUT` isteğinde `preferences` dizisi zorunludur ve en az bir öğe içermelidir. Her öğe yalnızca `type` ve `enabled` alanlarını taşır. Aynı `type` iki kez gönderilmez. Gönderilmeyen türler olduğu gibi kalır; yanıt tüm listeyi döner.

```bash theme={null}
curl --request PUT "https://app.flextell.ai/api/v1/account/notification-preferences" \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{"preferences": [{"type": "chat_new_message", "enabled": false}]}'
```

`label` ve `category_label` her zaman Türkçedir; `Accept-Language` değerinden etkilenmez. Bu uç noktanın doğrulama mesajları İngilizcedir.

| Kategori (`category`) | `type` değerleri |
| - | - |
| `appointment` (Randevu) | `appointment_created`, `appointment_assignment`, `appointment_status_changed`, `appointment_rescheduled`, `appointment_bulk_reschedule`, `appointment_reschedule_no_alternative` |
| `message` (Mesaj) | `chat_new_message` |
| `ticket` (Destek Kaydı) | `ticket_created`, `ticket_assigned`, `ticket_status_changed` |
| `lead` (Lead) | `lead_unassigned`, `lead_task_assigned`, `lead_task_due`, `lead_bulk_operation` |
| `inventory` (Stok / Depo) | `inventory_low_stock`, `storage_file_uploaded`, `storage_overage` |
| `sales` (Satış) | `sales_export` |
| `finance` (Finans) | `customer_balance_export` |
| `announcement` (Duyuru) | `announcement_updated` |
| `panel_ticket` (Sorun Bildirimi) | `panel_ticket_created`, `panel_ticket_status_updated` |
| `report` (Rapor) | `ai_report_ready`, `ai_report_failed` |

<Note>
  Bu liste yalnızca uygulama içi bildirim türlerini kapsar. Kimlik ve faturalama e-postaları bildirim türü değildir; tercihlerle kapatılamaz. Bildirimleri okuma ve yönetme için [Bildirimler](/api/kaynaklar/bildirimler) sayfasına bakın.
</Note>

## Şifre ve iki adımlı doğrulama

Hassas işlemler (şifre değiştirme, iki adımlı doğrulamayı başlatma, kapatma ve kodları yenileme, diğer oturumları kapatma, hesap silme) `current_password` ister. Bu işlemler kullanıcı başına dakikada 5 istekle sınırlıdır; aşıldığında `429` döner. `two-factor/confirm` için sınır dakikada 3 denemedir. Genel sınırlar için [Oran sınırları](/api/istekler/oran-sinirlari) sayfasına bakın.

### Şifre değiştirme

`PUT /v1/account/password` gövdesi:

| Alan | Zorunlu | Açıklama |
| - | - | - |
| `current_password` | Evet | Mevcut şifre. Eşleşmezse `422`. |
| `password` | Evet | Yeni şifre, en az 8 karakter. |
| `password_confirmation` | Evet | `password` ile aynı olmalı. |
| `revoke_other_tokens` | Hayır | `true` ise diğer tüm access ve refresh token'lar iptal edilir. Varsayılan `false`. |

Şifre değişince kullanıcının diğer web oturumları kapanır. Diğer OAuth token'ları yalnızca `revoke_other_tokens` ile iptal edilir; isteği gönderen token geçerli kalır. Başarılı yanıt: `Şifre başarıyla güncellendi.`

### İki adımlı doğrulama

<Steps>
  <Step title="Başlatın">
    `POST /v1/account/two-factor` isteğini `current_password` ile gönderin. Yanıt `qr_code_url` ve 8 adet `recovery_codes` içerir. `qr_code_url` bir `otpauth://` adresidir, resim değildir; QR kod olarak siz üretirsiniz. Kurtarma kodlarını yalnızca bu yanıtta ve yenileme yanıtında görürsünüz.
  </Step>

  <Step title="Onaylayın">
    Authenticator uygulamasındaki 6 haneli kodu `POST /v1/account/two-factor/confirm` isteğinde `code` olarak gönderin. Onay için şifre gerekmez. Daha önce kabul edilmiş bir kod, süresi dolana kadar tekrar kullanılamaz; aynı kodu yeniden gönderirseniz `422 TWO_FACTOR_INVALID_CODE` döner.
  </Step>
</Steps>

<Warning>
  Girişte kod yalnızca onaylanmış kurulumlar için sorulur. Başlatıp onaylamadığınız hesap henüz korunmaz. Başlatma isteğini tekrarlarsanız önceki kurulum silinir; yeni bir gizli anahtar ve yeni kurtarma kodları üretilir.
</Warning>

Durumu `GET /v1/account/two-factor` ile `is_enabled` ve `is_confirmed` olarak okursunuz. `disable` ve `recovery-codes/regenerate` istekleri `current_password` ister; yenilemede eski kodlar geçersiz olur.

| Kod | HTTP | Ne zaman |
| - | - | - |
| `TWO_FACTOR_NOT_ENABLED` | 422 | Onaylama veya kod yenileme sırasında iki adımlı doğrulama başlatılmamış. |
| `TWO_FACTOR_INVALID_CODE` | 422 | Gönderilen kod hatalı. |
| `RECOVERY_CODES_REGENERATION_FAILED` | 422 | Kurtarma kodları yenilenemedi. |
| `SESSION_LOGOUT_FAILED` | 409 | Diğer oturumları kapatma işlemi zaten sürüyor. |

### Tarayıcı oturumları

`GET /v1/account/browser-sessions` her oturum için `id`, `ip_address`, `user_agent`, `last_active_at`, `is_current_device` ve `device` bilgisini döner. Bearer token ile yapılan isteklerde `is_current_device` hiçbir zaman `true` olmaz. `POST /v1/account/browser-sessions/logout` isteği `current_password` ile tüm diğer web oturumlarını kapatır. Mobil uygulama ve entegrasyon token'ları etkilenmez.

## Hesap silme

`DELETE /v1/account` isteği için `account:delete` ve `account:sensitive` scope'ları gerekir.

| Alan | Zorunlu | Açıklama |
| - | - | - |
| `current_password` | Evet | Mevcut şifre. |
| `two_factor_code` | İki adımlı doğrulama varsa | Authenticator uygulamasındaki 6 haneli kod. Kurulum onaylanmamış olsa bile istenir. |

OpenAPI şeması bu iki alanı sorgu parametresi olarak gösterir; JSON gövde de çalışır. Şifre URL'de görünmesin diye gövde kullanmanızı öneririz.

```bash theme={null}
curl --request DELETE "https://app.flextell.ai/api/v1/account" \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{"current_password": "<şifre>", "two_factor_code": "123456"}'
```

Başarılı yanıt `Hesabınız silindi.` mesajıdır. İşlem şunları yapar:

* Hesabı hemen kapatır, tüm access token'ları iptal eder ve tüm web oturumlarını sonlandırır.
* Kişisel verileri 30 gün sonra anonimleştirmek üzere zamanlar. Randevu, satış ve destek talebi gibi geçmiş kayıtlar anonimleşen kullanıcıya bağlı kalır.
* Eski e-posta adresine bilgilendirme e-postası gönderir.

<Warning>
  API üzerinden silmeyi geri alamazsınız. Hesabı silmeden önce verilerinizi dışa aktarın.
</Warning>

| Kod | HTTP | Ne zaman |
| - | - | - |
| `SINGLE_MEMBER_TENANT` | 422 | Kullanıcı, üyesi olduğu bir kliniğin tek üyesi. `data.single_member_tenants` dizisi `id` ve `name` ile bu klinikleri listeler. |
| `TOO_MANY_REQUESTS` | 429 | Hassas işlem sınırı aşıldı. |

`SINGLE_MEMBER_TENANT` yanıtındaki mesaj şöyledir: `Hesabınızı silmeden önce tek üyesi olduğunuz kliniklere başka bir kullanıcı eklemeli veya sahipliği devretmelisiniz.` Alan hataları (yanlış şifre, geçersiz kod) `422` olarak döner. Tüm hata kodları için [Hata kodları](/api/istekler/hata-kodlari) sayfasına bakın.

Panelden aynı işlemler için [Profil ve güvenlik](/panel/baslarken/profil-ve-guvenlik) sayfasına bakın.


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