CimolaceDémarrer
LIRI/Documentation développeur

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

ServiceURL
API RESThttps://api.cimolace.space
Embed widgethttps://embed.cimolace.space
SDK JavaScripthttps://cimolace.space/liri-sdk.js
Dashboard tenanthttps://cimolace.space/tenant/admin
Swagger / OpenAPIhttps://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

html
<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.

ModeDescriptiondata-mode
LiveVisio HD multi-participants, chat, partage écranlive
StudioPrésentation slides + IA assistant livestudio
SmartboardTableau blanc collaboratif + OCR + IAsmartboard
MasterclassCours scénarisé généré par IA, format sériemasterclass
Coach1-to-1 coaching avec assistant IA dédiécoach
WebinarLive broadcast 1-to-many, chat modéré, billetteriewebinar

Authentification

LIRI utilise 2 types de clés API et 1 type de JWT participant.

Clés API tenant

TypePréfixeUsage
Publiquelk_pub_Front (SDK, embed). Scope limité : démarrer sessions, lire pricing.
Secrètelk_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 :

javascript
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

html
<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

text
https://embed.cimolace.space/{mode}?tenant={slug}&apiKey={pub}&room={id}&role={host|viewer}

Exemple

html
<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ètreRequisDescription
tenantouiSlug de votre tenant
apiKeyouiClé publique lk_pub_...
roomouiIdentifiant unique de session
roleouihost ou viewer
themenonlight | dark | auto
localenonfr, en, es...
userTokennonJWT 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é)

  1. Téléchargez liri-wp.zip depuis votre dashboard tenant.
  2. WP Admin → Extensions → Ajouter → Téléverser le ZIP → Activer.
  3. Réglages → LIRI : collez votre tenant slug + clé lk_pub_....
  4. Dans n'importe quelle page/article :
text
[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 »).

  1. Wix Editor → + AjouterEmbed HTML iframe.
  2. Mode « URL externe », collez l'URL embed :
text
https://embed.cimolace.space/live?tenant=mon-ecole&apiKey=lk_pub_xxx&room=salon-vip

Wix 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.

text
X-API-Key: lk_sec_xxxxxxxxxxxxxxxxxxxxx

Les endpoints publics (lecture pricing, packs) ne nécessitent aucune auth. Les endpoints "tenant-scoped" (data utilisateur, sessions) demandent en plus :

text
X-Tenant-Slug: mon-ecole

Sessions 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

json
{
  "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éthodeEndpointDescription
GET/liri/sessionsListe paginée
GET/liri/sessions/:idDétail + participants
PATCH/liri/sessions/:idModifier titre, horaire, max
POST/liri/sessions/:id/endTerminer + générer replay
DELETE/liri/sessions/:idAnnuler (avant démarrage)

Tokens participants

Générez un token participant signé pour identifier l'utilisateur dans la session :

bash
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
  }'
json
{
  "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.

bash
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

bash
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.mp3

tier = live (basse latence, ElevenLabs Flash) ou export (qualité max, Multilingual v2 + fallback Google Studio).

POST /liri/stt — Transcription

bash
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.

bash
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"]
  }'
json
{
  "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 :

bash
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

EventQuand
session.startedPremière personne rejoint une session
session.endedDernière personne quitte ou host clique « Terminer »
participant.joinedUn participant rejoint
participant.leftUn participant quitte
recording.readyEnregistrement vidéo finalisé + URL signée
transcript.readyTranscript final disponible
masterclass.generatedGénération masterclass terminée
credits.lowSolde LIRI Credits < seuil tenant
credits.depletedSolde é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

json
{
  "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

bash
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.

ServiceUnitéCrédits
TTS ElevenLabs Flash (live)1 000 caractères50
TTS Google Studio (export)1 000 caractères16
STT Whisper large-v31 minute audio0,5
Traduction multilang1 000 caractères2
LLM Groq Llama 3.3 70B1 000 tokens1
LLM Claude Sonnet1 000 tokens15
Génération Masterclass complète1 cours 45 min120–180
Smartboard OCR + IA1 image3

Packs de recharge

Recharges one-shot via Stripe Checkout. Activez l'achat depuis votre dashboard ou via API :

bash
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_keyCréditsPrixBonus
pack_1k1 00015 €
pack_5k5 50070 €+10 %
pack_20k24 000250 €+20 %
pack_100k130 0001 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 HTTPCodeSens
400BAD_REQUESTPayload invalide ou paramètres manquants
401UNAUTHORIZEDClé API absente, expirée ou révoquée
402CREDITS_DEPLETEDSolde LIRI Credits épuisé — rechargez un pack
403FORBIDDENClé valide mais scope insuffisant (pub vs sec)
404NOT_FOUNDRessource inexistante (session, masterclass…)
409CONFLICTSession déjà terminée, slug déjà utilisé…
429RATE_LIMITEDTrop de requêtes (limite 60/min sur les endpoints IA, retry après Retry-After)
500INTERNAL_ERRORErreur 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