# YouTube Transcript Extractor & Video Detail Scraper

Scrape full video metadata (title, description, channel info, publish date, view/like counts, tags, categories, thumbnails), channel details, and all engagement metrics.
Plus: Download complete video transcripts in any available or auto-translated language, with clean plain-text output.

## Actor Statistics

- Total users: 93
- Monthly users: 23
- Runs succeeded: 93.16%
- Categories: Lead generation, Videos

## Pricing

$4.00/month + usage

## Input Schema

- **startUrls** (type: array): List of URLs to start scraping from, it can be in form of a link or search term or query from youtube.
- **includeTranscript** (type: boolean): Whether to include the transcript of the video in the output.
- **language** (type: string): Select the language for the transcript. If not available, will fall back to the default language.
- **maxConcurrency** (type: integer): Maximum number of pages that can be processed at the same time.
- **minConcurrency** (type: integer): Minimum number of pages that will be processed at the same time.
- **maxRequestRetries** (type: integer): Number of times the crawler will retry a failed request before giving up.
- **proxy** (type: object): Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.

## API example

## YouTube Transcript Extractor & Video Detail Scraper

- **OpenAPI Version:** `3.1.1`
- **API Version:** `0.0`

Scrape full video metadata (title, description, channel info, publish date, view/like counts, tags, categories, thumbnails), channel details, and all engagement metrics. Plus: Download complete video transcripts in any available or auto-translated language, with clean plain-text output.

### Servers

- **URL:** `https://api.apify.com/v2`

### Operations

#### Executes an Actor, waits for its completion, and returns Actor's dataset items in response.

- **Method:** `POST`
- **Path:** `/acts/memo23~youtube-video-details-scraper/run-sync-get-dataset-items`
- **Tags:** Run Actor

##### Request Body

###### Content-Type: application/json

- **`startUrls` (required)**

  `array` — List of URLs to start scraping from, it can be in form of a link or search term or query from youtube.

  **Items:**

  `string`

- **`includeTranscript`**

  `boolean`, default: `true` — Whether to include the transcript of the video in the output.

- **`language`**

  `string`, possible values: `"default", "ab", "aa", "af", "ay", "ak", "sq", "am", "ar", "hy", "as", "az", "bn", "eu", "ba", "bho", "be", "bs", "br", "bg", "my", "ceb", "tn", "cs", "da", "dv", "dz", "en", "eo", "et", "ee", "fo", "fj", "fil", "fi", "fr", "gaa", "gl", "lg", "el", "ka", "gu", "gn", "ht", "ha", "haw", "iw", "hi", "hmn", "hr", "ig", "id", "iu", "ga", "is", "ja", "jv", "yi", "yo", "kl", "kn", "ca", "kk", "qu", "kha", "zh-Hans", "zh-Hant", "rw", "ky", "km", "ko", "co", "kri", "ku", "lo", "la", "lv", "ln", "lt", "lua", "lb", "luo", "hu", "mk", "ml", "ms", "mg", "mt", "gv", "mi", "mr", "mfe", "mn", "ne", "new", "nl", "no", "ny", "de", "oc", "or", "om", "os", "pam", "pa", "ps", "fa", "pl", "pt", "pt-PT", "ro", "rn", "ru", "sm", "sg", "sa", "crs", "st", "sn", "sd", "si", "nso", "sk", "sl", "so", "sr", "su", "sw", "ss", "gd", "es", "sv", "tg", "th", "it", "ta", "tt", "te", "bo", "ti", "to", "ts", "tum", "tk", "tr", "ug", "uk", "ur", "uz", "cy", "ve", "vi", "wo", "war", "xh", "fy", "zu"`, default: `"default"` — Select the language for the transcript. If not available, will fall back to the default language.

- **`maxConcurrency`**

  `integer`, default: `10` — Maximum number of pages that can be processed at the same time.

- **`maxRequestRetries`**

  `integer`, default: `10` — Number of times the crawler will retry a failed request before giving up.

- **`minConcurrency`**

  `integer`, default: `1` — Minimum number of pages that will be processed at the same time.

- **`proxy`**

  `object`, default: `{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"US"}` — Specifies proxy servers that will be used by the scraper in order to hide its origin.\<br>\<br>For details, see \<a href='https://apify.com/apify/web-scraper#proxy-configuration' target='\_blank' rel='noopener'>Proxy configuration\</a> in README.

**Example:**

