# YouTube Transcripción y Subtítulos (español) (`scrapewise/youtube-transcripcion-espanol`) Actor

Transcripción de videos de YouTube en español: texto completo, subtítulos SRT o VTT y marcas de tiempo de videos, canales, listas y búsquedas. Incluye fecha, vistas, duración y miniatura. Modo solo videos nuevos. Videos sin subtítulos no se cobran. Pago por transcripción.

- **URL**: https://apify.com/scrapewise/youtube-transcripcion-espanol.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** Videos, AI, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 transcript delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## YouTube Transcripción y Subtítulos (español)

Obtén la transcripción completa de cualquier video de YouTube en español, o de un canal, una lista de reproducción o una búsqueda entera: texto limpio, segmentos con marcas de tiempo, subtítulos SRT o VTT, y además la fecha de publicación, las vistas, la duración, la descripción y la miniatura. Listo para resúmenes con IA, RAG, flujos de n8n, subtítulos o investigación de contenido.

Por defecto busca primero los subtítulos en español (`es`, `es-419`, `es-ES`) y, si no hay, en inglés.

### Por qué este

- **Videos, canales, listas y búsquedas en un solo campo.** Pega un canal (`/@usuario`), una lista o una URL de búsqueda de YouTube y recibe las transcripciones de sus videos, con límite por fuente, fecha "publicado después de" y Shorts activados o no.
- **Solo videos nuevos desde la última ejecución.** Activa `onlyNewVideos`, programa el Actor a diario y cada ejecución transcribe solo los videos que todavía no tenías.
- **Los videos sin subtítulos nunca rompen tu ejecución.** Vuelven como un resultado con `errorCode` (por ejemplo `NO_CAPTIONS`) y **no se cobran**, así una llamada de un solo video desde n8n, Make o Zapier no rompe tu flujo.
- **Revisa dos veces antes de decir "sin subtítulos".** Los subtítulos se leen directo del reproductor de YouTube con dos clientes distintos, y se prueba un segundo método antes de declarar que un video no tiene subtítulos.
- **Datos del video incluidos:** `publishedAt`, `viewCount`, `lengthSeconds`, `description`, `thumbnailUrl`, `channelId`, título y canal, sin costo extra.
- **Elige los subtítulos:** idiomas en orden de preferencia, solo manuales o solo automáticos, y traducción opcional.
- **SRT y VTT incluidos** al mismo precio, junto al texto y los segmentos.
- **Reemplazo directo:** acepta los nombres de campo de otros scrapers de transcripciones (`videoUrl`, `urls`, `startUrls`, `youtube_url`, `targetLanguage`).

### Casos de uso

- Pasar transcripciones de videos a ChatGPT, Claude o tu pipeline RAG para resumir o responder preguntas sobre videos en español.
- Monitorear un canal: una ejecución diaria con `onlyNewVideos` envía la transcripción de cada video nuevo a tu flujo.
- Convertir un curso, un canal de pódcast o los primeros resultados de una búsqueda en texto para SEO, apuntes o artículos de blog.
- Descargar subtítulos en SRT o VTT para editar o volver a subir.

### Entrada

```json
{
  "videoUrls": [
    "https://www.youtube.com/watch?v=nKPbfIU442g",
    "https://www.youtube.com/@Platzi",
    "https://www.youtube.com/results?search_query=receta+tortilla+de+patatas"
  ],
  "searchQueries": ["curso de python desde cero"],
  "maxVideosPerSource": 10,
  "publishedAfter": "2026-01-01",
  "includeShorts": false,
  "onlyNewVideos": false,
  "languages": ["es", "es-419", "es-ES", "en"],
  "captionType": "any",
  "includeSegments": true,
  "subtitleFormats": ["srt"],
  "maxItems": 50
}
```

- **Videos:** URLs watch, youtu.be, shorts, embed y live, o IDs de 11 caracteres. Los duplicados se eliminan.
- **Canales:** `/@usuario`, `/channel/UC...`, `/c/nombre` y `/user/nombre`, del más nuevo al más antiguo. Con `includeShorts` desactivado recibes videos normales y transmisiones terminadas; activado, también Shorts.
- **Listas de reproducción:** cualquier URL con `list=` que no sea de un solo video, o el ID de la lista.
- **Búsquedas:** URLs de búsqueda de YouTube (`/results?search_query=...`, los filtros de la URL se mantienen) o términos en `searchQueries`. Solo se toman videos.
- `maxVideosPerSource` limita cada canal, lista o búsqueda; `maxItems` limita toda la ejecución.
- Los videos se procesan en paralelo, así que llegan al dataset en el orden en que terminan; ordena por `publishedAt` si necesitas una línea de tiempo.
- `publishedAfter` omite videos más antiguos en todas las entradas; los omitidos no generan resultado ni costo.

