{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Channel Videos Transcript Scraper — Bulk Video to Text",
    "description": "YouTube channel videos to text: newest 50 per channel by default, up to 5,000 — videos, Shorts and live VODs; captions first, speech-to-text when none at $0.008 per started minute. JSON, text, SRT or VTT. From $1.20 per 1,000 transcripts, no per-channel fee. Never charged for a video we can't read.",
    "version": "1.0",
    "x-build-id": "5HEGjrJQ6oTjQlTwH"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/steadyfetch~youtube-channel-transcripts/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-steadyfetch-youtube-channel-transcripts",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/steadyfetch~youtube-channel-transcripts/runs": {
      "post": {
        "operationId": "runs-sync-steadyfetch-youtube-channel-transcripts",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/steadyfetch~youtube-channel-transcripts/run-sync": {
      "post": {
        "operationId": "run-sync-steadyfetch-youtube-channel-transcripts",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "channels"
        ],
        "properties": {
          "channels": {
            "title": "Channels",
            "type": "array",
            "description": "YouTube channels: https://www.youtube.com/@handle, /channel/UC…, /c/…, /user/…, or a bare channel ID; a single video link is transcribed directly as a convenience. Never charged for a video we cannot transcribe or one this account already has. Leave it untouched in the console and click Start for a one-channel sample (@jawed, one video), charged like any run. With a format, a language or a limit set below, that sample runs under your settings instead, plus one uncharged row naming what you set. For one-off videos, steadyfetch/youtube-transcript-scraper is the dedicated actor. This is the one required field, so it needs a real value; the optional fields below accept null and read it as “use the default”, so a template that leaves a field unset still runs.",
            "default": [
              "_demo"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxVideos": {
            "title": "Max videos per channel",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on how many videos to transcribe from each channel (newest first). Raise it — and your maximum cost per run — to transcribe a whole channel. Ask for more than this actor serves per channel and the run still starts: it continues at the actor's own ceiling of 5,000 videos, with one uncharged row saying what was asked and what bound it.",
            "default": 50
          },
          "maxItems": {
            "title": "Max videos for the whole run",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on how many videos this run transcribes in total, across every channel you pasted. \"Max videos per channel\" limits each channel on its own; this one limits the bill for the run. Channel reports and skipped-video rows are always uncharged and never count against it. Ask for more than this actor serves in one run and the run still starts: it continues at the actor's own ceiling of 5,000 videos, with one uncharged row saying so.",
            "default": 500
          },
          "newVideosOnly": {
            "title": "New videos only",
            "type": "boolean",
            "description": "OFF (default): every video runs as usual; a video your account already has comes back from the earlier run, not charged (`repeat: true`), so a re-run of the same channel list is a complete archive that only pays for what is new. ON: videos already delivered to your account are left out of the dataset entirely — nothing fetched, nothing charged, and the run's status line says how many were skipped — so a scheduled run hands your integration only the new videos. Only a video the actor actually answered counts (a delivered transcript, or a final uncharged verdict such as no speech); a video it could not reach does not, so the next run tries it again.",
            "default": false
          },
          "transcripts": {
            "title": "Transcribe the videos",
            "type": "boolean",
            "description": "Set this to false to LIST a channel's videos without transcribing them: one row per video with id, url, title, durationSeconds, thumbnail and the listing's own viewsText (\"2.5M views\") and publishedText (\"2 days ago\"), and no transcript. Those rows carry charged: false — there is no charged event for a channel's video listing, so a listing run bills no transcript and no speech-to-text minute, only the Apify platform usage every run spends. Leave it on (the default) and every listed video is transcribed as usual. \"Max videos per channel\" and \"Max videos for the whole run\" still bound how many rows you get, and a listing is re-listed in full on every run, so a scheduled run always hands you the channel as it is now. The listing carries no exact view count and no upload timestamp: YouTube's channel grid gives rounded words, and this actor ships those words rather than inventing a number.",
            "default": true
          },
          "language": {
            "title": "Preferred caption language",
            "type": "string",
            "description": "Two-letter language code (en, es, ja) or a regional code (pt-BR). If a video has no captions in that language, the video's own default caption track (its original language) is used instead, and the row tells you which language you got."
          },
          "format": {
            "title": "Output format",
            "type": "string",
            "description": "json keeps timestamped segments, text returns the transcript only, srt and vtt add a ready-to-download subtitle string on the row. Leave it out, or send null, to get json. Anything else is not recognised: nothing is transcribed, nothing is charged, and one row names the formats that exist.",
            "default": "json"
          },
          "enableSpeechFallback": {
            "title": "Use speech-to-text when a video has no captions",
            "type": "boolean",
            "description": "On: caption-less videos are transcribed with speech-to-text, which charges speech-to-text minutes on top of the transcript. Off: caption-less videos come back as uncharged rows and you never pay a speech-to-text minute.",
            "default": true
          },
          "maxSpeechMinutes": {
            "title": "Max speech-to-text minutes",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on speech-to-text minutes for the whole run. Videos that would go past it are skipped as uncharged rows naming this limit. 0 means no speech-to-text at all. Ask for more than this actor allows in one run and the run still starts: it continues at the actor's own ceiling of 100,000 minutes, with one uncharged row saying so.",
            "default": 60
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}