{
  "openapi": "3.0.1",
  "info": {
    "title": "Podcast & Audio Transcriber: Speech to Text, RSS, SRT",
    "description": "Turn podcast episodes and audio files into text, timestamps, SRT and VTT. Uses the show's own transcripts for free where the feed has them, or your own Deepgram, AssemblyAI, ElevenLabs, OpenAI Whisper or Groq key. Keyword alerts and new-episode watchlists. Not affiliated with those companies.",
    "version": "1.0",
    "x-build-id": "cUDegxxsrgLXTqdFE"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nightfallhq~podcast-audio-transcriber/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nightfallhq-podcast-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/nightfallhq~podcast-audio-transcriber/runs": {
      "post": {
        "operationId": "runs-sync-nightfallhq-podcast-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/nightfallhq~podcast-audio-transcriber/run-sync": {
      "post": {
        "operationId": "run-sync-nightfallhq-podcast-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": {
          "feedUrls": {
            "title": "Podcast RSS feed links",
            "type": "array",
            "description": "One RSS feed link per line. The newest episodes of each feed are taken. Use the feed link from the show's own hosting page (Libsyn, Simplecast, Megaphone, Buzzsprout and so on), not a page of Apple Podcasts, Spotify or YouTube: those are refused. You must have the right to transcribe the audio.",
            "items": {
              "type": "string"
            }
          },
          "audioUrls": {
            "title": "Direct audio or video file links",
            "type": "array",
            "description": "One link per line, each pointing straight at an mp3, m4a, wav, ogg or mp4 file. Links to web pages and to private network addresses are refused.",
            "items": {
              "type": "string"
            }
          },
          "provider": {
            "title": "Speech provider",
            "enum": [
              "deepgram",
              "assemblyai",
              "elevenlabs",
              "openai",
              "groq"
            ],
            "type": "string",
            "description": "The service that transcribes the audio. You need your own account and key with it, and it bills you directly. Not needed for free publisher transcripts. Speaker labels work with Deepgram, AssemblyAI and ElevenLabs.",
            "default": "deepgram"
          },
          "apiKey": {
            "title": "Your provider's API key",
            "type": "string",
            "description": "Paste your key for the provider chosen above. Leave it empty for a free run: publisher transcripts where the feed has them, and a free cost preview for the other episodes. The key is stored encrypted by Apify, sent only to your provider's own address, and never written to logs, results or files.\n\nWhere to get a key (free credit as listed on 2026-10-13, check the provider):\n- Deepgram, https://console.deepgram.com (about $200 free credit for new accounts)\n- AssemblyAI, https://www.assemblyai.com/dashboard ($50 free credit)\n- ElevenLabs, https://elevenlabs.io/app/settings/api-keys (a free plan with some hours of Scribe; the key needs the Speech to Text permission)\n- Groq, https://console.groq.com/keys (a free tier with rate limits)\n- OpenAI, https://platform.openai.com/api-keys (pay as you go)"
          },
          "episodesPerFeed": {
            "title": "Episodes per feed",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many of the newest episodes to take from each feed. With 'Only new episodes' on, this is the most taken in one run.",
            "default": 3
          },
          "publishedAfter": {
            "title": "Only episodes published on or after",
            "type": "string",
            "description": "Feeds only. Earlier episodes, and episodes with no date, are left out. Format: 2026-10-01."
          },
          "titleContains": {
            "title": "Only episodes whose title contains",
            "type": "array",
            "description": "Feeds only. One word or phrase per line; an episode is kept when its title contains any of them (case does not matter). Leave empty to keep every episode.",
            "items": {
              "type": "string"
            }
          },
          "oldestFirst": {
            "title": "Oldest episodes first",
            "type": "boolean",
            "description": "Off (default): the newest episodes are taken. On: the oldest ones, to work through a whole back catalogue a few episodes per run (with 'Only new episodes' on, each run carries on where the last stopped).",
            "default": false
          },
          "onlyNewEpisodes": {
            "title": "Only new episodes since the last run",
            "type": "boolean",
            "description": "For scheduled runs. The first run transcribes the newest episodes and remembers the feed; later runs transcribe only what appeared since, so you never pay twice for the same episode. Failed episodes are tried again next time.",
            "default": false
          },
          "watchlistName": {
            "title": "Watchlist name",
            "type": "string",
            "description": "Names the memory of 'already transcribed' episodes (short ids only, no text, kept in your own account). Use one name per scheduled task; a new name starts over.",
            "default": "default"
          },
          "usePublisherTranscripts": {
            "title": "Use the publisher's own transcripts when the feed has them",
            "type": "boolean",
            "description": "On (default): when a feed entry carries the show's own transcript (the podcast:transcript tag) it is used. It is free: no key, nothing is sent to a speech provider, and this Actor does not charge for it. Off: always use speech to text (for speaker labels, or the provider's accuracy).",
            "default": true
          },
          "model": {
            "title": "Model (optional)",
            "type": "string",
            "description": "Leave empty for the default: nova-3 (Deepgram), universal-2 (AssemblyAI, the cheapest; universal-3-5-pro is more accurate and costs more), scribe_v2 (ElevenLabs), whisper-large-v3-turbo (Groq; whisper-large-v3 is also offered). OpenAI always uses whisper-1 and ignores this field."
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "'auto' detects the language. Or give a language code such as en, es, de, fr, pt-BR. OpenAI and Groq need a two-letter code.",
            "default": "auto"
          },
          "speakerLabels": {
            "title": "Speaker labels",
            "type": "boolean",
            "description": "Say who speaks when (speaker 0 and 1, or A and B). Works with Deepgram, AssemblyAI and ElevenLabs; ignored for OpenAI and Groq. Some providers charge a little extra for it.",
            "default": false
          },
          "timestamps": {
            "title": "Timestamps (segments) in the result",
            "type": "boolean",
            "description": "Add the list of segments (start, end, text, speaker) to each result row. SRT and VTT files are made from the same segments whether or not this is on.",
            "default": true
          },
          "outputFormats": {
            "title": "Extra files",
            "type": "array",
            "description": "The plain text is always in the 'text' column. Pick files to save as well: they are stored in this run's key-value store and linked from the row (textFileUrl, srtUrl, vttUrl, jsonUrl).",
            "items": {
              "type": "string",
              "enum": [
                "txt",
                "srt",
                "vtt",
                "json"
              ],
              "enumTitles": [
                "Plain text file (.txt)",
                "SRT subtitles (.srt)",
                "WebVTT subtitles (.vtt)",
                "JSON with segments (.json)"
              ]
            },
            "default": []
          },
          "keywords": {
            "title": "Keywords to listen for (mention alerts)",
            "type": "array",
            "description": "One word or phrase per line. Every transcript gets a 'mentions' list: each place a keyword is said, with the time and about 20 words around it. Case does not matter; whole words only ('rate' does not match 'migrate'); a phrase matches when its words follow each other. No extra charge.",
            "items": {
              "type": "string"
            }
          },
          "onlyEpisodesWithMentions": {
            "title": "Write rows only for episodes with a mention",
            "type": "boolean",
            "description": "Off (default): every transcript is written. On: only episodes where a keyword is said get a row. The others are still transcribed and billed (the audio was processed) but not written; the run summary says how many.",
            "default": false
          },
          "maxTotalMinutes": {
            "title": "Maximum audio minutes in total",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stops starting files once this many audio minutes are done in this run. Leave empty for no limit. The free preview uses it too, so the cost estimate matches."
          },
          "maxFiles": {
            "title": "Maximum audio files per run",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Stops after this many audio files; the rest wait for the next run. The small pre-filled number keeps a first test cheap: raise it for real use.",
            "default": 10
          },
          "maxFileSizeMb": {
            "title": "Maximum file size (MB)",
            "minimum": 1,
            "maximum": 2048,
            "type": "integer",
            "description": "Larger files are skipped (free) before anything is sent to the provider. OpenAI uploads are limited to 25 MB and Groq to 100 MB whatever you set here.",
            "default": 200
          },
          "maxMinutesPerFile": {
            "title": "Maximum minutes per file",
            "minimum": 1,
            "maximum": 720,
            "type": "integer",
            "description": "Episodes the feed says are longer are skipped (free). AssemblyAI stops the transcript at this length; for other providers a longer file is still delivered but billed for this many minutes at most.",
            "default": 240
          },
          "maxRunMinutes": {
            "title": "Maximum run time (minutes)",
            "minimum": 1,
            "maximum": 720,
            "type": "integer",
            "description": "No new file is started after this many minutes; a file already running gets up to 15 more minutes, then it is cut off (free). Set the Actor's run timeout in the Apify Console (Run options) to at least this plus 20 minutes.",
            "default": 120
          },
          "groqDeveloperTier": {
            "title": "My Groq account is on the paid Developer tier",
            "type": "boolean",
            "description": "Groq's free tier accepts uploads of up to 25 MB; the paid Developer tier up to 100 MB. Switch this on only if your Groq account is on the paid tier.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Files transcribed at the same time",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "How many files are sent to the provider in parallel. Higher is faster but may hit your provider's rate limit.",
            "default": 2
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}