**¿Vienes de otro scraper de transcripciones?** Esto funciona tal cual: `{"videoUrl": "https://www.youtube.com/watch?v=...", "targetLanguage": "es"}`, `{"urls": ["..."]}`, `{"startUrls": [{"url": "..."}]}`, `{"youtube_url": "..."}`.

### Salida

Un resultado por video. Los nombres de los campos están en inglés, iguales a los de la versión en inglés de este Actor, para que tus integraciones funcionen con las dos:

```json
{
  "videoId": "nKPbfIU442g",
  "url": "https://www.youtube.com/watch?v=nKPbfIU442g",
  "title": "Curso de PYTHON desde CERO (Completo)",
  "channel": "Soy Dalto",
  "channelId": "UCtoo4_P6ilCj7jwa4FmA5lQ",
  "publishedAt": "2023-01-22T23:52:37+00:00",
  "viewCount": 5980912,
  "lengthSeconds": 29190,
  "thumbnailUrl": "https://i.ytimg.com/vi_webp/nKPbfIU442g/sddefault.webp",
  "category": "Science & Technology",
  "language": "es-419",
  "languageName": "Spanish (Latin America)",
  "isAutoGenerated": false,
  "availableLanguages": ["en-US", "pt-BR", "es-419", "es"],
  "text": "Python es uno de los lenguajes de programación más versátiles que existen. ...",
  "wordCount": 102298,
  "durationSeconds": 29186.6,
  "segments": [{ "text": "Python es uno de los lenguajes de programación\nmás versátiles que existen.", "start": 0.1, "duration": 3.26 }],
  "error": null,
  "errorCode": null,
  "sourceUrl": "https://www.youtube.com/watch?v=nKPbfIU442g",
  "scrapedAt": "2026-09-13T03:30:59+00:00"
}
```

Salida real de una prueba del 13/09/2026, con el texto recortado. Cuando existen subtítulos manuales en una variante del idioma pedido (aquí `es-419`), se prefieren a los automáticos (`es`). `lengthSeconds` es la duración real del video; `durationSeconds` es donde termina el último subtítulo.

Los videos que no se pudieron transcribir traen `error` y `errorCode` (y los datos del video cuando YouTube los devolvió) y **no se cobran**:

| errorCode | Significado |
|---|---|
| `NO_CAPTIONS` | El video no tiene subtítulos |
| `NO_CAPTIONS_IN_LANGUAGE` | No hay subtítulos del tipo pedido |
| `VIDEO_UNAVAILABLE` / `VIDEO_UNPLAYABLE` | Video privado, eliminado o bloqueado por región |
| `AGE_RESTRICTED` | Video con restricción de edad |
| `LIVE_NOT_ENDED` | Transmisión en vivo en curso, programada o sin grabación disponible |
| `INVALID_VIDEO_ID` | No es un video válido |
| `BLOCKED` | YouTube bloqueó todos los intentos; prueba de nuevo |

La ejecución solo falla cuando no se entregó nada y YouTube bloqueó las solicitudes, o cuando ningún canal, lista o búsqueda pudo listarse.

### Precios

**Desde US$ 3,50 por cada 1.000 transcripciones entregadas, sin mensualidad.** US$ 5,00 en el plan Free y menos en los planes pagos de Apify:

| Plan de Apify | Por 1.000 transcripciones |
|---|---|
| Free | US$ 5,00 |
| Starter (Bronze) | US$ 4,50 |
| Scale (Silver) | US$ 4,00 |
| Business (Gold) o superior | US$ 3,50 |

Un cobro = un video con transcripción entregada, sin importar la duración o el formato. Listar canales, listas y búsquedas es gratis, igual que los videos sin subtítulos, no disponibles o bloqueados.

### Cómo usarlo

