API Reference

REST API complète pour gérer vos projets, rendus, partages et plus encore. Base URL : https://demobro.com/api

Content-Type: application/json
Auth: Bearer JWT
Responses: JSON

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.

Partages

Créez des liens de partage publics pour vos rendus avec analytics, protection par mot de passe et expiration.

Endpoints publics (sans authentification)

GET/api/share/public/{token}/ Récupérer la page de partage publique
POST/api/share/public/{token}/session/Créer une session de vue
POST/api/share/public/{token}/events/— Enregistrer des événements analytics

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 3000

Reprenez 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.py

Dé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)   # gratuit

Restreignez 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.49

Exemple 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.49

N'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 demodsl

Authentification

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

Partager 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 list

Codes d'erreur

L'API retourne des codes HTTP standards avec un body JSON détaillé.

CodeDescription
200Succès
201Ressource créée
204Suppression réussie (pas de body)
400Requête invalide — vérifiez les champs envoyés
401Non authentifié — token manquant ou expiré
403Accès refusé — vous n'êtes pas propriétaire de cette ressource
404Ressource introuvable
429Trop de requêtes — rate limit atteint
500Erreur serveur interne
503Service 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."
}