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

# Aktivite logları, giriş kayıtları ve geri dönüşüm kutusu

> Aktivite loglarını, kullanıcı giriş kayıtlarını ve geri dönüşüm kutusu endpoint'lerini anlatır.

Bu sayfa üç ilişkili kaynağı anlatır. **Aktivite logları** kliniğinizde "kim, neyi, ne zaman değiştirdi" sorusunun cevabıdır. **Giriş kayıtları** klinik kullanıcılarının oturum açma ve kapatma denemelerini listeler. **Geri dönüşüm kutusu** silinen kayıtları saklama süresi dolana kadar geri yüklemenizi sağlar.

Aktivite logları ve giriş kayıtları salt okunurdur; API'den kayıt ekleyemez, değiştiremez veya silemezsiniz. Tüm isteklerde `Authorization: Bearer <access_token>` ve `X-Tenant: <tenant_id>` başlıkları gerekir. Taban adres `https://app.flextell.ai/api/v1` şeklindedir. Panelde aynı bilgiler için [Aktivite Logları](/panel/sistem/aktivite-loglari), [Kullanıcı Girişleri](/panel/sistem/kullanici-girisleri) ve [Geri Dönüşüm Kutusu](/panel/sistem/geri-donusum-kutusu) sayfaları vardır.

## Endpoint özeti

| Metot | Endpoint | Açıklama | Scope | İzin |
| - | - | - | - | - |
| `GET` | `/activity-logs` | Aktivite loglarını listeler | `activity_logs:read` | `View:ActivityLog` |
| `GET` | `/activity-logs/{id}` | Tek bir aktivite logunu getirir | `activity_logs:read` | `View:ActivityLog` |
| `GET` | `/authentication-logs` | Klinik kullanıcılarının giriş kayıtlarını listeler | `authentication_logs:read` | `View:AuthenticationLog` |
| `GET` | `/recycle-bin` | Geri dönüşüm kutusundaki kayıtları listeler | `recycle_bin:read` | `View:RecycleBin` |
| `POST` | `/recycle-bin/{id}/restore` | Kaydı (ve birlikte silinenleri) geri yükler | `recycle_bin:write` | `Restore:RecycleBin` |
| `DELETE` | `/recycle-bin/{id}/purge` | Kaydı kalıcı olarak siler | `recycle_bin:write` | `Purge:RecycleBin` |

