Widget Meeto: dokumentasi developer
Widget adalah iframe dari meeto.me dengan jembatan postMessage bertipe. Yang Anda butuhkan hanyalah kunci sematan publik — buat satu di dasbor.
Mulai cepat
Pilih stack Anda, ganti YOUR_KEY dengan kunci Anda, dan beri tinggi pada kontainer — widget mengisi 100% dari tinggi tersebut.
<div id="meeto-call" style="height: 520px"></div>
<script src="https://meeto.me/widget.js" data-key="YOUR_KEY" data-target="#meeto-call"></script>Paket npm: @meeto/embed-core (tanpa dependensi), @meeto/embed-react, @meeto/embed-vue, @meeto/embed-angular. Skrip widget.js biasa bekerja tanpa langkah build apa pun.
Parameter skrip
Atribut dari tag <script src="https://meeto.me/widget.js"> (* — wajib). Opsi yang sama tersedia di JavaScript API (key, container, room, name, lang, accent, autoJoin, baseUrl) dan sebagai atribut dari komponen web <meeto-room>.
| Parameter | Deskripsi |
|---|---|
| data-key* | Kunci sematan publik (mk_live_…) dari dasbor. |
| data-mode | inline (default, iframe di kontainer Anda) atau bubble — tombol panggilan mengambang di sudut halaman; tidak perlu kontainer. |
| data-target | Selektor CSS dari kontainer. Tanpa itu, sebuah blok setinggi 520px dibuat tepat setelah tag skrip. |
| data-room-name | Ruang bernama permanen: semua orang dengan cuplikan ini bertemu di ruang yang sama («support»). Pemilik kunci bergabung sebagai host dari dasbor. |
| data-position | Sudut bubble: bottom-right (default) atau bottom-left. |
| data-label | aria-label tombol bubble (widget tidak mengetahui bahasa situs Anda). |
| data-room | Kode ruang yang sudah ada (meeto.me/<code>). Tanpa itu, widget membuat ruang sendiri dan menggunakannya kembali di dalam tab. |
| data-name | Nama peserta yang sudah terisi di lobi. |
| data-lang | Bahasa antarmuka widget (en, ru, de, …). Default — bahasa browser pengunjung. |
| data-accent | Warna aksen, hex (mis. #27D6AA). |
| data-auto-join | Lewati lobi dan langsung bergabung (hanya ruang berpintu terbuka; kamera dan mikrofon menyala sejak awal). |
| data-base-url | Alamat Meeto untuk instalasi self-hosted. |
| data-accelerated | Penyematan siap isolasi yang disajikan dari call.meeto.me: efek kamera lebih cepat saat halaman Anda terisolasi dari asal lain (melalui COOP/COEP). Tanpa COOP/COEP, widget berjalan persis seperti penyematan bawaan. |
Tautan ruang tetap valid: ruang widget mana pun juga dapat dibuka di meeto.me/<code>.
Event dan metode
Berlangganan melalui widget.on(type, handler) (mengembalikan fungsi untuk berhenti berlangganan), opsi onEvent, props komponen framework, atau CustomEvent meeto:* dari elemen <meeto-room>.
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));| Event | Payload |
|---|---|
| ready | — — widget dimuat dan terhubung ke halaman |
| phase | { phase: "prejoin" | "room" | "finished" | "error" } — layar berubah (lobby, call, finished, error) |
| joined | { room, identity } — pengunjung bergabung ke panggilan |
| left | { reason, durationSec } — pengunjung meninggalkan panggilan (reason: left, ended, kicked, connection) |
| participants | { count } — jumlah peserta berubah |
| error | { code, message } — widget tidak dapat memulai (kunci salah, domain tidak terdaftar, …) |
Metode instance widget:
| Metode | Deskripsi |
|---|---|
| join(name?) | Bergabung ke panggilan dari lobi secara terprogram (ruang berpintu terbuka). |
| leave() | Meninggalkan panggilan. |
| setMicrophone(on) | Nyalakan/matikan mikrofon selama panggilan. |
| setCamera(on) | Nyalakan/matikan kamera selama panggilan. |
| destroy() | Hapus iframe dan semua langganan. |
Di ruang dengan ketukan, kata sandi, atau kunci, join() menahan pengunjung di lobi dan widget memancarkan error dengan kode join_not_allowed — sebagai gantinya, biarkan pengunjung bergabung sendiri dari lobi.
API server
Untuk alur di sisi server (membuat ruang dari backend Anda, mengirim tautan lewat email, menentukan siapa yang menjadi host) gunakan kunci rahasia mk_secret_… — kunci ini ditampilkan sekali saat Anda membuat sematan:
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 menjadikan pemegangnya sebagai host ruang: teruskan ruang ke widget melalui data-room, dan berikan hostSecret hanya kepada staf Anda sendiri. Permintaan dengan kunci rahasia melewati pemeriksaan domain — jangan pernah menampilkannya dalam kode browser.
API berversi (/api/v1) tersedia pada paket Pro: permintaan dengan kunci akun Free menerima 402 plan_required. Widget itu sendiri berfungsi di semua paket.
SDK seluler (iOS / Android)
Pembungkus native menyematkan widget yang sama ke aplikasi Anda: WebView dengan jembatan event/perintah bertipe. Daftarkan origin aplikasi app://<bundle-id> di domain kunci.
iOS (Swift Package, iOS 14+)
// Xcode → File → Add Package Dependencies…
https://github.com/meeto-app/meeto-widget-ios.git // from: 0.1.2import MeetoWidget
MeetoWidget(config: .init(key: "mk_live_…", roomName: "support")) { event in
if event.type == "left" { /* close the screen */ }
}Swift Package; tambahkan NSCameraUsageDescription dan NSMicrophoneUsageDescription ke Info.plist.
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"))Modul Gradle; deklarasikan CAMERA / RECORD_AUDIO / INTERNET dan minta izin runtime sebelum menampilkan widget.
Event (ready, joined, left, participants, error) dan perintah (join, leave, setMicrophone, setCamera) identik dengan SDK web.
Kode sumber dan rilis: meeto-app/meeto-widget-ios ↗meeto-app/meeto-widget-android ↗
Plugin WordPress
Tambahkan widget ke situs WordPress tanpa menulis kode: tombol panggilan mengambang di setiap halaman atau panggilan inline melalui shortcode.
Unduh meeto-widget.zip- Di admin WordPress, buka Plugin → Tambah Baru → Unggah Plugin dan unggah zip.
- Aktifkan plugin dan buka Pengaturan → Meeto Widget.
- Tempel kunci embed Anda (dengan domain situs Anda ditambahkan padanya) — tombol panggilan aktif.
Untuk widget inline, nonaktifkan penyisipan otomatis di pengaturan dan letakkan shortcode ke halaman mana pun: [meeto_widget room_name="support" height="600"]
Batas
Ruang widget mengikuti paket pemilik kunci:
- Gratis — hingga 10 peserta, panggilan grup hingga 60 menit, hingga 1080p.
- Pro — hingga 25 peserta, tanpa batas waktu untuk 2 rapat bersamaan, dan hingga 4K di desktop yang didukung. Branding Meeto tetap terlihat.
Keamanan
- Kunci publik bukan rahasia: kunci ini terlihat di kode sumber halaman Anda, dan itu memang disengaja.
- Widget hanya berfungsi di domain yang terdaftar untuk kunci tersebut. Browser melaporkan origin situs yang menyematkan dengan cara yang tidak bisa dipalsukan oleh halaman (postMessage event.origin), dan backend Meeto memeriksanya.
- Kunci rahasia mk_secret_… disimpan dalam bentuk hash dan hanya ditampilkan sekali. Gunakan secara eksklusif dari server ke server.
- Kunci yang bocor atau tidak terpakai dapat dicabut di dasbor kapan saja — widget langsung berhenti.
FAQ
Framework mana yang didukung?
Semua. HTML biasa melalui widget.js, React/Next.js, Vue/Nuxt, dan Angular melalui paket npm, semua lainnya melalui komponen web <meeto-room>.
Apakah bekerja dengan Meeto self-hosted?
Ya: arahkan data-base-url (atau opsi baseUrl) ke instalasi Anda.
Bisakah saya menghapus “Didukung oleh Meeto”?
Tidak. Lencana “Powered by Meeto” tetap terlihat di semua paket, termasuk Pro dan Team.
Ukuran apa saja yang didukung widget?
Semua: iframe mengisi kontainernya. Di kontainer sempit, antarmuka otomatis beralih ke tata letak ringkas.