Meeto Widget: geliştirici belgeleri

Widget, türlenmiş bir postMessage köprüsüne sahip bir meeto.me iframe'idir. Tek ihtiyacın olan açık bir embed anahtarı — panelde bir tane oluştur.

Hızlı başlangıç

Stack'ini seç, YOUR_KEY'i anahtarınla değiştir ve konteynere bir yükseklik ver — widget onun %100'ünü doldurur.

<div id="meeto-call" style="height: 520px"></div>
<script src="https://meeto.me/widget.js" data-key="YOUR_KEY" data-target="#meeto-call"></script>

npm paketleri: @meeto/embed-core (bağımlılıksız), @meeto/embed-react, @meeto/embed-vue, @meeto/embed-angular. Sade widget.js script'i herhangi bir build adımı olmadan çalışır.

Script parametreleri

<script src="https://meeto.me/widget.js"> etiketinin öznitelikleri (* — zorunlu). Aynı seçenekler JavaScript API'sinde (key, container, room, name, lang, accent, autoJoin, baseUrl) ve <meeto-room> web bileşeninin öznitelikleri olarak da bulunur.

ParametreAçıklama
data-key*Panelden açık embed anahtarı (mk_live_…).
data-modeinline (varsayılan, kendi kapsayıcınızda iframe) veya bubble — sayfanın köşesinde yüzen bir arama düğmesi; kapsayıcı gerekmez.
data-targetKonteynerin CSS seçicisi. Bu olmadan, script etiketinin hemen ardından 520px yüksekliğinde bir blok oluşturulur.
data-room-nameKalıcı adlandırılmış oda: bu kod parçasına sahip herkes aynı odada buluşur («support»). Anahtarın sahibi panelden host olarak katılır.
data-positionBalon köşesi: bottom-right (varsayılan) veya bottom-left.
data-labelBalon düğmesinin aria-label değeri (widget, sitenizin dilini bilmez).
data-roomVar olan bir odanın kodu (meeto.me/<code>). Bu olmadan widget odayı kendisi oluşturur ve sekme içinde yeniden kullanır.
data-nameLobide önceden doldurulan katılımcı adı.
data-langWidget arayüzü dili (en, ru, de, …). Varsayılan — ziyaretçinin tarayıcı dili.
data-accentVurgu rengi, hex (ör. #27D6AA).
data-auto-joinLobiyi atla ve hemen katıl (yalnızca açık kapılı odalar; kamera ve mikrofon açık başlar).
data-base-urlSelf-hosted kurulumlar için Meeto adresi.
data-acceleratedcall.meeto.me üzerinden sunulan, izolasyona hazır gömme: sayfanız diğer kaynaklardan izole edildiğinde (COOP/COEP başlıkları) kamera efektleri daha hızlı çalışır. Bu başlıklar olmadan widget, varsayılan gömme ile tamamen aynı şekilde çalışır.

Oda bağlantıları geçerli kalır: herhangi bir widget odası meeto.me/<code> adresinden de açılabilir.

Olaylar ve yöntemler

widget.on(type, handler) (bir abonelikten çıkma fonksiyonu döndürür), onEvent seçeneği, framework bileşeni props'ları ya da <meeto-room> öğesinin meeto:* CustomEvents'leri aracılığıyla abone ol.

const widget = new MeetoWidget({ key: "mk_live_…", container: "#call" });
const off = widget.on("joined", (e) => console.log(e.room));
widget.on("participants", (e) => console.log("in call:", e.count));
OlayPayload
ready— — widget yüklendi ve sayfaya bağlandı
phase{ phase: "prejoin" | "room" | "finished" | "error" } — ekran değişti (lobby, call, finished, error)
joined{ room, identity } — ziyaretçi aramaya katıldı
left{ reason, durationSec } — ziyaretçi aramadan ayrıldı (reason: left, ended, kicked, connection)
participants{ count } — katılımcı sayısı değişti
error{ code, message } — widget başlayamıyor (hatalı anahtar, kayıtlı olmayan alan adı, …)

Widget örneğinin yöntemleri:

YöntemAçıklama
join(name?)Lobiden aramaya programatik olarak katıl (açık kapılı odalar).
leave()Aramadan ayrıl.
setMicrophone(on)Arama sırasında mikrofonu aç/kapat.
setCamera(on)Arama sırasında kamerayı aç/kapat.
destroy()iframe'i ve tüm abonelikleri kaldır.

Kapı çalma, şifre veya kilit olan bir odada join() ziyaretçiyi lobide tutar ve widget join_not_allowed koduyla error yayar — bunun yerine ziyaretçinin lobiden kendisinin katılmasını sağlayın.

Sunucu API'si

Sunucu tarafı akışlar için (arka ucundan oda oluşturma, bağlantıları e-postayla gönderme, kimin sunucu olacağına karar verme) gizli anahtar mk_secret_…'i kullan — embed'i oluşturduğunda bir kez gösterilir:

curl -X POST https://api.meeto.me/api/embed/rooms \
  -H "Authorization: Bearer mk_secret_…"
# → 201 { "slug": "misty-fox-42", "hostSecret": "…" }
curl -X POST https://api.meeto.me/api/v1/meetings \
  -H "Authorization: Bearer mk_secret_…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: appointment-872" \
  -d '{
    "title": "Project review",
    "startsAt": "2027-03-22T10:00:00+02:00",
    "durationMin": 45,
    "timezone": "Europe/Tallinn"
  }'
