İstek örnekleri ucun GERÇEK metodu ve yolundan üretilir. 23 ucun elle doğrulanmış gövde örneği henüz yok; o uçlarda iskelet gövdesizdir — uydurma bir alan yazmıyoruz.
POST /api/b2b/v1/admin/marketplace/apps/{id}/install — onaylı app'i bu kiracıya kur.
OturumYol parametresi: id
**B2B kapsam kontrolü ÖNCE:** motor `install_app` yalnız `approved` bakar; `compatible_products`
süzgeci B2B-yereldir. Bu kontrol olmadan B2B paneli, B2B ile uyumlu OLMAYAN (ör. yalnız ERP)
bir app'i kurabilirdi — katalogda göremediği bir şeyi id'siyle kurmak. Fail-closed: kapsam
dışıysa katalogdaki gibi **404** (varlığını sızdırmayız).
**Yetki onayı BURADA zorunludur (2026-08-15).** Çağıran `grant_scopes` ile app'in istediği
yetkilerin TAMAMINI adıyla saymak zorundadır; küme eşit değilse kurulum 400 ile reddedilir.
Öncesinde onay yalnız panelin onay kutusuydu — yani istemci tarafıydı: bir betik ya da
güncellenmemiş bir ekran, app ne isterse sessizce veriyordu.
Asıl koruduğu vaka **yetki kayması**: kurulu bir app yeni sürümünde daha fazla yetki
isterse, eski listeyi gönderen çağıran artık sessizce genişletmek yerine 400 alır ve
operatör yeni listeyi görüp onaylamak zorunda kalır. (Kurulum `on conflict do update`
olduğu için bu yol gerçekten bir GÜNCELLEME yoludur.)
⚠ Kısmi onay (istenen yetkilerin bir kısmını verme) DESTEKLENMEZ: motor `required_scopes`'un
tamamını yazar ve app beyan ettiği yetkiler olmadan çalışmayacağını varsayar. Yarım grant,
app'i sessizce bozardı; "kabul et ya da kurma" dürüst olan.
GET /api/b2b/v1/admin/marketplace/events — abone olunabilir `b2b.*` webhook olay kataloğu
Oturum
(BLE-2233 discovery). Çekirdek `EVENT_CATALOG`'u KİRLETMEDEN B2B kendi olay sözlüğünü yayınlar;
tenant bir ucu bu olaylara `POST /api/v1/webhooks` (çekirdek `create_endpoint`) ile abone eder,
B2B iş tx'inde teslimat üretir, çekirdek worker imzalar+teslim eder. Statik liste (tenant verisi
YOK) ama `b2b.marketplace.view` ile kapılı (yalnız yetkili personel keşfeder).