- **Consola:** pega las URLs, haz clic en Start y descarga JSON, CSV o Excel.
- **API:** `POST https://api.apify.com/v2/acts/scrapewise~youtube-transcripcion-espanol/run-sync-get-dataset-items?token=TU_TOKEN` con la entrada de arriba como cuerpo.
- **Programación:** ejecútalo a diario sobre tus canales con `onlyNewVideos` activado, usando Apify Schedules.
- **Integraciones:** n8n, Make, Zapier y Google Sheets mediante las integraciones de Apify.

### Preguntas frecuentes

**¿Tengo que configurar algo?** No. Pega URLs de videos, canales, listas o búsquedas y haz clic en Start. Todo lo demás ya viene configurado.

**¿Solo funciona con videos en español?** No. Prefiere subtítulos en español, pero transcribe videos en cualquier idioma. Cambia `languages` (por ejemplo `["en", "es"]`) si quieres otro orden.

**¿Me cobran por videos sin subtítulos?** No. Se cobra una vez por video con transcripción entregada. Videos fallidos, listados de canales y listas, y videos omitidos son gratis.

**¿Qué significa "por 1.000 transcripciones"?** Cada transcripción entregada es un cobro, sin importar la duración del video o el formato. 1.000 videos con transcripción = el precio de la tabla.

**¿Puedo recibir solo los videos que un canal publicó desde mi última ejecución?** Sí. Activa `onlyNewVideos` y programa el Actor.

**¿Cuál es la diferencia con la versión en inglés?** Ninguna en el resultado: mismo motor, mismos campos y mismo precio. Esta versión tiene la interfaz, la documentación y los idiomas por defecto en español.

**¿Cómo lo uso desde n8n, Make o Zapier?** Con la integración de Apify, llamando a `scrapewise/youtube-transcripcion-espanol` con la entrada de arriba. Un video por llamada funciona bien, y un video sin subtítulos devuelve un resultado con `errorCode` en lugar de romper el flujo.

**¿Puedo usarlo desde un agente de IA (MCP)?** Sí, a través del servidor MCP de Apify, como cualquier Actor.

**Dijo NO\_CAPTIONS pero el video tiene subtítulos.** Abre un issue con la URL del video. Revisamos dos clientes de YouTube y un segundo método antes de decir que no hay subtítulos, y corregimos rápido los casos reportados.

**¿Transcribe el audio?** No. Lee los subtítulos que YouTube ya tiene (manuales o automáticos), que cubren la mayoría de los videos en español.

### Changelog

- **2026-09-14:** precio más bajo, desde US$ 3,50 por 1.000 en planes pagos (US$ 5,00 en Free).
- **2026-09-13:** primera versión en español, con el motor de la versión en inglés (canales, listas, búsquedas, solo videos nuevos, SRT/VTT, datos del video).

### Limitaciones

- Solo se transcriben videos que tienen subtítulos (manuales o automáticos). Este Actor no transcribe audio.
- La traducción usa la del propio YouTube, que rechaza la mayoría de las solicitudes. Cuando lo hace, se entrega el idioma original y el motivo queda en `translationError`.
- No se pueden transcribir videos con restricción de edad ni transmisiones en vivo en curso.
- YouTube bloquea la mayoría de las IPs de datacenter, por eso el proxy residencial es el predeterminado. Déjalo activado.
- ¿Algo falló? Abre un issue en la página del Actor. Respondemos en menos de 12 horas.

Este Actor recopila solo datos públicos y respeta los términos del sitio.

Palabras clave: transcripción de YouTube, transcripcion youtube, subtítulos de YouTube, subtitulos youtube, transcribir video de YouTube, video a texto, descargar subtítulos SRT.

# Actor input Schema

## `videoUrls` (type: `array`):

Mezcla lo que quieras: URLs de videos (watch, youtu.be, shorts, embed, live) o IDs de 11 caracteres; canales (/@usuario, /channel/UC..., /c/..., /user/...); listas de reproducción (list=...); búsquedas de YouTube (/results?search\_query=...). Canales, listas y búsquedas se convierten en videos, con el límite de 'Máximo de videos por canal, lista o búsqueda'.

## `searchQueries` (type: `array`):

Busca estos términos en YouTube y transcribe los videos encontrados (solo videos, sin canales ni listas), con el límite de 'Máximo de videos por canal, lista o búsqueda'.

