Comment utiliser l'API Vidiome pour automatiser la génération d'articles depuis une vidéo

    ·9 min de lecture·Par Vidiome Team
    API VidiomeAutomatisation d'ArticlesTutoriel DéveloppeurAutomatisation de Contenu

    Tutoriel technique pour les développeurs : utilisez l'endpoint POST /api/v1/articles de Vidiome pour automatiser la génération d'articles vidéo à grande échelle. Exemples curl et Node.js inclus.

    L'API REST de Vidiome transforme une vidéo YouTube en article de blog structuré, en une seule requête. Vous envoyez une URL YouTube, Vidiome lit la transcription de la vidéo, rédige l'article avec un LLM et vous le renvoie en JSON : un titre et une liste de sections, chacune avec son titre H2, son contenu et ses horodatages.

    Ce tutoriel couvre l'authentification, le format de la requête et de la réponse, des exemples curl et Node.js, le traitement par lots, la publication sur WordPress et les limites à prévoir.

    À qui s'adresse ce tutoriel

    • Développeurs SaaS qui construisent des fonctionnalités d'automatisation de contenu pour leurs clients ou leurs outils internes
    • Agences de contenu qui traitent de nombreuses vidéos chaque semaine et veulent supprimer les étapes manuelles
    • Équipes plateforme qui branchent la conversion vidéo-article sur un CMS ou un workflow de contenu existant

    Si vous êtes un créateur plutôt qu'un développeur, l'application web Vidiome est le chemin le plus rapide. Elle capture en plus une image pour chaque section, ce que l'API ne fait pas.

    Vidiome

    Turn your videos into SEO traffic machines

    Générer mon premier article

    Sans carte bancaire · 120 crédits offerts

    Prérequis

    • Un compte Vidiome avec un forfait payant (Starter, Pro ou Business). Les requêtes API des comptes gratuits sont refusées avec une erreur 403.
    • Une clé API, créée dans l'application sous Profil → Clés API. Les clés commencent par vdm_live_. Gardez-les secrètes : toute personne qui possède la clé peut dépenser vos crédits.
    • Une vidéo YouTube qui dispose d'une transcription (sous-titres manuels ou automatiques). L'API travaille à partir de cette transcription.

    Les nouveaux comptes reçoivent 120 crédits gratuits pour essayer l'application web avant de choisir un forfait.


    Endpoint : POST /api/v1/articles

    Requête

    POST https://www.vidiome.com/api/v1/articles
    Content-Type: application/json
    x-api-key: vdm_live_YOUR_KEY
    

    Authorization: Bearer vdm_live_YOUR_KEY fonctionne aussi.

    Corps de la requête

    {
      "youtubeUrl": "https://www.youtube.com/watch?v=XXXXXXXXXXX",
      "language": "fr"
    }
    
    Champ Type Obligatoire Description
    youtubeUrl string Oui URL complète d'une vidéo YouTube
    language string Non Langue de rédaction de l'article : en, fr, es, pt, de, ru, hi, uk, id ou tr. Précisez-la toujours : sans elle, aucune langue n'est imposée

    C'est toute la requête. Il n'existe aucun paramètre d'envoi de fichier, de format de sortie ou de mot-clé.

    Réponse

    L'appel est synchrone : la connexion reste ouverte pendant que Vidiome génère l'article, puis le résultat complet arrive d'un coup. Comptez de quelques secondes à quelques minutes selon la durée de la vidéo.

    {
      "id": "5b0c9c2e-6f1d-4d8a-9a57-2f1f3c1e8b21",
      "title": "Comment décliner une vidéo en un mois de contenu",
      "sections": [
        {
          "id": "a3f1…",
          "title": "Introduction : une vidéo, plusieurs formats",
          "content": "La plupart des créateurs publient une vidéo et passent à la suite…\n\n### Pourquoi la transcription n'est qu'un point de départ\n\n…",
          "startTime": 0,
          "endTime": 74,
          "images": []
        }
      ],
      "videoUrl": "https://www.youtube.com/watch?v=XXXXXXXXXXX",
      "videoId": "XXXXXXXXXXX",
      "language": "fr",
      "creditsUsed": 40,
      "creditsRemaining": 460,
      "createdAt": "2026-09-26T10:23:41.000Z"
    }
    

    Quelques points à connaître sur la réponse :

    • sections sont dans l'ordre de lecture : une introduction, les sections du corps, puis une conclusion. title est le H2 de la section. content est du texte avec des lignes ### pour les sous-titres H3, des lignes vides entre les paragraphes, du **gras** et des éléments de liste - .
    • startTime / endTime sont en secondes et indiquent le passage de la vidéo dont provient chaque section. Pratique pour intégrer la vidéo au bon moment.
    • images est toujours vide via l'API. Les captures d'écran sont réalisées dans le navigateur par l'application web. Pour en ajouter, ouvrez l'article dans Vidiome et choisissez-les, ou utilisez vos propres images.
    • L'article est enregistré dans votre compte (id). Il apparaît dans votre tableau de bord Vidiome, où vous pouvez le modifier.

    Exemples de code

    curl

    curl -X POST https://www.vidiome.com/api/v1/articles \
      -H "Content-Type: application/json" \
      -H "x-api-key: $VIDIOME_API_KEY" \
      -d '{
        "youtubeUrl": "https://www.youtube.com/watch?v=XXXXXXXXXXX",
        "language": "fr"
      }'
    

    Node.js (fetch)

    const VIDIOME_API_KEY = process.env.VIDIOME_API_KEY;
    
    async function generateArticle(youtubeUrl, language = 'fr') {
      const response = await fetch('https://www.vidiome.com/api/v1/articles', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'x-api-key': VIDIOME_API_KEY,
        },
        body: JSON.stringify({ youtubeUrl, language }),
        // La génération peut prendre quelques minutes : le client ne doit pas abandonner avant.
        signal: AbortSignal.timeout(6 * 60 * 1000),
      });
    
      const data = await response.json();
      if (!response.ok) {
        const error = new Error(`Vidiome API ${response.status}: ${data.error}`);
        error.status = response.status;
        error.retryAfter = Number(response.headers.get('retry-after')) || null;
        throw error;
      }
      return data;
    }
    
    // Convertit les sections en Markdown (ou passez-les à votre propre moteur de rendu).
    function toMarkdown(article) {
      const body = article.sections
        .map((section) => `## ${section.title}\n\n${section.content}`)
        .join('\n\n');
      return `# ${article.title}\n\n${body}\n`;
    }
    
    const article = await generateArticle('https://www.youtube.com/watch?v=XXXXXXXXXXX');
    console.log(toMarkdown(article));
    console.log(`Credits used: ${article.creditsUsed}, left: ${article.creditsRemaining}`);
    

    Workflow d'automatisation

    ┌─────────────────────────────────────────────────────────┐
    │                      SOURCES VIDÉO                      │
    │  Playlist / chaîne YouTube / liste d'URL                │
    └──────────────────────┬──────────────────────────────────┘
                           │  URL YouTube
                           ▼
    ┌─────────────────────────────────────────────────────────┐
    │                      ORCHESTRATION                      │
    │  Tâche cron / n8n / Make.com / votre propre file        │
    │  - Ignorer les URL déjà traitées                        │
    │  - Rester sous 10 requêtes par minute et par clé        │
    │  - Réessayer sur 429 / 502 après le délai Retry-After   │
    └──────────────────────┬──────────────────────────────────┘
                           │  POST /api/v1/articles
                           ▼
    ┌─────────────────────────────────────────────────────────┐
    │                       API VIDIOME                       │
    │  1. Récupérer la transcription de la vidéo YouTube      │
    │  2. Rédiger l'article avec un LLM                       │
    │  3. L'enregistrer dans votre compte, renvoyer           │
    │     le titre + les sections                             │
    └──────────────────────┬──────────────────────────────────┘
                           │  JSON de l'article
                           ▼
    ┌─────────────────────────────────────────────────────────┐
    │                     POST-TRAITEMENT                     │
    │  - Convertir les sections en HTML ou Markdown           │
    │  - Relecture humaine (recommandée)                      │
    │  - Images, liens internes, meta description, schema     │
    └──────────────────────┬──────────────────────────────────┘
                           │  Article prêt à publier
                           ▼
    ┌─────────────────────────────────────────────────────────┐
    │                     CMS / PLATEFORME                    │
    │  WordPress / Ghost / Webflow / Contentful / Sanity      │
    └─────────────────────────────────────────────────────────┘
    

    Cas d'usage

    Traiter une chaîne YouTube par lots

    Chaque clé API est limitée à 10 requêtes par minute. Comme chaque requête reste ouverte jusqu'à ce que l'article soit prêt, quelques requêtes en parallèle suffisent largement :

    async function processVideos(urls, { language = 'fr', concurrency = 2 } = {}) {
      const results = [];
      const queue = [...urls];
    
      async function worker() {
        while (queue.length > 0) {
          const url = queue.shift();
          try {
            results.push({ url, article: await generateArticle(url, language) });
          } catch (error) {
            if (error.status === 429 && error.retryAfter) {
              await new Promise((r) => setTimeout(r, error.retryAfter * 1000));
              queue.push(url); // on réessaiera plus tard
            } else {
              results.push({ url, error: error.message });
            }
          }
        }
      }
    
      await Promise.all(Array.from({ length: concurrency }, worker));
      return results;
    }
    

    Arrêtez le lot dès que vous recevez une erreur 402 : votre solde de crédits est insuffisant pour la vidéo suivante.

    Publier sur WordPress

    Vidiome renvoie des sections, pas du HTML : convertissez-les d'abord. Une bibliothèque Markdown comme marked fait très bien l'affaire, ou vous pouvez vous contenter d'une conversion minimale :

    import { marked } from 'marked';
    
    async function publishToWordPress(article, { siteUrl, username, appPassword }) {
      const credentials = Buffer.from(`${username}:${appPassword}`).toString('base64');
      const html = marked.parse(
        article.sections.map((s) => `## ${s.title}\n\n${s.content}`).join('\n\n')
      );
    
      const response = await fetch(`${siteUrl}/wp-json/wp/v2/posts`, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'Authorization': `Basic ${credentials}`,
        },
        body: JSON.stringify({
          title: article.title,
          content: html,
          status: 'draft', // relire avant de publier
        }),
      });
    
      return response.json();
    }
    

    Une vidéo, plusieurs langues

    Lancez une requête par langue. Chacune est une génération distincte et consomme des crédits comme n'importe quelle autre :

    const LANGUAGES = ['en', 'fr', 'es', 'de'];
    
    async function generateInLanguages(youtubeUrl) {
      const versions = {};
      for (const language of LANGUAGES) {
        versions[language] = await generateArticle(youtubeUrl, language);
      }
      return versions;
    }
    

    Limites et crédits

    • Limite de débit : 10 requêtes par minute et par clé API, sur tous les forfaits payants. Au-delà, vous recevez une erreur 429 avec un en-tête Retry-After (en secondes).
    • Durée : chaque requête peut durer jusqu'à 5 minutes côté Vidiome. Les vidéos très longues peuvent ne pas tenir dans ce délai ; découpez votre workflow ou passez par l'application web pour celles-ci.
    • Crédits : l'API coûte la même chose que l'application web, au tarif actuel de 4 crédits par minute de vidéo avec un minimum de 20 crédits (une vidéo de 10 minutes consomme 40 crédits, une vidéo de 60 minutes 240). Chaque réponse indique creditsUsed et creditsRemaining. Consultez les tarifs pour les forfaits et les packs de crédits.

    Gestion des erreurs

    Les erreurs sont renvoyées en JSON avec un champ error.

    Statut error Que faire
    400 Invalid request body ou invalid-youtube-url Vérifiez l'URL et le code de langue
    401 Missing API key / Invalid or revoked API key Vérifiez l'en-tête x-api-key
    402 insufficient-credits (avec required et available) Rechargez vos crédits ou passez à un forfait supérieur
    403 api_access_requires_paid_plan Passez à un forfait payant
    404 no-captions La vidéo n'a pas de transcription ; essayez une autre vidéo
    429 limite de débit, ou transcript_provider_rate_limited Attendez le délai Retry-After, puis réessayez
    500 article_generation_failed Réessayez une fois ; si l'erreur persiste, contactez-nous
    502 transcript_provider_unavailable / llm_provider_error Erreur temporaire : réessayez après un délai

    Questions fréquentes

    Puis-je envoyer un fichier vidéo au lieu d'une URL YouTube ?

    Non. L'API n'accepte que des URL YouTube, et la vidéo doit avoir une transcription. Pour les fichiers MP4, MOV ou WebM, utilisez l'application web : elle transcrit l'audio et capture en plus une image pour chaque section.

    Existe-t-il un webhook ou un endpoint de statut ?

    Non. La requête est synchrone et renvoie l'article terminé. Si vous traitez beaucoup de vidéos, placez les appels dans votre propre file de tâches (une tâche cron, n8n, Make.com, un worker) et enregistrez les résultats au fur et à mesure.

    Où vont les articles générés via l'API ?

    Ils sont enregistrés dans votre compte Vidiome : vous les retrouvez dans votre tableau de bord. C'est le moyen le plus simple d'ajouter des captures d'écran, de corriger un passage avec la réécriture IA ou d'exporter l'article en HTML ou en Markdown.


    Prochaines étapes

    Vidiome

    Turn your videos into SEO traffic machines

    Générer mon premier article

    Sans carte bancaire · 120 crédits offerts