API Reference
REST API complète pour gérer vos projets, rendus, partages et plus encore. Base URL : https://demobro.com/api
Authentification
JWT (JSON Web Token) pour toutes les requêtes authentifiées. Les tokens access expirent après 5 min, utilisez le refresh token pour en obtenir un nouveau.
Utilisation du token
# Ajoutez le header Authorization à chaque requête
curl -H "Authorization: Bearer <access_token>" \
https://demobro.com/api/api/projects/Projets
CRUD complet sur vos projets de démo. Chaque projet contient une configuration YAML DemoDSL.
Rendus
Lancez des rendus vidéo à partir d'un projet. Le rendu est asynchrone — le statut progresse de pending → processing → completed.
Templates
Galerie de templates publics que vous pouvez forker dans vos projets.
Facturation
Gestion des abonnements Stripe, crédits et consommation.
LLM
Génération IA pour vos configurations YAML, narrations et effets visuels.
Plugins
Plugins de rendu extensibles : Blender, Mobile, Webinar, 3D Product.
Connecteurs
Intégrations CRM et webhooks pour synchroniser vos données.
Démo d'une application locale
Le rendu s'exécute sur les serveurs DemoBro, jamais sur votre machine : une URL en localhost y désigne nos conteneurs, pas votre application. Ces adresses sont refusées avant tout débit.
Exposez le port sur une URL publique
# Cloudflare (sans compte)
cloudflared tunnel --url http://localhost:3000
# ou ngrok
ngrok http 3000Reprenez l'URL obtenue dans le YAML
scenarios:
- name: "Parcours"
url: "https://votre-tunnel.trycloudflare.com"
steps:
- action: navigate
url: "https://votre-tunnel.trycloudflare.com"
narration: "Voici l'application."L'URL change à chaque session du tunnel : régénérez le YAML, ou fixez un domaine côté fournisseur de tunnel. Vérifiez la configuration avec validate_demo_config (MCP) avant de lancer le rendu.
Cliquer et saisir, pas seulement montrer
Par défaut, les étapes click, type et wait_forsont réécrites en défilement : un sélecteur erroné bloquerait le navigateur trente secondes puis ferait échouer un rendu déjà facturé. Confirmez d'abord les sélecteurs sur la page vivante, puis demandez le rendu interactif.
# 1. les sélecteurs existent-ils vraiment ? (gratuit)
probe_demo_config(yaml_config=...)
# 2. le rendu exécute alors les clics et les saisies
render_demo_from_yaml(name=..., yaml_config=..., interactive=true)Les sélecteurs web acceptés sont css, id, text et xpath, sous la forme locator: {type: css, value: "#email"}.
Ou laissez l'appel ouvrir et fermer le tunnel
Notre serveur MCP tourne sur nos machines : il ne peut pas exposer un port de la vôtre. Ce pont-ci tourne chez vous. Il ouvre le tunnel, vérifie les sélecteurs, lance le rendu, attend la vidéo, puis referme le tunnel — y compris si le rendu échoue. Votre application n'est jamais exposée plus longtemps que l'appel.
curl -O https://demobro.com/demobro-local-mcp.pyDéclarez-le auprès de votre client MCP (nécessite uv et cloudflared) :
{
"servers": {
"demobro-local": {
"command": "uv",
"args": ["run", "/chemin/vers/demobro-local-mcp.py"],
"env": { "DEMOBRO_API_KEY": "dmbr_…" }
}
}
}Le YAML garde alors vos URL locales habituelles : le pont les réécrit vers le tunnel avant l'envoi.
render_local_demo(name="Ma démo", yaml_config=..., port=3000)
check_local_selectors(yaml_config=..., port=3000) # gratuitRestreignez l'accès à nos adresses de sortie
Un tunnel expose votre application à tout internet le temps du rendu. Nos rendus partent de deux adresses fixes, et d'elles seules : autorisez-les, refusez le reste.
20.86.141.140
20.54.114.49Exemple avec cloudflared et un pare-feu local :
# n'accepter le port 3000 que depuis les sorties DemoBro
sudo pfctl -t demobro -T add 20.86.141.140 20.54.114.49N'utilisez pas Cloudflare Access ni l'authentification de ngrok : le moteur de rendu ne sait pas s'authentifier, il serait bloqué comme n'importe quel visiteur. Le filtrage par adresse est le seul contrôle qu'il traverse. Servez des données jetables et refermez le tunnel après le rendu.
SDK Python
Wrapper Python pour l'API REST. Installez avec pip et commencez en 3 lignes.
Installation
pip install demodslAuthentification
from demodsl import DemoBroClient
# Option 1 : credentials file (~/.demodsl/credentials)
client = DemoBroClient()
# Option 2 : token direct
client = DemoBroClient(token="eyJ...")Créer un projet et lancer un rendu
# Créer un projet
project = client.projects.create(
name="Mon Produit",
yaml_config=open("demo.yaml").read(),
)
# Lancer un rendu cloud
render = client.renders.create(project_id=project.id)
# Attendre la fin du rendu
render.wait()
print(render.status) # "completed"
print(render.video_url) # https://...
print(render.duration) # 154.0Partager un rendu
share = client.shares.create(
render=render.id,
title="Démo pour le client",
allow_download=True,
expires_at="2024-12-31",
)
print(share.share_url) # https://demobro.com/share/xK9mQ2p...CLI
# Login
$ demodsl login
# Rendu cloud
$ demodsl run cloud demo.yaml
# Rendu local
$ demodsl run local demo.yaml --out video.mp4
# Lister les projets
$ demodsl projects listCodes d'erreur
L'API retourne des codes HTTP standards avec un body JSON détaillé.
| Code | Description |
|---|---|
| 200 | Succès |
| 201 | Ressource créée |
| 204 | Suppression réussie (pas de body) |
| 400 | Requête invalide — vérifiez les champs envoyés |
| 401 | Non authentifié — token manquant ou expiré |
| 403 | Accès refusé — vous n'êtes pas propriétaire de cette ressource |
| 404 | Ressource introuvable |
| 429 | Trop de requêtes — rate limit atteint |
| 500 | Erreur serveur interne |
| 503 | Service indisponible (ex: provider LLM down) |
// Exemple d'erreur 400
{
"yaml_config": ["Ce champ ne contient pas du YAML valide."],
"name": ["Ce champ est requis."]
}
// Exemple d'erreur 401
{
"detail": "Authentication credentials were not provided."
}