# Sürümler ve sürüm notları

> API'nin ve sayfa bileşeni sözleşmesinin sürümleri ile değişikliklerin duyurulma biçimi.

Kaynak: /tr/reference/versions/

## Sürümlenen bileşenler

| Bileşen | Güncel sürüm | Görüldüğü yer |
|---|---|---|
| API | `v1` | Endpoint yollarının başında: `/v1/…`, `/admin/v1/…` |
| Sayfa bileşeni sözleşmesi (`data-review-*` attribute'ları, `window.Sayproof`) | `3` | Kök öğedeki `data-review-version` ve `window.Sayproof.version` |

## Sürüm kuralları

- **Sayfa bileşeni sözleşmesi:** Yeni bir attribute, metot ya da event eklenmesi küçük sürüm değişikliğidir ve mevcut CSS kurallarınızı ya da kodunuzu etkilemez. Bir attribute'un kaldırılması ya da anlamının değiştirilmesi ana sürüm değişikliğidir; önceki sürüm en az bir yıl desteklenir.
- **API:** Mevcut sürüm içinde yanıtlara yeni alanlar, yeni endpoint'ler ve yeni hata kodları eklenebilir. Kodunuz tanımadığı alanları yok saymalıdır. Mevcut alanların kaldırılması ya da anlamının değiştirilmesi yeni bir API sürümüyle yapılır; önceki sürüm en az bir yıl desteklenir.
- Tüm değişiklikler bu sayfada duyurulur.

## Sürüm notları

### 15 Ekim 2026

- Yapay zekâ paketi (yorum denetimi, yanıt taslağı, konu ve duygu, çeviri, yorum özeti) ve WhatsApp ile davet v2 sürümüne taşındı; v1 kurulumlarında kapalıdır. Ayrıntı: [Yapay zekâ paketi](/tr/features/ai.md), [WhatsApp ile davet](/tr/features/invitations.md#whatsapp-ile-davet).
- `GET /admin/v1/ai` ve `POST /admin/v1/ai/requests` `404` döner. `POST /admin/v1/reviews/<id>/seller-response/draft` `409 seller_response_refused` döner (`ai_package_off` ya da `ai_feature_closed`). `GET /admin/v1/insights` yanıtında `ai` `null` olur.
- Otomatik kontrollerde yapay zekâ denetimi çalışmaz; `GET /admin/v1/settings` yanıtındaki `checks` listesinde `ai_review` yer almaz. `reply_tone`, `ai_translation_enabled` ve `ai_summary_enabled` kaydedilir ama etkisi yoktur.
- `GET /v1/reviews/list` yanıtında `ai_summary` `null`, yorum satırlarındaki `translations` `{}` döner; yorumlar çevrilmez, özet hazırlanmaz. Script ve sunucuda hazırlanan HTML `data-review-ai-*`, `data-review-translated` ve `data-review-show-original` öğelerini çizmez.
- `GET /admin/v1/settings` yanıtındaki `deliveries` `whatsapp` içermez; `invite_delivery` ya da `reminder_delivery` için `whatsapp` gönderilirse `400 invalid / invite_delivery_unavailable` ya da `reminder_delivery_unavailable` döner. WhatsApp mesajı gönderilmez. Sipariş verisindeki `customer_phone` kabul edilir; WhatsApp ile davet v2 sürümüyle gelene kadar telefon numarası saklanmaz.
- **İşlem geçmişi** iki sekmeye ayrıldı: **Panel işlemleri** ve **Kişisel veri erişimleri**. Kişisel veri gösteren okumalar (yorum ayrıntısı, yorum geçmişi, davetler, mesaj kayıtları, sorular, KVKK talepleri, kullanıcılar, e-posta adresiyle yorum araması, `POST /admin/v1/opt-outs/check`) panel oturumu, sunucu anahtarı ve Sayproof ekibi için kaydedilir; liste `GET /admin/v1/access-log` (`export`) ile okunur. Kayıtlar değiştirilemez ve 365 gün sonra silinir. Veri dışa aktarımı `personal_data_access.json` dosyasını da taşır. İşlem geçmişi kayıtları istek kimliği, IP adresinin anahtarlı hash'i ve tarayıcı bilgisini taşır.
- Panelde iki adımlı giriş: kullanıcı kendi hesabı için açabilir. Açıkken `POST /admin/v1/session` doğru parolada `{"authenticated": false, "step": "second_step"}` döner; giriş `POST /admin/v1/session/passcode` (`passcode`) ile tamamlanır. Yanlış kod `400 invalid_passcode`, süresi geçen adım `400 second_step_expired` döner. Açma, onaylama ve kapatma: `GET/POST /admin/v1/session/second-step`, `POST …/second-step/confirm`, `POST …/second-step/off`. Oturum yanıtında yeni `second_step` alanı var. Sayproof ekibinin yönetim ekranına giriş her zaman iki adımlıdır.
- `POST /admin/v1/users` yanıtında `set_password_link` ve `shown_once` yok, `mailed: true` var; e-posta zorunlu (`400 invalid / email_required`). `POST /admin/v1/users/<id>/password-link` `202 {"mailed": true}` döner. Parola bağlantısı yalnız hesabın sahibinin e-postasına gider. Yenileme bağlantısı 1 saat, yeni hesap bağlantısı 3 gün geçerli. Parola belirlenince ya da değişince ve e-posta değişince bildirim gönderilir. Yeni parola kodları: `invalid / password_guessable`, `password_names_account`. Parola yenileme sayacı IP adresine bağlı; sınır aşılınca yanıt `202` kalır, e-posta gönderilmez.
- KVKK silmesi yorum, soru ve cevap metnindeki ad ve iletişim bilgilerini `[email]`, `[phone]`, `[name]` gibi işaretlerle değiştirir; silinmiş ve yayında olmayan yorumda `available_events` `approve`/`unhide` içermez, geçiş `409 transition_refused / review_anonymized` alır, `POST /admin/v1/moderation/bulk` bu yorumları `skipped`'a sayar. Silmeden sonra yorum ayrıntısındaki `proof.order_reference` `erased-order:<32 hex>` döner; `GET /admin/v1/brand-export` hazır dışa aktarımları listelemez.
- `POST /v1/ingest/orders` yanıtındaki `orders[].external_id` gönderilen sipariş numarasını döner; silinmiş sipariş yeniden gönderilirse aynı siparişe yazılır. `POST /v1/ingest/deliveries` `detail` alanını kabul eder ama saklamaz. Sipariş iletişim bilgileri yorum yazma süresi bitince, davet gitmeyecek siparişlerde 30 gün sonra takma değere çevrilir; bu siparişlerin davetlerinde `GET /admin/v1/send-logs` ve `GET /admin/v1/invites` `recipient` boş döner.
- Erişim kopyası `export` satırlarına `author_name`, `aspect_scores`, `topics`, `seller_responses`; `export_details`'e `deliveries`, `mail_events`, `questions`, `answers`, `consents` eklendi; `emails` satırları `delivered_at`, `opened_at` taşır. Veri dışa aktarımı paketine `questions.json`, `answers.json`, `question_events.json`, `delivery_signals.json` eklendi.
- Kanallara aydınlatma metni bağlantısı eklendi: panel oturumunda `PATCH /admin/v1/channels/<id>` `privacy_url` alanını alır (`https`; değilse `400 invalid / privacy_url_not_https`, 500 karakteri aşarsa `privacy_url_too_long`), kanal satırları `privacy_url` taşır. `GET /v1/reviews/list`, `GET /v1/ssr` (`state`) ve `GET /v1/viewer/order` yanıtlarına `privacy_url`, `words` tablosuna `privacy_notice` eklendi; script bağlantıyı formların altında `data-review-privacy` ile gösterir. Davet e-postası tasarımında isteğe bağlı yeni değişken: `{{ privacy_url }}`.
- Yorumun fotoğraf ve videoları yalnız yorum yayındayken herkese açık adreste durur. Admin API'deki yorum ayrıntısında `media[].url`, `poster_url`, `srcset` artık `GET /admin/v1/reviews/<id>/media/<dosya kimliği>/<dosya adı>` endpoint'ini gösterir. `POST /v1/media` yeni ret kodları: `video_frame_too_large: 3840x2160`, `video_frame_rate_too_high: 60`, `video_codec_not_allowed`, `video_unreadable`, `video_stream_missing`, `image_unreadable`, `image_too_large`; `scan_failed` ve `processing_failed` artık ek bilgi taşımaz.
- `POST /admin/v1/audit-log/export` body'si `{"format", "title", "filters", "columns", "labels", "changes"}` oldu; `rows` okunmaz. Dosya sunucuda filtrelerden üretilir; kayıt dosyanın SHA-256 hash'ini (`fingerprint`) taşır.
- Geçersiz anahtar, şifre ya da imzayla, okunamayan body ile ya da tanınmayan e-posta hizmetine reddedilen istekler aynı IP adresinden 5 dakikada 60 ile sınırlıdır; sınır aşılınca `429 rate_limited` döner ([Limitler](/tr/reference/limits.md)). Çok derin iç içe JSON `500` yerine `400 invalid_json` (aktarım ve e-posta bildirimlerinde `400 invalid / body_invalid`) döner. Aktarımda saklanamayan karakter `400 invalid / field_invalid: <alan>`, e-posta teslim bildirimlerinde `400 invalid / field_invalid` ile reddedilir.
- E-posta teslim bildirimlerinde yalnız bir gönderimle eşleşen olay adresi e-posta almak istemeyenler listesine ekler; `detail` içindeki e-posta adresleri `address` sözcüğüne çevrilir. Sayproof'un dışarıya yaptığı istekler (ürün kaynağı, sipariş bağlantısı, bildirim adresi) yalnız 443 portunu kullanır; port numaralı adres `port_refused` ile reddedilir.
- Yorum formu fotoğraf ve videoyu yüklemeden önce müşterinin tarayıcısında hazırlar: fotoğraf uzun kenarı en çok 2560 piksel JPEG olarak yeniden kodlanır (konum ve cihaz bilgisi cihazdan çıkmaz), video kısa kenarı en çok 1080 piksel, saniyede en çok 30 kare, sessiz H.264 MP4'e dönüştürülür. Her dosyada "Hazırlanıyor %N", ardından "Yükleniyor %N" ve iptal düğmesi görünür (`data-review-form-media-progress`, `data-review-form-media-cancel`). Script bunun için iki yeni tembel parça yükleyebilir: `sayproof-media-*` (dosya seçilince) ve `sayproof-video-*` (yalnız video seçilince). Tarayıcı dönüştüremezse dosya sunucu sınırı içindeyse olduğu gibi yüklenir; sunucudaki denetimler değişmedi. Video dönüştürme 20 saniye ilerlemezse ya da toplam 4 dakikayı aşarsa durdurulur ve dosya olduğu gibi yüklenir (sınır içindeyse).
- Pazaryeri yorumları: **Entegrasyon › Pazaryeri yorumları** sekmesi ve `/admin/v1/marketplace/...` endpoint'leri (`sources`, `runs`, `check`, `imported-reviews`, `removals`; yalnız panel oturumu). Mağaza listesinde kaynağı `own` olmayan her yorum hazır `origin_label` taşır; pazaryerinden aktarılan yorumda `origin: "imported"`, `origin_url`, `verified: false` ve boş `verification_method` döner. `aggregate`'e `imported_count`, `imported_label`, `structured_count`, `structured_average` eklendi; `verified_count` ve `verified=1` süzgeci aktarılmış yorumları saymaz. Yapılandırılmış veri ve Google ürün yorumları dosyası aktarılmış yorumları içermez. DOM: `data-review-imported-count`; `data-review-origin` bağlantı (`<a>`) olabilir. Yöntem beyanına `imported` bölümü eklenir. Admin API: yorum ayrıntısında `imported` nesnesi, `proof.method: source_platform`, `entry_point: import`, kaldırma gerekçesi `source_removed`; geçmişte `review.imported` ve `review.source_updated`. `GET /admin/v1/marketplace/sources` satırları `attention` alanını taşır (`held` ya da `failed`, `count`, `error`, `at`; sorun yoksa `null`); `GET /admin/v1/overview` dikkat listesi `marketplace_held` ve `marketplace_failed` türlerini içerebilir. Veri dışa aktarımına `marketplace_sources`, `marketplace_runs`, `marketplace_imported_reviews`, `marketplace_suppressed_reviews` eklendi (erişim şifresi ve geçici yükleme satırı yok). Marka yöneticilerine kaldırmalar bekletilince ve okumalar **Ayarlar › Uyarı sınırları**'ndaki sayı kadar üst üste başarısız olunca e-posta gider; 0 ikisini de kapatır.
- Yorumun tek bir fotoğrafı ya da videosu yorum kaldırılmadan kaldırılabilir: `DELETE /admin/v1/reviews/<id>/media/<dosya kimliği>` (`moderate` kapsamı), body `{"reason"}` (`personal_data`, `profanity`, `data_subject_request`, `legal_order`). Liste `GET /admin/v1/reasons` yanıtında `review_media_removal`, yorum ayrıntısında `media_removal_reasons` olarak gelir. Dosya kalıcı silinir, yanıt `204`; kaldırma yorumun geçmişine ve **İşlem geçmişi**'ne yazılır. Panelde **Fotoğraf ve videolar** kartında her dosyanın altında **Kaldır…** düğmesi vardır.
- Yönetici artık hiçbir üyenin e-postasını değiştiremez: `PATCH /admin/v1/users/<id>` `email` alanı `403 email_change_own_only` döner. Üye kendi adresini `POST /admin/v1/session/email-change` (`{current, email}`) ile güncel parolasını girerek değiştirir; yanlış parola `400 invalid / current_password`. Kişisel veri erişim kaydına `imported_reviews.listed` eklendi. Pazaryeri yorumunun `origin_url` alanı yalnız platformun kendi alan adındaysa dolar. Sayproof ekibinin girişinde kurulum anahtarı tamamlanana kadar her parola girişinde yenilenir; parola adımı ile kod adımı arasında parola değişirse giriş baştan yapılır (`second_step_expired`). Kapatılan markanın yayındaki fotoğraf ve videoları herkese açık adresten hemen kalkar, marka yeniden açılırsa geri gelir.
- Yorum listesi (`GET /admin/v1/reviews`) ve onay kuyruğu (`GET /admin/v1/moderation/queue`) satırlarına `source` eklendi: pazaryerinden aktarılan yorumda `{"platform", "name"}` (örneğin `{"platform": "trendyol", "name": "Trendyol"}`), diğerlerinde `null`. Panelde **Onay bekleyenler** ve **Tüm yorumlar** satırlarında pazaryeri adı rozet olarak görünür; **Tüm yorumlar**'daki **Nereden geldi** filtresi **Filtreler** bölmesinden filtre çubuğuna alındı.
- Yorum, soru ve cevap formlarına isteğe bağlı ad alanı ve **Adım sitede gizli kalsın** kutusu eklendi; işaretliyse ad sitede, yapılandırılmış veride ve Google ürün yorumları dosyasında her sözcüğün ilk harfi ve `***` olarak görünür (`A*** K***`), tam ad panelde kalır. `POST /v1/reviews`, `POST /v1/reviews/revise`, `POST /v1/questions` ve cevap endpoint'i `hide_name` alanını kabul eder; yorum ve soru ayrıntısı `name_hidden` döndürür. Yeni attribute'lar: `data-review-form-who`, `data-review-hide-name`.

### 13 Ekim 2026

- NUL (`\u0000`) ya da eşi olmayan vekil karakter içeren metin artık `500` yerine `400` alır: JSON body'de `invalid_json`, sorgu parametresinde `invalid / invalid`, tek bir alanda `invalid / <alan>`.
- E-posta almak istemeyenler listesindeki telefon numaraları Sayproof'a özgü anahtarlı karmayla saklanır; `GET /admin/v1/opt-outs/export` telefon satırlarında bu değeri verir ve bu değer SHA-256 ile eşleşmez. Telefon listenizi `POST /admin/v1/opt-outs/check` ile eşleştirin; bu uç numarayı yerel yazımla da (`0532 111 22 33`, `905321112233`) kabul eder ve yanıtta gönderdiğiniz yazımı döner.
- `GET /admin/v1/invites` ve `GET /admin/v1/send-logs` satırları `recipient_erased` taşır; müşterinin kişisel verileri silinmişse `recipient` boş döner. Davetlerin `counters.conversion` değeri artık gönderilmiş ve en az bir ürünü yorumlanmış davetleri sayar; **İstatistikler**'deki dönüşümle aynıdır.
- `GET /admin/v1/moderation/queue` `counters.elsewhere` (`reviews`, `responses`) taşır: `channel` verildiğinde diğer kanallarda onay bekleyenlerin sayısı.
- Soru-cevap: müşteri cevabı yalnızca yorum davetinin token'ıyla verilir (süreç daveti token'ı `403 token_refused / token_wrong_kind`), iptal ya da iade edilen satır `not_a_buyer` alır; bağlantı içeren soru ve cevap `link` işaretiyle onaya düşer. Cevap e-postası soranın ve alıcının metnini taşımaz, bir adrese 24 saatte en fazla 5 e-posta gider; fazlası mesaj kayıtlarında `refused_rate_limit` sonucuyla görünür.
- Yapay zekâ metinleri (çeviri dahil) aynı denetimden geçer; bağlantı içeren metin de reddedilir. Geçemeyen çeviri saklanmaz, özet yayınlanmaz, yanıt taslağı `409 seller_response_refused / ai_draft_unusable` alır. Google ürün yorumları dosyasına süreç deneyimi yorumları (`experience: process`) girmez.
- Kullanıcı eklerken (yalnızca panel oturumunda) var olan bir hesabın eski parolası geçersiz olur ve parola belirleme bağlantısı hesabın e-posta adresine gönderilir (15 Ekim 2026'dan itibaren yanıt bağlantıyı taşımaz); son üyeliği silinen hesabın parolası da geçersiz olur.
- Admin API'de `5xx` ya da beklenmeyen bir hatada değişiklik ve **İşlem geçmişi** kaydı birlikte geri alınır. `POST /admin/v1/settings` aynı anda yapılan başka bir kaydı ezmez. `POST /admin/v1/order-sources/<id>/run` iş kuyruğu kapalıyken `500` yerine `202` döner.
- Script, `GET /v1/reviews/list` `200` yanıtında `core` ya da `reviews` yoksa bileşeni kapatır ve sayfaya hata fırlatmaz. `soft` tasarımında `--review-text-muted` varsayılanı `#7E6874` oldu.

### 12 Ekim 2026

- Bütün markalar panele tek adresten girer; markaya özel panel adresleri kaldırıldı. Açılacak markayı giriş yapan hesabın üyeliği belirler; parola, **Panelde aç** ve destek bağlantıları bu adresi açar. Anahtarla gönderilen Admin API istekleri değişmedi. Parola yenileme kullanıcı adını ya da e-postayı bütün markalarda arar ve yanıt her durumda `202 {"requested": true}` olur.
- Marka verisi veritabanında satır düzeyinde de ayrılır (RLS); dışarıdan görünen davranış değişmedi. Yanıtlar `Content-Security-Policy` ve `Permissions-Policy` header'larını taşır; API yalnızca JSON döner.
- Sipariş doğrulamada aynı e-posta ya da sipariş numarası için saatte 10 başarısız deneme sınırı eklendi (`429 rate_limited`). Bir sipariş satırına, yoruma eklenmemiş en fazla 18 dosya yüklenebilir (`400 refused / too_many_items: 18`); 40 megapikseli aşan ya da JPEG, PNG, WebP olmayan görsel `processing_failed` alır.
- `POST /admin/v1/invite-templates` HTML denetimi genişledi: `href`, `background`, `poster`, `srcset` ve stildeki `url()` adresleri ile Outlook koşullu bölümleri de taranır; izleme görseli ve stilde `@import` `400 invalid / image_tracking`, `style_import` alır. `POST /admin/v1/terms` marka başına en fazla 50 düzenli ifade kabul eder (`400 invalid / regex_limit: 50`).
- Soru-cevap: `GET|POST /v1/questions` ve `POST /v1/questions/<id>/answers` (kapalıyken `403 refused / questions_disabled`; liste yanıtında `questions_enabled`). Oturum açmış müşteri için `GET /v1/viewer` yanıtında `asker` token'ı. Yeni `data-review-questions` öğeleri; SSR HTML'i de bu bölümü içerir, sözleşme sürümü `3` kaldı. Panel ve Admin API: `GET /admin/v1/questions`, `GET /admin/v1/questions/<id>`, `POST /admin/v1/questions/<id>/transition`, `POST /admin/v1/answers/<id>/transition`, `POST /admin/v1/questions/<id>/answer`; ayrıntı [Soru-cevap](/tr/features/questions.md).
- Yapay zekâ paketi: liste yanıtında `ai_summary`, yorum satırlarındaki `translations` çevirilerle dolar; script özeti (`data-review-ai-summary*`) ve çeviriyi (`data-review-translated`, `data-review-show-original`) çizer. `GET /admin/v1/ai`, `POST /admin/v1/reviews/<id>/seller-response/draft`; `GET|POST /admin/v1/settings` yeni alanlar: `reply_tone`, `ai_translation_enabled`, `ai_summary_enabled`, `syndication_enabled`, `questions_enabled`, `reminder_consent`, `reminder_delivery`, `deliveries`. `GET /admin/v1/insights` `ai` bölümünü ve `products.fit_returns` alanını taşır.
- Pazarlar arası paylaşım açıkken liste diğer pazarlarınızdaki satın alma kanıtlı yorumları da taşır (`origin: "syndicated"`, `origin_market`, `shared`); bu yorumlar ortalamaya ve yapılandırılmış veriye girmez. Özet ya da paylaşım açılınca yöntem beyanına yeni bölümler eklendiği için `current_fingerprint` değişir.
- WhatsApp: sipariş verisine `customer_phone` eklendi (uluslararası biçimde saklanır); yeni gönderim yolu `invite_delivery: "whatsapp"`, mesaj kayıtlarında ve ret listesinde `channel_kind: "whatsapp"`, yeni durdurma nedeni `no_phone`. `GET /admin/v1/send-logs` ve `GET /admin/v1/invites` telefonda da arar.
- Google ürün yorumları dosyası: `GET|POST /admin/v1/review-feeds` ve `DELETE /admin/v1/review-feeds/<id>` (yalnızca panel oturumunda), oturumsuz dosya `GET /admin/v1/shared-review-feeds/<id>/<anahtar>.xml`; ayrıntı [Google ürün yorumları](/tr/integrate/google-reviews.md). Ürün eşlemesine `gtin`, `mpn`, `brand` hedefleri eklendi.
- KVKK talebi telefon numarasıyla da açılır; erişim kopyası telefonu ve sipariş telefonlarını taşır, silme soru soranın ve alıcı cevabındaki kişisel verileri de siler. Yorum satırları `flag_open` taşır; `GET /admin/v1/policies?channel=` yalnızca o kanalın pazarını döner.

### 9 Ekim 2026

- Her markanın paneli yalnızca markaya ait, rastgele harf ve rakamlardan oluşan adreste açılır; ortak giriş adresi yoktur. Panel oturumu markayı adresten çözer ve `X-Sayproof-Tenant` header'ını okumaz. Anahtarla gönderilen Admin API istekleri değişmedi; marka anahtardan çözülür.
- Bir kullanıcı yalnızca bir markaya üye olabilir: başka markada kullanılan kullanıcı adı `400 invalid / username_taken` alır. `account_shared` yanıtı ve kullanıcı satırlarındaki `operator` ve `brand_only` alanları kaldırıldı.
- Kanal satırları müşteriye görünen kimliği taşır: `brand_name`, `sender_address`, `support_url`. Kanal hakkı dolduğunda kanal oluşturma ve kapalı kanalı yeniden açma `409 channel_quota` döner; kanal listesi `quota` (`limit`, `open`, `request`) alanını taşır; ek kanal isteği `POST /admin/v1/channel-requests` ile, yalnızca panel oturumunda gönderilir (açık istek varken `409 channel_request_open`).
- Hizmeti dondurulan ya da kapatılan markada istekler `403 forbidden / brand_inactive` alır. Veri dışa aktarımı `GET|POST /admin/v1/brand-export` ve `GET /admin/v1/brand-export/<id>/download` ile hazırlanıp indirilir; hazır değilse `404 not_found / export_not_ready`.
- `GET /admin/v1/overview`, `GET /admin/v1/metrics` ve `GET /admin/v1/insights` `channel` parametresi alır; sayılar yalnızca o kanalı kapsar. `GET /admin/v1/overview` her kanal için `sites` satırlarını (`code`, `label`, `market`, `verdict`, `calls`, `refused`, `last_at`) taşır.
- `POST /admin/v1/audit-file` `channel` alır; saklanan rapor ve dosya adı kanal kodunu taşır, önceki raporlar listesi `channel` ile süzülür. Kanalın pazarıyla uyuşmayan `market` `400 invalid / channel_market_mismatch` alır.
- Markalar pazar kurallarının kendilerine ait sürümünü açabilir: `POST /admin/v1/policies` (yalnızca panel oturumunda, "Pazar kurallarını yönetebilir" izniyle) body'de `market` ya da `channel`, `verification_required`, `review_window_days` (7–365), `allowed_sort_options`, `default_sort_option` ve isteğe bağlı `valid_from` alır; sürüm yalnızca o markayı etkiler. `GET /admin/v1/policies` satırları `own` alanını taşır (`false` ise Sayproof kuralı) ve yanıt pazar başına sınırları `limits` içinde döner. Sayproof kuralı satın alma kanıtını zorunlu tutuyorsa şart kapatılamaz (`400 invalid / verification_locked`); Sayproof kuralında olmayan sıralama `400 invalid / sort_not_offered: <sıralama>` alır.
- Değerlendirme başlığı listeleri markaya aittir: `GET /admin/v1/aspect-templates` satırları `own` alanını taşır (`false` ise Sayproof hazır listesi); `POST /admin/v1/aspect-templates` markanın listesini ya da yeni sürümünü yayınlar; `POST /admin/v1/aspect-templates/retire` yalnızca markanın kendi listelerini kaldırır (`409 refused / template_preset`).
- `POST /admin/v1/invites/retry` `channel` alır; verilirse yalnızca o kanalın gönderilemeyen davetleri yeniden sıraya alınır.
- `POST /admin/v1/subject-requests/<id>/copy` yanıtı ve dosyası talebe yazılan notu (`note`) ve talebi işleyen kullanıcıyı (`handler_id`) taşımaz.
- `GET /admin/v1/overview` `channel` verildiğinde `mode` o kanalda geçerli yayınlama yöntemini döner ve `mode_overrides` `0` olur; yöntem beyanı uyarısı da o kanalı kapsar. `GET /admin/v1/insights` `compliance` bölümü `channel` ile süzülür; `reviews.product_bands` `scope` (`group` ya da `variant`) alanını taşır.
- KVKK taleplerinin `state` değeri `received`, `completed` ya da `refused` olur; kullanılmayan `in_progress` değeri kaldırıldı.

### 8 Ekim 2026

- Beş yeni hazır tasarım eklendi: `minimal` "Sade", `soft` "Pudra", `bold` "Sportif", `natural` "Doğal" ve `night` "Gece". Panelde **Mağaza görünümü** ekranında seçilir; `data-review-theme` attribute'u, `theme` seçeneği, `GET /v1/ssr` isteğindeki `theme` parametresi ve liste yanıtındaki `theme` alanı bu değerleri de taşıyabilir. **Gece** tasarımı kök öğeye kendi koyu zeminini, iç boşluğunu ve köşe yuvarlaklığını verir. Mevcut üç tasarımın görünümü ve sayfa bileşeni sözleşmesinin sürümü (`3`) değişmedi.
- `GET /admin/v1/reviews`, `GET /admin/v1/moderation/queue`, `GET /admin/v1/reviews/<id>` ve `GET /admin/v1/diagnostics` satırları `product_name` taşır.
- Yorum listesi ve onay kuyruğunda `q` ürün adında, yazanın e-posta adresinde ve tam yorum kimliğinde de arar.
- Liste endpoint'lerinin `filters` bildiriminde açık/kapalı filtreler (`reported`, `flagged`, `refused`, `sessions`) `advanced: true` döner.
- `GET /admin/v1/metrics` `publication` alanı ve `GET /admin/v1/insights` `moderation` bölümü `rejected` sayısını da taşır; `auto_published` ve `by_hand` artık onay kararlarını sayar.
- `GET /admin/v1/reviews/<id>/trace` ve `GET /admin/v1/audit-file/<id>` CSV ve Excel dosyalarında **Panelde aç** adresi bulunur; JSON dosyaları değişmedi.
- Sipariş ve teslimat endpoint'leri (`/v1/ingest/orders`, `/v1/ingest/deliveries`) `Authorization: Bearer <sunucu anahtarı>` header'ıyla da istek kabul eder; anahtarda yeni `orders` (Sipariş gönderme) izni bulunmalıdır. Anahtar tanınmazsa `401 refused / unknown_key`, iptal edilmişse `401 refused / revoked_key`, izin yoksa `403 refused / scope_missing` döner. İmzalı gönderim değişmedi.
- `scopes` verilmeden oluşturulan sunucu anahtarı `orders` ve `ssr` izinlerini alır; `ssr` izni olan mevcut anahtarlara `orders` izni eklendi.
- Sipariş bağlantılarına `shopify` ve `woocommerce` platformları eklendi. Yeni `platform_refused` ayrıntıları: `shop_address_invalid`, `api_credentials_missing`, `api_credentials_refused`, `api_scope_missing`; yeni okunamama nedeni: `lines_truncated`.
- Alan adı `_sayproof-verification.<alan adı>` adındaki `TXT` kaydıyla da doğrulanabilir. Alan adı satırları ve `proof_refused` yanıtı `dns_name` alanını taşır; yeni ayrıntı `dns_value_mismatch`.

### 6 Ekim 2026

- Dışa aktarımlar CSV, Excel ve JSON olarak alınır: `GET /admin/v1/reviews` `?export=xlsx` ve `?export=json` kabul eder; `GET /admin/v1/opt-outs/export` `?format=csv|xlsx|json` kabul eder.
- `POST /admin/v1/subject-requests/<id>/copy` body'de `format` (`csv`, `xlsx`, `json`) alırsa kopyayı dosya olarak döner. `GET /admin/v1/subject-requests/<id>` talebin kaydını döner; `?format=csv|xlsx|json` dosya olarak indirir.
- Yorumun dosyası: `GET /admin/v1/reviews/<id>/trace` (`?format=csv|xlsx|json` ile dosya).
- İşlem geçmişi panel girişlerini varsayılan olarak listelemez; `GET /admin/v1/audit-log?sessions=1` onları da döner.
- `GET /admin/v1/insights` davet hunisinde `deliveries_known` alanını taşır; e-posta hizmetinden teslim bilgisi hiç gelmediyse `delivered` ve oranı `null` olur. `GET /admin/v1/overview` dikkat listesinde `moderation_slow` türü yer alabilir.

### 29 Eylül 2026: sayfa bileşeni sözleşmesi sürüm 3

Ana sürüm değişikliği: varsayılan yorum bölümü yeniden tasarlandı. SSR yanıtındaki `version` değeri de `"3"` oldu.

Değişenler:

- Kök öğenin içi `data-review-frame` altında iki bölüme ayrıldı: `data-review-aside` (özet ve yorum yazma alanı) ve `data-review-main` (fotoğraf şeridi, filtreler, arama ve sıralama, liste). Yorum yazma alanı sıralama çubuğunun önünde değil, `data-review-aside` içinde özetin altında gösterilir.
- Puan dağılımının her satırı (`data-review-star`) yıldız etiketi, çubuk ve sayı içeren bir düğme taşır (`data-review-star-filter`); eski "5★ 8" metni kaldırıldı.
- "Faydalı (n)" düğmesi "Faydalı mı?" oy grubuna dönüştü (`data-review-vote`, `data-review-helpful`, `data-review-unhelpful`). Düğmeler başparmak simgesi ve yalnızca sayıyı (`data-review-vote-count`) gösterir; tam metin ("Evet (n)", "Hayır (m)") `aria-label` içindedir.
- Yorumun üst satırı `data-review-head` oldu: baş harfler (`data-review-avatar`) ve yazar bölümü (`data-review-byline`). `data-review-meta` artık yazar adının altındaki satırdır ve rozetleri (`data-review-badges`) ile tarihi (`data-review-date`) taşır; yazar adı bu satırda değildir.
- Yıldızlar her zaman beş karakterdir (`★★★★★`); dolu kısım `data-review-fill` ile gösterilir, özette ortalamaya göre dolar.
- CSS değişkenlerinin varsayılan değerleri **Sıcak** tasarımının değerleri oldu; kendi tanımladığınız değerler etkilenmez. Varsayılan bileşenin stilleri ayrı bir parça olarak ilk liste isteğiyle paralel yüklenir; headless kullanımda yüklenmez.

Eklenenler:

- Üç hazır tasarım (`warm` "Sıcak", `trust` "Güven", `editorial` "Editoryal") ve iki düzen (`cards` "Kartlı", `sidebar` "Yan panelli"). Tasarım ve düzen kanal başına panelde **Mağaza görünümü** ekranında seçilir; yeni kanallarda **Sıcak** ve **Kartlı**'dır. `data-review-theme` ve `data-review-style` attribute'ları, `theme` ve `style` seçenekleri ve `GET /v1/ssr` isteğindeki `theme` ve `style` parametreleri bu seçimi geçersiz kılar. Kök öğe ve yorum yazma alanı `data-review-theme` taşır.
- Yıldıza göre filtre, filtre düğmeleri (`data-review-filter`), arama (`data-review-search`) ve sonuç satırı (`data-review-results`). Bunlar liste endpoint'inin mevcut `rating`, `verified`, `media`, `q` ve `topic` parametrelerini kullanır.
- Fotoğraf şeridi (`data-review-gallery`) ve ayrı bir parça olarak yüklenen fotoğraf görüntüleyici (`data-review-lightbox`, `#sayproof-style-lightbox`).
- Uzun metinler için "Devamını oku" (`data-review-expand`).
- Baş harf dairesinin yazarın adına göre rengi (`data-review-avatar-tone`).
- Liste yanıtında `gallery`, `media_reviews`, `style` ve `theme` alanları.
- CSS değişkenleri `--review-track`, `--review-verified`, `--review-summary`, `--review-summary-text`, `--review-avatar` ve `--review-avatar-text`; bileşenin genişliğine göre değişen yerleşim (container `sayproof-reviews`).
- Sipariş detayında değerlendirme: `GET /v1/viewer/order`, `data-review-order` öğesi ve `window.Sayproof.mountOrder()`. Sipariş detayında `sayproof:submitted` event'i `detail: { order, line }` taşır.

### 28 Eylül 2026

- Belgeler Türkçe ve İngilizce olarak yayınlandı.
- Davet bağlantısı token'ı adresin `#` sonrasında taşır (`#review_token=…`); `?review_token=…` biçimi okunmaya devam eder.
- Storefront endpoint'lerinde dil yalnızca `?lang=`, body'deki `language` ya da kanalın dilinden belirlenir; `Accept-Language` kullanılmaz. Script'in sabit `tr` yedeği kaldırıldı.
- Yorum listesi yanıtına `limits` ve yorum satırına `experience` alanları eklendi; `POST /v1/reviews/revise` `kept_media` alanını kabul eder.
- Yeni attribute'lar: `data-review-experience`, `data-review-aspects`, `data-review-item-aspects`, `data-review-aspect`, `data-review-list-message`, `data-review-form-media-remove`; `data-review-gate-state` için `pending`, `data-review-form-media-state` için `kept` değeri.
- Yeni Admin API endpoint'leri: `POST /admin/v1/reviews/<id>/reports/resolve`, `POST /admin/v1/opt-outs/check`, `GET /admin/v1/opt-outs/export`.

### 25 Eylül 2026: sayfa bileşeni sözleşmesi sürüm 2

Ana sürüm değişikliği. Sürüm 1 hiçbir mağazada yayında kullanılmadı; bütün mağazalar bu sürümle başladı.

Değişenler:

- `data-review-gate`, yorum yazma alanının gösterileceği öğenin CSS seçicisi oldu.
- Ürün kodu ve kapsam (`data-review-product`, `data-review-scope`) script etiketinden container'a taşındı; script etiketindeki değerler yedek olarak okunmaya devam eder.
- SSR kök öğesi container'ın içinde oluşturulur.

Eklenenler:

- Headless kullanım: `data-review-mode="headless"`.
- `data-review-ready` attribute'u ve `window.Sayproof.write(container)` metodu.
- `sayproof:submitted` event'i.
- Sipariş doğrulamasının yorum formuyla aynı dialog içinde açılması (`data-review-form-verify`).
- Basamaklı ölçekli değerlendirme başlıkları (`data-review-form-steps`).
- Oturum açmış müşteri desteği (`data-review-viewer`, `GET /v1/viewer`).
- "Faydalı" oyunun geri alınması (`vote: "none"`).
- Anonim ürün görüntülenme sayımı (`POST /v1/views`).
