{
  "openapi": "3.0.1",
  "info": {
    "title": "Podcast Transcription Scraper — Speech to Text, Audio & Video",
    "description": "Audio & video transcription: never charged for a link we can't reach, can't decode, or that has no speech. Any audio or video URL to text, SRT and VTT with timestamped segments — direct file links from any host, plus 14 tested sites for page links. About 90 languages, no API key of your own.",
    "version": "1.0",
    "x-build-id": "gz6eqKHHcKuBqHSCF"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/steadyfetch~media-transcriber/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-steadyfetch-media-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/steadyfetch~media-transcriber/runs": {
      "post": {
        "operationId": "runs-sync-steadyfetch-media-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/steadyfetch~media-transcriber/run-sync": {
      "post": {
        "operationId": "run-sync-steadyfetch-media-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": {
          "urls": {
            "title": "Media URLs",
            "type": "array",
            "description": "Any direct audio or video file link, from any host (.mp3, .m4a, .wav, .mp4, .mov, .webm …), for example https://example.com/episode.mp3, or a page link on one of the 14 tested sites named in the description above — including an X (Twitter) post link, x.com/<user>/status/<id>. Files over 256 MB come back as an uncharged row — send the audio-only version. YouTube, Instagram, LinkedIn ads, TikTok Creative Center, Google Ads Transparency Center and Facebook Ad Library links belong in their own steadyfetch actor and come back uncharged naming it. Long meeting and conference recordings are the ones that cross the size limit, and an audio-only version of the same session is usually far smaller. Every field, this one included, accepts null, meaning \"use the default\"; for a whole show use \"Podcast feeds or show links\" (`podcastUrls`), for a whole scraper run the Dataset ID. Leave it empty with nothing else set and the run transcribes a fixed 25-second public-domain sample clip (charged like any run: one audio minute) — the fastest way to see real output, and leaving it empty with only the options below set runs that same clip under them.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "podcastUrls": {
            "title": "Podcast feeds or show links",
            "type": "array",
            "description": "A whole podcast show per line: an RSS feed address such as https://example.com/feed.xml, or an Apple Podcasts SHOW link such as https://podcasts.apple.com/us/podcast/name/id1200361736 (the show page, not an episode — an episode link carries ?i= and belongs in \"Media URLs\"). The newest episodes are read from the feed and transcribed, newest first, as many as \"Episodes per show\" allows. Never charged: a feed we cannot reach, a link that is not a feed, a show Apple does not list, and any episode this account already had — each comes back as an uncharged row naming what was found. Leave it empty and nothing here runs; the actor's own field for single files and episode pages is \"Media URLs\" (`urls`).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxEpisodesPerShow": {
            "title": "Episodes per show",
            "minimum": 1,
            "type": "integer",
            "description": "How many of each show's newest episodes to transcribe, for example 10 for the last ten. Never charged on its own — it only decides how many episodes the run plans, and a show with fewer episodes than this delivers all it has and says so. Applies to \"Podcast feeds or show links\" only; links in \"Media URLs\" are unaffected. One run goes up to 500 episodes per show, and asking for more continues at 500.",
            "default": 10
          },
          "datasetId": {
            "title": "Dataset ID (chain a scraper run)",
            "type": "string",
            "description": "The default dataset ID of a finished scraper run: the media link in each row is transcribed, whatever the scraper calls the field, up to 10,000 rows per run. With Apify's 'Connect actor' integration this is filled automatically — the cleanest way to chain. A link that is already in \"Media URLs\" is never transcribed twice, and one this account already had is handed back uncharged, so a re-run of the same dataset pays only for what is new (a scoped API token needs key-value store access for that)."
          },
          "datasetItems": {
            "title": "Dataset items (paste rows)",
            "type": "array",
            "description": "Paste rows from a scraper run instead of chaining by ID. The actor deep-scans each row for an audio or video link — works with any scraper's output shape, including nested posts. Thumbnails, covers and profile pictures are never mistaken for media."
          },
          "newItemsOnly": {
            "title": "New items only",
            "type": "boolean",
            "description": "OFF (default): every link runs as usual; an item your account already has comes back from the earlier run, not charged (`repeat: true`), so a re-run of the same list is a complete archive that only pays for what is new. ON: items 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 episodes. Only an item this actor actually delivered a transcript for counts; an item that came back without one — unreachable, no speech, or stopped by a cap — does not, so the next run tries it again. Both need the account memory: on a scoped API token in restricted-access mode, grant key-value store Read, Write and Create (or Full access), or repeats are charged again.",
            "default": false
          },
          "outputFormats": {
            "title": "Formats to return",
            "type": "array",
            "description": "All four are returned by default — plain text, timestamped segments and ready-made SRT and VTT subtitle files — at no extra cost. Trim the list if you only want some of them; plain text is always returned.",
            "items": {
              "type": "string",
              "enumSuggestedValues": [
                "text",
                "segments",
                "srt",
                "vtt"
              ],
              "enumTitles": [
                "Plain text",
                "Timestamped segments",
                "SRT subtitles",
                "VTT subtitles"
              ]
            },
            "default": [
              "text",
              "segments",
              "srt",
              "vtt"
            ]
          },
          "language": {
            "title": "Language hint",
            "type": "string",
            "description": "Leave as \"auto\" to detect the spoken language automatically (about 90 languages are supported). Otherwise give a two-letter ISO 639-1 code such as en, es, de, ja, ar. On a run with no links the sample clip is an English recording, so a hint naming another language is answered with an uncharged row rather than transcribed into words that are not in it.",
            "default": "auto"
          },
          "maxMinutesPerItem": {
            "title": "Max minutes per item",
            "minimum": 0,
            "type": "integer",
            "description": "Skip any single item longer than this many audio minutes. 0 means no per-item limit. Skipped items come back as uncharged rows saying how long they were. One run goes up to 100,000 minutes per item; ask for a bigger number and the run continues at that, and says so.",
            "default": 0
          },
          "maxTotalMinutes": {
            "title": "Max total minutes",
            "minimum": 0,
            "type": "integer",
            "description": "Stop the run once this many audio minutes have been charged in total. 0 means no limit. The run stops cleanly and the items it did not reach come back as uncharged rows. One run goes up to 1,000,000 minutes in total; ask for a bigger number and the run continues at that, and says so.",
            "default": 0
          },
          "maxRunSeconds": {
            "title": "Max run time (seconds)",
            "type": "integer",
            "description": "Wall-clock limit for the whole run, counted from when the run started. Items still waiting when it is reached come back as uncharged rows saying so, and the run finishes cleanly instead of being cut off. The default, 7,200 seconds (two hours), is also the most one run can take. Anything from 90 to 7,200 seconds is used as you set it; a number outside that range still starts the run, at the nearest end of the range, and one uncharged row says so. The run's own Timeout option still applies when it is shorter than this, and then it is the limit that ends the run.",
            "default": 7200
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}