```
{
  "startUrls": [
    ""
  ],
  "includeTranscript": true,
  "language": "default",
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 10,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

##### Responses

###### Status: 200 OK

#### Executes an Actor and returns information about the initiated run in response.

- **Method:** `POST`
- **Path:** `/acts/memo23~youtube-video-details-scraper/runs`
- **Tags:** Run Actor

##### Request Body

###### Content-Type: application/json

- **`startUrls` (required)**

  `array` — List of URLs to start scraping from, it can be in form of a link or search term or query from youtube.

  **Items:**

  `string`

- **`includeTranscript`**

  `boolean`, default: `true` — Whether to include the transcript of the video in the output.

- **`language`**

  `string`, possible values: `"default", "ab", "aa", "af", "ay", "ak", "sq", "am", "ar", "hy", "as", "az", "bn", "eu", "ba", "bho", "be", "bs", "br", "bg", "my", "ceb", "tn", "cs", "da", "dv", "dz", "en", "eo", "et", "ee", "fo", "fj", "fil", "fi", "fr", "gaa", "gl", "lg", "el", "ka", "gu", "gn", "ht", "ha", "haw", "iw", "hi", "hmn", "hr", "ig", "id", "iu", "ga", "is", "ja", "jv", "yi", "yo", "kl", "kn", "ca", "kk", "qu", "kha", "zh-Hans", "zh-Hant", "rw", "ky", "km", "ko", "co", "kri", "ku", "lo", "la", "lv", "ln", "lt", "lua", "lb", "luo", "hu", "mk", "ml", "ms", "mg", "mt", "gv", "mi", "mr", "mfe", "mn", "ne", "new", "nl", "no", "ny", "de", "oc", "or", "om", "os", "pam", "pa", "ps", "fa", "pl", "pt", "pt-PT", "ro", "rn", "ru", "sm", "sg", "sa", "crs", "st", "sn", "sd", "si", "nso", "sk", "sl", "so", "sr", "su", "sw", "ss", "gd", "es", "sv", "tg", "th", "it", "ta", "tt", "te", "bo", "ti", "to", "ts", "tum", "tk", "tr", "ug", "uk", "ur", "uz", "cy", "ve", "vi", "wo", "war", "xh", "fy", "zu"`, default: `"default"` — Select the language for the transcript. If not available, will fall back to the default language.

- **`maxConcurrency`**

  `integer`, default: `10` — Maximum number of pages that can be processed at the same time.

- **`maxRequestRetries`**

  `integer`, default: `10` — Number of times the crawler will retry a failed request before giving up.

- **`minConcurrency`**

  `integer`, default: `1` — Minimum number of pages that will be processed at the same time.

- **`proxy`**

  `object`, default: `{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"US"}` — Specifies proxy servers that will be used by the scraper in order to hide its origin.\<br>\<br>For details, see \<a href='https://apify.com/apify/web-scraper#proxy-configuration' target='\_blank' rel='noopener'>Proxy configuration\</a> in README.

**Example:**

```
{
  "startUrls": [
    ""
  ],
  "includeTranscript": true,
  "language": "default",
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 10,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

##### Responses

###### Status: 200 OK

\####### Content-Type: application/json

- **`data`**

  `object`

  - **`actId`**

    `string`

  - **`buildId`**

    `string`

  - **`buildNumber`**

    `string`

  - **`containerUrl`**

    `string`

  - **`defaultDatasetId`**

    `string`

  - **`defaultKeyValueStoreId`**

    `string`

  - **`defaultRequestQueueId`**

    `string`

  - **`finishedAt`**

    `string`, format: `date-time`

  - **`id`**

    `string`

  - **`meta`**

    `object`

    - **`origin`**

      `string`

    - **`userAgent`**

      `string`

  - **`options`**

    `object`

    - **`build`**

      `string`

    - **`diskMbytes`**

      `integer`

    - **`memoryMbytes`**

      `integer`

    - **`timeoutSecs`**

      `integer`

  - **`startedAt`**

    `string`, format: `date-time`

  - **`stats`**

    `object`

    - **`computeUnits`**

      `integer`

    - **`inputBodyLen`**

      `integer`

    - **`rebootCount`**

      `integer`

    - **`restartCount`**

      `integer`

    - **`resurrectCount`**

      `integer`

  - **`status`**

    `string`

  - **`usage`**

    `object`

    - **`ACTOR_COMPUTE_UNITS`**

      `integer`

    - **`DATA_TRANSFER_EXTERNAL_GBYTES`**

      `integer`

    - **`DATA_TRANSFER_INTERNAL_GBYTES`**

      `integer`

    - **`DATASET_READS`**

      `integer`

    - **`DATASET_WRITES`**

      `integer`

    - **`KEY_VALUE_STORE_LISTS`**

      `integer`

    - **`KEY_VALUE_STORE_READS`**

      `integer`

    - **`KEY_VALUE_STORE_WRITES`**

      `integer`

    - **`PROXY_RESIDENTIAL_TRANSFER_GBYTES`**

      `integer`

    - **`PROXY_SERPS`**

      `integer`

    - **`REQUEST_QUEUE_READS`**

      `integer`

    - **`REQUEST_QUEUE_WRITES`**

      `integer`

  - **`usageTotalUsd`**

    `number`

  - **`usageUsd`**

    `object`

    - **`ACTOR_COMPUTE_UNITS`**

      `integer`

    - **`DATA_TRANSFER_EXTERNAL_GBYTES`**

      `integer`

    - **`DATA_TRANSFER_INTERNAL_GBYTES`**

      `integer`

    - **`DATASET_READS`**

      `integer`

    - **`DATASET_WRITES`**

      `integer`

    - **`KEY_VALUE_STORE_LISTS`**

      `integer`

    - **`KEY_VALUE_STORE_READS`**

      `integer`

    - **`KEY_VALUE_STORE_WRITES`**

      `number`

    - **`PROXY_RESIDENTIAL_TRANSFER_GBYTES`**

      `integer`

    - **`PROXY_SERPS`**

      `integer`

    - **`REQUEST_QUEUE_READS`**

      `integer`

    - **`REQUEST_QUEUE_WRITES`**

      `integer`

  - **`userId`**

    `string`

**Example:**

```
{
  "data": {
    "id": "",
    "actId": "",
    "userId": "",
    "startedAt": "2025-01-08T00:00:00.000Z",
    "finishedAt": "2025-01-08T00:00:00.000Z",
    "status": "READY",
    "meta": {
      "origin": "API",
      "userAgent": ""
    },
    "stats": {
      "inputBodyLen": 2000,
      "rebootCount": 0,
      "restartCount": 0,
      "resurrectCount": 0,
      "computeUnits": 0
    },
    "options": {
      "build": "latest",
      "timeoutSecs": 300,
      "memoryMbytes": 1024,
      "diskMbytes": 2048
    },
    "buildId": "",
    "defaultKeyValueStoreId": "",
    "defaultDatasetId": "",
    "defaultRequestQueueId": "",
    "buildNumber": "1.0.0",
    "containerUrl": "",
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0,
      "DATASET_READS": 0,
      "DATASET_WRITES": 0,
      "KEY_VALUE_STORE_READS": 0,
      "KEY_VALUE_STORE_WRITES": 1,
      "KEY_VALUE_STORE_LISTS": 0,
      "REQUEST_QUEUE_READS": 0,
      "REQUEST_QUEUE_WRITES": 0,
      "DATA_TRANSFER_INTERNAL_GBYTES": 0,
      "DATA_TRANSFER_EXTERNAL_GBYTES": 0,
      "PROXY_RESIDENTIAL_TRANSFER_GBYTES": 0,
      "PROXY_SERPS": 0
    },
    "usageTotalUsd": 0.00005,
    "usageUsd": {
      "ACTOR_COMPUTE_UNITS": 0,
      "DATASET_READS": 0,
      "DATASET_WRITES": 0,
      "KEY_VALUE_STORE_READS": 0,
      "KEY_VALUE_STORE_WRITES": 0.00005,
      "KEY_VALUE_STORE_LISTS": 0,
      "REQUEST_QUEUE_READS": 0,
      "REQUEST_QUEUE_WRITES": 0,
      "DATA_TRANSFER_INTERNAL_GBYTES": 0,
      "DATA_TRANSFER_EXTERNAL_GBYTES": 0,
      "PROXY_RESIDENTIAL_TRANSFER_GBYTES": 0,
      "PROXY_SERPS": 0
    }
  }
}
```

#### Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.

- **Method:** `POST`
- **Path:** `/acts/memo23~youtube-video-details-scraper/run-sync`
- **Tags:** Run Actor

##### Request Body

###### Content-Type: application/json

- **`startUrls` (required)**

  `array` — List of URLs to start scraping from, it can be in form of a link or search term or query from youtube.

  **Items:**

  `string`

- **`includeTranscript`**

  `boolean`, default: `true` — Whether to include the transcript of the video in the output.

- **`language`**

  `string`, possible values: `"default", "ab", "aa", "af", "ay", "ak", "sq", "am", "ar", "hy", "as", "az", "bn", "eu", "ba", "bho", "be", "bs", "br", "bg", "my", "ceb", "tn", "cs", "da", "dv", "dz", "en", "eo", "et", "ee", "fo", "fj", "fil", "fi", "fr", "gaa", "gl", "lg", "el", "ka", "gu", "gn", "ht", "ha", "haw", "iw", "hi", "hmn", "hr", "ig", "id", "iu", "ga", "is", "ja", "jv", "yi", "yo", "kl", "kn", "ca", "kk", "qu", "kha", "zh-Hans", "zh-Hant", "rw", "ky", "km", "ko", "co", "kri", "ku", "lo", "la", "lv", "ln", "lt", "lua", "lb", "luo", "hu", "mk", "ml", "ms", "mg", "mt", "gv", "mi", "mr", "mfe", "mn", "ne", "new", "nl", "no", "ny", "de", "oc", "or", "om", "os", "pam", "pa", "ps", "fa", "pl", "pt", "pt-PT", "ro", "rn", "ru", "sm", "sg", "sa", "crs", "st", "sn", "sd", "si", "nso", "sk", "sl", "so", "sr", "su", "sw", "ss", "gd", "es", "sv", "tg", "th", "it", "ta", "tt", "te", "bo", "ti", "to", "ts", "tum", "tk", "tr", "ug", "uk", "ur", "uz", "cy", "ve", "vi", "wo", "war", "xh", "fy", "zu"`, default: `"default"` — Select the language for the transcript. If not available, will fall back to the default language.

- **`maxConcurrency`**

  `integer`, default: `10` — Maximum number of pages that can be processed at the same time.

- **`maxRequestRetries`**

  `integer`, default: `10` — Number of times the crawler will retry a failed request before giving up.

- **`minConcurrency`**

  `integer`, default: `1` — Minimum number of pages that will be processed at the same time.

- **`proxy`**

  `object`, default: `{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"US"}` — Specifies proxy servers that will be used by the scraper in order to hide its origin.\<br>\<br>For details, see \<a href='https://apify.com/apify/web-scraper#proxy-configuration' target='\_blank' rel='noopener'>Proxy configuration\</a> in README.

**Example:**

```
{
  "startUrls": [
    ""
  ],
  "includeTranscript": true,
  "language": "default",
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 10,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

##### Responses

###### Status: 200 OK

### Schemas

#### inputSchema

- **Type:**`object`

* **`startUrls` (required)**

  `array` — List of URLs to start scraping from, it can be in form of a link or search term or query from youtube.

  **Items:**

  `string`

* **`includeTranscript`**

  `boolean`, default: `true` — Whether to include the transcript of the video in the output.

* **`language`**

  `string`, possible values: `"default", "ab", "aa", "af", "ay", "ak", "sq", "am", "ar", "hy", "as", "az", "bn", "eu", "ba", "bho", "be", "bs", "br", "bg", "my", "ceb", "tn", "cs", "da", "dv", "dz", "en", "eo", "et", "ee", "fo", "fj", "fil", "fi", "fr", "gaa", "gl", "lg", "el", "ka", "gu", "gn", "ht", "ha", "haw", "iw", "hi", "hmn", "hr", "ig", "id", "iu", "ga", "is", "ja", "jv", "yi", "yo", "kl", "kn", "ca", "kk", "qu", "kha", "zh-Hans", "zh-Hant", "rw", "ky", "km", "ko", "co", "kri", "ku", "lo", "la", "lv", "ln", "lt", "lua", "lb", "luo", "hu", "mk", "ml", "ms", "mg", "mt", "gv", "mi", "mr", "mfe", "mn", "ne", "new", "nl", "no", "ny", "de", "oc", "or", "om", "os", "pam", "pa", "ps", "fa", "pl", "pt", "pt-PT", "ro", "rn", "ru", "sm", "sg", "sa", "crs", "st", "sn", "sd", "si", "nso", "sk", "sl", "so", "sr", "su", "sw", "ss", "gd", "es", "sv", "tg", "th", "it", "ta", "tt", "te", "bo", "ti", "to", "ts", "tum", "tk", "tr", "ug", "uk", "ur", "uz", "cy", "ve", "vi", "wo", "war", "xh", "fy", "zu"`, default: `"default"` — Select the language for the transcript. If not available, will fall back to the default language.

* **`maxConcurrency`**

  `integer`, default: `10` — Maximum number of pages that can be processed at the same time.

* **`maxRequestRetries`**

  `integer`, default: `10` — Number of times the crawler will retry a failed request before giving up.

* **`minConcurrency`**

  `integer`, default: `1` — Minimum number of pages that will be processed at the same time.

* **`proxy`**

  `object`, default: `{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"US"}` — Specifies proxy servers that will be used by the scraper in order to hide its origin.\<br>\<br>For details, see \<a href='https://apify.com/apify/web-scraper#proxy-configuration' target='\_blank' rel='noopener'>Proxy configuration\</a> in README.

**Example:**

```
{
  "startUrls": [
    ""
  ],
  "includeTranscript": true,
  "language": "default",
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 10,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

#### runsResponseSchema

- **Type:**`object`

* **`data`**

  `object`

  - **`actId`**

    `string`

  - **`buildId`**

    `string`

  - **`buildNumber`**

    `string`

  - **`containerUrl`**

    `string`

  - **`defaultDatasetId`**

    `string`

  - **`defaultKeyValueStoreId`**

    `string`

  - **`defaultRequestQueueId`**

    `string`

  - **`finishedAt`**

    `string`, format: `date-time`

  - **`id`**

    `string`

  - **`meta`**

    `object`

    - **`origin`**

      `string`

    - **`userAgent`**

      `string`

  - **`options`**

    `object`

    - **`build`**

      `string`

    - **`diskMbytes`**

      `integer`

    - **`memoryMbytes`**

      `integer`

    - **`timeoutSecs`**

      `integer`

  - **`startedAt`**

    `string`, format: `date-time`

  - **`stats`**

    `object`

    - **`computeUnits`**

      `integer`

    - **`inputBodyLen`**

      `integer`

    - **`rebootCount`**

      `integer`

    - **`restartCount`**

      `integer`

    - **`resurrectCount`**

      `integer`

  - **`status`**

    `string`

  - **`usage`**

    `object`

    - **`ACTOR_COMPUTE_UNITS`**

      `integer`

    - **`DATA_TRANSFER_EXTERNAL_GBYTES`**

      `integer`

    - **`DATA_TRANSFER_INTERNAL_GBYTES`**

      `integer`

    - **`DATASET_READS`**

      `integer`

    - **`DATASET_WRITES`**

      `integer`

    - **`KEY_VALUE_STORE_LISTS`**

      `integer`

    - **`KEY_VALUE_STORE_READS`**

      `integer`

    - **`KEY_VALUE_STORE_WRITES`**

      `integer`

    - **`PROXY_RESIDENTIAL_TRANSFER_GBYTES`**

      `integer`

    - **`PROXY_SERPS`**

      `integer`

    - **`REQUEST_QUEUE_READS`**

      `integer`

    - **`REQUEST_QUEUE_WRITES`**

      `integer`

  - **`usageTotalUsd`**

    `number`

  - **`usageUsd`**

    `object`

    - **`ACTOR_COMPUTE_UNITS`**

      `integer`

    - **`DATA_TRANSFER_EXTERNAL_GBYTES`**

      `integer`

    - **`DATA_TRANSFER_INTERNAL_GBYTES`**

      `integer`

    - **`DATASET_READS`**

      `integer`

    - **`DATASET_WRITES`**

      `integer`

    - **`KEY_VALUE_STORE_LISTS`**

      `integer`

    - **`KEY_VALUE_STORE_READS`**

      `integer`

    - **`KEY_VALUE_STORE_WRITES`**

      `number`

    - **`PROXY_RESIDENTIAL_TRANSFER_GBYTES`**

      `integer`

    - **`PROXY_SERPS`**

      `integer`

    - **`REQUEST_QUEUE_READS`**

      `integer`

    - **`REQUEST_QUEUE_WRITES`**

      `integer`

  - **`userId`**

    `string`

**Example:**

```
{
  "data": {
    "id": "",
    "actId": "",
    "userId": "",
    "startedAt": "2025-01-08T00:00:00.000Z",
    "finishedAt": "2025-01-08T00:00:00.000Z",
    "status": "READY",
    "meta": {
      "origin": "API",
      "userAgent": ""
    },
    "stats": {
      "inputBodyLen": 2000,
      "rebootCount": 0,
      "restartCount": 0,
      "resurrectCount": 0,
      "computeUnits": 0
    },
    "options": {
      "build": "latest",
      "timeoutSecs": 300,
      "memoryMbytes": 1024,
      "diskMbytes": 2048
    },
    "buildId": "",
    "defaultKeyValueStoreId": "",
    "defaultDatasetId": "",
    "defaultRequestQueueId": "",
    "buildNumber": "1.0.0",
    "containerUrl": "",
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0,
      "DATASET_READS": 0,
      "DATASET_WRITES": 0,
      "KEY_VALUE_STORE_READS": 0,
      "KEY_VALUE_STORE_WRITES": 1,
      "KEY_VALUE_STORE_LISTS": 0,
      "REQUEST_QUEUE_READS": 0,
      "REQUEST_QUEUE_WRITES": 0,
      "DATA_TRANSFER_INTERNAL_GBYTES": 0,
      "DATA_TRANSFER_EXTERNAL_GBYTES": 0,
      "PROXY_RESIDENTIAL_TRANSFER_GBYTES": 0,
      "PROXY_SERPS": 0
    },
    "usageTotalUsd": 0.00005,
    "usageUsd": {
      "ACTOR_COMPUTE_UNITS": 0,
      "DATASET_READS": 0,
      "DATASET_WRITES": 0,
      "KEY_VALUE_STORE_READS": 0,
      "KEY_VALUE_STORE_WRITES": 0.00005,
      "KEY_VALUE_STORE_LISTS": 0,
      "REQUEST_QUEUE_READS": 0,
      "REQUEST_QUEUE_WRITES": 0,
      "DATA_TRANSFER_INTERNAL_GBYTES": 0,
      "DATA_TRANSFER_EXTERNAL_GBYTES": 0,
      "PROXY_RESIDENTIAL_TRANSFER_GBYTES": 0,
      "PROXY_SERPS": 0
    }
  }
}
```

## YouTube Video Details Scraper

Unlock the power of in-depth YouTube video analytics with our Video Details Scraper. Extract comprehensive metadata, engagement metrics, and now full video transcripts in any language you want.

### Overview

This actor allows you to scrape detailed information about YouTube videos, including title, description, view count, keywords, thumbnail URLs, and more. **You can also download the full transcript of the video in any available language (original or auto-translated).** It provides valuable insights for content creators, marketers, and researchers looking to analyze video performance, metadata, and spoken content.

### Features

- Detailed Video Information: Extract comprehensive metadata about each video.
- Thumbnail URLs: Get links to various sizes of video thumbnails.
- Channel Details: Retrieve information about the video's channel.
- Engagement Metrics: Capture view counts and other relevant statistics.
- Keywords and Categories: Extract video tags and categories for better understanding of content.
- **Transcripts in Any Language:** Download the full transcript in the original or any supported/translated language.
- Customizable: Flexible configuration options to suit various scraping needs.
- Proxy Support: Built-in proxy configuration to enhance scraping reliability and avoid blocks.
- Scrape 35+ critical data points from any YouTube video, including:

#### 🎯 Core Metrics

- View counts (live/archived)
- Engagement: Likes/Dislikes ratio, comment density
- Monetization: Ad placements, sponsor segments
- Performance: CTR %, retention graphs (when available)

#### 📊 Engagement Analytics

- Real-time subscriber deltas
- Share tracking (platform-specific breakdown)
- Heatmap-style interaction patterns
- Audience demographics (age/gender distributions)

#### 📜 Content Details

- **Multilingual Transcripts**
  - Raw timestamped data
  - Clean text-only versions
  - 100+ language support (auto-translate enabled)
- Enhanced metadata:
  - Chapters/markers analysis
  - Hashtag performance metrics
  - Cards/end screens inventory

#### 🛠 Technical Features

- Automatic resolution of:
  - All YouTube URL formats (including embeds/shorts)
  - Video ID extraction from complex parameters

### How to Use

1. Set Up: Ensure you have an Apify account and access to the Apify platform.
2. Configure Input: Set the YouTube video URL(s) you want to scrape details for (see Input Configuration section).
3. (Optional) Adjust additional parameters like concurrency, proxy settings, and transcript language.
4. Run the Scraper: Execute the scraper on the Apify platform.
5. Data Collection: The scraper will output detailed data about the specified YouTube video(s), including transcripts.

### Input Configuration

Here's an example of how to set up the input for the YouTube Video Details Scraper:

```json
{
    "startUrls": [
        {
            "url": "https://www.youtube.com/watch?v=K07bw2bKI8U&t=985s&ab_channel=CohhCarnage"
        }
    ],
    "maxConcurrency": 10,
    "minConcurrency": 1,
    "maxRequestRetries": 10,
    "proxy": {
        "useApifyProxy": true
    },
    "includeTranscript": true,
    "language": "en"
}
```

#### Input Fields Explanation

- `startUrls`: Array of YouTube video URLs to scrape details from.
- `maxConcurrency`: Maximum number of pages processed simultaneously (default: 10).
- `minConcurrency`: Minimum number of pages processed simultaneously (default: 1).
- `maxRequestRetries`: Number of retries for failed requests (default: 10).
- `proxy`: Proxy configuration for enhanced scraping reliability.
- `includeTranscript`: Whether to include the transcript of the video in the output.
- `language`: Select the language for the transcript. If not available, will fall back to the default language.

### Output Structure

The output data includes detailed information about each video. Here's a sample of the structure:

```json
{
        "transcript": [
            {
                "text": "People often say to me, Julien, that I have a",
                "startMs": "40",
                "endMs": "3320",
                "startTimeText": "0:00"
            },
            {
                "text": "great level in the final.  Well in this",
                "startMs": "1680",
                "endMs": "5759",
                "startTimeText": "0:01"
            },
            {
                "text": "video, I'm going to show you some",
                "startMs": "3320",
                "endMs": "7759",
                "startTimeText": "0:03"
            },
            {
                "text": "super important techniques to become an",
                "startMs": "5759",
                "endMs": "11480",
                "startTimeText": "0:05"
            },
            ...
        ],
        "transcript_only_text": "People often say to me, Julien, that I have a great level in the final.  Well in this video, I'm going to show you some super important techniques to become an endgame god and get past 1300 hoo in chess. The first technique, of course, is to create a passed pawn.  There you see the C5 pawn, it could very quickly go to queen.  For what ?  because it is supported by the rook on C1 and in addition this bishop H3 also controls the final destination square for the pawn to turn into a queen.  But unfortunately, this pawn ....",
        "videoId": "zHhIJPR0JXw",
        "title": "8 tactiques pour gagner tes finales et passer 1300 Elo aux échecs !! (Partie 1)",
        "lengthSeconds": "669",
        "keywords": [
            "juliensong",
            "chess",
            "échecs",
            "jeu d'échecs",
            "jeu d'échec",
            "julien song",
            "julien song échecs"
        ],
        "channelId": "UC3FXGTXQqx9cc2T7EDhslIQ",
        "isOwnerViewing": false,
        "shortDescription": "👉 Rejoins la communauté et obtiens des conseils pour progresser aux échecs sur https://liens.juliensong.com !",
        "isCrawlable": true,
        "thumbnail": {
            "thumbnails": [
                {
                    "url": "https://i.ytimg.com/vi/zHhIJPR0JXw/hqdefault.jpg?sqp=-oaymwEmCKgBEF5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLCF3TcZfQvL1NgqH1IlapyFY4hbvQ",
                    "width": 168,
                    "height": 94
                },
                {
                    "url": "https://i.ytimg.com/vi/zHhIJPR0JXw/hqdefault.jpg?sqp=-oaymwEmCMQBEG5IWvKriqkDGQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAE=&rs=AOn4CLAPxdGDt4Yw4roHAJQRWoMn_8F4Bw",
                    "width": 196,
                    "height": 110
                },
                {
                    "url": "https://i.ytimg.com/vi/zHhIJPR0JXw/hqdefault.jpg?sqp=-oaymwEnCPYBEIoBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLBBNhgBu8ok7j-yUsCiOH2DHx3txw",
                    "width": 246,
                    "height": 138
                },
                {
                    "url": "https://i.ytimg.com/vi/zHhIJPR0JXw/hqdefault.jpg?sqp=-oaymwEnCNACELwBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLDpeZd7xoTMNMRDnNg5rwnQtx791Q",
                    "width": 336,
                    "height": 188
                },
                {
                    "url": "https://i.ytimg.com/vi_webp/zHhIJPR0JXw/maxresdefault.webp",
                    "width": 1920,
                    "height": 1080
                }
            ]
        },
        "allowRatings": true,
        "viewCount": "45641",
        "author": "Julien Song",
        "isPrivate": false,
        "isUnpluggedCorpus": false,
        "isLiveContent": false,
        "microformat": {
            "playerMicroformatRenderer": {
                "thumbnail": {
                    "thumbnails": [
                        {
                            "url": "https://i.ytimg.com/vi/zHhIJPR0JXw/maxresdefault.jpg",
                            "width": 1280,
                            "height": 720
                        }
                    ]
                },
                "embed": {
                    "iframeUrl": "https://www.youtube.com/embed/zHhIJPR0JXw?start=985",
                    "width": 1280,
                    "height": 720
                },
                "title": {
                    "simpleText": "8 tactiques pour gagner tes finales et passer 1300 Elo aux échecs !! (Partie 1)"
                },
                "description": {
                    "simpleText": "👉 Rejoins la communauté et obtiens des conseils pour progresser aux échecs sur https://liens.juliensong.com !"
                },
                "lengthSeconds": "670",
                "ownerProfileUrl": "http://www.youtube.com/@JulienSong",
                "externalChannelId": "UC3FXGTXQqx9cc2T7EDhslIQ",
                "isFamilySafe": true,
                "isUnlisted": false,
                "hasYpcMetadata": false,
                "viewCount": "45641",
                "category": "Entertainment",
                "publishDate": "2025-05-16T10:01:23-07:00",
                "ownerChannelName": "Julien Song",
                "uploadDate": "2025-05-16T10:01:23-07:00",
                "isShortsEligible": false,
                "externalVideoId": "zHhIJPR0JXw",
                "likeCount": "2442",
                "canonicalUrl": "https://www.youtube.com/watch?v=zHhIJPR0JXw"
            }
        },
        "captions": {
            "playerCaptionsTracklistRenderer": {
                "captionTracks": [
                    {
                        "baseUrl": "https://www.youtube.com/api/timedtext?v=zHhIJPR0JXw&ei=gqo1aLfZNqSKsfIPv-K4EA&caps=asr&opi=112496729&xoaf=5&hl=hr&ip=0.0.0.0&ipbits=0&expire=1748372722&sparams=ip,ipbits,expire,v,ei,caps,opi,xoaf&signature=CF59F9732960052B69E2CB68698B03C71E4AD902.7F2796A9277B07D258F169962040E4EA0FA20853&key=yt8&kind=asr&lang=fr&variant=punctuated",
                        "name": {
                            "simpleText": "Francuski (automatski generirano)"
                        },
                        "vssId": "a.fr",
                        "languageCode": "fr",
                        "kind": "asr",
                        "isTranslatable": true,
                        "trackName": ""
                    }
                ],
                "audioTracks": [
                    {
                        "captionTrackIndices": [
                            0
                        ],
                        "audioTrackId": "fr-FR.4"
                    },
                    {
                        "captionTrackIndices": [
                            0
                        ],
                        "audioTrackId": "en-US.10"
                    }
                ],
                "defaultAudioTrackIndex": 0
            }
        }
    }
]
```

#### Output Fields Explanation

The scraper returns a comprehensive set of data points for each video. Here's a detailed breakdown of the output fields:

##### Transcript Data

- `transcript`: Array of transcript segments, each containing:
  - `text`: The spoken text for that segment
  - `startMs`: Start time in milliseconds from the beginning of the video
  - `endMs`: End time in milliseconds
  - `startTimeText`: Human-readable timestamp (e.g., "1:23")
- `transcript_only_text`: The complete transcript as a single, continuous plain text string, with timestamps removed for easy reading and processing.

##### Core Video Information

- `videoId`: Unique 11-character identifier for the YouTube video.
- `title`: The full title of the video as displayed on YouTube.
- `lengthSeconds`: Total duration of the video in seconds.
- `keywords`: Array of relevant keywords and tags associated with the video.
- `channelId`: Unique identifier for the channel that published the video.
- `author`: Display name of the channel or content creator.
- `shortDescription`: The full description of the video as shown on YouTube.
- `isPrivate`: Boolean indicating if the video is set to private.
- `isLiveContent`: Boolean indicating if the video is or was a live stream.
- `viewCount`: Total number of views the video has received.

##### Thumbnails

- `thumbnail`: Object containing various sizes of thumbnail images for the video.
  - `thumbnails`: Array of objects, each containing:
    - `url`: Direct URL to the thumbnail image
    - `width`: Width in pixels
    - `height`: Height in pixels

##### Additional Metadata

- `allowRatings`: Boolean indicating if viewers can rate (like/dislike) the video.
- `isCrawlable`: Boolean indicating if the video is indexable by search engines.
- `isOwnerViewing`: Boolean indicating if the video owner is viewing the video (typically false for scraped data).
- `isUnpluggedCorpus`: Internal YouTube flag (usually false).

##### Microformat Data

- `microformat`: Object containing YouTube's internal metadata:
  - `playerMicroformatRenderer`: Contains:
    - `thumbnail`: Main thumbnail image details
    - `embed`: Embed configuration (iframe URL, dimensions)
    - `title`: Video title
    - `description`: Video description
    - `lengthSeconds`: Video duration
    - `ownerProfileUrl`: URL to the channel's profile
    - `externalChannelId`: Channel ID
    - `isFamilySafe`: Boolean indicating family-friendly content
    - `isUnlisted`: Boolean for unlisted videos
    - `hasYpcMetadata`: Boolean for YouTube Premium content
    - `category`: Video category (e.g., "Education", "Gaming")
    - `publishDate`: ISO 8601 timestamp of when the video was published
    - `ownerChannelName`: Channel name
    - `uploadDate`: ISO 8601 timestamp of when the video was uploaded
    - `isShortsEligible`: Boolean for YouTube Shorts eligibility
    - `externalVideoId`: Video ID
    - `likeCount`: Number of likes (when available)

##### Captions and Subtitles

- `captions`: Object containing caption information:
  - `playerCaptionsTracklistRenderer`: Contains:
    - `captionTracks`: Array of available caption tracks:
      - `baseUrl`: Endpoint to fetch captions
      - `name`: Track name
      - `vssId`: Internal ID
      - `languageCode`: ISO 639-1 language code
      - `kind`: Type (e.g., "asr" for auto-generated)
      - `isTranslatable`: Boolean for translation support
      - `trackName`: Display name of the track
    - `audioTracks`: Array of available audio tracks
    - `defaultAudioTrackIndex`: Index of the default audio track
    - `translationLanguages`: Array of supported translation languages:
      - `languageCode`: ISO 639-1 code
      - `languageName`: Object with `simpleText` containing the language name

### Support

- For issues or feature requests, please use the [Issues](https://console.apify.com/actors/D3edLjry0l0eAY0T2/issues) section of this actor.
- If you need customization or have questions, feel free to contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

### Additional Services

- Request customization or whole dataset: <muhamed.didovic@gmail.com>
- If you need anything else scraped, or this actor customized, email: <muhamed.didovic@gmail.com>
- For API services of this scraper (no Apify fee, just usage fee for the API), contact: <muhamed.didovic@gmail.com>