## `languages` (type: `array`):

Códigos de idioma en orden de preferencia (por ejemplo es, es-419, es-ES, en). Si ninguno está disponible, se usa el primer subtítulo manual y luego el generado automáticamente.

## `maxItems` (type: `integer`):

Límite total de la ejecución, sumando todas las entradas. Protege tu presupuesto.

## `maxVideosPerSource` (type: `integer`):

Cuántos videos tomar de cada canal, lista o búsqueda. Los canales se listan del más nuevo al más antiguo.

## `publishedAfter` (type: `string`):

Omite los videos publicados antes de esta fecha (AAAA-MM-DD). Vale para todas las entradas, incluso videos sueltos. Los videos omitidos no generan resultado y no se cobran.

## `includeShorts` (type: `boolean`):

Incluye Shorts al listar un canal o una búsqueda. Desactivado: un canal entrega sus videos normales y transmisiones en vivo ya terminadas.

## `onlyNewVideos` (type: `boolean`):

Recuerda qué videos de cada canal, lista o búsqueda ya tuvieron transcripción (en un almacén clave-valor con nombre en tu cuenta, 'youtube-transcripcion-espanol-videos-nuevos') y los omite en las siguientes ejecuciones. Ideal para programar a diario o semanalmente. Los videos sin subtítulos se vuelven a intentar la próxima vez, gratis.

## `captionType` (type: `string`):

Qué subtítulos usar. Los videos sin el tipo pedido vuelven con errorCode NO\_CAPTIONS\_IN\_LANGUAGE y no se cobran.

## `includeSegments` (type: `boolean`):

Agrega un arreglo 'segments' con texto, inicio y duración (segundos) de cada línea de subtítulo.

## `subtitleFormats` (type: `array`):

Agrega los campos 'srt' y/o 'vtt' con el archivo de subtítulos completo, listo para usar. Mismo precio.

## `translateTo` (type: `string`):

Código de idioma para traducir la transcripción con la traducción del propio YouTube (por ejemplo es, en). YouTube rechaza la mayoría de estas solicitudes; cuando lo hace, se entrega el idioma original y el motivo queda en translationError.

## `videoUrl` (type: `string`):

Una URL de video. Mismo nombre de campo que otros scrapers de transcripciones, para cambiar sin tocar tu integración. Se suma a la lista de arriba.

## `targetLanguage` (type: `string`):

Código del idioma de la transcripción a buscar primero (por ejemplo es, en). Mismo nombre de campo que otros scrapers; va al inicio de 'Idiomas preferidos'. Para traducir usa 'Traducir a'.

## `tryDatacenterFirst` (type: `boolean`):

Cada video se intenta dos veces por proxy de datacenter antes de pasar al proxy de abajo. Mantiene las ejecuciones rápidas y baratas; desactívalo solo si quieres residencial desde la primera solicitud.

## `proxyConfiguration` (type: `object`):

YouTube bloquea la mayoría de las IPs de datacenter; el proxy residencial es el predeterminado y el recomendado.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.youtube.com/watch?v=nKPbfIU442g",
    "https://www.youtube.com/watch?v=pvlkYYdIBV0"
  ],
  "languages": [
    "es",
    "es-419",
    "es-ES",
    "en"
  ],
  "maxItems": 50,
  "maxVideosPerSource": 10,
  "includeShorts": false,
  "onlyNewVideos": false,
  "captionType": "any",
  "includeSegments": true,
  "subtitleFormats": [],
  "tryDatacenterFirst": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `resultsCsv` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "videoUrls": [
        "https://www.youtube.com/watch?v=nKPbfIU442g",
        "https://www.youtube.com/watch?v=pvlkYYdIBV0"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/youtube-transcripcion-espanol").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "videoUrls": [
        "https://www.youtube.com/watch?v=nKPbfIU442g",
        "https://www.youtube.com/watch?v=pvlkYYdIBV0",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/youtube-transcripcion-espanol").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "videoUrls": [
    "https://www.youtube.com/watch?v=nKPbfIU442g",
    "https://www.youtube.com/watch?v=pvlkYYdIBV0"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scrapewise/youtube-transcripcion-espanol --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/youtube-transcripcion-espanol"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/m5hHFw7bx56tWUDOt/builds/ZD0WlEd0Zow2CHlXN/openapi.json
