Cómo utilizar la API de Vidiome para automatizar la generación de artículos a partir de vídeo

    ·9 min de lectura·Por Vidiome Team
    Vidiome APIArticle AutomationDeveloper TutorialContent Automation

    Tutorial técnico para desarrolladores: utilice el punto final POST /api/v1/articles de Vidiome para automatizar la generación de vídeo a artículo a escala. Se incluyen ejemplos de Curl + Node.js.

    La API REST de Vidiome convierte un vídeo de YouTube en un artículo de blog estructurado con una sola solicitud. Envías una URL de YouTube, Vidiome lee la transcripción del vídeo, redacta el artículo con un LLM y te lo devuelve en JSON: un título y una lista de secciones, cada una con su propio título H2, su contenido y sus marcas de tiempo.

    Este tutorial cubre la autenticación, el formato de la solicitud y de la respuesta, ejemplos con curl y Node.js, el procesamiento por lotes, la publicación en WordPress y los límites que debes tener en cuenta.

    A quién va dirigido este tutorial

    • Desarrolladores SaaS que crean funciones de automatización de contenido para clientes o herramientas internas
    • Agencias de contenido que procesan muchos vídeos cada semana y quieren eliminar los pasos manuales
    • Equipos de plataforma que integran la conversión de vídeo a artículo en un CMS o flujo de contenido existente

    Si eres creador y no desarrollador, la aplicación web de Vidiome es el camino más rápido. Además, captura una imagen para cada sección, algo que la API no hace.

    Vidiome

    Turn your videos into SEO traffic machines

    Generar mi primer artículo

    Sin tarjeta bancaria · 120 créditos gratuitos

    Requisitos previos

    • Una cuenta de Vidiome con un plan de pago (Starter, Pro o Business). Las solicitudes a la API desde cuentas gratuitas se rechazan con un 403.
    • Una clave API, creada en la aplicación en Perfil → Claves API. Las claves empiezan por vdm_live_. Mantenlas en secreto: cualquiera que tenga la clave puede gastar tus créditos.
    • Un vídeo de YouTube que tenga transcripción (subtítulos manuales o automáticos). La API trabaja a partir de esa transcripción.

    Las cuentas nuevas reciben 120 créditos gratis para probar la aplicación web antes de elegir un plan.


    Endpoint: POST /api/v1/articles

    Solicitud

    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 también funciona.

    Cuerpo de la solicitud

    {
      "youtubeUrl": "https://www.youtube.com/watch?v=XXXXXXXXXXX",
      "language": "es"
    }
    
    Campo Tipo Obligatorio Descripción
    youtubeUrl string Sí URL completa de un vídeo de YouTube
    language string No Idioma en el que se redacta el artículo: en, fr, es, pt, de, ru, hi, uk, id o tr. Indícalo siempre: sin él, no se impone ningún idioma

    Esa es toda la solicitud. No hay ningún parámetro de subida de archivos, de formato de salida ni de palabra clave.

    Respuesta

    La llamada es síncrona: la conexión permanece abierta mientras Vidiome genera el artículo y, después, llega el resultado completo. Cuenta con entre unos segundos y unos minutos según la duración del vídeo.

    {
      "id": "5b0c9c2e-6f1d-4d8a-9a57-2f1f3c1e8b21",
      "title": "Cómo convertir un vídeo en un mes de contenido",
      "sections": [
        {
          "id": "a3f1…",
          "title": "Introducción: un vídeo, muchos formatos",
          "content": "La mayoría de los creadores publican un vídeo y pasan a otra cosa…\n\n### Por qué la transcripción es solo un punto de partida\n\n…",
          "startTime": 0,
          "endTime": 74,
          "images": []
        }
      ],
      "videoUrl": "https://www.youtube.com/watch?v=XXXXXXXXXXX",
      "videoId": "XXXXXXXXXXX",
      "language": "es",
      "creditsUsed": 40,
      "creditsRemaining": 460,
      "createdAt": "2026-09-26T10:23:41.000Z"
    }
    

    Algunas cosas que debes saber sobre la respuesta:

    • sections van en orden de lectura: una introducción, las secciones del cuerpo y una conclusión. title es el H2 de la sección. content es texto con líneas ### para los subtítulos H3, líneas en blanco entre párrafos, **negrita** y elementos de lista - .
    • startTime / endTime están en segundos e indican la parte del vídeo de la que procede cada sección. Resultan útiles para insertar el vídeo en el momento adecuado.
    • images siempre está vacío a través de la API. Las capturas de pantalla las toma la aplicación web en el navegador. Para añadirlas, abre el artículo en Vidiome y elígelas allí, o usa tus propias imágenes.
    • El artículo se guarda en tu cuenta (id). Aparece en tu panel de Vidiome, donde puedes editarlo.

    Ejemplos de código

    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": "es"
      }'
    

    Node.js (fetch)

    const VIDIOME_API_KEY = process.env.VIDIOME_API_KEY;
    
    async function generateArticle(youtubeUrl, language = 'es') {
      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 generación puede tardar unos minutos: que el cliente no se rinda antes.
        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;
    }
    
    // Convierte las secciones en Markdown (o pásalas a tu propio renderizador).
    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}`);
    

    Flujo de automatización

    ┌─────────────────────────────────────────────────────────┐
    │                   ORIGEN DE LOS VÍDEOS                  │
    │  Lista / canal de YouTube / lista de URL                │
    └──────────────────────┬──────────────────────────────────┘
                           │  URL de YouTube
                           ▼
    ┌─────────────────────────────────────────────────────────┐
    │                       ORQUESTACIÓN                      │
    │  Tarea cron / n8n / Make.com / tu propia cola           │
    │  - Omitir las URL ya procesadas                         │
    │  - No superar 10 solicitudes por minuto por clave       │
    │  - Reintentar ante 429 / 502 tras el Retry-After        │
    └──────────────────────┬──────────────────────────────────┘
                           │  POST /api/v1/articles
                           ▼
    ┌─────────────────────────────────────────────────────────┐
    │                      API DE VIDIOME                     │
    │  1. Obtener la transcripción del vídeo de YouTube       │
    │  2. Redactar el artículo con un LLM                     │
    │  3. Guardarlo en tu cuenta, devolver título             │
    │     + secciones                                         │
    └──────────────────────┬──────────────────────────────────┘
                           │  JSON del artículo
                           ▼
    ┌─────────────────────────────────────────────────────────┐
    │                    POSTPROCESAMIENTO                    │
    │  - Convertir las secciones a HTML o Markdown            │
    │  - Revisión humana (recomendada)                        │
    │  - Imágenes, enlaces internos, meta description, schema │
    └──────────────────────┬──────────────────────────────────┘
                           │  Artículo listo para publicar
                           ▼
    ┌─────────────────────────────────────────────────────────┐
    │                     CMS / PLATAFORMA                    │
    │  WordPress / Ghost / Webflow / Contentful / Sanity      │
    └─────────────────────────────────────────────────────────┘
    

    Casos de uso

    Procesar un canal de YouTube por lotes

    Cada clave API está limitada a 10 solicitudes por minuto. Como cada solicitud permanece abierta hasta que el artículo está listo, basta con unas pocas solicitudes en paralelo:

    async function processVideos(urls, { language = 'es', 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); // volver a intentarlo más tarde
            } else {
              results.push({ url, error: error.message });
            }
          }
        }
      }
    
      await Promise.all(Array.from({ length: concurrency }, worker));
      return results;
    }
    

    Detén el lote cuando recibas un 402: tu saldo de créditos no alcanza para el siguiente vídeo.

    Publicar en WordPress

    Vidiome devuelve secciones, no HTML, así que primero conviértelas. Una biblioteca de Markdown como marked sirve perfectamente, o puedes mantener la conversión al mínimo:

    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', // revisar antes de publicar
        }),
      });
    
      return response.json();
    }
    

    Un vídeo, varios idiomas

    Lanza una solicitud por idioma. Cada una es una generación independiente y consume créditos como cualquier otra:

    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;
    }
    

    Límites y créditos

    • Límite de frecuencia: 10 solicitudes por minuto por clave API, en todos los planes de pago. Por encima de eso recibes un 429 con una cabecera Retry-After (en segundos).
    • Duración: cada solicitud puede durar hasta 5 minutos en el lado de Vidiome. Es posible que los vídeos muy largos no quepan en ese tiempo; divide tu flujo o usa la aplicación web para ellos.
    • Créditos: la API cuesta lo mismo que la aplicación web, a la tarifa actual de 4 créditos por minuto de vídeo con un mínimo de 20 créditos (un vídeo de 10 minutos consume 40 créditos; uno de 60 minutos, 240). Cada respuesta indica creditsUsed y creditsRemaining. Consulta los precios para ver los planes y los paquetes de créditos.

    Gestión de errores

    Los errores se devuelven en JSON con un campo error.

    Estado error Qué hacer
    400 Invalid request body o invalid-youtube-url Comprueba la URL y el código de idioma
    401 Missing API key / Invalid or revoked API key Comprueba la cabecera x-api-key
    402 insufficient-credits (con required y available) Recarga créditos o mejora tu plan
    403 api_access_requires_paid_plan Cámbiate a un plan de pago
    404 no-captions El vídeo no tiene transcripción; prueba con otro vídeo
    429 límite de frecuencia, o transcript_provider_rate_limited Espera el tiempo de Retry-After y vuelve a intentarlo
    500 article_generation_failed Reinténtalo una vez; si sigue fallando, contáctanos
    502 transcript_provider_unavailable / llm_provider_error Error temporal: vuelve a intentarlo tras una espera

    Preguntas frecuentes

    ¿Puedo enviar un archivo de vídeo en lugar de una URL de YouTube?

    No. La API solo acepta URL de YouTube, y el vídeo necesita una transcripción. Para archivos MP4, MOV o WebM, usa la aplicación web: transcribe el audio y, además, captura una imagen para cada sección.

    ¿Hay un webhook o un endpoint de estado?

    No. La solicitud es síncrona y devuelve el artículo terminado. Si procesas muchos vídeos, coloca las llamadas en tu propia cola de trabajos (una tarea cron, n8n, Make.com, un worker) y guarda los resultados a medida que llegan.

    ¿Dónde van los artículos generados con la API?

    Se guardan en tu cuenta de Vidiome, así que los encontrarás en tu panel. Es la forma más sencilla de añadir capturas de pantalla, corregir un pasaje con la reescritura con IA o exportar el artículo en HTML o Markdown.


    Próximos pasos

    Vidiome

    Turn your videos into SEO traffic machines

    Generar mi primer artículo

    Sin tarjeta bancaria · 120 créditos gratuitos