İzinler istekte `X-Tenant` ile seçilen klinikte kontrol edilir. İzne yalnızca başka bir klinikte sahipseniz `403 FORBIDDEN` alırsınız. İzin etiketleri rol editöründe **Aktivite Logları**, **Kullanıcı Girişleri** ve **Geri Dönüşüm Kutusu** olarak görünür; geri dönüşüm için eylemler **Geri Yükle** ve **Kalıcı Sil** adını taşır. Genel kurallar için [izinler ve görünürlük](/api/izinler-ve-gorunurluk), [scope'lar](/api/kimlik-dogrulama/scopelar) ve [klinik seçimi](/api/klinikler-ve-x-tenant) sayfalarına bakın.

<Warning>
  Ayrı bir "yalnızca kendi kayıtlarım" izni yoktur. `View:ActivityLog` izni olan kullanıcı, diğer modüllerdeki görünürlük kısıtlarından bağımsız olarak kliniğin **tüm** aktivitesini okur. Örneğin yalnızca kendi randevularını görebilen bir kullanıcı, `View:ActivityLog` ile tüm randevuların değişiklik geçmişini de okuyabilir. Bu izni dikkatle verin.
</Warning>

## Aktivite logları

Bir aktivite logu, kliniğinizdeki bir kaydın oluşturulmasını, güncellenmesini veya silinmesini kaydeder. Hasta, randevu, Lead, satış, teklif, fatura, destek talebi, etiket, rol, kanal, ürün ve depo gibi birçok kayıt türü loglanır. Platform yöneticilerinin yaptığı işlemler klinik API'sinde görünmez.

### Log nesnesi

| Alan | Tür | Açıklama |
| - | - | - |
| `id` | integer | Log kimliği |
| `tenant_id` | integer | Klinik kimliği |
| `log_name` | string veya null | Log grubu adı |
| `description` | string | Serbest metin. Model olaylarında genellikle olay adıdır |
| `subject_type` | string | Değişen kaydın türü, örneğin `App\Models\Customer` |
| `subject_id` | integer | Değişen kaydın kimliği |
| `event` | string veya null | Olay türü ([Olaylar](#olaylar)) |
| `causer_type`, `causer_id` | string, integer veya null | İşlemi yapan. İkisi de `null` ise işlemi sistem yapmıştır |
| `causer_name` | string veya null | İşlemi yapan kullanıcının adı. Sistem, silinmiş kullanıcı veya adı boş kullanıcı için `null` |
| `properties` | nesne veya null | `{ "attributes": {yeni değerler}, "old": {eski değerler} }` ve olaya özgü ek alanlar |
| `batch_uuid` | string veya null | Birlikte silinen kayıtları gruplayan kimlik |
| `created_at`, `updated_at` | tarih-saat | Klinik saat diliminde, örneğin `2026-10-12T14:30:00+03:00` |

`properties` içinde `updated` olaylarında yalnızca değişen alanlar, `created` olaylarında tüm alanlar yer alır. Hiçbir alanı değiştirmeyen bir güncelleme log üretmez. Parola, iki adımlı doğrulama sırları ve token'lar gibi hassas alanlar loglara yazılmaz.

### Olaylar

`event` alanı aşağıdaki değerleri alabilir. Listeleri yalnızca ilk üçüne göre süzebilirsiniz; diğer değerler yanıtlarda görünür ama `event` parametresi olarak gönderilirse `422` döner.

| `event` | Anlamı | Süzülebilir |
| - | - | - |
| `created` | Oluşturuldu | Evet |
| `updated` | Güncellendi | Evet |
| `deleted` | Silindi | Evet |
| `restored` | Geri Yüklendi | Hayır |
| `merged` | Birleştirildi (hasta birleştirme, hedef hastada) | Hayır |
| `tag_attached`, `tag_detached` | Etiket Eklendi, Etiket Çıkarıldı | Hayır |
| `treatment_attached`, `treatment_detached` | Tedavi Eklendi, Tedavi Çıkarıldı (doktor veya asistan kaydında) | Hayır |
| `erasure_link_copied` | Silme Onay Bağlantısı Kopyalandı | Hayır |

Rol ve izin değişiklikleri `event: "updated"` olarak gelir; ayrım `description` alanındadır (`role_attached`, `role_detached`, `permission_attached`, `permission_detached`).

### Listeleme

`GET /activity-logs` sayfalanmış bir liste döndürür. Genel kurallar için [sayfalama](/api/istekler/sayfalama) ve [filtreleme ve sıralama](/api/istekler/filtreleme-ve-siralama) sayfalarına bakın.

| Parametre | Açıklama |
| - | - |
| `search` | En çok 255 karakter. `description`, `log_name` ve işlemi yapan kullanıcının adında arar. Her sözcük ön ek olarak eşleşir |
| `per_page` | 1 ile 100 arası, varsayılan 15 |
| `page` | 1 veya büyük |
| `sort_by` | `created_at` (varsayılan), `event`, `subject_type` |
| `sort_order` | `asc` veya `desc` (varsayılan, en yeni önce) |
| `event` | `created`, `updated` veya `deleted` |
| `subject_type` | Kayıt türü. Saklanan takma adı (`App\Models\Customer`) veya model sınıf adını kabul eder |
| `subject_id` | Kayıt kimliği, 1 veya büyük |
| `related[]` | İlişkili kayıtların aktivitesini de getirir. `subject_type` ve `subject_id` ile birlikte zorunludur |
| `causer` | `system` (sistem işlemleri) veya pozitif bir kullanıcı kimliği. `0`, `01`, `-1` ve `System` geçersizdir |
| `created_at_from`, `created_at_to` | Tarih aralığı. Yalnızca tarih (`2026-10-01`) verirseniz klinik saat diliminde günün başı ve sonu kullanılır. `created_at_to`, `created_at_from` değerinden önce olamaz |

Bir kaydın geçmişini görmek için `subject_type` ve `subject_id` gönderin. `related[]` ile kaydın ilişkili kayıtlarını da kapsayabilirsiniz. Her `related[]` değeri, o kayıt türü için izin verilenlerden biri olmalıdır.

| `subject_type` | İzin verilen `related[]` değerleri |
| - | - |
| `App\Models\User` | `appointments`, `assistantAppointments`, `tickets`, `files` |
| `App\Models\Customer` | `files`, `notes`, `tickets`, `appointments`, `forms` |
| `App\Models\Treatment` | `appointments` |
| `App\Models\TreatmentGroup` | `treatments` |
| `App\Models\Room` | `appointments` |
| `App\Models\Tag` | `customers` |
| `App\Models\FormTemplate` | `questions`, `formOptions` |

<CodeGroup>
  ```bash curl theme={null}
  curl -G "https://app.flextell.ai/api/v1/activity-logs" \
    -H "Authorization: Bearer <access_token>" \
    -H "X-Tenant: <tenant_id>" \
    --data-urlencode "subject_type=App\Models\Customer" \
    --data-urlencode "subject_id=123" \
    --data-urlencode "related[]=appointments" \
    --data-urlencode "created_at_from=2026-10-01" \
    --data-urlencode "per_page=25"
  ```

  ```json Yanıt theme={null}
  {
    "data": [
      {
        "id": 4501,
        "tenant_id": 12,
        "log_name": "default",
        "description": "updated",
        "subject_type": "App\\Models\\Customer",
        "subject_id": 123,
        "event": "updated",
        "causer_type": "App\\Models\\User",
        "causer_id": 7,
        "causer_name": "Ayşe Yılmaz",
        "properties": {
          "attributes": { "first_name": "Ayşe" },
          "old": { "first_name": "Ayse" }
        },
        "batch_uuid": null,
        "created_at": "2026-10-12T14:30:00+03:00",
        "updated_at": "2026-10-12T14:30:00+03:00"
      }
    ],
    "links": { "first": "...", "last": "...", "prev": null, "next": null },
    "meta": { "current_page": 1, "per_page": 25, "total": 1, "timezone": "Europe/Istanbul" }
  }
  ```
</CodeGroup>

Liste yanıtında `success` anahtarı yoktur; `data`, `links` ve `meta` alanlarını okuyun. `GET /activity-logs/{id}` ise `success: true`, `data` ve `meta.timezone` döndürür.

<Note>
  Bulunamayan, başka kliniğe ait veya platform yöneticisi tarafından yapılmış bir logu `GET /activity-logs/{id}` ile istediğinizde hepsi aynı `404 RESOURCE_NOT_FOUND` yanıtını alır. Mesaj `Aktivite kaydı bulunamadı` şeklindedir.
</Note>

## Giriş kayıtları

`GET /authentication-logs`, kliniğin **şu anki tüm üyelerinin** oturum açma ve kapatma kayıtlarını listeler; yalnızca sizinkileri değil. Kliniğin üyesi olmayan kullanıcıların kayıtları gelmez. İki klinikte üye olan bir kullanıcının kayıtları her iki kliniğin listesinde de görünür.

| Parametre | Açıklama |
| - | - |
| `search` | En çok 255 karakter. `ip_address` ve `user_agent` içinde arar; `192.168.99` gibi parçalar eşleşir. Kullanıcı adında aramaz |
| `user_id` | Tek bir kullanıcıya göre süzer. Var olmayan kullanıcı `422` verir; var olan ama kliniğe ait olmayan kullanıcı boş sayfa döndürür |
| `login_successful` | Yalnızca `1` (başarılı) veya `0` (başarısız). `true` ve `false` kabul edilmez |
| `cleared_by_user` | `1` veya `0`. Göndermezseniz ikisi birden gelir |
| `login_at_from`, `login_at_to` | Giriş zamanı aralığı. Tarih kuralları aktivite logları ile aynıdır |
| `sort_by` | `login_at` (varsayılan), `ip_address`, `login_successful` |
| `sort_order` | `asc` veya `desc` (varsayılan) |
| `per_page`, `page` | `per_page` 1 ile 100 arası, varsayılan 15 |

Boş gönderilen `sort_order` varsayılan sıralamaya düşer.

| Alan | Tür | Açıklama |
| - | - | - |
| `id` | integer | Kayıt kimliği |
| `authenticatable_id` | integer | Kullanıcı kimliği |
| `authenticatable` | nesne | `{ id, name }` biçiminde kullanıcı |
| `ip_address` | string veya null | İstemci IP adresi |
| `user_agent` | string veya null | Tarayıcı veya uygulama bilgisi |
| `device_name` | string veya null | Cihaz adı, örneğin `Safari on Mac` |
| `login_successful` | boolean | `false` başarısız denemedir |
| `login_at`, `logout_at` | tarih-saat veya null | Giriş ve çıkış zamanı |
| `is_suspicious`, `suspicious_reason` | boolean, string veya null | Şüpheli giriş işareti ve nedeni |
| `cleared_by_user` | boolean | Kullanıcı kaydı temizlediyse `true` |
| `location` | nesne veya null | Konum bilgisi. Çoğu kayıtta `null` olabilir |

```bash curl theme={null}
curl -G "https://app.flextell.ai/api/v1/authentication-logs" \
  -H "Authorization: Bearer <access_token>" \
  -H "X-Tenant: <tenant_id>" \
  --data-urlencode "login_successful=0" \
  --data-urlencode "login_at_from=2026-10-01"
```

### Aktivite ve giriş kayıtlarının hataları

| Kod | HTTP | Ne zaman |
| - | - | - |
| `UNAUTHENTICATED` | 401 | Token yok veya geçersiz |
| `FORBIDDEN` | 403 | Scope veya klinikteki izin eksik |
| `TENANT_HEADER_REQUIRED` | 400 | `X-Tenant` başlığı yok |
| `TENANT_NOT_FOUND` | 404 | Klinik bulunamadı veya üyesi değilsiniz |
| `RESOURCE_NOT_FOUND` | 404 | `GET /activity-logs/{id}` için kayıt yok |
| `VALIDATION_FAILED` | 422 | Parametre kuralı ihlali (alan hataları `errors` altında) |
| `TOO_MANY_REQUESTS` | 429 | İstek sınırı aşıldı |

Hata yapısı için [hata kodları](/api/istekler/hata-kodlari) sayfasına bakın.

## Geri dönüşüm kutusu

Bir kayıt silindiğinde hemen yok olmaz; çoğu hasta ile ilgili kayıt geri dönüşüm kutusuna girer ve varsayılan olarak 30 gün saklanır. Süre dolunca kayıt kendiliğinden kalıcı olarak silinir. Silme akışının genel anlatımı için [silme yaşam döngüsü](/api/istekler/silme-yasam-dongusu) sayfasına bakın.

`GET /recycle-bin` yalnızca açık (geri yüklenmemiş, kalıcı silinmemiş) ve birlikte silinen kayıtların **kökü** olan girişleri listeler. Örneğin bir hastayı sildiğinizde, onunla birlikte silinen randevular ayrı satır olmaz; hastanın girişinde `relation_summary` içinde sayılır.

### Geri dönüştürülebilen kayıtlar

Yalnızca aşağıdaki 12 tür geri dönüşüm kutusuna girer. `model_name` alanı Türkçe etiketi verir.

| `model_name` | Kayıt |
| - | - |
| `Hasta` | Hasta |
| `Hasta Kimlik Bilgisi` | Hastanın iletişim kimliği |
| `Hasta Formu` | Hastaya gönderilen form |
| `Aday (Lead)` | Lead |
| `Not` | Not |
| `Dosya` | Dosya |
| `Kanal Beyaz Listesi` | Kanal izin listesi kaydı |
| `Randevu` | Randevu |
| `Satış` | Satış |
| `Teklif` | Teklif |
| `Sohbet` | Sohbet |
| `Destek Talebi` | Destek Talebi |

<Warning>
  Kullanıcı, doktor, asistan, tedavi, oda, ürün, kategori, marka, etiket, meslek, banka hesabı, OAuth uygulaması, AI rapor ve planı ile agent prompt kayıtları geri dönüşüm kutusuna girmez. Bunları silerseniz API ile geri getiremezsiniz. Silinen dosyaların içeriğinin geri yüklemeyle birlikte geri geleceğine de güvenmeyin; silmeden önce dosyanın bir kopyasını saklayın.
</Warning>

### Liste ve giriş nesnesi

| Parametre | Açıklama |
| - | - |
| `model_type` | Yalnızca bu türdeki girişleri getirir. Değer, listede dönen `model_type` değeriyle aynı olmalıdır |
| `deleted_at_from`, `deleted_at_to` | Silinme zamanı aralığı |
| `sort_by` | `deleted_at` (varsayılan), `model_type`, `purge_at` |
| `sort_order` | `asc` veya `desc` (varsayılan) |
| `per_page`, `page` | `per_page` 1 ile 100 arası |

| Alan | Tür | Açıklama |
| - | - | - |
| `id` | integer | **Giriş** kimliği. Geri yükleme ve kalıcı silmede bu kimliği kullanırsınız, kaydın kimliğini değil |
| `tenant_id` | integer | Klinik kimliği |
| `model_type` | string | Kayıt türü, örneğin `Modules\Customer\Models\Customer` |
| `model_name` | string | Türkçe tür etiketi, örneğin `Hasta` |
| `model_id` | integer | Silinen kaydın kimliği |
| `label` | string | Silindiği andaki görünen ad (en çok 180 karakter) |
| `deleted_by` | nesne veya null | Silen kullanıcı. `null` ise silmeyi sistem yapmıştır |
| `deleted_at` | tarih-saat | Silinme zamanı |
| `purge_at` | tarih-saat | Kaydın kendiliğinden kalıcı silineceği zaman (panelde **Otomatik Silinme**) |
| `restored_at`, `purged_at` | tarih-saat veya null | Giriş geri yüklendiyse veya kalıcı silindiyse dolar |
| `relation_summary` | dizi | Birlikte silinen kayıtların özeti: `[{ relation, label, count }]`. Yoksa `[]` |
| `related_record_count` | integer | `relation_summary` içindeki sayıların toplamı |
| `is_recoverable` | boolean | Kaydın satırı hâlâ duruyorsa `true` |

```bash curl theme={null}
curl -G "https://app.flextell.ai/api/v1/recycle-bin" \
  -H "Authorization: Bearer <access_token>" \
  -H "X-Tenant: <tenant_id>" \
  --data-urlencode "sort_by=purge_at" \
  --data-urlencode "sort_order=asc"
```

<Info>
  Kurulum sihirbazı tamamlanmamış bir klinikte geri dönüşüm kutusu endpoint'leri `428 SETUP_REQUIRED` döndürür. Ayrıntı için [erişim kilitleri](/api/istekler/erisim-kilitleri) sayfasına bakın.
</Info>

## Geri yükleme ve kalıcı silme

Her ikisi de listedeki giriş `id` değeri ile çalışır ve istek gövdesi gerektirmez. Yanıt, güncellenmiş giriş nesnesidir; işlemden sonra `is_recoverable` değeri `false` olur.

### Geri yükleme

`POST /recycle-bin/{id}/restore`, kaydı ve **onunla birlikte silinen tüm ilişkili kayıtları** geri getirir. Yanıtta `restored_at` dolar.

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

Silinen hastanın telefon numarası bu arada başka bir hastaya verilmiş olabilir. Bu durumda geri yükleme `409 RESTORE_CONFLICT` ile reddedilir ve `data.conflicts` çakışmayı açıklar:

```json theme={null}
{
  "success": false,
  "error_code": "RESTORE_CONFLICT",
  "message": "Silinen kayıt aktif bir kayıtla çakışıyor.",
  "data": {
    "conflicts": [
      { "model_type": "Customer", "columns": ["tenant_id", "phone_number"], "conflicting_id": 123 }
    ]
  }
}
```

Çakışan değerin kendisi yanıtta yer almaz. Panel bu durumda `Bu kaydın :fields bilgisi bu arada başka bir kayda verilmiş. Geri yüklemek yerine iki kaydı birleştirmeniz gerekiyor.` mesajını gösterir. Entegrasyonunuz da aynı yönlendirmeyi yapmalıdır: kullanıcıya iki kaydı [birleştirmesini](/api/kaynaklar/hasta-birlestirme) önerin.

### Kalıcı silme

`DELETE /recycle-bin/{id}/purge`, kaydı ve birlikte silinen tüm ilişkili kayıtları kalıcı olarak siler. Yanıtta `purged_at` dolar.

<Warning>
  Kalıcı silme geri alınamaz. Süresi dolmamış bir kaydı yalnızca kullanıcı açıkça onayladığında silin.
</Warning>

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

Kaydın satırı daha önce yok olduysa kalıcı silme yine `200` döner ve girişi kapatır.

### Hata kodları

| Kod | HTTP | Ne zaman |
| - | - | - |
| `RESOURCE_NOT_FOUND` | 404 | Giriş yok, başka kliniğe ait veya (kalıcı silmede) kayıt bu arada geri yüklenmiş. Mesaj `Geri dönüşüm kutusu kaydı bulunamadı` |
| `RECYCLE_BIN_ENTRY_UNRECOVERABLE` | 409 | Kayıt artık geri yüklenemez; yalnızca kalıcı silinebilir. Mesaj `Silinen kayıt artık geri yüklenemez.` |
| `RESTORE_CONFLICT` | 409 | Benzersiz bir değer (örneğin hasta telefon numarası) başka bir aktif kayda verilmiş |
| `RECYCLE_BIN_RESTORE_FAILED` | 500 | Geri yükleme sırasında beklenmeyen hata. Mesaj `Silinen kayıt geri yüklenemedi.` |
| `RECYCLE_BIN_PURGE_FAILED` | 500 | Kalıcı silme sırasında beklenmeyen hata. Mesaj `Silinen kayıt kalıcı olarak silinemedi.` |

Ortak hatalar (`401`, `403`, `400`, `422`, `428`) için [hata kodları](/api/istekler/hata-kodlari) sayfasına bakın.

<Note>
  Geri dönüşüm kutusu, KVKK kapsamındaki [veri imha talepleri](/api/kaynaklar/veri-imha-talepleri) ile aynı şey değildir. İmha talebi kayıtları kutuya almaz; kişisel verileri geri alınamaz biçimde maskeler.
</Note>


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