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

# API değişiklikleri

> Entegrasyonları etkileyen uyumsuz değişiklikleri, yeniden adlandırmaları ve kaldırılan endpoint'leri tarih sırasıyla listeler.

Bu sayfa, API'yi kullanan entegrasyonları bozabilecek değişiklikleri listeler: yeni izin zorunlulukları, yeniden adlandırılan alanlar, değişen yanıtlar ve kaldırılan endpoint'ler. Yeni ve geriye uyumlu eklemeler için [Platform sürüm notlarına](/surum-notlari/platform) bakın.

Kayıtlar en yeniden en eskiye sıralıdır ve v1.9.0 sürümüne kadar olan değişiklikleri kapsar. Tarih, ilgili API sürümünün etiket tarihidir; değişikliğin kliniğinizin ortamına ulaştığı gün farklı olabilir.

<Warning>
  Entegrasyonunuzu güncellemeden önce **Ekim 2026** bölümünü okuyun. `/oauth/*` ve `/announcements` artık `X-Tenant` ister. Sohbet, randevu iptali ve kanal işlemlerinin izinleri değişti. Pasif kanalda mesaj gönderimi artık `422 CHANNEL_INACTIVE` döner.
</Warning>

## Ekim 2026

### 13 Ekim: pasif kanal, hasta bakiyesi ve bildirim alıcıları

| Endpoint veya ayar | Önceki | Şimdi |
| - | - | - |
| Mesaj gönderen uçlar (metin, medya, sesli mesaj, hızlı yanıt, tepki, AI önerisi gönderme) | Sohbetin kanalı kapalıysa `202` dönüp mesaj iletilmezdi. | Kanal kapalıysa (`is_active=false`) `422 CHANNEL_INACTIVE`; mesaj kuyruğa alınmaz ve saklanmaz. İstek kabul edildikten sonra kanal kapanırsa mesajın `metadata.delivery_status` değeri `failed` olur. Bkz. [Mesajlar](/api/kaynaklar/mesajlar). |
| `GET /appointments/{id}` | `customer_balance` her okuyana dönerdi. | Yalnızca `View:CustomerBalances` izni olan ve hastası maskelenmemiş kullanıcıya dolu döner; aksi hâlde `null`. |
| `tenant.chat.message_notification_roles` ayarı | Varsayılan `["assistant"]`. | Varsayılan `["super_admin","sales_director"]`. Kayıtlı ayarlar değişmez; ayarı hiç kaydetmemiş kliniklerde yeni mesaj bildirimi bu rollere gider. |
| Tedavi yanıtlarında `users[]` | Yalnızca `id` ve `name`. | `email`, `phone` ve `is_active` da gelir. Liste yalnızca geçerli kliniğin üyelerini içerir. Bkz. [Tedaviler](/api/kaynaklar/tedaviler). |

İki adımlı doğrulama kodu Redis önbelleğinde de tekrar kullanılamaz; kabul edilmiş kod süresi dolana kadar `422 TWO_FACTOR_INVALID_CODE` ile reddedilir.

### 12 Ekim: randevu iptali ve izinler

Randevu iptali artık kendi endpoint'lerine ve izinlerine sahiptir. Ayrıntılar için [Randevular](/api/kaynaklar/randevular) sayfasına bakın.

