@meeto/embed-core
@meeto/embed-core
Add free video calls to your website with one snippet. Meeto is a video call widget that embeds a complete call experience — lobby, screen sharing with annotations, chat, reactions and recordings — straight into your site. Your visitors join right in the browser, with no downloads and no sign-up. The free plan is included, no credit card required.
@meeto/embed-core is the zero-dependency, framework-agnostic core: a WebRTC video call SDK that mounts an iframe and talks to it over a typed postMessage bridge. Use it as a free live video chat widget for customer support, sales, telehealth video calls, online tutoring or community rooms — anywhere you'd otherwise wire up a video conferencing API for your website by hand.
Features
- Free video calls — the free plan is included with no credit card: up to 10 participants and 60-minute group calls. Pro lifts the limits (25 participants, 4K, hidden badge) only when you need it.
- Floating button or inline embed — drop a chat-style floating call button (bubble) in the corner, or embed the call inline in your own container.
- Persistent named rooms — route every visitor to a shared room by name ("support", "sales"), so a call is always waiting where you need it.
- Presence badge — the floating button shows how many people are currently in the room.
- Full in-call experience — screen sharing with annotations, chat, reactions and recordings, out of the box.
- 42 UI languages — the widget follows the visitor's browser language automatically, or set your own.
- Works with any framework — plain HTML, or the React / Vue / Angular wrappers built on this core.
Getting started
Create a free embed key at meeto.me/app and add your site's domain (the key is public and origin-locked to your domains).
Install:
npm install @meeto/embed-coreEmbed the call:
import { MeetoWidget } from "@meeto/embed-core"; const widget = new MeetoWidget({ key: "mk_live_…", // public key from your meeto.me dashboard container: "#call", // element or selector (give it a height) }); widget.on("joined", (e) => console.log("joined", e.room)); widget.on("left", (e) => console.log("left after", e.durationSec, "s"));
It also exports the <meeto-room> Web Component:
<meeto-room key="mk_live_…" style="display:block;height:520px"></meeto-room>
<script type="module">
import { registerMeetoElement } from "@meeto/embed-core";
registerMeetoElement();
</script>
For sites without a build step, a ready-made loader adds the widget with a single tag:
<script src="https://meeto.me/widget.js" data-key="mk_live_…" data-target="#call"></script>
Options
Pass these to new MeetoWidget({ … }):
| Option | Description |
|---|---|
key |
Public embed key (mk_live_…) from your dashboard. Required. |
container |
Element or CSS selector to mount into (not needed in bubble mode). |
mode |
"inline" (embed in your container, default) or "bubble" (floating call button). |
roomName |
Persistent named room — everyone with the same name shares one room. |
room |
Code of an existing room; if unset, the widget creates one and reuses it for the tab. |
name |
Default participant name, prefilled in the lobby. |
lang |
UI language (ru, en, de, …); defaults to the browser language. |
accent |
Accent color of the UI, hex (e.g. #27D6AA). |
position |
Corner of the bubble button: "bottom-right" (default) or "bottom-left". |
autoJoin |
Join immediately, skipping the lobby (open-door rooms only). |
baseUrl |
Meeto address for self-hosted installations (defaults to https://meeto.me). |
Events & methods
Subscribe with widget.on(type, handler) or the onEvent option:
| Event | Fires when |
|---|---|
ready |
The widget iframe has loaded and completed its handshake. |
phase |
The call phase changes (prejoin, room, finished, error). |
joined |
The visitor joins the call (carries the room code). |
left |
The visitor leaves (carries the reason and durationSec). |
participants |
The participant count changes. |
error |
An error occurs (carries code and message). |
Control the call imperatively:
| Method | Action |
|---|---|
join(name?) |
Join from the lobby programmatically. |
leave() |
Leave the call. |
setMicrophone(on) |
Toggle the microphone. |
setCamera(on) |
Toggle the camera. |
open() / close() |
Expand / collapse the bubble panel (no-op inline). |
destroy() |
Remove the iframe and all listeners. |
Links
- Docs: meeto.me/developers
- Live demo & playground: meeto.me/widget
- Dashboard: meeto.me/app
License
MIT