Intégrer LIRI dans votre application
LIRI est le moteur live & IA de Cimolace. Il s'intègre dans n'importe quel site existant via SDK JavaScript, iframe embed, ou API REST. Cette doc couvre tout : quickstart, SDK, embed, API publique, webhooks, et facturation LIRI Credits.
Vue d'ensemble
LIRI est le moteur live & IA universel de Cimolace. Il réunit vidéo HD (LiveKit), Studio créateur, Smartboard interactif, Masterclass Factory, multilingue temps réel, recall & transcription, TTS/STT premium, le tout exposé via 3 canaux d'intégration :
- SDK JavaScript — 6 lignes HTML collées dans votre site.
- Embed widget (iframe) — pour les CMS qui bloquent les scripts tiers (Webflow strict, Squarespace).
- API REST publique — pour reconstruire votre propre UI au-dessus de LIRI.
Tous les modes s'authentifient via une clé API tenant (préfixe lk_) générée dans votre dashboard. La facturation IA passe par LIRI Credits (quota mensuel inclus dans votre plan + packs de recharge).
URLs officielles
| Service | URL |
|---|---|
| API REST | https://api.cimolace.space |
| Embed widget | https://embed.cimolace.space |
| SDK JavaScript | https://cimolace.space/liri-sdk.js |
| Dashboard tenant | https://cimolace.space/tenant/admin |
| Swagger / OpenAPI | https://api.cimolace.space/docs |
Quickstart (5 minutes)
Du zéro à un live LIRI dans votre site en 5 étapes.
1. Créez votre tenant
Rendez-vous sur cimolace.space/onboarding, créez votre espace (gratuit, 500 crédits IA offerts) et notez votre slug tenant (ex : mon-ecole).
2. Générez une clé API publique
Dans le dashboard tenant → Réglages → Clés API, créez une clé publique lk_pub_... (utilisable côté front, scope limité). Pour les opérations sensibles côté serveur, utilisez une clé lk_sec_....
3. Collez le snippet dans votre site
<script src="https://cimolace.space/liri-sdk.js"></script>
<div id="liri-live" data-tenant="mon-ecole" data-mode="live"></div>
<script>
LIRI.init({
tenant: "mon-ecole",
apiKey: "lk_pub_xxxxxxxxxxxx"
});
LIRI.start("liri-live");
</script>4. Ouvrez votre page
LIRI affiche le bouton « Rejoindre la session ». Au clic, il ouvre une room LiveKit HD avec chat, partage d'écran, et l'assistant IA actif.
5. (Optionnel) Configurez un webhook
Dans Réglages → Webhooks, ajoutez l'URL de votre endpoint et choisissez les events (session.started, session.ended,transcript.ready...). Voir section Webhooks.
Architecture
LIRI tourne sur 3 couches techniques découplées :
- API NestJS (
api.cimolace.space) — héberge la logique métier, les endpoints publics, le webhook Stripe, et fait le pont avec Supabase + LiveKit. - Edge Functions Supabase — pour les opérations IA latentes (TTS, STT, multilang, génération slides, Smartboard).
- LiveKit Cloud — serveurs WebRTC SFU pour la vidéo HD multi-participants.
Le SDK et l'embed côté client communiquent uniquement avec l'API REST. Aucune donnée tenant ne transite en clair.
Modes LIRI
LIRI expose 6 modes principaux. Vous les sélectionnez via data-mode sur le SDK ou via l'URL d'embed.
| Mode | Description | data-mode |
|---|---|---|
| Live | Visio HD multi-participants, chat, partage écran | live |
| Studio | Présentation slides + IA assistant live | studio |
| Smartboard | Tableau blanc collaboratif + OCR + IA | smartboard |
| Masterclass | Cours scénarisé généré par IA, format série | masterclass |
| Coach | 1-to-1 coaching avec assistant IA dédié | coach |
| Webinar | Live broadcast 1-to-many, chat modéré, billetterie | webinar |
Authentification
LIRI utilise 2 types de clés API et 1 type de JWT participant.
Clés API tenant
| Type | Préfixe | Usage |
|---|---|---|
| Publique | lk_pub_ | Front (SDK, embed). Scope limité : démarrer sessions, lire pricing. |
| Secrète | lk_sec_ | Serveur uniquement. Tout l'API REST, masterclass, exports. |
Header HTTP : X-API-Key: lk_sec_...
JWT participant
Pour identifier un utilisateur final (nom affiché, rôle host/viewer, avatar), votre serveur génère un JWT signé avec votre clé secrète, puis passe ce JWT au SDK :
LIRI.init({
tenant: "mon-ecole",
apiKey: "lk_pub_...",
userToken: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
});SDK JavaScript
Le SDK liri-sdk.js (~24 ko gzip) gère pour vous : chargement du widget, auth, WebRTC, fallbacks, theming. Compatible tout navigateur evergreen.
Installation
<script src="https://cimolace.space/liri-sdk.js" defer></script>API
LIRI.init({
tenant: "mon-ecole",
apiKey: "lk_pub_xxxxxxxxxxxx",
theme: "light", // ou "dark" | "auto"
locale: "fr", // fr, en, es, de, it, pt, nl, ar, ja, ko, zh, ru
});
LIRI.start("liri-live", {
mode: "live", // live | studio | smartboard | masterclass | coach | webinar
room: "salle-101", // identifiant unique de session
role: "host", // host | viewer
});Embed widget (iframe)
Quand votre CMS interdit les scripts tiers (Squarespace, Webflow strict, certains LMS), utilisez l'embed iframe. Tout fonctionne pareil mais hébergé sous embed.cimolace.space.
URL format
https://embed.cimolace.space/{mode}?tenant={slug}&apiKey={pub}&room={id}&role={host|viewer}Exemple
<iframe
src="https://embed.cimolace.space/live?tenant=mon-ecole&apiKey=lk_pub_xxx&room=salle-101&role=host"
width="100%"
height="640"
allow="camera; microphone; display-capture; autoplay"
style="border:0; border-radius:12px"
></iframe>Paramètres URL
| Paramètre | Requis | Description |
|---|---|---|
tenant | oui | Slug de votre tenant |
apiKey | oui | Clé publique lk_pub_... |
room | oui | Identifiant unique de session |
role | oui | host ou viewer |
theme | non | light | dark | auto |
locale | non | fr, en, es... |
userToken | non | JWT participant signé (voir Auth) |
WordPress
2 méthodes : un shortcode via le plugin LIRI officiel, ou collage manuel du SDK.
Méthode A — Plugin (recommandé)
- Téléchargez
liri-wp.zipdepuis votre dashboard tenant. - WP Admin → Extensions → Ajouter → Téléverser le ZIP → Activer.
- Réglages → LIRI : collez votre tenant slug + clé
lk_pub_.... - Dans n'importe quelle page/article :
[liri mode="live" room="cours-maths-101"]Méthode B — SDK manuel
Activez le bloc HTML personnalisé Gutenberg et collez le quickstart ci-dessus.
Wix
Wix supporte l'iframe via le widget HTML Embed (anciennement « iFrame »).
- Wix Editor → + Ajouter → Embed → HTML iframe.
- Mode « URL externe », collez l'URL embed :
https://embed.cimolace.space/live?tenant=mon-ecole&apiKey=lk_pub_xxx&room=salon-vipWix bloque par défaut les permissions caméra/micro. Dans les paramètres du widget, cochez Allow camera + Allow microphone + Allow display-capture.
React / Next.js
Le SDK fonctionne en React via un effet d'init. Voici un composant prêt à coller :
"use client";
import { useEffect, useRef } from "react";
declare global { interface Window { LIRI: any } }
export function LiriLive({ tenant, apiKey, room, role = "viewer" }: {
tenant: string; apiKey: string; room: string; role?: "host"|"viewer";
}) {
const containerId = `liri-${room}`;
const initialized = useRef(false);
useEffect(() => {
if (initialized.current) return;
const script = document.createElement("script");
script.src = "https://cimolace.space/liri-sdk.js";
script.async = true;
script.onload = () => {
window.LIRI.init({ tenant, apiKey });
window.LIRI.start(containerId, { mode: "live", room, role });
initialized.current = true;
};
document.head.appendChild(script);
return () => { window.LIRI?.destroy?.(); };
}, [tenant, apiKey, room, role, containerId]);
return <div id={containerId} style={{ minHeight: 640 }} />;
}API REST — Authentification
Toutes les requêtes au-delà des endpoints publics nécessitent une clé secrète tenant en header.
X-API-Key: lk_sec_xxxxxxxxxxxxxxxxxxxxxLes endpoints publics (lecture pricing, packs) ne nécessitent aucune auth. Les endpoints "tenant-scoped" (data utilisateur, sessions) demandent en plus :
X-Tenant-Slug: mon-ecoleSessions live
POST /liri/sessions — Créer une session
curl -X POST https://api.cimolace.space/liri/sessions \
-H "X-API-Key: lk_sec_xxxxxxx" \
-H "X-Tenant-Slug: mon-ecole" \
-H "Content-Type: application/json" \
-d '{
"mode": "live",
"title": "Cours de maths — Algèbre",
"scheduled_at": "2026-06-01T14:00:00Z",
"max_participants": 30,
"record": true
}'Réponse
{
"id": "sess_abc123",
"mode": "live",
"title": "Cours de maths — Algèbre",
"room_url": "https://embed.cimolace.space/live?tenant=mon-ecole&room=sess_abc123",
"status": "scheduled",
"scheduled_at": "2026-06-01T14:00:00Z",
"max_participants": 30,
"record": true,
"created_at": "2026-05-29T11:30:00Z"
}Autres endpoints sessions
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /liri/sessions | Liste paginée |
| GET | /liri/sessions/:id | Détail + participants |
| PATCH | /liri/sessions/:id | Modifier titre, horaire, max |
| POST | /liri/sessions/:id/end | Terminer + générer replay |
| DELETE | /liri/sessions/:id | Annuler (avant démarrage) |
Tokens participants
Générez un token participant signé pour identifier l'utilisateur dans la session :
curl -X POST https://api.cimolace.space/liri/sessions/sess_abc123/tokens \
-H "X-API-Key: lk_sec_xxx" \
-H "X-Tenant-Slug: mon-ecole" \
-d '{
"user_id": "user_42",
"name": "Alice Martin",
"role": "viewer",
"ttl_seconds": 3600
}'{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expires_at": "2026-06-01T15:00:00Z",
"session_id": "sess_abc123"
}Multilingue temps réel
Traduisez à la volée n'importe quel texte ou flux audio dans 30+ langues.
curl -X POST https://api.cimolace.space/liri/multilang/translate \
-H "X-API-Key: lk_sec_xxx" \
-H "X-Tenant-Slug: mon-ecole" \
-d '{
"text": "Bonjour le monde",
"source": "fr",
"target": "en"
}'
# → { "translated": "Hello world", "credits_used": 1 }TTS / STT
POST /liri/tts — Synthèse vocale
curl -X POST https://api.cimolace.space/liri/tts \
-H "X-API-Key: lk_sec_xxx" \
-H "X-Tenant-Slug: mon-ecole" \
-d '{
"text": "Bienvenue dans ce cours de mathématiques.",
"language": "fr",
"voice": "studio-fr-A",
"tier": "export"
}' \
-o welcome.mp3tier = live (basse latence, ElevenLabs Flash) ou export (qualité max, Multilingual v2 + fallback Google Studio).
POST /liri/stt — Transcription
curl -X POST https://api.cimolace.space/liri/stt \
-H "X-API-Key: lk_sec_xxx" \
-H "X-Tenant-Slug: mon-ecole" \
-F "audio=@meeting.mp3" \
-F "language=fr" \
-F "model=whisper-large-v3"Masterclass Factory
Génère un cours complet (titre, plan, slides, quiz, transcripts) à partir d'un sujet libre.
curl -X POST https://api.cimolace.space/masterclass-factory/generate \
-H "X-API-Key: lk_sec_xxx" \
-H "X-Tenant-Slug: mon-ecole" \
-d '{
"topic": "Introduction au théorème de Pythagore",
"audience": "lycéens 1ère",
"duration_minutes": 45,
"language": "fr",
"modules": ["slides", "quiz", "transcript", "tts_narration"]
}'{
"masterclass_id": "mc_xyz789",
"title": "Le théorème de Pythagore — Le pilier de la géométrie",
"modules": {
"slides": { "url": "...", "count": 18 },
"quiz": { "questions": 12, "id": "quiz_..." },
"transcript": { "url": "...", "words": 4250 },
"tts_narration": { "url": "...", "duration_s": 2680 }
},
"credits_used": 145,
"credits_remaining": 855
}Webhooks — Configuration
Configurez vos endpoints webhook dans le dashboard tenant ou via l'API :
curl -X POST https://api.cimolace.space/liri/webhooks \
-H "X-API-Key: lk_sec_xxx" \
-H "X-Tenant-Slug: mon-ecole" \
-d '{
"url": "https://monsite.com/webhooks/liri",
"events": ["session.started", "session.ended", "transcript.ready"],
"active": true
}'
# → { "id": "wh_...", "secret": "whsec_..." }Notez bien le secret retourné — il sert à vérifier la signature.
Events disponibles
| Event | Quand |
|---|---|
session.started | Première personne rejoint une session |
session.ended | Dernière personne quitte ou host clique « Terminer » |
participant.joined | Un participant rejoint |
participant.left | Un participant quitte |
recording.ready | Enregistrement vidéo finalisé + URL signée |
transcript.ready | Transcript final disponible |
masterclass.generated | Génération masterclass terminée |
credits.low | Solde LIRI Credits < seuil tenant |
credits.depleted | Solde épuisé, sessions IA suspendues |
Vérification de signature
Chaque webhook arrive avec un header X-LIRI-Signature: t=<timestamp>,v1=<hex>. La signature est un HMAC-SHA256 de `${t}.${body}` avec votre secret webhook. Tolérance anti-replay : 5 minutes.
import { createHmac, timingSafeEqual } from "crypto";
export function verifyLiriSignature(rawBody, header, secret) {
const parts = Object.fromEntries(
header.split(",").map(s => s.split("="))
);
const t = parts.t;
const v1 = parts.v1;
if (!t || !v1) return false;
// anti-replay 5 min
if (Math.abs(Date.now()/1000 - parseInt(t,10)) > 300) return false;
const expected = createHmac("sha256", secret)
.update(`${t}.${rawBody}`)
.digest("hex");
return timingSafeEqual(Buffer.from(v1,"hex"), Buffer.from(expected,"hex"));
}Payload exemple
{
"id": "evt_2NfGh...",
"type": "session.ended",
"created": 1780058600,
"tenant": "mon-ecole",
"data": {
"session_id": "sess_abc123",
"mode": "live",
"duration_seconds": 2845,
"participants_count": 14,
"credits_used": 32,
"recording_url": "https://...",
"transcript_url": "https://..."
}
}LIRI Credits — Vue d'ensemble
Toutes les opérations IA (TTS, STT, traduction, génération masterclass, Smartboard assist) consomment des LIRI Credits. Chaque plan inclut un quota mensuel rechargé automatiquement le 1er de chaque mois (cron Supabase).
Unité : 1 LIRI Credit ≈ 0,001 €. Au-delà du quota, vous achetez des packs de recharge via Stripe Checkout.
GET /ai-billing/balance
curl https://api.cimolace.space/ai-billing/balance \
-H "X-API-Key: lk_sec_xxx" \
-H "X-Tenant-Slug: mon-ecole"
# → { "balance_credits": 1247.5, "plan_tier": "pro", "monthly_quota": 10000, ... }Tarifs par modèle
Coûts approximatifs en crédits LIRI par unité d'usage.
| Service | Unité | Crédits |
|---|---|---|
| TTS ElevenLabs Flash (live) | 1 000 caractères | 50 |
| TTS Google Studio (export) | 1 000 caractères | 16 |
| STT Whisper large-v3 | 1 minute audio | 0,5 |
| Traduction multilang | 1 000 caractères | 2 |
| LLM Groq Llama 3.3 70B | 1 000 tokens | 1 |
| LLM Claude Sonnet | 1 000 tokens | 15 |
| Génération Masterclass complète | 1 cours 45 min | 120–180 |
| Smartboard OCR + IA | 1 image | 3 |
Packs de recharge
Recharges one-shot via Stripe Checkout. Activez l'achat depuis votre dashboard ou via API :
curl -X POST https://api.cimolace.space/ai-billing/topup/checkout \
-H "X-API-Key: lk_sec_xxx" \
-H "X-Tenant-Slug: mon-ecole" \
-d '{ "pack_key": "pack_5k" }'
# → { "checkout_url": "https://checkout.stripe.com/...", "session_id": "cs_..." }Redirigez l'utilisateur vers checkout_url. À la confirmation du paiement, Stripe envoie l'event checkout.session.completed à notre webhook interne, qui crédite automatiquement votre solde.
| pack_key | Crédits | Prix | Bonus |
|---|---|---|---|
pack_1k | 1 000 | 15 € | — |
pack_5k | 5 500 | 70 € | +10 % |
pack_20k | 24 000 | 250 € | +20 % |
pack_100k | 130 000 | 1 000 € | +30 % |
Sécurité
- HTTPS strict partout (HSTS, TLS 1.3). Aucun fallback HTTP.
- Clés API rotatables à tout moment depuis le dashboard tenant (révocation immédiate).
- Scoping : les clés
lk_pub_ne peuvent pas lire de données utilisateur ni créer de masterclass — seulement démarrer des sessions. - Signatures webhook HMAC-SHA256 + anti-replay 5 min (idem Stripe).
- JWT participants à durée courte (1h par défaut), signés par votre serveur.
- RLS PostgreSQL sur Supabase : isolation tenant garantie au niveau base.
- Audit log : toutes les actions sensibles sont journalisées (table
access_audit_log).
Codes d'erreur
| Code HTTP | Code | Sens |
|---|---|---|
| 400 | BAD_REQUEST | Payload invalide ou paramètres manquants |
| 401 | UNAUTHORIZED | Clé API absente, expirée ou révoquée |
| 402 | CREDITS_DEPLETED | Solde LIRI Credits épuisé — rechargez un pack |
| 403 | FORBIDDEN | Clé valide mais scope insuffisant (pub vs sec) |
| 404 | NOT_FOUND | Ressource inexistante (session, masterclass…) |
| 409 | CONFLICT | Session déjà terminée, slug déjà utilisé… |
| 429 | RATE_LIMITED | Trop de requêtes (limite 60/min sur les endpoints IA, retry après Retry-After) |
| 500 | INTERNAL_ERROR | Erreur serveur — réessayer avec backoff |
Changelog
2026-05-29 — v2.0 (production)
- API NestJS déployée sur
api.cimolace.space(Railway, TLS 1.3). - 4 packs LIRI Credits sur Stripe (test + live mode).
- TTS : Google Cloud Studio voices en provider primaire (3× moins cher que ElevenLabs).
- Masterclass Factory : Groq Llama 3.3 70B + fallback DeepSeek.
- Webhooks : signature HMAC-SHA256 + anti-replay 5 min (compatible Stripe-style).
- 26 Edge Functions LIRI déployées (TTS, STT, multilang, smartboard).
Besoin d'aide ? dev@cimolace.space · Twitter @cimolace