| Endpoint | Önceki | Şimdi |
| - | - | - |
| `POST /appointments/{id}/cancel` | Yoktu; iptal için `PUT` ile `status=cancelled` gönderilirdi. | Yeni. `Cancel:Appointment` izni yeterlidir (`Update` gerekmez). İptal edilmiş randevuda `409 APPOINTMENT_ALREADY_CANCELLED`. |
| `POST /appointments/{id}/revert-cancel` | Yoktu. | Yeni. `RevertCancel:Appointment` izni ve gövdede `status` (`pending` veya `approved`) gerekir. İptal edilmemiş randevuda `409 APPOINTMENT_NOT_CANCELLED`. |
| `PUT /appointments/{id}` ile durum değişikliği | Yalnızca `Update:Appointment`. | `cancelled` durumuna geçiş için ek olarak `Cancel:Appointment`, `cancelled` durumundan çıkış için ek olarak `RevertCancel:Appointment`. Diğer geçişler yalnızca `Update` ister. |
| `POST /appointments` ile `status=cancelled` | Kabul edilirdi. | `422` (`status` alanı): `Randevu iptal statüsünde oluşturulamaz; önce oluşturup ardından iptal edin.` |
| `POST /appointments/reschedule` ve `GET /appointments/reschedule/preview` | `Update:Appointment` ve `View:Appointment`. | `BulkReschedule:Appointment` (Toplu Randevu Taşı). Önizleme ve çalıştırma yalnızca çağıranın görebildiği randevuları sayar. |
| `GET /appointments/available-slots` | `Create:Appointment`. | `Create:Appointment` veya `Update:Appointment`. |

<Note>
  Mevcut kliniklerde `Update:Appointment` sahiplerine `Cancel` ve `RevertCancel` otomatik verildi. Toplu taşıma izni satış temsilcisi dışındaki sahiplere verildi; satış temsilcileri API'den toplu taşıma yetkisini bilerek kaybetti.
</Note>

### 12 Ekim: sohbet görünürlüğü ve gerçek zamanlı kanallar

`ViewAllConversations:Conversation` iznine sahip olmayan kullanıcılar (platform yöneticisi değilse) artık yalnızca lead'i kendilerine atanmış kişilerin sohbetlerini görür. Hasta sohbetleri artık bu kullanıcılarla paylaşılmaz. Kişisi (hasta) olmayan veya kişisinin lead kaydı bulunmayan sohbetler de onlara görünmez. Kural için [İzinler ve görünürlük](/api/izinler-ve-gorunurluk) sayfasına bakın.

| Endpoint veya kanal | Önceki | Şimdi |
| - | - | - |
| `GET /conversations` | `scope` parametresi yoktu. | `scope=assigned` veya `scope=all` (varsayılan). İzni olmayan kullanıcıda sonuç her zaman atanmış sohbetlerdir. |
| `POST /conversations` | `Send:Message`. | `Create:Conversation`. Kişinin sohbeti size atanmamışsa hiçbir şey yazılmadan `403 CONVERSATION_NOT_ASSIGNED` döner; `data.assigned_user` lead'in sahibini (`{id, name}`) veya `null` verir. |
| Sohbeti arşivleme ve arşivden çıkarma | `View:Conversation`. | `Archive:Conversation`. |
| `POST /conversations/{id}/messages/quick-reply` | `View:Conversation`. | `Send:Message`. |
| `PUT .../ai-suggestion/rating` | `View:Conversation`. | `ManageAiSuggestions:Conversation`. |
| `POST .../ai-suggestion/send` | `Send:Message` (düzenlenmişse ek izin). | Her zaman `ManageAiSuggestions:Conversation` ve `Send:Message`. `send_source=suggestion_edited` ile `take_over_agent=true` birlikteyse ayrıca `ToggleAgent:Conversation`. |
| `private-chat-log.{tenantId}` | Her klinik üyesi abone olabilirdi. | Yalnızca `View:Conversation` izni olan ve tüm sohbetleri görebilen (`ViewAllConversations:Conversation` veya platform yöneticisi) üyeler abone olabilir. Diğerleri `/api/broadcasting/auth` üzerinden `403` alır. |
| `private-chat-log-activity.{tenantId}` | Yoktu. | Yeni. `View:Conversation` izni olan her klinik üyesi abone olabilir. Yalnızca kimlik taşır; istemci güncel veriyi REST ile yeniden okur. |
| `presence-conversation.{conversationId}` (personel) | Her klinik üyesi katılabilirdi. | `View:Conversation` izni ve sohbeti görme yetkisi gerekir. |

