{
  "openapi": "3.0.1",
  "info": {
    "title": "Media Transcriber · Any URL, RSS & Podcast to Text",
    "description": "Media transcriber for any video or audio URL — YouTube, TikTok, Instagram, Facebook, X, podcast RSS, direct files. On-device Whisper: full text, timestamped segments, SRT/VTT, hook3s. No API key. Silent, unreachable, and failed files are not charged. Billed by the second, not a rounded minute.",
    "version": "0.0",
    "x-build-id": "aMNI8Fh1A4vJ3YbB7"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~video-audio-transcriber/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-video-audio-transcriber",
        "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/memo23~video-audio-transcriber/runs": {
      "post": {
        "operationId": "runs-sync-memo23-video-audio-transcriber",
        "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/memo23~video-audio-transcriber/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-video-audio-transcriber",
        "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": {
          "mediaUrls": {
            "title": "Media URLs",
            "maxItems": 50,
            "type": "array",
            "description": "Video, audio, podcast or direct-file URLs to transcribe. A YouTube channel or playlist, or a SoundCloud artist or set, expands into its newest items (see Max episodes). Works with TikTok, YouTube, Instagram, Facebook, X (Twitter), Rumble, SoundCloud, Twitch and 1800+ other sites; podcast RSS feeds and Apple Podcasts show links (the newest episodes are expanded automatically); Apple Podcasts episode links (the ones carrying ?i=); Spotify episode and show links (transcribed from the show's public feed; Spotify-only shows have none and come back as an uncharged row); Google Drive, Dropbox and OneDrive/SharePoint share links (shared with anyone who has the link); and direct media links (mp3, mp4, wav, m4a, flac, …). Audio is extracted from video automatically. Music-only or silent media comes back as an uncharged no_speech row.",
            "items": {
              "type": "string"
            }
          },
          "datasetId": {
            "title": "Dataset ID (chain a scraper run)",
            "type": "string",
            "description": "Default dataset ID of a finished scraper run. Each row gives ONE item, whatever the scraper calls its fields: an audio file first, then a video file (videoUrl, downloadAddr, videoUrls from the Facebook Ads Library scraper …), then the post's own page. Thumbnails, covers, profile pictures and profile links are never picked, and a post's page and its video file count as one item, never two charges. When a video file turns out to have no audio track or has expired, the row's page link is transcribed instead. Rows with no audio or video (image posts, text) are skipped and never charged."
          },
          "datasetItems": {
            "title": "Dataset items (paste rows)",
            "type": "array",
            "description": "Paste rows from another scraper instead of chaining by ID. Each row is read exactly like a chained dataset row: one audio or video link per row, images and profile links ignored. A plain list of links works too."
          },
          "audioFiles": {
            "title": "Upload audio or video files",
            "type": "array",
            "description": "Upload media straight from your computer instead of pasting a link. Each file is stored in this run's key-value store and transcribed exactly like a direct URL. Supported: MP3, WAV, FLAC, AAC, OPUS, OGG, M4A, MP4, MOV, WebM. You can combine this with **Media URLs** above — both lists run in the same job."
          },
          "language": {
            "title": "Language (optional)",
            "type": "string",
            "description": "ISO 639-1 code of the spoken language (e.g. 'en', 'es', 'pt', 'de'). Leave empty to auto-detect — Whisper recognizes 99+ languages.",
            "default": ""
          },
          "model": {
            "title": "Whisper model",
            "enum": [
              "tiny",
              "base",
              "small"
            ],
            "type": "string",
            "description": "Accuracy vs. speed trade-off. 'base' (default) is fast and accurate on clear speech, 'small' is the most accurate for hard audio, 'tiny' is fastest. All three are baked into the Actor image — no downloads at run time.",
            "default": "base"
          },
          "translateToEnglish": {
            "title": "Translate to English",
            "type": "boolean",
            "description": "Instead of transcribing in the original language, output an English translation of the speech (Whisper's built-in translate task). SRT/VTT subtitles are translated too.",
            "default": false
          },
          "wordTimestamps": {
            "title": "Word-level timestamps",
            "type": "boolean",
            "description": "Add per-word start/end times and confidence inside every segment (`segments[].words`). Needed for karaoke-style captions, precise clip cutting and word-accurate search. Costs roughly 15-25% extra transcription time, so it stays off by default.",
            "default": false
          },
          "speakerLabels": {
            "title": "Speaker labels (who speaks when)",
            "type": "boolean",
            "description": "Label every segment and paragraph with Speaker 1, Speaker 2, … and put the names into the SRT/VTT/TXT/Markdown output. Runs on the Actor's own CPU, no API key. It takes longer than the transcription itself: a 4 GB run labelled 4 minutes of audio in about 2.5 minutes, so give long recordings 8 GB or more and a longer timeout. Best on clean recordings with a few speakers; one person recorded two different ways (a pre-recorded intro and the studio talk) can come back as two labels.",
            "default": false
          },
          "vocabulary": {
            "title": "Vocabulary: names and terms to expect",
            "type": "string",
            "description": "Names, brands, places and jargon the audio contains, separated by commas (for example: Michael Barbaro, Xi Jinping, Kubernetes). The speech model is primed with them so they come out spelled right. Only the first ~800 characters are used."
          },
          "summarize": {
            "title": "Summary, chapters and keywords (AI)",
            "type": "boolean",
            "description": "After transcribing, Claude Haiku 4.5 writes a short summary, a list of chapters with start times, and the key names and terms, in the language of the recording. They appear on the row (summary, chapters, keywords) and at the top of the Markdown and Word files. The transcript text is sent to Anthropic's API for this; the summary is machine-written and can contain mistakes. No extra charge.",
            "default": false
          },
          "maxMinutesPerItem": {
            "title": "Max minutes per item",
            "minimum": 1,
            "maximum": 600,
            "type": "integer",
            "description": "Safety cap on how many minutes of media to transcribe per URL. Longer items are transcribed up to this cap and billed only for the transcribed minutes.",
            "default": 120
          },
          "maxEpisodesPerFeed": {
            "title": "Max episodes / videos per feed, show, channel or playlist",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "How many of the newest items to take from each podcast feed, Apple Podcasts or Spotify show, YouTube channel or playlist, or SoundCloud artist or set, after the filters below. Up to 500. To follow a channel or a show, run this on a schedule with a Watchlist ID and Only new items on: every run transcribes only what is new.",
            "default": 1
          },
          "publishedAfter": {
            "title": "Only episodes published after",
            "type": "string",
            "description": "Leave out older episodes: a date such as 2026-09-01, or a window back from now such as 30 days, 2 weeks or 12 hours. Applies to podcast feeds, Apple Podcasts shows and Spotify shows. Channel and playlist listings carry no dates; use a Watchlist ID with Only new items to get just the new uploads."
          },
          "episodeTitleContains": {
            "title": "Only episodes whose title contains",
            "type": "string",
            "description": "Case-insensitive. Separate alternatives with | (for example interview|Q&A). Applies to podcast feeds, shows, YouTube channels and playlists."
          },
          "usePublisherTranscripts": {
            "title": "Use the publisher's own transcript when the feed has one",
            "type": "boolean",
            "description": "Many podcast hosts (Omny, Buzzsprout, Spreaker, Flightcast, …) publish a timed transcript for each episode in the RSS feed, usually edited and with speaker names. When one is listed, it is delivered as the episode's transcript, in seconds, with no audio download (transcriptSource: publisher). Turn off to always transcribe the audio yourself. Ignored when translating or when word-level timestamps are on.",
            "default": true
          },
          "cookies": {
            "title": "Cookies (optional)",
            "type": "string",
            "description": "Contents of a Netscape cookies.txt exported from a logged-in browser session. Useful for YouTube (avoids the 'Sign in to confirm you're not a bot' gate) and for age/region-restricted content on any network. Leave empty for public content and direct files."
          },
          "watchlistId": {
            "title": "Watchlist ID",
            "type": "string",
            "description": "Named key-value store that remembers which media URLs this run already transcribed. Use the same id on a schedule (for example <code>my-podcast</code>) and later runs leave them out, so an episode or video is never billed twice. Letters, numbers, hyphens, underscores."
          },
          "newItemsOnly": {
            "title": "Only new items",
            "type": "boolean",
            "description": "When enabled, media already stored on the Watchlist ID is left out of the run and the dataset. A podcast feed is still read in full; only its new episodes are transcribed. Requires <code>watchlistId</code>. Default: false.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. This Actor downloads through its own residential pool by default, so social networks work without you configuring anything and without spending your proxy quota. Turn on Apify Proxy here only if you want it as an extra fallback, or paste your own proxy URLs to use those exclusively. Podcast feeds and direct media files are always fetched without a proxy.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}