Meeto Widget : documentation développeur
Le widget est un iframe de meeto.me avec un pont postMessage typé. Tout ce dont vous avez besoin, c’est d’une clé d’intégration publique — créez-en une dans le tableau de bord.
Démarrage rapide
Choisissez votre stack, remplacez YOUR_KEY par votre clé et donnez une hauteur au conteneur — le widget la remplit à 100 %.
<div id="meeto-call" style="height: 520px"></div>
<script src="https://meeto.me/widget.js" data-key="YOUR_KEY" data-target="#meeto-call"></script>Paquets npm : @meeto/embed-core (sans dépendances), @meeto/embed-react, @meeto/embed-vue, @meeto/embed-angular. Le script simple widget.js fonctionne sans aucune étape de build.
Paramètres du script
Attributs de la balise <script src="https://meeto.me/widget.js"> (* — obligatoire). Les mêmes options existent dans l’API JavaScript (key, container, room, name, lang, accent, autoJoin, baseUrl) et comme attributs du composant web <meeto-room>.
| Paramètre | Description |
|---|---|
| data-key* | Clé d’intégration publique (mk_live_…) du tableau de bord. |
| data-mode | inline (par défaut, iframe dans votre conteneur) ou bubble — un bouton d’appel flottant dans le coin de la page ; aucun conteneur nécessaire. |
| data-target | Sélecteur CSS du conteneur. Sans lui, un bloc de 520 px de haut est créé juste après la balise du script. |
| data-room-name | Salle nommée permanente : toute personne disposant de cet extrait se retrouve dans la même salle («support»). Le propriétaire de la clé rejoint en tant qu’hôte depuis le tableau de bord. |
| data-position | Coin du bouton flottant : bottom-right (par défaut) ou bottom-left. |
| data-label | aria-label du bouton flottant (le widget ne connaît pas la langue de votre site). |
| data-room | Code d’une salle existante (meeto.me/<code>). Sans lui, le widget crée lui-même une salle et la réutilise au sein de l’onglet. |
| data-name | Nom du participant prérempli dans la salle d’attente. |
| data-lang | Langue de l’interface du widget (en, ru, de, …). Par défaut — la langue du navigateur du visiteur. |
| data-accent | Couleur d’accent, hex (par ex. #27D6AA). |
| data-auto-join | Ignorer la salle d’attente et rejoindre immédiatement (salles à porte ouverte uniquement ; la caméra et le micro démarrent activés). |
| data-base-url | Adresse Meeto pour les installations auto-hébergées. |
| data-accelerated | Intégration compatible avec l’isolation, servie depuis call.meeto.me : effets caméra plus rapides lorsque votre page est isolée des autres origines (en-têtes COOP/COEP). Sans ces en-têtes, le widget fonctionne exactement comme l’intégration par défaut. |
Les liens de salle restent valides : toute salle du widget peut aussi être ouverte sur meeto.me/<code>.
Événements et méthodes
Abonnez-vous via widget.on(type, handler) (renvoie une fonction de désabonnement), l’option onEvent, les props du composant du framework ou les CustomEvents meeto:* de l’élément <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));| Événement | Payload |
|---|---|
| ready | — — le widget est chargé et connecté à la page |
| phase | { phase: "prejoin" | "room" | "finished" | "error" } — l’écran a changé (lobby, call, finished, error) |
| joined | { room, identity } — le visiteur a rejoint l’appel |
| left | { reason, durationSec } — le visiteur a quitté l’appel (reason : left, ended, kicked, connection) |
| participants | { count } — le nombre de participants a changé |
| error | { code, message } — le widget ne peut pas démarrer (mauvaise clé, domaine non enregistré, …) |
Méthodes de l’instance du widget :
| Méthode | Description |
|---|---|
| join(name?) | Rejoindre l’appel depuis la salle d’attente par programmation (salles à porte ouverte). |
| leave() | Quitter l’appel. |
| setMicrophone(on) | Activer ou couper le micro pendant l’appel. |
| setCamera(on) | Activer ou couper la caméra pendant l’appel. |
| destroy() | Supprimer l’iframe et tous les abonnements. |
Dans une salle où il faut frapper, saisir un mot de passe ou dont l’entrée est verrouillée, join() laisse le visiteur dans la salle d’attente et le widget émet error avec le code join_not_allowed — laissez-le plutôt rejoindre lui-même depuis la salle d’attente.
API serveur
Pour les flux côté serveur (créer des salles depuis votre backend, envoyer des liens par e-mail, décider qui devient l’hôte), utilisez la clé secrète mk_secret_… — elle s’affiche une fois à la création de l’intégration :
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 fait de son porteur l’hôte de la salle : transmettez la salle au widget via data-room et ne confiez hostSecret qu’à votre propre personnel. Les requêtes avec la clé secrète ignorent la vérification de domaine — ne l’exposez jamais dans le code du navigateur.
L’API versionnée (/api/v1) est disponible avec le forfait Pro : les requêtes avec la clé d’un compte Free reçoivent 402 plan_required. Le widget lui-même fonctionne avec tous les forfaits.
SDK mobiles (iOS / Android)
Les wrappers natifs intègrent le même widget dans votre application : une WebView avec un pont d’événements/commandes typé. Enregistrez l’origine de l’application app://<bundle-id> dans les domaines de la clé.
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 ; ajoutez NSCameraUsageDescription et NSMicrophoneUsageDescription à 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"))Module Gradle ; déclarez CAMERA / RECORD_AUDIO / INTERNET et demandez les autorisations à l’exécution avant d’afficher le widget.
Les événements (ready, joined, left, participants, error) et les commandes (join, leave, setMicrophone, setCamera) sont identiques au SDK web.
Code source et versions : meeto-app/meeto-widget-ios ↗meeto-app/meeto-widget-android ↗
Extension WordPress
Ajoutez le widget à un site WordPress sans écrire de code : un bouton d’appel flottant sur chaque page ou un appel intégré via un shortcode.
Télécharger meeto-widget.zip- Dans l’administration de WordPress, ouvrez Extensions → Ajouter → Téléverser une extension et téléversez le zip.
- Activez l’extension et ouvrez Réglages → Meeto Widget.
- Collez votre clé d’intégration (avec le domaine de votre site ajouté) — le bouton d’appel est actif.
Pour un widget intégré, désactivez l’insertion automatique dans les réglages et placez le shortcode dans n’importe quelle page : [meeto_widget room_name="support" height="600"]
Limites
Les salles du widget suivent l’offre du propriétaire de la clé :
- Gratuit — jusqu’à 10 participants, appels de groupe jusqu’à 60 minutes, jusqu’à 1080p.
- Pro — jusqu’à 25 participants, sans limite de temps pour 2 réunions simultanées et jusqu’à 4K sur les ordinateurs de bureau compatibles. La marque Meeto reste visible.
Sécurité
- La clé publique n’est pas un secret : elle est visible dans le code source de votre page, c’est voulu.
- Le widget ne fonctionne que sur les domaines enregistrés pour la clé. Le navigateur signale l’origine du site intégrateur d’une manière que les pages ne peuvent pas falsifier (postMessage event.origin), et le backend Meeto la vérifie.
- La clé secrète mk_secret_… est stockée hachée et affichée une seule fois. Utilisez-la exclusivement de serveur à serveur.
- Une clé divulguée ou inutilisée peut être révoquée dans le tableau de bord à tout moment — le widget s’arrête instantanément.
FAQ
Quels frameworks sont pris en charge ?
Tous. HTML pur via widget.js, React/Next.js, Vue/Nuxt et Angular via des paquets npm, tout le reste via le composant web <meeto-room>.
Est-ce que ça fonctionne avec un Meeto auto-hébergé ?
Oui : pointez data-base-url (ou l’option baseUrl) vers votre installation.
Puis-je retirer « Powered by Meeto » ?
Non. Le badge « Powered by Meeto » reste visible sur toutes les offres, y compris Pro et Team.
Quelles tailles le widget prend-il en charge ?
Toutes : l’iframe remplit son conteneur. Dans les conteneurs étroits, l’interface passe automatiquement en disposition compacte.