# → 201 { "meeting": { "id": "…", "joinUrl": "https://meeto.me/…?k=…" }, "hostSecret": "…" }

curl https://api.meeto.me/api/v1/meetings \
  -H "Authorization: Bearer mk_secret_…"

hostSecret, onu taşıyanı odanın sahibi yapar: odayı widget'a data-room ile ilet ve hostSecret'i yalnızca kendi personeline ver. Gizli anahtarla yapılan istekler alan adı kontrolünü atlar — onu asla tarayıcı kodunda açığa çıkarma.

Sürümlü API (/api/v1) Pro planında kullanılabilir: Free hesabın anahtarıyla yapılan istekler 402 plan_required yanıtı alır. Widget'ın kendisi her planda çalışır.

Mobil SDK’lar (iOS / Android)

Yerel sarmalayıcılar aynı widget’ı uygulamanıza gömer: türlenmiş bir olay/komut köprüsüne sahip bir WebView. Uygulama origin’i app://<bundle-id> değerini anahtarın alan adlarına kaydedin.

iOS (Swift Package, iOS 14+)

// Xcode → File → Add Package Dependencies…
https://github.com/meeto-app/meeto-widget-ios.git   // from: 0.1.2
import MeetoWidget

MeetoWidget(config: .init(key: "mk_live_…", roomName: "support")) { event in
    if event.type == "left" { /* close the screen */ }
}

Swift Package; Info.plist dosyasına NSCameraUsageDescription ve NSMicrophoneUsageDescription ekleyin.

Android (Kotlin, minSdk 24)

// settings.gradle.kts
dependencyResolutionManagement { repositories { maven("https://jitpack.io") } }

// module's build.gradle.kts
dependencies { implementation("com.github.meeto-app:meeto-widget-android:0.1.3") }
val widget = MeetoWidgetView(this)
widget.onEvent = { event -> if (event.type == "left") finish() }
container.addView(widget)
widget.load(MeetoWidgetConfig(key = "mk_live_…", roomName = "support"))

Gradle modülü; CAMERA / RECORD_AUDIO / INTERNET izinlerini tanımlayın ve widget’ı göstermeden önce çalışma zamanı izinlerini isteyin.

Olaylar (ready, joined, left, participants, error) ve komutlar (join, leave, setMicrophone, setCamera) web SDK ile aynıdır.

Kaynak kodu ve sürümler: meeto-app/meeto-widget-ios ↗meeto-app/meeto-widget-android ↗

WordPress eklentisi

Widget’ı bir WordPress sitesine kod yazmadan ekleyin: her sayfada kayan bir arama düğmesi veya bir shortcode ile satır içi arama.

meeto-widget.zip dosyasını indir
  1. WordPress yönetim panelinde Eklentiler → Yeni Ekle → Eklenti Yükle bölümünü açın ve zip dosyasını yükleyin.
  2. Eklentiyi etkinleştirin ve Ayarlar → Meeto Widget bölümünü açın.
  3. Yerleştirme anahtarınızı (sitenizin alan adı eklenmiş olarak) yapıştırın — arama düğmesi yayında.

Satır içi bir widget için ayarlarda otomatik eklemeyi kapatın ve shortcode’u herhangi bir sayfaya yerleştirin: [meeto_widget room_name="support" height="600"]

Sınırlar

Widget odaları anahtar sahibinin planına uyar:

  • Free — 10 katılımcıya kadar, 60 dakikaya kadar grup aramaları, 1080p'ye kadar.
  • Pro — 25 katılımcıya kadar, aynı anda 2 toplantı için süre sınırı yok ve desteklenen masaüstü bilgisayarlarda 4K'ya kadar. Meeto markası görünür kalır.

Güvenlik

  • Açık anahtar bir sır değildir: sayfanın kaynağında görünür, bu tasarım gereğidir.
  • Widget yalnızca anahtar için kayıtlı alan adlarında çalışır. Tarayıcı, gömülü sitenin origin'ini sayfaların sahteleyemeyeceği bir biçimde bildirir (postMessage event.origin) ve Meeto arka ucu bunu doğrular.
  • Gizli anahtar mk_secret_… karma (hash) olarak saklanır ve yalnızca bir kez gösterilir. Onu yalnızca sunucudan sunucuya kullan.
  • Sızmış ya da kullanılmayan bir anahtar panelde her an iptal edilebilir — widget anında durur.

SSS

Hangi framework'ler destekleniyor?

Hepsi. widget.js ile sade HTML, npm paketleri ile React/Next.js, Vue/Nuxt ve Angular, geri kalan her şey <meeto-room> web bileşeni ile.

Self-hosted bir Meeto ile çalışır mı?

Evet: data-base-url'yi (ya da baseUrl seçeneğini) kendi kurulumuna yönlendir.

“Powered by Meeto”yu kaldırabilir miyim?

Hayır. “Powered by Meeto” rozeti Pro ve Team dâhil tüm planlarda görünür kalır.

Widget hangi boyutları destekler?

Hepsini: iframe konteynerini doldurur. Dar konteynerlerde arayüz otomatik olarak kompakt düzene geçer.