Web (Site Kurucu)

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

GET /api/web/public/v1/pages — yayındaki sayfalar.

API anahtarı
İstek
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/public/v1/pages" \
  -H "Authorization: Bearer blsk_..." \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/web/public/v1/pages/{id}

GET /api/web/public/v1/pages/{id} — sayfanın CANLI içeriği.

API anahtarıYol parametresi: id
İstek
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/public/v1/pages/<id>" \
  -H "Authorization: Bearer blsk_..." \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/web/v1/pages/{page}/access

Erisim ayarla

OturumYol parametresi: page
İstek
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/access" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/web/v1/pages/{page}/activity

GET /api/web/v1/pages/{page}/activity

OturumYol parametresi: page
İstek
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/activity" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/web/v1/pages/{page}/ai/edit

POST /api/web/v1/pages/{page}/ai/edit

OturumYol parametresi: page
İstek
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/ai/edit" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/web/v1/pages/{page}/approval

POST /api/web/v1/pages/{page}/approval — onay iste.

OturumYol parametresi: page
İstek
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/approval" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/web/v1/pages/{page}/duplicate

POST /api/web/v1/sites/{site}/menus/{handle}/duplicate (BLE2-13443)

OturumYol parametresi: 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.

İstek
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/duplicate" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
PATCH/api/web/v1/pages/{page}/layout

Set layout

OturumYol parametresi: page
İstek
curl -X PATCH "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/layout" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/web/v1/pages/{page}/move

POST /api/web/v1/pages/{page}/move — sayfayı ağaçta taşı.

OturumYol parametresi: 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.

İstek
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/move" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/web/v1/pages/{page}/notes

GET /api/web/v1/audit

OturumYol parametresi: page
İstek
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/notes" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/web/v1/pages/{page}/notes

POST /api/web/v1/sites/{site}/posts

OturumYol parametresi: page
İstek
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/notes" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
PATCH/api/web/v1/pages/{page}/plan

Page plan

OturumYol parametresi: page
İstek
curl -X PATCH "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/plan" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/web/v1/pages/{page}/presence

POST /api/web/v1/pages/{page}/presence

OturumYol parametresi: page

Nabzı 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).

İstek
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/presence" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/web/v1/pages/{page}/publish

POST /api/web/v1/posts/{post}/publish

OturumYol parametresi: page
İstek
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/publish" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/web/v1/pages/{page}/regions

GET /api/web/v1/pages/{page}/regions — SAYFA görünümü.

OturumYol parametresi: page

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

İstek
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/regions" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
PUT/api/web/v1/pages/{page}/regions/{key}

PUT /api/web/v1/pages/{page}/regions/{key} — sayfa istisnası.

OturumYol parametresi: 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).

İstek
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"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
DELETE/api/web/v1/pages/{page}/regions/{key}

DELETE /api/web/v1/pages/{page}/regions/{key} — istisnayı kaldır.

OturumYol parametresi: pagekey

⚠ Bu bir GİZLEME DEĞİL: satır silinince sayfa yeniden SİTE atamasına düşer.

İstek
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"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/web/v1/pages/{page}/restore

POST /api/web/v1/pages/{id}/restore — çöpten geri getir (BLE2-12888).

OturumYol parametresi: 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.

İstek
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/restore" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/web/v1/pages/{page}/review-link

POST /api/web/v1/pages/{page}/review-link — misafir inceleme bağlantısı.

OturumYol parametresi: 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).

İstek
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"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
PATCH/api/web/v1/pages/{page}/seo

PATCH /api/web/v1/pages/{id}/seo — sayfanın SEO künyesi (BLE2-13465).

OturumYol parametresi: 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ı.

İstek
curl -X PATCH "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/seo" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/web/v1/pages/{page}/seo-audit

GET /api/web/v1/pages/{id}/seo-audit — SEO denetimi: yapısal veri +

OturumYol parametresi: page

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

İstek
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"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/web/v1/pages/{page}/share-preview

GET /api/web/v1/pages/{id}/share-preview — paylaşım kartı önizlemesi

OturumYol parametresi: 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.

İstek
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"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/web/v1/pages/{page}/siblings

GET /api/web/v1/pages/{id}/siblings — dil kardeşleri (BLE2-13452).

OturumYol parametresi: 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ı.

İstek
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/siblings" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
PATCH/api/web/v1/pages/{page}/template

PATCH /api/web/v1/pages/{id}/template — sayfa şablonu (BLE2-12889).

OturumYol parametresi: 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ı.

İstek
curl -X PATCH "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/template" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/web/v1/pages/{page}/template-chain

GET /api/web/v1/pages/{page}/template-chain — hangi şablon çizilecek ve

OturumYol parametresi: page

NEDEN (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.

İstek
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"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
PATCH/api/web/v1/pages/{page}/translation

PATCH /api/web/v1/pages/{id}/translation — dil kardeşliği (BLE2-13447).

OturumYol parametresi: 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ı").

İstek
curl -X PATCH "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/translation" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/web/v1/pages/{page}/unpublish

POST /api/web/v1/posts/{post}/unpublish — arşive al.

OturumYol parametresi: 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ı.

İstek
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/unpublish" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
GET/api/web/v1/pages/{page}/versions

GET /api/web/v1/audit

OturumYol parametresi: page
İstek
curl -X GET "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/versions" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
POST/api/web/v1/pages/{page}/versions

POST /api/web/v1/pages/{page}/versions — yeni sürüm (+ opsiyonel yayın).

OturumYol parametresi: page
İstek
curl -X POST "https://{slug}--panel.web.blesyum.app/api/web/v1/pages/<page>/versions" \
  -H "Authorization: Bearer <oturum-token>" \
  -H "Accept: application/json"
Yanıt
{
  "data": "…",
  "trace_id": "01JC…"
}
Bu sayfa işine yaradı mı?