pages
29 uç · /api/web/v1/pages
İstek örnekleri ucun GERÇEK metodu ve yolundan üretilir. 29 ucun elle doğrulanmış gövde örneği henüz yok; o uçlarda iskelet gövdesizdir — uydurma bir alan yazmıyoruz.
GET /api/web/public/v1/pages/{id} — sayfanın CANLI içeriği.
idcurl -X GET "https://{slug}--panel.web.blesyum.app/api/web/public/v1/pages/<id>" \
-H "Authorization: Bearer blsk_..." \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}GET /api/web/v1/pages/{page}/activity
pagecurl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/activity" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}POST /api/web/v1/pages/{page}/ai/edit
pagecurl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/ai/edit" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}POST /api/web/v1/pages/{page}/approval — onay iste.
pagecurl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/approval" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}POST /api/web/v1/sites/{site}/menus/{handle}/duplicate (BLE2-13443)
page🔴 **Ç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/pages/<page>/duplicate" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}POST /api/web/v1/pages/{page}/move — sayfayı ağaçta taşı.
page🔴 **Döngü kapısı**: bir sayfa kendi altına (ya da kendi torununun altına) taşınamaz. Döngü, ağacı gezen HER kodu (menü üretimi, breadcrumb, sitemap) sonsuz döngüye sokar — ve bu, ziyaretçi isteğinde patlar. ⚠ Kapı UYGULAMADA: PostgreSQL'de kendine referanslı FK döngüyü engellemez.
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/move" \
-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/pages/<page>/notes" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}POST /api/web/v1/pages/{page}/presence
pageNabzı yazar ve **BAŞKALARINI** döndürür (kendini değil: kullanıcı zaten kendisinin burada olduğunu biliyor ve listede kendini görmek "iki kişi var" gibi okunur).
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/presence" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}POST /api/web/v1/posts/{post}/publish
pagecurl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/publish" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}GET /api/web/v1/pages/{page}/regions — SAYFA görünümü.
pageHer bölge için üç bilgi döner: sitenin ne dediği, bu sayfanın istisnası (varsa) ve **etkin** olan. 🔴 Etkin değeri panelde HESAPLATMAK, aynı düşme kuralının ikinci bir kopyası olurdu.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/regions" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}PUT /api/web/v1/pages/{page}/regions/{key} — sayfa istisnası.
pagekey🔴 İstisna bir GÖRÜNÜRLÜK kararıdır, bir KAPI değildir: bir bölgeyi
gizlemek sayfayı korumaz. Erişim web.pages.accessin işidir (WEB32'nin
hide_header dersi).
curl -X PUT "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/regions/<key>" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}DELETE /api/web/v1/pages/{page}/regions/{key} — istisnayı kaldır.
pagekey⚠ Bu bir GİZLEME DEĞİL: satır silinince sayfa yeniden SİTE atamasına düşer.
curl -X DELETE "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/regions/<key>" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}POST /api/web/v1/pages/{id}/restore — çöpten geri getir (BLE2-12888).
page🔴 **TASLAĞA döner, yayına DEĞİL.** Geri getirmek yayınlamak değildir; bir
sayfayı çöpten çıkarıp doğrudan ziyaretçiye açmak, yayın kapısını
(web.publish) content.write ile atlamak olurdu (sürüm geri dönüşünün
aynı kararı).
⚠ live_version_id çöpe atılırken temizlendi; geri gelen sayfa içeriğini
KORUR (sürüm defteri durur) ama yeniden yayınlanmayı bekler.
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/restore" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}POST /api/web/v1/pages/{page}/review-link — misafir inceleme bağlantısı.
page🔴 content.write yeter, publish İSTENMEZ: müşteriye taslağını
göstermek yayınlamak değildir (önizleme bağlantısının aynı gerekçesi).
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/review-link" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}PATCH /api/web/v1/pages/{id}/seo — sayfanın SEO künyesi (BLE2-13465).
page# 🔴 Bu kolon aylardır OKUNUYOR ama YAZILAMIYORDU
render.rs web.pages.seoyu okuyup temaya veriyordu; onu yazan hiçbir yol
yoktu. Yani müşteri, sayfasının arama motorunda görünen başlığını ve
açıklamasını **hiçbir yerden** değiştiremiyordu ve bunu hiçbir hata
söylemiyordu — kolon "var"dı, ekran yoktu.
# 🔴 Eksiklik "değişmedi", null "temizle"
Gövde bir YAMADIR: verilmeyen alan olduğu gibi kalır. Tam-değiştirme yapan
bir uç, yalnız başlığı düzelten bir isteği açıklamayı SİLEN bir isteğe
çevirirdi (B2B-40'ta canlı künye böyle silindi).
⚠ Ayrı bir uç, genel bir PATCH /pages/{id} yerine: genel yama TAM girdi
isterdi ve yalnız SEO'yu değiştiren bir çağrı 422 alırdı.
curl -X PATCH "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/seo" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}GET /api/web/v1/pages/{id}/seo-audit — SEO denetimi: yapısal veri +
pagemeta bulguları + skor (BLE2-13492 · 13500..13506).
⚠ Uç TEK: "yapısal veri" ile "meta denetimi" kullanıcı için AYNI sorunun
(bu sayfa arama motorunda nasıl görünüyor) iki yüzüdür; iki uç, panelde
iki tur ve iki ayrı boş durum demekti.
# 🔴 Künyeyi YENİDEN KURMAZ
Kompozisyon yapisal_veri::sayfa_icindedir ve renderer da onu kullanır.
İkinci bir kopya er geç ayrışır ve panel *"her şey yolunda"* derken
ziyaretçiye başka bir künye gider — doğrulama aracının var oluş sebebini
yok eder.
⚠ Ölçüt CANLI sürümdür: taslak bir sayfanın künyesini "yayında böyle
görünüyor" diye göstermek yalan olurdu. Canlı sürüm yoksa uç bunu SÖYLER.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/seo-audit" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}GET /api/web/v1/pages/{id}/share-preview — paylaşım kartı önizlemesi
page(WEB37 · BLE22-14830).
# 🔴 Neden var
Kiracı bir bağlantıyı paylaşıyor ve kartın ne göstereceğini **ancak
paylaştıktan sonra** görüyordu. Üstelik platformlar önizlemeyi agresif
önbelleklediği için yanlış bir kart günlerce dolaşıyor.
# 🔴 Kompozisyon TEK yerde
Başlık ve açıklama seo::cozdan gelir — canlı renderer'ın çağırdığı AYNI
fonksiyon. İkinci bir çözüm, "panelde şu görünüyor, paylaşımda başka şey
çıkıyor" demekti.
⚠ Görsel zincirinin HANGİ halkasına düşüldüğü de SÖYLENİR (image_source):
"görsel yok" ile "marka logosuna düşüldü" AYRI şeylerdir ve ikisinin
çözümü de farklıdır.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/share-preview" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}GET /api/web/v1/pages/{id}/siblings — dil kardeşleri (BLE2-13452).
page# Neden var Çevirmen, hedef sayfayı yazarken KAYNAK metni görmek zorunda. Sekme değiştirerek çalışmak, her blokta bir gidiş-geliş demektir ve uzun bir sayfada çevirmen sırasını kaybeder. Dönen her satır o dildeki sayfanın **en son sürümünü** taşır: yayındakini değil. Çevirmen taslakta çalışıyor olabilir ve kaynak taslağı görmesi meşrudur — yayına bakan bir sürüm, henüz yayınlanmamış bir kaynağı çevirmesini imkânsız kılardı.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/siblings" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}PATCH /api/web/v1/pages/{id}/template — sayfa şablonu (BLE2-12889).
page# 🔴 Değer AKTİF TEMANIN şablon kümesinden gelmek zorunda
Uydurma bir şablon adı sessizce pagee düşer (YuklenmisTema::sablon
yedeği) ve kullanıcı "seçtim ama değişmedi" der. Doğrulama yazma anındadır;
panelin seçici çizmesi bir KOLAYLIKTIR, kapı değil (DOM'u atlayan istemci).
⚠ Ayrı bir uç, genel bir PATCH /pages/{id} yerine: genel yama TAM girdi
isterdi (title zorunlu) ve yalnız şablonu değiştiren bir çağrı 422 alırdı.
curl -X PATCH "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/template" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}GET /api/web/v1/pages/{page}/template-chain — hangi şablon çizilecek ve
pageNEDEN (WEB32 · BLE22-14723).
# 🔴 "Bu sayfa hangi şablonla çiziliyor" sorusunun EKRANDA cevabı olmalı
Şablon seçimi artık bir ZİNCİRDİR (sablon_hiyerarsi): yazı önce
post-<slug>, sonra post, sonra page denenir. Zinciri göstermeyen bir
panelde kullanıcı, temaya post.html eklediğinde yazılarının neden
değiştiğini (ya da değişmediğini) hiçbir yerden göremez — ve "seçtim ama
değişmedi" şikayeti bu kez zincirin içinde saklanırdı.
⚠ Kaynak ÇİZİMLE AYNI: şablon kümesi tema_deposu::yukle_zincirliden
okunur, web.theme_filestan İKİNCİ bir listeyle değil. Ayrışsalardı panel
ziyaretçinin görmediği bir şablonu "seçildi" diye gösterirdi.
⚠ **Yazı da kabul edilir**: web.poststa template kolonu YOKTUR (açık
seçim yapılamaz) ama zinciri vardır ve yazarın onu görmesi gerekir.
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/template-chain" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}PATCH /api/web/v1/pages/{id}/translation — dil kardeşliği (BLE2-13447).
page# 🔴 Kardeşlik bir GRUPTUR, çift değil
a → b biçiminde bir işaretçi tutan tasarımda üçüncü dil eklendiğinde
zincir kurulur ve bir halka koparsa diller birbirini GÖREMEZ. Ortak bir
translation_group kimliği, N dilin hepsini tek sorguyla verir.
# 🔴 Aynı dilden İKİ kardeş olamaz
Dil değiştirici hangi sayfaya gideceğini bilemezdi. Kapı pages_dil_kardesi_uk
kısmi unique indeksidir; uç onu ANLAŞILIR bir cümleye çevirir.
⚠ Kuşak İLERLETİLİR: hreflang ve dil değiştirici KARDEŞLERDEN doğar, yani
bağ kurmak sayfanın çıktısını değiştirir. İlerletmeyen bir sürümde müşteri
bağı kurar ve bir saat boyunca hiçbir şey değişmez ("yaptım, olmadı").
curl -X PATCH "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/translation" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}POST /api/web/v1/posts/{post}/unpublish — arşive al.
page🔴 archived, drafttan AYRIDIR: taslak "henüz yayınlanmadı", arşiv
"yayındaydı, kaldırıldı". Birleştirmek, eski adresine gelen ziyaretçiye ne
olacağı sorusunu cevapsız bırakırdı.
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/unpublish" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}POST /api/web/v1/pages/{page}/versions — yeni sürüm (+ opsiyonel yayın).
pagecurl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/versions" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}