Yeni `ChatLogChanged` olayı yalnızca `private-chat-log-activity.{tenantId}` kanalında yayınlanır; yükü `{conversation_id, chat_log_id}` biçimindedir ve `chat_log_id` `null` olabilir. `ChatLogCreated`, `ChatLogUpdated` ve `WhatsappHistorySyncProgressed` yalnızca içerik kanalında (`private-chat-log.{tenantId}`) yayınlanır. `ChatLogDeleted`, `ConversationCreated`, `ConversationDeleted`, `ConversationRead`, `ConversationArchiveStatusChanged`, `ConversationTagsChanged`, `ConversationAgentStatusChanged`, `ConversationPresenceUpdated`, `CustomerBlacklisted`, `CustomerUnblacklisted` ve `CustomerUpdated` iki kanalda da aynı yükle yayınlanır. Ayrıntılar için [Kanallar ve olaylar](/api/gercek-zamanli/kanallar-ve-olaylar) sayfasına bakın.

Sohbet mesajına eklenmiş dosyalar da, sohbeti göremeyen kullanıcıya dosya listesinde ve indirme endpoint'lerinde gizlenir.

<Info>
  Yeni klinik varsayılanlarında `Create:Conversation` yalnızca `super_admin` rolündedir. Mevcut kliniklerde `Send:Message` sahiplerine otomatik verildi. Başka bir rolün sohbet başlatması gerekiyorsa izni rolün ayarlarından ekleyin.
</Info>

### 12 Ekim: kanal ve engel izinleri

| Endpoint | Önceki | Şimdi |
| - | - | - |
| `GET /channels/{id}/whatsapp/connection-state` | `View:Channel` | `QueryStatus:Channel` veya `Update:Channel` |
| `GET /channels/{id}/widget/embed-snippet` | `View:Channel` | `CopyLink:Channel` (Gömme Kodunu Kopyala) |
| `POST /channels/{id}/widget/rotate-token` | `Update:Channel` | `GenerateLink:Channel` (Bağlantı Oluştur) |
| `DELETE /channel-blacklists/{id}` | `Delete:ChannelBlacklist` | `Unblock:ChannelBlacklist` (Engeli Kaldır) |
| `PUT /channel-blacklists/{id}` ile `is_active=false` | `Update:ChannelBlacklist` | `Update` ve `Unblock` birlikte. Aktif kaydı pasifleştirmek gerçek engel kaldırma işlemini çalıştırır ve `CustomerUnblacklisted` olayını yayınlar. |

### 12 Ekim: OAuth, duyurular ve içe aktarma

| Endpoint | Önceki | Şimdi |
| - | - | - |
| `/oauth/clients*` ve `GET /oauth/scopes` | `X-Tenant` isteğe bağlıydı. | `X-Tenant` zorunlu; yoksa `400 TENANT_HEADER_REQUIRED`. İzin yalnızca o klinikte denetlenir. |
| `GET /announcements` ve `GET /announcements/{id}` | Klinik ve izin gerektirmezdi. | `X-Tenant` zorunlu ve `View:Announcement` izni gerekir. Duyurular klinik başına değil, hâlâ genel içeriktir. |
| `PUT /import/sources/{id}/install` | `Install:ImportSource` | `Update:ImportSource` |

`View:Announcement` ve `Update:ImportSource` mevcut kliniklerde sırasıyla her role ve `Install:ImportSource` sahiplerine otomatik verildi. Başlık kuralları için [Klinikler ve X-Tenant](/api/klinikler-ve-x-tenant), uygulama yönetimi için [OAuth uygulamaları](/api/kaynaklar/oauth-uygulamalari) sayfasına bakın.

### 12 Ekim: sıralama

Tüm listelerde `sort_by` için tek bir kural geçerlidir. Ayrıntılar [Filtreleme ve sıralama](/api/istekler/filtreleme-ve-siralama) sayfasındadır.

