21 uç · /api/web/v1/pages
İstek örnekleri ucun GERÇEK metodu ve yolundan üretilir. 21 ucun elle doğrulanmış gövde örneği henüz yok; o uçlarda iskelet gövdesizdir — uydurma bir alan yazmıyoruz.
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…"
}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…"
}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…"
}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…"
}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…"
}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…"
}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…"
}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…"
}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…"
}page# 🔴 Bu kolon aylardır OKUNUYOR ama YAZILAMIYORDU `render.rs` `web.pages.seo`yu 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…"
}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_icin`dedir 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…"
}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…"
}page# 🔴 Değer AKTİF TEMANIN şablon kümesinden gelmek zorunda Uydurma bir şablon adı sessizce `page`e 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…"
}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…"
}page🔴 `archived`, `draft`tan 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…"
}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…"
}