Transformez n'importe quelle URL en vidéo de qualité studio — par programmation. Un seul POST crée et rend la vidéo ; interrogez un seul endpoint pour le résultat. Parfait pour les automatisations, la génération en masse et les aperçus Open Graph vidéo.
Vous utilisez un assistant IA ?Connectez PageToVid à Claude, Cursor, VS Code ou Codex et demandez simplement une vidéo.Créez une clé API dans votre compte, puis envoyez-la comme jeton Bearer. Gardez-la secrète — elle consomme vos crédits.
httpAuthorization: Bearer cp_live_xxxxxxxxxxxxxxxx
URL de base : https://pagetovid.com · une vidéo rendue coûte 40 crédits.
POST /api/v1/videos — renvoie immédiatement un id ; le rendu s'exécute en asynchrone.
curlcurl -X POST https://pagetovid.com/api/v1/videos \ -H "Authorization: Bearer $PAGETOVID_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://stripe.com", "goal": "ad", // explainer | ad | demo | tutorial "aspect": "16:9", // 16:9 | 9:16 | 1:1 "language": "en", "targetSeconds": 35, "subtitles": true }'
Réponse (202) :
json{ "id": "cmq…", "status": "analyzing", "statusUrl": "https://pagetovid.com/api/v1/videos/cmq…" }
GET /api/v1/videos/:id — interrogez jusqu'à status: "done".
json{ "id": "cmq…", "status": "done", // analyzing | scripting | recording | voicing | rendering | done | error "progress": 100, "videoUrl": "https://pagetovid.com/media/cmq…/video.mp4", "posterUrl": "https://pagetovid.com/media/cmq…/scene-2.png", "subtitleUrl": "https://pagetovid.com/media/cmq…/subtitles.vtt", "durationMs": 41000, "width": 1920, "height": 1080, "og": { "og:video": "…", "og:image": "…", "og:video:type": "video/mp4", … } }
Tout ce qu'un assistant peut faire via le MCP existe aussi en REST, avec la même clé. Un site est identifié par son domaine.
/api/v1/sites/:domain/plan — le plan d'un site entier — les vidéos qu'il devrait avoir, chacune avec un objectif, un brief et ses plans. POST le génère ou le régénère (gratuit)./api/v1/sites/:domain/plan/videos — l'ensemble des vidéos demandées par le plan, avec la vidéo déjà réalisée pour chaque idée. POST prévisualise ; POST avec confirm: true les lance, 40 crédits chacune./api/v1/sites/:domain/shows — les émissions du site — des vidéos récurrentes depuis un flux RSS, Atom ou JSON : même storyboard à chaque épisode, données fraîches à chaque épisode. POST en crée une ; elle démarre en attente./api/v1/shows/:id/run — lance une émission à la main. Sans confirm, prévisualisation gratuite des épisodes ; confirm: true les fabrique (40 crédits chacun) et, sur une émission en attente, la confirme — le planificateur horaire prend ensuite le relais, dans ses plafonds par diffusion et par jour. PATCH /api/v1/shows/:id met en pause, reprend ou règle.json// POST /api/v1/sites/example.com/shows { "name": "Release notes", "kind": "video", "feed_kind": "rss", "feed_url": "https://example.com/changelog.xml", "cadence": "weekly", "max_episodes_per_run": 1, "max_credits_per_day": 2, "aspect_ratio": "9:16", "language": "en", "goal": "explainer", "target_seconds": 30, "focus_template": "This episode is about {{title}}: {{summary}}. Lead with what is new." } // → 201 { show: { show_id, confirmed: false, ... } } then POST /api/v1/shows/:id/run { "confirm": true }
Une émission ne dépense jamais avant que son propriétaire ait vu une diffusion, jamais plus que max_credits_per_day par jour, et ne fabrique jamais deux fois le même élément du flux.
Une vidéo finie fait aussi office de riche aperçu og:video — vos liens s'affichent alors comme une vidéo lisible sur les réseaux et dans la recherche. La réponse de statut vous donne les balises exactes dans og. Placez-les dans le <head> de votre page :
html<meta property="og:image" content="POSTER_URL" /> <meta property="og:video" content="VIDEO_URL" /> <meta property="og:video:secure_url" content="VIDEO_URL" /> <meta property="og:video:type" content="video/mp4" /> <meta property="og:video:width" content="1920" /> <meta property="og:video:height" content="1080" /> <meta name="twitter:card" content="player" />
Générez + attendez, dans n'importe quel langage.
javascriptconst KEY = process.env.PAGETOVID_API_KEY; const create = await fetch("https://pagetovid.com/api/v1/videos", { method: "POST", headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" }, body: JSON.stringify({ url: "https://your-site.com", goal: "ad" }), }).then((r) => r.json()); let v; do { await new Promise((r) => setTimeout(r, 5000)); v = await fetch(create.statusUrl, { headers: { Authorization: `Bearer ${KEY}` } }).then((r) => r.json()); } while (v.status !== "done" && v.status !== "error"); console.log(v.videoUrl, v.posterUrl, v.og);
pythonimport os, time, requests KEY = os.environ["PAGETOVID_API_KEY"] H = {"Authorization": f"Bearer {KEY}"} r = requests.post("https://pagetovid.com/api/v1/videos", headers=H, json={"url": "https://your-site.com", "goal": "ad"}).json() while True: time.sleep(5) v = requests.get(r["statusUrl"], headers=H).json() if v["status"] in ("done", "error"): break print(v["videoUrl"], v["posterUrl"], v["og"])
401 — clé API invalide ou manquante.402 — plus de crédits. Rechargez sur tarifs.400 — entrée invalide (une url est requise).Des crédits gratuits pour démarrer — générez votre première vidéo par API en quelques minutes.
Créer une clé API →