* `sort_order` göndermezseniz metin sütunları Türkçe sıralamayla A'dan Z'ye, sayı ve tarih sütunları büyükten küçüğe sıralanır. Önceki varsayılan yön ve bayt sırası geçerli değildir.
* Açık bir `sort_by`, arama alaka sırasının yerini alır. Eşitlikte birincil anahtar belirler.
* `sort_by` listenin izin verilen anahtarlarından biri olmalıdır. Bunu doğrulayan listeler bilinmeyen anahtarda `422` döner.
* `GET /authentication-logs` boş `sort_order` ile artık `500` vermez; varsayılan sıraya döner.

### 12 Ekim: diğer değişiklikler

| Değişiklik | Önceki | Şimdi |
| - | - | - |
| Başkasının lead'i | Satış temsilcisi, kendisine atanmamış lead'lerin hastalarını adıyla görebilirdi. | Bu hastalar maskeli görünür. `ViewOtherLeadNames:Lead` izni kaldırıldı. |
| Aktivite logları | Platform yöneticisi kayıtları klinikte görünürdü. | Klinikten gizlenir. |
| Sohbet ayarı | `pre_booking_requirements` | `intake_requirements.enabled`. Eski ad takma ad olarak çalışmaya devam eder. |
| Kanal silme | Parola gerekmezdi. | `DELETE /channels/{id}` isteği `current_password` ister. |
| Lead silme | Notlar, görevler ve dosyalar kalırdı. | Bunlar da silinir. |
| Gezinme izinleri | `View:ChatLogPage`, `View:CalendarPage` | `View:Conversation`, `View:Appointment` |
| Zorunlu kurulum | Yoktu. | Kurulum tamamlanana kadar `428 SETUP_REQUIRED`. Bkz. [Erişim kilitleri](/api/istekler/erisim-kilitleri). |

### 6 Ekim ve 5 Ekim

| Tarih | Değişiklik |
| - | - |
| 6 Ekim | Başkasına atanmış lead'e erişim `404` yerine `403 LEAD_NOT_ASSIGNED` döner. Silinmiş veya olmayan lead `404` olarak kalır. |
| 5 Ekim | `GET /appointments/available-slots` yeniden şekillendi. `user_id` ve `duration_minutes` zorunludur; yanıtta `busy_slots` ve `OUTSIDE_BUSINESS_HOURS` yoktur. Personel randevularında çakışma, kapalı gün, tatil ve ızgara dışı dakika engel değil uyarıdır. Bkz. [Uygunluk ve takvim](/api/kaynaklar/randevu-uygunlugu-ve-takvim). |
| 5 Ekim | `GET /stocks/overview` için `View:StockMovement` yerine `View:StockOverview` gerekir. Ürün oluştururken başlangıç stoğu göndermek `Create:StockMovement` ister. |
| 5 Ekim | İmzalı dosya bağlantılarının ömrü 5 dakikadan yaklaşık 65 dakikaya çıktı. |
| 5 Ekim | Geç kalmış hatırlatmalar geç gönderilmek yerine `expired` durumuna düşer. Süresi dolmuş bir hatırlatmayı onaylamak veya reddetmek `422 REMINDER_EXPIRED` döner. |
| 1 Ekim | KVKK ile imha edilmiş hastanın kayıtlarına yazma `422` yerine `409 CUSTOMER_ERASED` döner. |

## Eylül 2026

| Tarih | Değişiklik |
| - | - |
| 28 Eylül | İzin adları: `Update:Offer` yerine `Convert:Offer`; pipeline işlemleri için `Create:Pipeline`, `Update:Pipeline`, `Delete:Pipeline`, `Activate:Pipeline`; ödeme almak için `Update:Sale` yerine `Pay:Sale`; satıştan belge oluşturmak için `CreateDocument:Sale`. |
| 28 Eylül | `GET /customer-forms` klinik genelini listeler. Hasta bazlı form endpoint'leri kayıt sahipliğine göre kısıtlanır. |
| 28 Eylül | Hızlı yanıt medyası: yeni dosya eklemek mevcutları değiştirmek yerine ekler. `file` alanı kullanımdan kalktı, yerine `files` gelir. |
| 23 Eylül | Varsayılan oran sınırı dakikada 300 istek; kota kullanıcı ve OAuth istemcisi başına uygulanır (önceki: kullanıcı başına 60). Bkz. [Oran sınırları](/api/istekler/oran-sinirlari). |
| 23 Eylül | API mesajları `Accept-Language` başlığına göre yerelleşir; varsayılan `tr`. Önceki sürümlerde mesajlar İngilizceydi. |
| 23 Eylül | Silme yaşam döngüsü değişti. `DELETE .../force` ve geri yükleme endpoint'leri, `trashed` filtreleri ve `ForceDelete:*` izinleri kaldırıldı. Eski endpoint'lerin karşılıkları aşağıdaki Kaldırılan endpoint'ler bölümündedir. |
| 23 Eylül | `GET /mobile/statistics` kaldırıldı. |
| 1 Eylül | Satışlarda iş tarihi `created_at` yerine `sale_date` alanıdır. |

