53 uç · /api/web/v1/sites
İstek örnekleri ucun GERÇEK metodu ve yolundan üretilir. 53 ucun elle doğrulanmış gövde örneği henüz yok; o uçlarda iskelet gövdesizdir — uydurma bir alan yazmıyoruz.
site# 🔴 Rakamlar HAM DEĞİL, kullanıcı sorusunun cevabı Panel "hangi sayfa okundu · nereden geldiler · hangi cihaz · şu an kaç kişi" diye sorar. Ham satır dökmek panele bir tablo verir, bir CEVAP vermez.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/analytics" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitecurl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/authors" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitecurl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/authors" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitecurl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/backups" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}site🔴 Katalog SİTEYE bağlıdır, kiracıya değil: aynı kiracının iki sitesi FARKLI tema kullanabilir ve her birinin paleti kendi temasının bloklarını göstermeli. Kiracı düzeyinde dönen bir uç, bir sitede olmayan bir bloğu palete koyar ve kullanıcı onu ekleyip çizilmediğini görür.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/blocks" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}site🔴 Sayfa · yazı · fikir TEK yanıtta: üç ayrı uç, panelin üç turu birleştirmesi ve üçünün AYRI süzülmesi demekti — kullanıcı "takvimimde eksik var" der.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/calendar" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}site🔴 **Çoğaltma bir KOPYALAMA değil, bir BAŞLANGIÇtır.** Dile göre ikinci bir menü kuran ya da altbilgi menüsünü ana menüden türeten kullanıcı, 20 satırı elle yeniden yazmak zorunda kalmamalı (CHAN-01'in bu ekrandaki hâli). ⚠ Hedef anahtar DOLUYSA reddedilir (409): sessizce ezmek, kullanıcının üstünde çalıştığı menüyü kaybettirmektir.
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/duplicate" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}site🔴 Katalog SİTEYE bağlıdır, kiracıya değil: aynı kiracının iki sitesi FARKLI tema kullanabilir ve her birinin paleti kendi temasının bloklarını göstermeli. Kiracı düzeyinde dönen bir uç, bir sitede olmayan bir bloğu palete koyar ve kullanıcı onu ekleyip çizilmediğini görür.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/event-destinations" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitecurl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/event-destinations" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/forms" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitecurl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/goals" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/goals" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitecurl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/handover-check" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/health" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitepage⚠ Sayfa **YAYINDA olmalı**: kök adres taslak bir sayfaya bağlanırsa ziyaretçi 404 alır ve müşteri bunu ürün arızası sanar.
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/home/<page>" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitecurl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/ideas" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}site🔴 Fikir bir SAYFA DEĞİLDİR: sayfa bir adres, bir sürüm defteri ve bir yayın kapısı taşır. Her fikir için taslak sayfa açmak, sayfa listesini hiç yazılmamış başlıklarla doldurur ve sayfa tavanını (5000) fikirlerle yakar.
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/ideas" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitecurl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/library" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitecurl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/media" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitemedia# 🔴 ORİJİNAL KORUNUR Yerinde yazan bir sürüm geri alınamaz bir düzenleme yapar: kullanıcı yanlış kırptığında ilk hâli KAYBOLUR ve "geri al" diye bir şey olmaz. Ve o görsel yayındaki bir sayfada kullanılıyorsa, ziyaretçi düzeltilmemiş bir kırpmayı anında görür. Yeni kayıt, kullanıcının kararını geri alınabilir kılar. ⚠ Yeni kayıt kotadan DÜŞER ve panel bunu söyler — sessizce iki kat yer tüketen bir düğme, kotanın neden dolduğunu anlaşılmaz yapardı.
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/media/<media>/transform" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitemediacurl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/media/<media>/usage" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}site🔴 Kısmi başarı SESSİZ kalmaz: her kayıt için sonuç döner. *"İşlem tamamlandı"* diyen bir toplu uç, kullanıcıya yapılmamış bir işi yapılmış gösterir (sayfa toplu işleminin aynı kararı).
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/media/bulk-delete" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitehandle🔴 Upsert, POST/PATCH ayrımı DEĞİL: menü `handle` ile adreslenir ("ana", "altbilgi") ve tema onu o adla çağırır. Kullanıcının "ana menü var mı" sorusunu sorup ona göre POST ya da PATCH seçmesi, panelde iki yol demekti.
curl -X PUT "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/menus/<handle>" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitehandle🔴 **Çoğaltma bir KOPYALAMA değil, bir BAŞLANGIÇtır.** Dile göre ikinci bir menü kuran ya da altbilgi menüsünü ana menüden türeten kullanıcı, 20 satırı elle yeniden yazmak zorunda kalmamalı (CHAN-01'in bu ekrandaki hâli). ⚠ Hedef anahtar DOLUYSA reddedilir (409): sessizce ezmek, kullanıcının üstünde çalıştığı menüyü kaybettirmektir.
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/menus/<handle>/duplicate" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}site# 🔴 Rapor bir GÖREV LİSTESİDİR Her satır **öneri** taşır: aynı yolda çöpte/taslakta bir sayfa varsa *"yayınla"*, benzer bir yol varsa *"yönlendir"*, hiçbiri yoksa *"sayfa yaz"*. Yalnız sayı gösteren bir rapor, kullanıcıya ne yapacağını söylemez.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/not-found" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/pages" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}site## 🔴 Kısmi başarı SESSİZ kalmaz 200 sayfanın 3'ü yayınlanamadıysa (sürümü yok, yayında değil, alt sayfası var) uç **hangisinin neden** olduğunu satır satır söyler. "İşlem tamamlandı" diyen bir toplu uç, kullanıcıya yapılmamış bir işi yapılmış gösterir ve o bunu ancak ziyaretçi şikayet edince öğrenir. ## 🔴 Her eylem KENDİ iznini ister `publish` → `web.publish`; gerisi `web.content.write`. Tek bir "toplu işlem" izni tanımlamak, yayın kapısını toplu uç üzerinden atlatmak olurdu — tek sayfada `publish` bayrağının ayrı izin istemesiyle aynı gerekçe. ⚠ **Her sayfa KENDİ tx'inde** işlenir: tek tx'te biri düşerse hepsi geri alınır ve kullanıcı 199 başarılı işini kaybeder. Toplu işlem bir atomiklik vaadi DEĞİLDİR; rapor vaadidir.
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/pages/bulk" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/posts" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitecurl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/redirects" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}site# 🔴 Kısmi başarı SESSİZ KALMAZ Yanıt `{eklenen, guncellenen, atlanan, hatalar[]}` döner. *"İçe aktarıldı"* diyen bir uç, kullanıcıya yapılmamış bir işi yapılmış gösterir ve o bunu ancak ziyaretçi şikayet edince öğrenir.
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/redirects/import" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}site# 🔴 Asıl değerli soru "aranan ama BULUNAMAYAN"dır "En çok aranan" ilginç bir istatistiktir; **sıfır sonuç veren aramalar** ise bir YAPILACAKLAR listesidir: müşterinin sitesinde eksik olan içeriği tam olarak o liste söyler. İkisi AYRI döner. ⚠ İzin `web.view`: bu bir içerik kararı değil, bir okuma. Ama `visitor_hash` YANITTA GEÇMEZ — o bir spam/tekillik sinyalidir, ekrana basmak onu bir "ziyaretçi kimliği" sanmaya davet ederdi.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/search-analytics" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}site⚠ Katalog yanıtın İÇİNDE gelir: panel ikinci bir ayar listesi tutmaz. Gömülü liste sunucudakiyle sessizce ayrışır (DEV-01'in "kapsam kataloğu tek kaynaktadır" dersi).
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/settings" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitecurl -X PATCH "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/settings" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitecurl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/taxonomies" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}sitecurl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/taxonomies" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}site(BLE2-12889). # 🔴 Liste AKTİF TEMADAN gelir, panele GÖMÜLMEZ Şablon kümesi temanın `templates/` dizinidir ve her tema farklıdır. Panele gömülü bir liste, kiracının yüklediği temada olmayan bir şablonu seçtirir; sayfa o şablonu bulamaz, sessizce `page`e düşer ve kullanıcı "seçtim ama değişmedi" der (DEV-01'in bu ekrandaki hâli). ⚠ `page` DAİMA listede: `ZORUNLU_SABLON`dur ve her tema onu taşımak zorundadır (`tema_paketi` doğrulaması). Tema yüklenmemişse yerleşik varsayılan temanın tek şablonu odur.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/templates" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}siteSÜRÜMLERİ (BLE2-13272 · 14874 · 14875). # 🔴 Sürüm bir GİT COMMIT'i değil, YÜKLENMİŞ BİR PAKETTİR Her yükleme `web.themes`te AYRI bir satırdır (`themes_ad_surum_uk`: aynı ad+sürüm iki kez kurulamaz). "Geri alma" bu yüzden ayrı bir mekanizma GEREKTİRMEZ: önceki sürümün satırı DURUYOR ve `PUT …/theme` onu aktive eder — üstelik uyumluluk raporuyla (karşılıksız bloklar, taşınan ayarlar) birlikte. Eksik olan tek şey **hangi sürümlerin var olduğunu görmekti**; görmediği bir şeye geri dönemeyen kullanıcı için o mekanizma YOKTU. ⚠ Ölçüt tema **ADIDIR**: sürümler aynı adı taşıyan satırlardır. `digest` UNIQUE DEĞİLDİR (aynı paketi ikinci kez kurmak meşru bir istektir) ve kimlik ölçütü olamaz.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/theme/history" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}site🔴 Katalog SİTEYE bağlıdır, kiracıya değil: aynı kiracının iki sitesi FARKLI tema kullanabilir ve her birinin paleti kendi temasının bloklarını göstermeli. Kiracı düzeyinde dönen bir uç, bir sitede olmayan bir bloğu palete koyar ve kullanıcı onu ekleyip çizilmediğini görür.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/<site>/translations" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}(BLE2-12743). ## 🔴 Neden "lisans açılınca" DEĞİL, panele ilk girişte İlk akla gelen, lisansı açan yolun (`card_verify_callback`, admin onayı, eklenti ekleme) siteyi de açmasıdır. Üç sebeple reddedildi: * **Çekirdek `web.sites`i GÖREMEZ.** FORCE RLS altındadır ve kiracı bağlamı kurulmadan yapılan sorgu hata VERMEZ — sessizce **0 satır** döner (COMMERCE-01'in kök dersi). Orada yazılan bir "site var mı" kontrolü daima "yok" der ve her lisans açılışında yeni bir site doğardı. * **Lisansı açan YOL BİR TANE DEĞİL.** Kart doğrulama, KYC onayı, plan değişimi, eklenti ekleme, admin… Kanca hepsine tek tek yazılırsa er geç birinde unutulur (bu deponun en pahalı dersi). * **Kurulum sihirbazı zaten ilk girişte çalışır.** Site oluşturma onun ilk adımıdır; iki yerden açmak, sihirbazın adım sayacını yalanlar. ## Sözleşme * **İdempotent**: kiracının zaten sitesi varsa hiçbir şey yapmaz ve var olanı döner. Kullanıcı paneli her açtığında yeni site açan bir uç, çoklu site tavanını üç günde doldururdu. * Site **TASLAK** doğar — içi boş bir siteyi ziyaretçiye açmak müşteriye *"sitem bomboş yayında"* dedirtir. * **Ad kiracının ünvanından** gelir; boşsa okunur bir yedek. Adsız bir site seçicide metinsiz bir satırdır (V7 dersi).
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/sites/ensure-first" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}