Pour les développeurs et les SaaS
Ajoute la vidéo IA à ton produit en quelques appels
Une API REST, un serveur MCP et des webhooks : ton produit crée des vidéos explicatives et découpe des vidéos longues en shorts, sans que tes utilisateurs ouvrent ClipOnIt.
Plan Starter ou plus · la clé se crée dans Réglages → Intégrations
Trois façons de s'en servir
Les deux produits de ClipOnIt, appelés depuis ton code ou par un agent.
AI Explainer
Un outil de formation : une vidéo explicative par leçon
Ton produit envoie le titre ou le texte de la leçon ; ClipOnIt écrit les scènes, les illustre, pose la voix et les sous-titres, puis rend un MP4 vertical que tu affiches à côté du cours.
POST /api/agent/produceSmart Clipper
Une plateforme de podcast : les shorts de chaque épisode
À chaque épisode publié, ton serveur envoie le lien de la vidéo ; ClipOnIt trouve les meilleurs moments, les note sur 100, les recadre en 9:16 et les sous-titre. Tu exportes ceux que tu veux.
POST /api/videos/urlMCP
Un agent IA qui pilote ClipOnIt
Ton agent (Claude, Cursor, VS Code ou le tien) se branche sur le serveur MCP : il importe une vidéo, choisit les clips, lance une vidéo explicative et attend le résultat avec des outils déjà décrits.
POST /mcp
Toujours le même flux
Une vidéo prend des minutes, pas des millisecondes : tu crées une tâche, tu suis son état, tu récupères le fichier.
- Créer la tâche
Un POST avec le sujet ou le lien de la vidéo. Réponse immédiate avec un identifiant.
- Suivre l'état
Un GET toutes les 10 s environ : étape, pourcentage, temps restant. Pour l'Explainer, un webhook peut te prévenir à la place.
- Récupérer la vidéo
Une fois terminé, l'URL du MP4 est dans la réponse. Télécharge-le ou affiche-le dans ton produit.
AI Explainer
Une vidéo explicative à partir d'un sujet
POST /api/agent/produce reçoit un sujet (ou un script, ou un enregistrement audio) et lance l'écriture puis le rendu. GET /api/jobs/{id} renvoie status, step, percent, puis url quand la vidéo est prête.
- duration_s15 à 180 secondes
- style22 styles visuels, et le tien : GET /api/explainer/styles
- voiceune voix du catalogue, par nom ou identifiant
- dry_runtrue : vérifie le quota et le coût sans rien lancer
curl -s -X POST https://cliponit.app/api/agent/produce \
-H "Authorization: Bearer $CLIPONIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"topic": "La photosynthèse en 3 étapes", "duration_s": 45}'
curl -s https://cliponit.app/api/jobs/JOB_ID \
-H "Authorization: Bearer $CLIPONIT_API_KEY"
curl -s -o lecon.mp4 "URL_DU_JOB"const API = "https://cliponit.app";
const headers = {
Authorization: `Bearer ${process.env.CLIPONIT_API_KEY}`,
"Content-Type": "application/json",
};
async function call(method, path, body) {
const res = await fetch(API + path, { method, headers, body: body && JSON.stringify(body) });
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
return res.json();
}
let { job } = await call("POST", "/api/agent/produce", { topic: "La photosynthèse en 3 étapes", duration_s: 45 });
while (!["done", "failed", "canceled"].includes(job.status)) {
await new Promise((r) => setTimeout(r, 10_000));
job = await call("GET", `/api/jobs/${job.id}`);
}
console.log(job.status === "done" ? job.url : job.error);import json, os, time, urllib.request
API = "https://cliponit.app"
KEY = os.environ["CLIPONIT_API_KEY"]
def call(method, path, body=None):
req = urllib.request.Request(API + path, method=method,
data=None if body is None else json.dumps(body).encode(),
headers={"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"})
with urllib.request.urlopen(req) as r:
return json.load(r)
job = call("POST", "/api/agent/produce", {"topic": "La photosynthèse en 3 étapes", "duration_s": 45})["job"]
while job["status"] not in ("done", "failed", "canceled"):
time.sleep(10)
job = call("GET", f"/api/jobs/{job['id']}")
if job["status"] == "done":
urllib.request.urlretrieve(job["url"], "lecon.mp4")
else:
print(job["error"])Smart Clipper
Les shorts d'une vidéo longue
POST /api/videos/url importe un lien (YouTube ou fichier vidéo en https) ; POST /api/videos accepte aussi un envoi de fichier. Quand state vaut ready, clips contient les moments trouvés, chacun avec score, title et reason.
POST /api/clips/{id}/export rend le clip recadré et sous-titré (orientation vertical ou horizontal) ; GET /api/exports/{id} donne url une fois terminé.
curl -s -X POST https://cliponit.app/api/videos/url \
-H "Authorization: Bearer $CLIPONIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/episode-42.mp4"}'
curl -s https://cliponit.app/api/videos/VIDEO_ID \
-H "Authorization: Bearer $CLIPONIT_API_KEY"
curl -s -X POST "https://cliponit.app/api/clips/CLIP_ID/export?orientation=vertical" \
-H "Authorization: Bearer $CLIPONIT_API_KEY"
curl -s https://cliponit.app/api/exports/EXPORT_ID \
-H "Authorization: Bearer $CLIPONIT_API_KEY"const API = "https://cliponit.app";
const headers = {
Authorization: `Bearer ${process.env.CLIPONIT_API_KEY}`,
"Content-Type": "application/json",
};
async function call(method, path, body) {
const res = await fetch(API + path, { method, headers, body: body && JSON.stringify(body) });
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
return res.json();
}
const wait = (s) => new Promise((r) => setTimeout(r, s * 1000));
let video = await call("POST", "/api/videos/url", { url: "https://example.com/episode-42.mp4" });
while (!["ready", "failed"].includes(video.state)) {
await wait(15);
video = await call("GET", `/api/videos/${video.id}`);
}
const best = [...video.clips].sort((a, b) => (b.score ?? 0) - (a.score ?? 0)).slice(0, 3);
for (const clip of best) {
let exp = await call("POST", `/api/clips/${clip.id}/export?orientation=vertical`);
while (!["done", "failed", "canceled"].includes(exp.status)) {
await wait(5);
exp = await call("GET", `/api/exports/${exp.id}`);
}
console.log(clip.title, exp.status === "done" ? API + exp.url : exp.error);
}import json, os, time, urllib.request
API = "https://cliponit.app"
KEY = os.environ["CLIPONIT_API_KEY"]
def call(method, path, body=None):
req = urllib.request.Request(API + path, method=method,
data=None if body is None else json.dumps(body).encode(),
headers={"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"})
with urllib.request.urlopen(req) as r:
return json.load(r)
video = call("POST", "/api/videos/url", {"url": "https://example.com/episode-42.mp4"})
while video["state"] not in ("ready", "failed"):
time.sleep(15)
video = call("GET", f"/api/videos/{video['id']}")
best = sorted(video["clips"], key=lambda c: c["score"] or 0, reverse=True)[:3]
for clip in best:
exp = call("POST", f"/api/clips/{clip['id']}/export?orientation=vertical")
while exp["status"] not in ("done", "failed", "canceled"):
time.sleep(5)
exp = call("GET", f"/api/exports/{exp['id']}")
if exp["status"] == "done":
urllib.request.urlretrieve(API + exp["url"], f"{clip['id']}.mp4")MCP
Un serveur MCP pour les agents
Adresse unique https://cliponit.app/mcp, en HTTP « streamable ». Les outils couvrent les deux produits : importer, attendre, créer et exporter des clips, produire une vidéo explicative et attendre sa fin. Ceux qui modifient quelque chose sont annotés pour que l'agent demande avant.
Claude Desktop et Claude.ai : Réglages → Connecteurs → Ajouter un connecteur personnalisé, avec l'adresse ci-dessus. La connexion se fait par OAuth, sans clé à copier ; ChatGPT fonctionne de la même façon. Pas à pas
claude mcp add --transport http cliponit https://cliponit.app/mcp \
--header "Authorization: Bearer $CLIPONIT_API_KEY"{
"mcpServers": {
"cliponit": {
"url": "https://cliponit.app/mcp",
"headers": { "Authorization": "Bearer ${env:CLIPONIT_API_KEY}" }
}
}
}{
"inputs": [
{ "type": "promptString", "id": "cliponit-key", "description": "ClipOnIt API key", "password": true }
],
"servers": {
"cliponit": {
"type": "http",
"url": "https://cliponit.app/mcp",
"headers": { "Authorization": "Bearer ${input:cliponit-key}" }
}
}
}curl -s -X POST https://cliponit.app/mcp \
-H "Authorization: Bearer $CLIPONIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "get_quota", "arguments": {}}}'Être prévenu au lieu de demander
Dans Réglages → Intégrations, ajoute jusqu'à 3 URL https. Quand une production Explainer se termine, ClipOnIt y envoie job.done ou job.failed, avec le même objet que GET /api/jobs/{id}. Six essais en cas d'échec, sur 8 heures environ.
Pour les clips Smart Clipper, il n'y a pas encore de webhook : suis l'état avec GET.
import hashlib, hmac, time
def verify(secret: str, header: str, body: bytes, tolerance: int = 300) -> bool:
"""header = X-ClipOnIt-Signature, body = raw request bytes."""
parts = dict(p.split("=", 1) for p in header.split(",") if "=" in p)
if abs(time.time() - int(parts.get("t", 0))) > tolerance:
return False
mac = hmac.new(secret.encode(), parts["t"].encode() + b"." + body, hashlib.sha256).hexdigest()
return hmac.compare_digest(mac, parts.get("v1", ""))Limites et quotas par plan
Les appels API comptent comme dans l'interface : mêmes quotas, même compte. Voir les tarifs
| Free | Starter | Pro | Business | |
|---|---|---|---|---|
| API et MCP | — | ✓ | ✓ | ✓ |
| Vidéos Smart Clipper par mois | 2 | 20 | 60 | 200 |
| Minutes de vidéo source par mois | 40 | 480 | 900 | 2 400 |
| Vidéos Explainer par mois | — | 15 | 30 | 100 |
| Productions Explainer en même temps | — | 2 | 2 | 2 |
| Clés API par compte | — | 10 | 10 | 10 |
| Webhooks par compte | — | 3 | 3 | 3 |
Sécurité
Appelle ClipOnIt depuis ton serveur, jamais depuis le navigateur de tes utilisateurs.
Politique de confidentialité- La clé reste sur ton serveur.Elle donne accès au compte ClipOnIt entier : jamais dans le navigateur, une appli mobile ou un dépôt Git. Garde-la dans une variable d'environnement et appelle ClipOnIt depuis ton backend.
- Une clé par usage, avec sa portée.Portée « lecture » (consulter, vérifier) ou « production » (créer des vidéos). Chaque clé a un nom, une date de dernière utilisation et se révoque d'un clic : elle répond 401 dès l'appel suivant.
- Le secret n'est montré qu'une fois.ClipOnIt n'en garde que l'empreinte (SHA-256). Perdue, une clé se remplace, elle ne se relit pas.
- Webhooks signés.Chaque envoi porte X-ClipOnIt-Signature (HMAC-SHA256 du corps et de l'horodatage) ; refuse tout envoi de plus de 5 minutes. Les URL de réception sont en https et vérifiées à chaque envoi.
- Hébergé dans l'Union européenne.Serveurs Hetzner en UE ; sous-traitants listés dans la politique de confidentialité.
Questions fréquentes
SDK, widget, délais, quotas et volume.
Quel plan faut-il pour l'API ?
Starter ou plus. Le plan gratuit n'a pas d'accès API ni MCP : une clé ne peut pas être créée et le serveur MCP répond « plan sans accès API ». Les quotas de l'API sont ceux du compte, comme dans l'interface.
Y a-t-il un SDK ?
Pas de SDK officiel pour l'instant. L'API est en HTTP et JSON, décrite en OpenAPI 3.1 (/openapi.json) : les exemples de cette page tiennent en quelques lignes de fetch ou de Python standard, et tu peux générer un client depuis le fichier OpenAPI.
Puis-je intégrer un lecteur ou un éditeur ClipOnIt dans mon site ?
Non, il n'y a pas de widget embarquable. Tu récupères le fichier MP4 et tu l'affiches dans ton propre lecteur, ou tu l'héberges chez toi.
Combien de temps prend une vidéo ?
Une vidéo explicative : quelques minutes (écriture puis rendu, environ 4 min pour le rendu). Des clips : environ 1 à 5 minutes pour 20 minutes de vidéo, puis l'export de chaque clip. L'API renvoie l'étape, le pourcentage et une estimation du temps restant.
Que se passe-t-il quand un quota est atteint ?
L'API répond 402 avec un message clair (quota du mois ou budget IA), 403 si la fonction n'est pas dans le plan, 429 si deux productions Explainer tournent déjà. Pour l'Explainer, « dry_run »: true vérifie tout avant de lancer, sans rien créer ni facturer.
Je veux brancher ClipOnIt pour tous mes utilisateurs.
Une clé agit sur un seul compte ClipOnIt : les vidéos et les quotas sont ceux de ce compte. Pour un usage à plus grande échelle, écris-nous à contact@cliponit.app avec ton volume et ton cas d'usage.
Ta première vidéo par l'API, aujourd'hui
Crée une clé, copie un exemple, lance-le. Une question sur ton intégration : contact@cliponit.app.