## Ağustos 2026

| Tarih | Değişiklik |
| - | - |
| 26 Ağustos | Avatar yalnızca `POST /account/avatar` ve `DELETE /account/avatar` ile (alan adı `file`) yönetilir. `avatar_url` kullanıcı ve hesap isteklerinde yazılamaz. `POST /users` isteğinde `password` isteğe bağlıdır; boş bırakılırsa rastgele parola atanır ve sıfırlama e-postası gider. |
| 26 Ağustos | Krediler listesi filtreleri yeniden adlandırıldı: `created_from` ve `created_until` yerine `created_at_from` ve `created_at_to`; `end_date_until` yerine `end_date_to`. |
| 26 Ağustos | Fatura türü filtresi etiket (`E-Fatura`) yerine kayıtlı değerleri alır: `EFATURA`, `EARSIV`, `SMM`. |
| 26 Ağustos | İstatistik rakamları (ciro, yeni hasta) kliniğin saat dilimi ve satış anındaki döviz kuruyla yeniden hesaplanır; yeni hasta sayısına yalnızca hastaya dönüşenler girer. Eski rakamlarla karşılaştırmayın. |
| 14 Ağustos | Lead aşamasındaki kişiler `/customers*` altında listelenmez; kimlikle istenirse `404` döner. |
| 12 Ağustos | İzin sistemi merkezi kataloga taşındı. `ViewAny:*` izinleri kaldırıldı; yerine `View:*` kullanılır. |

## Daha eski değişiklikler

Aşağıdaki kayıtlar entegrasyon kodunda en sık takılan eski değişikliklerdir.

| Sürüm tarihi | Değişiklik |
| - | - |
| 30 Temmuz | `POST /sales/{id}/payments` için `payment_method` zorunlu. Hastanın serbest metin `job` alanı yerine `occupation_id` ve `occupation_name` kullanılır. |
| 22 Temmuz | Tüm hata yanıtları `{success, error_code, message, errors?, data?}` biçimindedir; `error` ve `data.message` alanları kalktı. Lead erişimi izne bağlı sahipliğe geçti. Bkz. [Hata yapısı](/api/istekler/hatalar). |
| 14 Temmuz | Lead durumları, pipeline aşamalarıyla (`PipelineStage`) değiştirildi. `AvailabilityException` adı `UnavailablePeriod` oldu. |
| 5 Temmuz | Muhasebe ayarı `default_tax_rate` yalnızca 0, 1, 10 ve 20 değerlerini alır. |
| 24 Haziran | Alt randevularda `parent_session_id` zorunlu. Doktorun dış takvimi yerine yerel randevular dolu saat sayılır. |
| 15 Haziran | Tarih filtreleri yeniden adlandırıldı, eski adlar için takma ad yok: `created_from`/`created_until` yerine `created_at_from`/`created_at_to`; randevularda `from`/`to` yerine `scheduled_at_from`/`scheduled_at_to`; faturalarda `date_from`/`date_to` yerine `issue_date_from`/`issue_date_to`; stokta `date_from`/`date_to` yerine `effective_at_from`/`effective_at_to`. Tarihler UTC `Z` yerine kliniğin saat farkıyla döner ve `meta.timezone` eklenir. |
| 15 Haziran | Randevularda `assistant_id` yerine `assistant_ids[]` (eski alan kullanımdan kalktı). Doktorlarda `calendar_integration` nesnesi yerine `has_calendar_integration`. Tedavilerde üst düzey `products[]` ve `product_id` filtresi yerine `sessions[].products[]` ve `group_id` filtresi. |
| 15 Haziran | Erişim token'ı ömrü 15 günden 5 dakikaya, yenileme token'ı ömrü 30 günden 7 güne indi. Bkz. [Tokenlar](/api/kimlik-dogrulama/tokenlar). |
| 15 Haziran | `tenants:read` scope'u kalktı; yerine `tenant:read` ve `tenant:write` geldi. `ViewAny:ActivityLog` izni `View:ActivityLog` oldu. |
| Mayıs | `channels:read` scope'u `conversations:read` oldu; kanal yanıtından `metadata` kalktı. `/account*` endpoint'leri `account:read` scope'u ister. Hasta alanı `nationality_country_id` yerine `country_id` oldu. |
| Şubat | `/account` üçe bölündü: `/account`, `/account/tenants`, `/account/roles`. `X-Tenant` tüm istemciler için zorunlu oldu. Sohbet mesajları en yeniden eskiye sıralanır. Tedavilerde `tax_rate` zorunlu (0, 1, 10 veya 20). |

