# Restomenum Geliştirici Portalı > 3. parti eklenti geliştiricileri için Restomenum eklenti platformu dokümantasyonu: event/lifecycle webhook’ları, scope’lar, OAuth Connect, manifest yapı taşları ve API uçları. ## Dokümanlar - [Geliştirici Dokümanları](https://dev.restomenum.com/docs): Bir Restomenum eklentisini uçtan uca geliştirmek için ihtiyacın olan her şey: eklenti oluşturma, manifest, OAuth Connect, token exchange, webhook event'leri, akış-durduran hook'lar ve iframe Custom UI - [Action Ucu (actionUrl)](https://dev.restomenum.com/docs/action-url): UI butonlarının (packet.detail.actions) tıklanmasında çalışan SENKRON uç. Webhook'tan ayrıdır: kullanıcı butona basar, Restomenum bu uca imzalı POST atar, sen kısa sürede { success, message, level } d - [Paket İşlemleri — packet.detail.actions](https://dev.restomenum.com/docs/action-url/packet): Paket detay ekranındaki işlem menüsüne (slot: packet.detail.actions) eklediğin butonlar tıklanınca actionUrl'ine imzalı POST gelir. Ortak sözleşme (istek/yanıt/imza) Genel Bakış'ta; burada bu slot'a ö - [API Uçları — Genel Bakış](https://dev.restomenum.com/docs/api): Eklentinin Restomenum'dan veri okuduğu / işlem yaptığı HTTP uçları. Etkileşimler (event, action, iframe) yalnızca bir id taşır; dolu veriyi bu API'lerden çekersiniz. Liste zamanla genişler. - [Kategori Detayı — GET /plugin-api/categories/get](https://dev.restomenum.com/docs/api/categories-get): Tek bir kategorinin detayı — örn. category.* event'indeki id'yi zenginleştirmek için. Şekil categories/list'teki öğeyle birebir aynıdır. - [Kategori Listesi — GET /plugin-api/categories/list](https://dev.restomenum.com/docs/api/categories-list): Mağazanın tüm ürün kategorilerini döndürür (menü ağacı / gruplama için). Aktif + pasif hepsi gelir. Kategori id'si ürünün category alanıyla eşleşir → ürünleri kategorilere bağlarsın. - [Kategori Yazma — categories/create · update · delete](https://dev.restomenum.com/docs/api/categories-write): Kategori kataloğunu yazar. Scope ürünlerle aynıdır (products:write) — kategoriler ürün/menü domain'inin parçasıdır. Sahiplik/idempotency/hata/echo kuralları katalog yazma ile ortaktır. - [Müşteri Detayı — GET /plugin-api/customers/get](https://dev.restomenum.com/docs/api/customers-get): Tek bir müşteriyi ID ile getirir (CRM/sadakat). Şekil customers/list öğesiyle birebir aynıdır. PII alanları (name/phone/address) yalnız customers:read + tenant consent birlikte varken döner; total (fi - [Müşteri Listesi — GET /plugin-api/customers/list](https://dev.restomenum.com/docs/api/customers-list): Mağazanın tüm müşteri kataloğunu sayfalı döner (CRM/sadakat/müşteri-senkron). Müşteri sayısı binlerce olabileceğinden cursor (keyset) pagination kullanılır — offset YOKTUR. Her öğe customers/get ile a - [Malzeme Kataloğu — GET /plugin-api/ingredients/list](https://dev.restomenum.com/docs/api/ingredients-list): Mağazanın malzeme/stok kataloğunu (reçete malzemeleri, envanter) döner. Stok/envanter eklentileri için. Snapshot; değişiklikler için ingredient.* event'leri. - [Malzeme Yazma — ingredients/create · update · delete](https://dev.restomenum.com/docs/api/ingredients-write): Malzeme/stok kartlarını yazar (oluştur/güncelle/sil). Alan adları ingredients/list okuma şekliyle simetriktir. Sahiplik/idempotency/hata/echo kuralları katalog yazma ile ortaktır. - [Paket Oluştur — POST /plugin-api/packets/create](https://dev.restomenum.com/docs/api/packets-create): Eklentinin Restomenum'da yeni paket/delivery siparişi oluşturduğu yazma ucudur. Okuma uçlarından farklı: POST, JSON gövde alır ve orders:write scope'u ister. Sepet ürün id'leriyle gönderilir; fiyatlar - [Paket Detayı — GET /plugin-api/packets/get](https://dev.restomenum.com/docs/api/packets-get): Action ve iframe etkileşimleri yalnızca packetId taşır; paketin DOLU order'ını (ürünler, müşteri, adres, toplam) bu uçtan çekersiniz. Standart desen: etkileşim bir id taşır, veri API'den okunur. - [Açık Paketler — GET /plugin-api/packets/open](https://dev.restomenum.com/docs/api/packets-open): O an AÇIK olan tüm paket/delivery hesaplarının özetini verir. Paket (telefon siparişi, Yemeksepeti/Getir/Trendyol…) oluşunca listeye düşer, teslim edilip kapanınca düşer — dönen liste anlık açık paket - [Paket Güncelle — POST /plugin-api/packets/update](https://dev.restomenum.com/docs/api/packets-update): Bir paketin sınırlı alanlarını güncelleyen yazma ucudur (allowlist). Yalnız izinli alanlar değişir; tanımsız alan gönderirsen reddedilir (success:false — kütle-atama engeli). Tutar/kalem/ödeme bu uçla - [Paket Kalemleri — POST /plugin-api/packets/update-orders](https://dev.restomenum.com/docs/api/packets-update-orders): Bir paketin TÜM kalemlerini (cart) değiştirir — merge değil, FULL REPLACE. total Restomenum ürün fiyatlarından yeniden hesaplanır (gönderdiğin fiyat yok sayılır). Transaction'lı (paket oku → doğrula → - [Paket Ödemeleri — POST /plugin-api/packets/update-payments](https://dev.restomenum.com/docs/api/packets-update-payments): Bir paketin TÜM ödemelerini değiştirir — FULL REPLACE. paid yeniden hesaplanır (yalnız price>0 satırlar). Transaction'lı. Hiçbir uç paketi KAPATMAZ; paid==total olsa bile finansal kapanış işletme akış - [Ödeme Yöntemleri — GET /plugin-api/payment-methods/list](https://dev.restomenum.com/docs/api/payment-methods-list): Mağazanın tanımlı ödeme yöntemlerini (Nakit, Kredi Kartı, Yemek Çeki…) döner. Scope: payment_methods:read (config; satış orders:read'ten ayrı). Tek seferlik snapshot; değişiklikler için payment_method - [Ödeme Yöntemi Yazma — payment-methods/create · update · delete](https://dev.restomenum.com/docs/api/payment-methods-write): Ödeme yöntemi tanımlarını yazar (oluştur/güncelle/sil). Alan adları payment-methods/list okuma şekliyle simetriktir. Sahiplik/idempotency/hata/echo kuralları katalog yazma ile ortaktır. - [Ürün Detayı — GET /plugin-api/products/get](https://dev.restomenum.com/docs/api/products-get): Bir ürünün tam detayını (fiyat, KDV, görsel, barkod, stok, çok dilli alanlar ve seçenek/choice ağacı) id ile çekersin. Menü/katalog senkronu yapan eklentilerin temel ucudur. - [Ürün Kataloğu — GET /plugin-api/products/list](https://dev.restomenum.com/docs/api/products-list): Mağazanın tüm ürün kataloğunu döndürür (menü senkronu için). Aktif VE pasif ürünlerin hepsi gelir; eklenti active alanına göre kendisi filtreler. Tek ürünü id ile çekmek için products/get. - [Ürün Yazma — products/create · update · delete](https://dev.restomenum.com/docs/api/products-write): Ürün kataloğunu yazar (oluştur/güncelle/sil). Alan adları products/get okuma şekliyle birebir simetriktir. Sahiplik, idempotency, hata ve echo kuralları tüm katalog yazma uçlarında ortaktır. - [Masa Detayı — GET /plugin-api/tables/get](https://dev.restomenum.com/docs/api/tables-get): table.close gate'i yalnızca bir referans taşır (target:{type:'table', id:'…'}); masanın DOLU içeriğini (ürünler, tutar, müşteri) bu uçtan, o id ile çekersiniz. Satır deseni (orders[]) packets/get ile - [Masa Yerleşimi — GET /plugin-api/tables/layout](https://dev.restomenum.com/docs/api/tables-layout): Mağazanın masa yerleşimini (floor plan) döndürür: bölümler (salon/alan) + her bölümdeki aktif masalar (id + ad). Masa rezervasyon/seçim eklentileri veya bir masanın detayını çözmek için. Masa id'si ta - [Açık Masa Hesapları — GET /plugin-api/tables/open](https://dev.restomenum.com/docs/api/tables-open): O an AÇIK olan tüm dine-in (masa) hesaplarının özetini verir. Masa adisyonu açılınca listeye düşer, kapatılınca (ödeme alınıp adisyon kapanınca) düşer — ekstra durum filtresine gerek yoktur. Canlı das - [Masa Kalemleri — POST /plugin-api/tables/update-orders](https://dev.restomenum.com/docs/api/tables-update-orders): Dine-in masanın TÜM kalemlerini değiştirir — FULL REPLACE (packets/update-orders'ın masa karşılığı). total kuver dahil yeniden hesaplanır; fiyatlar Restomenum ürün kaydından (normal satış fiyatı). Hiç - [Masa Ödemeleri — POST /plugin-api/tables/update-payments](https://dev.restomenum.com/docs/api/tables-update-payments): Dine-in masanın TÜM ödemelerini değiştirir — FULL REPLACE (packets/update-payments'ın masa karşılığı). Ödeme kuralları paket ucuyla birebir aynı: id'ler tenant'ın gerçek ödeme yöntemlerine karşı doğru - [Personel Listesi — GET /plugin-api/users/get](https://dev.restomenum.com/docs/api/users-get): Tenant'ın personel (kullanıcı) listesini döner — örn. siparişi bir personele atamak için. Yalnız id + ad; hassas alanlar (pincode, yetki, e-posta, mesai) kasıtlı olarak dönmez. - [Aksiyon Butonları (ui:button)](https://dev.restomenum.com/docs/buttons): Eklenti, panelin belirli bir slot'una (şu an paket detayı) bir buton yerleştirir. Tenant tıklayınca ya eklentinin iframe sayfasını modal açar ya da senin action ucuna imzalı bir istek gider. Action Ho - [Değişiklik Günlüğü](https://dev.restomenum.com/docs/changelog): Geliştiriciyi etkileyen değişiklikler (yeni uçlar, hook'lar, scope'lar, yetenekler). Yalnızca canlıya alınmış/doğrulanmış özellikler listelenir; planlananlar 'Yakında' altında. - [Mimari & Kavramlar](https://dev.restomenum.com/docs/concepts): Bir Restomenum eklentisinin nasıl çalıştığının kuş bakışı haritası: kurulum/kimlik, Restomenum ↔ eklenti iletişiminin yönleri, scope/consent, imzalama ve yaşam döngüsü. Her kavram ilgili detay sayfası - [1 · OAuth Connect (/connect)](https://dev.restomenum.com/docs/connect): Tenant eklentiyi kurduğunda, Restomenum tarayıcıyı senin connectUrl'ine tek-kullanımlık bir code ile yönlendirir. Bu code'u sunucu tarafında credential'a çevirirsin (bir sonraki adım). Bu, eklentinin - [Teslim Sağlığı & Politikası](https://dev.restomenum.com/docs/delivery-health): Webhook teslim garantileri: retry, circuit breaker (sürekli başarısız endpoint'i koruma), 72 saat kalıcı durdurma ve hacim cap'i. Endpoint sağlığın doğrudan teslim akışını (ve senkron hook'larda tenan - [Test Mağazaları (Development Stores)](https://dev.restomenum.com/docs/dev-stores): Yayınlanmamış (taslak/incelemedeki) eklentini, sahibi olduğun bir test restoranında uçtan uca dene — tıpkı Shopify development stores gibi. Gerçek restoranlar yalnız onaylı/yayınlı eklentileri görür; - [Hata Kodları](https://dev.restomenum.com/docs/errors): Tüm yüzeylerdeki (Veri API, yazma ucu, hook'lar, aksiyon, webhook) dokümante hata mesajları tek yerde. Veri API hataları artık REST-uyumlu HTTP status döner (not-found 404, doğrulama 400, scope/sahipl - [Event Kataloğu](https://dev.restomenum.com/docs/events): Eklentinin webhook ile abone olabileceği tüm event tipleri. Bir event'e abone olmak için manifest'te events[] listesine ekle ve events:subscribe scope'unu iste. Bir event'e tıkla → örnek payload açılı - [Kategori Event'leri — category.created · updated · deleted](https://dev.restomenum.com/docs/events/category-events): Ürün kategorileri değiştiğinde eklentinin webhookUrl'ine async imzalı POST edilir. Menü ağacı senkronu için product.* event'leriyle birlikte kullanılır. - [Müşteri Event'leri — customer.*](https://dev.restomenum.com/docs/events/customer-events): Müşteri (CRM) yaşam döngüsü ve cari hesap (veresiye/tahsilat) event'leri. Dördü de eklentinin webhookUrl'ine async imzalı POST edilir, customers:read scope + events:subscribe ister. PII içerir — custo - [Malzeme Event'leri — ingredient.created · updated · deleted](https://dev.restomenum.com/docs/events/ingredient-events): Malzeme/stok kataloğu değiştiğinde async webhook gelir. Envanter senkronu için: ilk yükleme ingredients/list, sonrası bu event'ler. - [packet.closed](https://dev.restomenum.com/docs/events/packet-closed): Bir paket / delivery siparişi kapatıldığında (ödendi/teslim/finalize) eklentinin webhookUrl'ine async imzalı POST edilir. Manuel telefon paketleri VE entegrasyon teslimatları (Getir, Yemeksepeti, Tren - [packet.created](https://dev.restomenum.com/docs/events/packet-created): Restomenum'da yeni bir paket sipariş oluşunca eklentinin webhookUrl'ine imzalı POST edilir. Bu, paket/kurye eklentilerinin temel event'idir. Aşağıdaki şema canlı (authoritative) payload'ı tanımlar. - [Ödeme Yöntemi Event'leri — payment_method.created · updated · deleted](https://dev.restomenum.com/docs/events/payment-method-events): Mağazanın ödeme yöntemi tanımları (Nakit, Kredi Kartı, Yemek Çeki…) değiştiğinde async webhook gelir. Mutabakat/raporlama eklentileri için. - [Ürün Event'leri — product.created · updated · deleted](https://dev.restomenum.com/docs/events/product-events): Ürün kataloğu değiştiğinde eklentinin webhookUrl'ine async imzalı POST edilir. Menü/stok senkronu yapan eklentilerin delta kaynağıdır: ilk yükleme products/list, sonrası bu event'ler. - [table.closed](https://dev.restomenum.com/docs/events/table-closed): Dine-in masa adisyonu kapatıldığında (ödeme alınıp adisyon kapanınca) eklentinin webhookUrl'ine async (fire-and-forget) imzalı POST edilir. Kapanış SONRASI bir bildirimdir. - [table.created](https://dev.restomenum.com/docs/events/table-created): Dine-in bir masa GERÇEKTEN açıldığında (bir masaya ilk sipariş eklendiğinde) eklentinin webhookUrl'ine async (fire-and-forget) imzalı POST edilir. Açılış SONRASI bir bildirimdir. - [Personel Event'leri — user.created · updated · deleted](https://dev.restomenum.com/docs/events/user-events): Personel (staff) yaşam döngüsü: ekleme/düzenleme/silme. Async webhook. PII içerir — users:read + tenant consent gerektirir. actor.userId ile etkileşimi yapan kullanıcıyı personel kaydıyla eşleyebilirs - [Declarative Formlar (Native UI)](https://dev.restomenum.com/docs/forms): HTML/CSS yazmazsınız. Manifest'te formun şemasını (alanlar) bildirirsiniz; Restomenum onu panelde native gösterir, doldurtur ve değerleri size formData olarak iletir. Sonuç: tutarlı görünüm, güvenlik - [Gate iframe — resolve/close ZORUNLU](https://dev.restomenum.com/docs/gate-iframe): Bir hook'a iframe UI tanımladıysan (ör. table.close, packet.close), panel o iframe'i açıp BEKLER. Akışı devam ettirmek senin sayfanın sorumluluğundadır — sayfan App Bridge resolve/close çağırmazsa gat - [Gate Pending & Async Resolve](https://dev.restomenum.com/docs/gate-pending): Senkron gate penceresine (≤10 sn) sığmayan kararlar için: eklenti allow/deny yerine { decision:'pending' } döner → statü geçişi askıya alınır → eklenti hazır olunca gate-resolve ucunu çağırır → geçiş - [Yayına Alma (Go-Live) Kontrol Listesi](https://dev.restomenum.com/docs/go-live): Test mağazasında doğruladığın eklentiyi üretime taşırken değişenler (base URL, limitler, billing) ve yayın öncesi/sonrası kontrol listesi. DEV ile PROD bilinçli olarak farklıdır — bu sayfa geçişte atl - [4 · Action Hook (before-hook sözleşmesi)](https://dev.restomenum.com/docs/hook-impl): Before-hook, bir çekirdek işlem (ör. masa kapatma) gerçekleşmeden ÖNCE çalışan senkron bir kapıdır. Restomenum actionUrl'inize imzalı POST atar; siz allow/deny kararı dönersiniz ve işlem buna göre dev - [Hook'lar (Akış Kontrolü)](https://dev.restomenum.com/docs/hooks): Hook'lar, bir çekirdek işlemi (örn. masa kapatma) gerçekleşmeden önce araya girer: senin formunu/onayını bekler ve verdiğin karara göre işlem devam eder veya iptal olur. Event'lerin (async bildirim) a - [Paket Kapatma Gate’i — packet.close](https://dev.restomenum.com/docs/hooks/packet-close): Paket hesabı kapatılmadan önce sorulan before-action gate. table.close gibi TENANT-GENEL çalışır: SAHİPLİK ŞARTI YOKTUR — bu hook’u kaydeden her aktif eklenti, restoranın TÜM paket kapanışlarında (ken - [Paket Statü Gate'i — packet.status.update](https://dev.restomenum.com/docs/hooks/packet-status-update): Sipariş platformu tipi eklentiler için: packets/create ile oluşturduğunuz paketlerin statü geçişlerinde söz sahibi olun. Restoran paneli, sizin oluşturduğunuz bir paketin statüsünü değiştirmeden ÖNCE - [Masa Kapatma Gate’i — table.close](https://dev.restomenum.com/docs/hooks/table-close): Masa (dine-in) hesabı kapatılmadan ÖNCE araya giren before-hook. Restoran "Hesabı Kapat" dediğinde eklentinize senkron sorulur; allow/deny dönersiniz (deny → kapatma durur, message personele gösterili - [iframe Güvenliği (ZORUNLU)](https://dev.restomenum.com/docs/iframe-security): Custom UI sayfaların kötü niyetli sitelerce çerçevelenip (clickjacking) tenant oturumunun istismarını engellemek için iki kural zorunludur: (1) CSP frame-ancestors ile yalnız panel origin'ine izin ver - [Lifecycle Webhook'ları](https://dev.restomenum.com/docs/lifecycle): Kurulum, abonelik, teslim sağlığı ve GDPR (customer.redact) yaşam döngüsü event'leri, packet.created ile AYNI webhook ucuna düşer. Bunlara abone OLMAZSIN — bağlı (connected) kuruluma otomatik gönderil - [app.installed](https://dev.restomenum.com/docs/lifecycle/app-installed): Tenant kurulumu tamamlayıp OAuth connect ettiğinde gönderilir — eklentinin ilk sinyalidir. Ödeme beklemez; bağlanma yeter. data, kurulan sürümü ve tenant'ın onayladığı scope listesini taşır. - [app.uninstalled](https://dev.restomenum.com/docs/lifecycle/app-uninstalled): Tenant kurulumu kaldırdığında gönderilir — tek temizlik sinyalidir. Bu tenant'a ait TÜM veriyi silmelisin (GDPR). Sonrasında bu tenant için artık webhook gelmez. data boştur. - [customer.redact](https://dev.restomenum.com/docs/lifecycle/customer-redact): Tenant bir müşteriyi sildiğinde gönderilir — o customerId'ye ait tüm PII'yi (isim, telefon, adres, e-posta, notlar) kendi tarafında SİLMELİSİN (Shopify customers/redact paritesi; marketplace sözleşmes - [delivery.degraded](https://dev.restomenum.com/docs/lifecycle/delivery-degraded): Webhook endpoint'in art arda başarısız olunca circuit breaker açılır ve teslimler geçici atlanır (delivery-logs'ta skipped). Bu bildirim sorunu haber verir. Cooldown sonrası tek "probe" teslimi deneni - [delivery.disabled](https://dev.restomenum.com/docs/lifecycle/delivery-disabled): Circuit breaker kesintisiz 72 saat açık kalırsa webhook teslimi KALICI durdurulur. Callback API erişimin sürer (düzeltirken veri çekebilirsin) ama event/lifecycle teslimi gelmez. Geri açmak için: port - [delivery.restored](https://dev.restomenum.com/docs/lifecycle/delivery-restored): Circuit breaker kapanıp teslimler normale döndüğünde (başarılı probe, portal'dan yeniden etkinleştirme veya başarılı test-emit) gönderilir. Bilgilendirme amaçlıdır; aksiyon gerektirmez. 1 saatlik debo - [delivery.throttled](https://dev.restomenum.com/docs/lifecycle/delivery-throttled): Teslim hacmin kurulum başına cap'i (120/dk; toplu ürün/kategori event'leri 60/dk) aşınca, aşan teslimler 10 dakikaya kadar geciktirilir; tavanı aşanlar düşürülür (delivery-logs'ta dropped) ve bu bildi - [subscription.activated](https://dev.restomenum.com/docs/lifecycle/subscription-activated): Abonelik aktif (veya trial) olduğunda gönderilir — aktivasyonda ve her yenilemede. Premium yetkiyi bununla açarsın. ⚠️ Aynı abonelik için birden çok kez (farklı id'lerle) gelebilir; bu yüzden tenantId - [subscription.canceled](https://dev.restomenum.com/docs/lifecycle/subscription-canceled): Abonelik iptal edildiğinde gönderilir. Premium yetkiyi kapatırsın (deprovision). Ancak tenant hâlâ bağlı (connected) olabilir — veri silme app.uninstalled işidir, burada değil. data genelde boştur; ek - [subscription.past_due](https://dev.restomenum.com/docs/lifecycle/subscription-past-due): Yenileme ödemesi alınamadığında gönderilir (Stripe subscription.updated→past_due veya invoice.payment_failed). Premium özellikleri kısıtlarsın (degrade) ama tenant verisini SİLMEZSİN — ödeme düzelirse - [Limitler & Kotalar](https://dev.restomenum.com/docs/limits): Rate limit'ler, webhook teslim sınırları, senkron action/hook timeout'ları ve development store kotaları. DEV (test) ve PROD (canlı) değerleri FARKLIDIR — dev kasıtlı olarak sıkıdır (incelenmemiş kod - [Manifest Referansı](https://dev.restomenum.com/docs/manifest): Eklentinin tüm bildirimsel tanımı: istediği scope'lar, abone olduğu event'ler, eklediği UI (sayfa/menü/buton/form), akış-durduran hook'lar ve fiyatlandırma. Sunucu manifest'i normalize eder: yalnız wh - [Remote MCP — AI ile yönet](https://dev.restomenum.com/docs/mcp): Eklentini Claude gibi yapay zekâ asistanlarından yönet. Restomenum, OAuth 2.1 ile korunan bir remote MCP (Model Context Protocol) sunucusu sağlar: Claude'a bir URL ekler, kendi portal hesabınla bağlan - [Para Kazanma — Genel Bakış & Komisyon](https://dev.restomenum.com/docs/monetization): Eklenti iki modelle para kazanır: tenant'ın satın aldığı abonelik ve tek-seferlik uygulama-içi satın alma (IAP). Platform %30 komisyon alır; geliştirici net'in %70'ini alır. Tüm tutarlar kuruş cinsind - [In-App Purchase (IAP)](https://dev.restomenum.com/docs/monetization/iap): Tenant'tan tek-seferlik ödeme alın (premium kilit, kredi paketi vb.). Akış: purchases/create ile checkout başlatın → tenant Stripe Checkout'ta öder → purchase.granted webhook'u düşer (kilidi açın) → p - [Ödeme Alma (Payout)](https://dev.restomenum.com/docs/monetization/payout): Eklenti gelirin balancePending'de birikir; Stripe Connect Express ile banka hesabına aktarılır. KYC (kimlik + banka doğrulama) tamamen Stripe'ta yapılır — platform banka bilgini hiç görmez. - [Menü Öğeleri (nav)](https://dev.restomenum.com/docs/nav): nav[], eklentinin Restomenum panelinin menüsüne eklediği bağlantılardır. Her öğe bir Custom UI sayfasına (pages[].id) bağlanır; tenant menüden tıklayınca o sayfa iframe'de açılır. - [Custom UI Sayfaları (iframe)](https://dev.restomenum.com/docs/pages): Kendi arayüzünü Restomenum paneli içinde bir iframe olarak gösterirsin. Sayfayı sen barındırırsın; panel onu güvenli (sandboxed) bir iframe'de yükler. Veri alışverişi yalnız App Bridge (postMessage) ü - [Hızlı Başlangıç](https://dev.restomenum.com/docs/quickstart): İlk eklentini uçtan uca ayağa kaldırmak için en kısa yol. Her adım, kodun bulunduğu detay sayfasına bağlanır — bu sayfa yalnızca sırayı verir. Kavramsal harita için önce Mimari & Kavramlar'a göz at. - [Scope Referansı](https://dev.restomenum.com/docs/scopes): Eklentinin isteyebileceği yetkiler. Manifest'te requestedScopes[] içine eklenir; admin install'da bunların alt kümesini, tenant da onayını verir. Bir scope'a tıkla → detay sayfası. - [customers:read](https://dev.restomenum.com/docs/scopes/customers%3Aread): Müşteri verisi okuma (ad/telefon/adres) — PII. - [customers:write](https://dev.restomenum.com/docs/scopes/customers%3Awrite): Müşteri verisi yazma (PII) — uç kodu hazırlanıyor (YAKINDA). - [events:subscribe](https://dev.restomenum.com/docs/scopes/events%3Asubscribe): Webhook event aboneliği (manifest.events). Event almak için ZORUNLU. - [ingredients:read](https://dev.restomenum.com/docs/scopes/ingredients%3Aread): Malzeme/stok kataloğunu okuma (envanter; PII değil; satış/menü scope'larından ayrı). - [ingredients:write](https://dev.restomenum.com/docs/scopes/ingredients%3Awrite): Malzeme/stok kartı yazma (oluştur/güncelle/sil). - [orders:read](https://dev.restomenum.com/docs/scopes/orders%3Aread): Sipariş/adisyon verisini okuma (event + Callback API). - [orders:write](https://dev.restomenum.com/docs/scopes/orders%3Awrite): Sipariş/paket oluşturma (yazma uçları). - [packets:status](https://dev.restomenum.com/docs/scopes/packets%3Astatus): Paket sipariş durumunu değiştirme (yolda/teslim/iptal). - [payment_methods:read](https://dev.restomenum.com/docs/scopes/payment_methods%3Aread): Ödeme yöntemi tanımlarını okuma (config; satış orders:read'ten ayrı). - [payment_methods:write](https://dev.restomenum.com/docs/scopes/payment_methods%3Awrite): Ödeme yöntemi tanımı yazma (oluştur/güncelle/sil). - [products:read](https://dev.restomenum.com/docs/scopes/products%3Aread): Ürün/stok okuma. - [products:write](https://dev.restomenum.com/docs/scopes/products%3Awrite): Ürün ve kategori katalog yazma (oluştur/güncelle/sil). - [purchases:read](https://dev.restomenum.com/docs/scopes/purchases%3Aread): Kendi IAP (tek-seferlik satın alma) kayıtlarını okuma — PII DEĞİL (finansal/operasyonel). - [purchases:write](https://dev.restomenum.com/docs/scopes/purchases%3Awrite): Tek-seferlik (IAP) satın alma başlatma — tenant öder; PII DEĞİL. - [ui:button](https://dev.restomenum.com/docs/scopes/ui%3Abutton): Aksiyon butonu — panel slot'una buton (manifest.buttons). - [ui:form](https://dev.restomenum.com/docs/scopes/ui%3Aform): Declarative form/popup — Faz 3A. - [ui:nav](https://dev.restomenum.com/docs/scopes/ui%3Anav): Sol menüye öğe ekleme (manifest.nav). - [ui:page](https://dev.restomenum.com/docs/scopes/ui%3Apage): iframe Custom UI sayfası (App Bridge) (manifest.pages). - [ui:widget](https://dev.restomenum.com/docs/scopes/ui%3Awidget): Dashboard widget’ı — Faz 3A. - [users:read](https://dev.restomenum.com/docs/scopes/users%3Aread): Personel (kullanıcı) listesi okuma — PII. - [@restomenum/plugin-sdk](https://dev.restomenum.com/docs/sdk): Restomenum eklenti platformu için resmi TypeScript SDK'sı. Webhook imza doğrulama, OAuth token exchange, tipli Callback API istemcisi, event/scope katalogu ve tipler — tek pakette. Node 20+ (global fe - [5 · Session Token (iframe)](https://dev.restomenum.com/docs/session-token): Custom UI sayfan iframe içinde açıldığında, hangi tenant'ın baktığını App Bridge'den aldığın session token ile öğrenirsin. Token'ı backend'inde webhookSecret ile doğrularsın; böylece iframe'den gelen - [Kur / Ayarlar Sayfası](https://dev.restomenum.com/docs/settings-page): settingsPageId, kurulum sonrası ve eklenti ayarlarında tenant'a açılacak Custom UI sayfasını işaret eder. Onboarding (ör. API anahtarı, tercih) ve sonradan yapılandırma için tek giriş noktasıdır. - [2 · Token Exchange (/plugin-api/oauth/token)](https://dev.restomenum.com/docs/token): Connect'ten gelen tek-kullanımlık code'u, sunucu-sunucu bir istekle kalıcı credential'lara çevirirsin: apiKey, webhookSecret, tenantId ve gerçekten verilen scopes. Bu credential'ları tenant başına sak - [API Versiyonlama & Deprecation](https://dev.restomenum.com/docs/versioning): Eklenti sürümleme kuralları (semver), platform API'sinin uyumluluk sözleşmesi (neler kırıcı sayılır, neler sayılmaz) ve kırıcı değişikliklerin nasıl duyurulduğu. Entegrasyonunu bilinmeyen alanlara tol - [3 · /webhook Alıcısı](https://dev.restomenum.com/docs/webhook): Abone olduğun event'ler, imzalı POST olarak webhook endpoint'ine teslim edilir (asenkron, fire-and-forget). İmzayı doğrula, 2xx dön ve işle. 2xx dönmezsen Restomenum yeniden dener (retry). - [Webhook İmza Şeması](https://dev.restomenum.com/docs/webhook-signature): Restomenum'dan gelen her webhook ve hook isteği, tenant'a özel webhookSecret ile HMAC-SHA256 imzalanır. İmzayı doğrulamak, isteğin gerçekten Restomenum'dan geldiğini ve değiştirilmediğini garanti eder ## Diğer - [Tüm dokümanlar tek dosya (markdown)](https://dev.restomenum.com/llms-full.txt) - [Ana sayfa](https://dev.restomenum.com/)