{
  "openapi": "3.0.1",
  "info": {
    "title": "Video Transcript API — YouTube, TikTok, Instagram, X, Facebook",
    "description": "Any video URL to a timestamped transcript — including videos with no captions, which are transcribed with AI. Playlists, channels, and your own files too. JSON, text, SRT, VTT or LLM-ready output.",
    "version": "0.3",
    "x-build-id": "NfeJyoLynsQ6MeoTE"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/airtune~universal-transcript-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-airtune-universal-transcript-api",
        "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/airtune~universal-transcript-api/runs": {
      "post": {
        "operationId": "runs-sync-airtune-universal-transcript-api",
        "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/airtune~universal-transcript-api/run-sync": {
      "post": {
        "operationId": "run-sync-airtune-universal-transcript-api",
        "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",
        "properties": {
          "startUrls": {
            "title": "Video URLs",
            "type": "array",
            "description": "YouTube video, playlist or channel links. Videos accept watch URLs, youtu.be short links, /shorts/, /embed/, /live/, or bare 11-character IDs. Playlists (/playlist?list=...) and channels (/@handle, /channel/UC..., /c/..., /user/...) are expanded into their videos. A watch URL that also carries &list= is treated as one video, not the whole playlist.",
            "items": {
              "type": "string"
            }
          },
          "mediaUrls": {
            "title": "Audio or video files",
            "type": "array",
            "description": "Upload your own audio or video files, or paste direct links to them (MP3, MP4, M4A, WAV, WEBM…). These are transcribed with AI — no platform involved, so nothing here can break when a website changes. Cheapest path per minute of content.",
            "default": []
          },
          "estimateOnly": {
            "title": "Quote only — do not process",
            "type": "boolean",
            "description": "Return what each item would cost, and charge nothing. The Actor fetches only the metadata it needs to price the job: whether captions exist, and how long the audio is. Re-run with this off to actually transcribe. Quotes for platform videos are exact; for uploaded files they are approximate, because a file exposes no duration until it is decoded.",
            "default": false
          },
          "maxVideosPerSource": {
            "title": "Max videos per playlist or channel",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Caps how many videos each playlist or channel contributes, so one channel link cannot turn into a thousand-video bill. Videos passed directly are never capped.",
            "default": 50
          },
          "languages": {
            "title": "Preferred languages",
            "type": "array",
            "description": "ISO 639-1 codes in priority order, e.g. [\"tr\", \"en\"]. Human-written captions win over auto-generated ones within the same language. Leave empty to take the best available track.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "outputFormats": {
            "title": "Output formats",
            "type": "array",
            "description": "Which representations to write. 'llm' is plain text with [Music], (laughter) and hesitation tokens removed — ready to index in a RAG pipeline without post-processing.",
            "items": {
              "type": "string",
              "enum": [
                "json",
                "text",
                "llm",
                "srt",
                "vtt"
              ],
              "enumTitles": [
                "JSON (timestamped segments)",
                "Plain text",
                "LLM-ready text",
                "SRT subtitles",
                "WebVTT"
              ]
            },
            "default": [
              "json",
              "text"
            ]
          },
          "maxConcurrency": {
            "title": "Max concurrent videos",
            "minimum": 1,
            "maximum": 25,
            "type": "integer",
            "description": "Higher is faster but more likely to draw rate limiting.",
            "default": 5
          },
          "proxyCountryCode": {
            "title": "Proxy country",
            "type": "string",
            "description": "Optional two-letter country for the residential proxy, e.g. US. Affects which regional caption tracks and metadata YouTube returns.",
            "default": ""
          },
          "reuseSession": {
            "title": "Reuse YouTube session between runs",
            "type": "boolean",
            "description": "Caches the YouTube session token in a named key-value store so short runs do not re-acquire it. Cuts the cost of single-video runs by roughly half. Turn off only when debugging session problems.",
            "default": true
          },
          "captionEgress": {
            "title": "Caption download route",
            "enum": [
              "auto",
              "direct",
              "residential"
            ],
            "type": "string",
            "description": "Caption URLs are signed with ip=0.0.0.0, so the free datacenter route usually serves them (measured 15/15) and costs about 17% less overall. 'Auto' uses it and falls back to residential if it ever stops working.",
            "default": "auto"
          },
          "asrFallback": {
            "title": "Transcribe with AI when captions are missing",
            "type": "boolean",
            "description": "When a video has no caption track at all, download its audio and transcribe it with Whisper. This is the one thing other transcript tools cannot do. Billed per audio minute, and only when it actually runs.",
            "default": true
          },
          "asrModel": {
            "title": "Speech recognition model",
            "enum": [
              "whisper-large-v3-turbo",
              "whisper-large-v3"
            ],
            "type": "string",
            "description": "Turbo is the default: same family, a fraction of the cost, and no meaningful accuracy loss for speech.",
            "default": "whisper-large-v3-turbo"
          },
          "maxAsrDurationSeconds": {
            "title": "Max video length for AI transcription (seconds)",
            "minimum": 60,
            "maximum": 21600,
            "type": "integer",
            "description": "Videos longer than this skip speech recognition instead of running up a bill. Default one hour.",
            "default": 3600
          },
          "forceAsrLanguage": {
            "title": "Force AI transcription language",
            "type": "string",
            "description": "ISO 639-1 code handed straight to Whisper for videos with no captions. Skips its 30-second auto-detection window, which is what mis-reads short or music-heavy clips. Leave empty to auto-detect. Separate from 'Preferred languages', which only selects a caption track.",
            "default": ""
          },
          "cacheTranscripts": {
            "title": "Reuse transcripts you have already paid for",
            "type": "boolean",
            "description": "Speech-recognition results are remembered in your own key-value store and reused when the same video comes round again. A repeat is returned immediately, without re-downloading the media and without using speech-recognition quota — the price is the same, the wait and the failure modes are not. Only AI transcriptions are cached, never caption tracks, and the store belongs to your account: nothing is shared between users. Turn this off to force a fresh transcription.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}