## Kaldırılan endpoint'ler

| Kaldırılan | Yerine |
| - | - |
| `DELETE /api/v1/{kaynak}/{id}/force` (randevu, asistan, hasta, hasta notu, doktor, dosya, ürün markası, ürün kategorisi, ürün, oda, satış, destek talebi, tedavi grubu, tedavi, kullanıcı) | Yalnızca yumuşak silme. Silinen kayıtlar için `GET /v1/recycle-bin`, `POST /v1/recycle-bin/{id}/restore`, `DELETE /v1/recycle-bin/{id}/purge`. Silme öncesi etki önizlemesi için `GET .../deletion-relations`. |
| `trashed` sorgu parametresi ve `ForceDelete:*` izinleri | Geri Dönüşüm Kutusu. |
| `GET/POST /api/v1/leads/statuses`, `PUT/DELETE /leads/statuses/{id}` | `/v1/pipelines`, `/v1/pipelines/{id}/stages` ve `/v1/leads/reference-sources`. Lead işlemleri: `assign`, `won`, `lost`, `bulk-stage`, `move-stage-group`. |
| `GET /api/v1/exchange-rates` | `GET /v1/general/exchange-rates`. Sayfalıdır; Bearer token ister, scope ve `X-Tenant` istemez. |
| `GET /tenants` | `GET /v1/account/tenants` |
| `GET /general` | `GET /v1/general/global-search` |
| `GET /mobile/statistics` | Yerine geçen bir mobil endpoint yoktur. İstatistik kaynakları için [İstatistikler](/api/kaynaklar/istatistikler) sayfasına bakın. |

<Warning>
  Geri Dönüşüm Kutusu'ndan yalnızca belirli kayıt türleri geri yüklenebilir. Silmeden önce [Silme yaşam döngüsü](/api/istekler/silme-yasam-dongusu) sayfasını okuyun.
</Warning>

### Eski belgelerde geçen ama bulunmayan çağrılar

* `GET /conversations?updated_since=` yoktur. `GET /conversations/{id}/messages` için `after` parametresi de yoktur. Bağlantı koptuktan sonra eksikleri yakalamak için listenin veya mesajların ilk sayfasını yeniden okuyun.
* `POST /conversations/{id}/messages` `201` değil, `202 Accepted` döner. Yanıtta geçici bir `queued` durumu bulunur; gerçek mesaj `ChatLogCreated` olayıyla gelir.
* `GET /conversations/{id}/agent` yanıtı `{agent_disabled, agent_expires_at, agent_disabled_by_user_name, remaining_minutes}` biçimindedir. Asistan durumu değişince `ConversationAgentStatusChanged` olayı yayınlanır.


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