{
  "openapi": "3.0.1",
  "info": {
    "title": "Audio & Video Transcriber — Speech to Text API",
    "description": "Convert speech to text from any public audio or video URL: podcast episodes, MP3, WAV, M4A or MP4 files and video pages on other sites. Get timestamps, SRT/VTT subtitles, speaker labels and RAG-ready JSONL with source times. Up to 4 hours per file and 1,000 URLs per run. No speech API key needed.",
    "version": "0.2",
    "x-build-id": "16ZDuvkHXVr3Uv0l2"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/andronixmd~speech-to-text-transcriber/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-andronixmd-speech-to-text-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/andronixmd~speech-to-text-transcriber/runs": {
      "post": {
        "operationId": "runs-sync-andronixmd-speech-to-text-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/andronixmd~speech-to-text-transcriber/run-sync": {
      "post": {
        "operationId": "run-sync-andronixmd-speech-to-text-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": "Audio / video URLs",
            "maxItems": 1000,
            "type": "array",
            "description": "One transcript per public HTTPS audio/video URL: YouTube, TikTok, Instagram, podcasts, X, or direct media files (MP3, WAV, M4A, MP4 and more). Submit up to 1,000 URLs of up to 8,192 characters each, or leave this list empty and fill in Podcast feeds or Dataset ID below. Embedded credentials, invalid URLs and unsafe destinations are rejected at runtime before fetching. Private, authenticated and inaccessible sources are unsupported.",
            "items": {
              "type": "string",
              "pattern": "^\\s*[Hh][Tt][Tt][Pp][Ss]://(?=[\\s\\S]{0,8184}\\s*$)"
            }
          },
          "exportRag": {
            "title": "Export RAG passages (JSONL)",
            "type": "boolean",
            "description": "Enable RAG/search ingestion: return rag_chunks and transcript-NNN.rag.jsonl with text, original-source seconds, URL, versioned document identity, timing_basis and optional language/speaker scope. Requires segment or word timestamps. Embeddings/indexing remain downstream steps.",
            "default": false
          },
          "language": {
            "title": "Language hint",
            "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$",
            "minLength": 2,
            "type": "string",
            "description": "Optional BCP-47 language hint, for example en, ru or pt-BR. Omit this field for automatic language detection; an explicit empty string is invalid. Detection and language support depend on the selected engine."
          },
          "timestamps": {
            "title": "Timestamp granularity",
            "enum": [
              "none",
              "segment",
              "word"
            ],
            "type": "string",
            "description": "Choose no timestamps, segment timestamps for subtitles, or word timestamps for detailed alignment. Segment/word output includes SRT and VTT when valid cues are available. Retrieval passages require segment or word timestamps. Timed lines are in the segments array (word timing in words): read the whole field (fields=segments), because dotted paths such as segments.t0 return nothing.",
            "default": "segment"
          },
          "diarize": {
            "title": "Speaker labels",
            "type": "boolean",
            "description": "Identify speakers at the premium per-minute rate. Whole-recording labels are S1/S2; independently processed chunks use C1_S1/C2_S1. Read speaker_scope in each result: labels from different chunks do not identify the same person.",
            "default": false
          },
          "subtitleProfile": {
            "title": "Subtitle profile and QA",
            "enum": [
              "standard",
              "short"
            ],
            "type": "string",
            "description": "Optional caption layout and QA report. Requires segment or word timestamps. Standard uses 42 characters/line and 1–7 s cues; short uses 28 characters/line and 0.5–4 s cues. Both flag more than 2 lines, over 20 characters/second and overlaps. Cues over the line or duration limits are split inside their segment's time range; segments keep their original times, and warnings do not stop transcription. Omit for the existing layout without a QA report."
          },
          "startTime": {
            "title": "Start time (seconds)",
            "minimum": 0,
            "type": "number",
            "description": "Start time in seconds, including zero. Audio minutes cover only the selected interval; any source download fee still applies.",
            "default": 0
          },
          "endTime": {
            "title": "End time (seconds)",
            "minimum": 0,
            "type": "number",
            "description": "Optional exclusive end time in seconds. Must be positive and greater than startTime; this relationship is validated at runtime. Omit it to transcribe through the end of the recording."
          },
          "glossary": {
            "title": "Names and terminology",
            "maxItems": 100,
            "type": "array",
            "description": "Optional names and terminology: up to 100 trimmed phrases, 1–80 characters each, with a combined UTF-8 budget of 500 bytes including separators (validated at runtime). Hosted glossary requests use Deepgram Nova-3; incompatible pins or options fail before download.",
            "items": {
              "type": "string",
              "minLength": 1,
              "pattern": "^\\s*\\S(?:[\\s\\S]{0,78}\\S)?\\s*$"
            }
          },
          "summarize": {
            "title": "Summary",
            "type": "boolean",
            "description": "Return a 2–4 sentence AI summary in the transcript's language (summary). Charged $0.015 per URL as Transcript analysis (transcript-summary), once for any combination of summary, chapters and action items, and only after it succeeds. Generated by Anthropic's Claude from the transcript text. A transcript too long for the add-on's cost limit (about an hour of speech) returns summary_error and is not charged.",
            "default": false
          },
          "chapters": {
            "title": "Chapters",
            "type": "boolean",
            "description": "Return titled chapters with original-source start and end seconds (chapters). Requires segment or word timestamps. Included in the same $0.015 Transcript analysis charge as summary and action items.",
            "default": false
          },
          "actionItems": {
            "title": "Action items",
            "type": "boolean",
            "description": "Return explicit tasks with the quoted source segments as evidence (action_items); assignee and deadline appear only when those segments state them. Requires segment or word timestamps. Included in the same $0.015 Transcript analysis charge. Review before acting on them.",
            "default": false
          },
          "translateTo": {
            "title": "Translate to",
            "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$",
            "type": "string",
            "description": "Optional BCP-47 target language, for example de or pt-BR. Returns translation and, with timestamps, translated_segments, translated_srt and translated_vtt. $0.015 per URL (transcript-translation), charged only after the whole translation succeeds. Recordings longer than about 15 minutes usually exceed the add-on's cost limit and return translation_error without a charge."
          },
          "extractKeywords": {
            "title": "Keywords",
            "type": "boolean",
            "description": "Return up to 10 keywords or topics that the transcript discusses, in its language (keywords); a short transcript gets fewer. $0.008 per URL (transcript-keywords), charged only after it succeeds.",
            "default": false
          },
          "provider": {
            "title": "Pin a speech engine",
            "minLength": 1,
            "maxLength": 120,
            "type": "string",
            "description": "Omit for automatic routing by language, timestamps, speaker labels and terminology; an explicit empty string is invalid. Supported hosted pins: groq/whisper-large-v3, groq/whisper-large-v3-turbo, openai/gpt-transcribe (text only), openai/whisper-1 (legacy timings), openai/gpt-4o-mini-transcribe (text only), openai/gpt-4o-transcribe-diarize (legacy speakers), deepgram/nova-3. A pin never switches providers; unsupported combinations fail explicitly."
          },
          "feedUrls": {
            "title": "Podcast feeds",
            "maxItems": 100,
            "type": "array",
            "description": "The example URL above is processed and charged too: remove it if you want only feed episodes. RSS or Atom feed URLs (for example https://feeds.simplecast.com/Sl5CSM3S) or Apple Podcasts show pages (such as https://podcasts.apple.com/us/podcast/the-daily/id1200361736; the Actor looks up the feed). Episodes are transcribed like direct media URLs, newest first; each row carries show, episode, GUID and date. An Apple episode link (with ?i=) names one episode: put its audio URL in the list above.",
            "items": {
              "type": "string",
              "pattern": "^\\s*[Hh][Tt][Tt][Pp][Ss]://(?=[\\s\\S]{0,8184}\\s*$)\\S+\\s*$"
            }
          },
          "maxItemsPerSource": {
            "title": "Max items per source",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "List at most this many of the newest episodes from each source (up to 200). Each listed item is processed and billed like a URL you submit; listing itself is free. A run holds at most 1,000 items in total, counting URLs and dataset rows.",
            "default": 20
          },
          "publishedAfter": {
            "title": "Published on or after",
            "pattern": "^\\s*\\d{4}-\\d{2}-\\d{2}\\s*$",
            "type": "string",
            "description": "Optional date as YYYY-MM-DD (UTC). Items published before this day are left out. Feeds give exact dates; episodes without a date are left out when this is set."
          },
          "datasetId": {
            "title": "Dataset ID",
            "pattern": "^\\s*(?:[A-Za-z0-9][A-Za-z0-9._-]{0,62}[~/])?[A-Za-z0-9-]{1,63}\\s*$",
            "type": "string",
            "description": "The example URL above is processed and charged too: remove it if you want only the dataset's items. Pick the dataset, or paste its ID, of another Actor run whose rows hold audio, video or page links (a podcast, TikTok or Instagram scraper run). The Actor reads the rows with your run's own token and processes each row's URL like a URL above, after the listed URLs. Rows without a usable URL become uncharged error items. A named dataset works as username~dataset-name."
          },
          "datasetUrlField": {
            "title": "Dataset URL field",
            "pattern": "^\\s*[\\w$#@-]+(?:\\.[\\w$#@-]+)*\\s*$",
            "maxLength": 200,
            "type": "string",
            "description": "Optional. The row field that holds the URL, for example webVideoUrl, or a dotted path such as video.url. Leave it empty to use the first accepted URL from webVideoUrl, url, postUrl, videoUrl, inputUrl, link, audioUrl, mediaUrl, downloadUrl or an Instagram shortCode."
          },
          "maxItems": {
            "title": "Max dataset items",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Read at most this many dataset rows, in dataset order. A run processes at most 1,000 URLs in total, counting the list above.",
            "default": 100
          },
          "skipPreviouslyProcessed": {
            "title": "Skip items processed by earlier runs",
            "type": "boolean",
            "description": "Remember every item that was delivered and charged, in a key-value store in your Apify account, and skip those items in later runs. Use it with a schedule to get only new videos or episodes. Items that failed are tried again next time. When every item was already processed, the run ends without any charge. If the store cannot be read, the run stops before any charge and the next run tries again.",
            "default": false
          },
          "memoryKey": {
            "title": "Memory name",
            "pattern": "^\\s*[A-Za-z0-9](?:[A-Za-z0-9-]{0,23}[A-Za-z0-9])?\\s*$",
            "type": "string",
            "description": "Optional. Keeps a separate memory for this schedule, for example my-weekly-podcasts. The store is named polyglot-processed-transcriber--<name>, and other Actors never share it; without a name every run of this Actor shares polyglot-processed-transcriber. Delete the store in Apify Console (Storage, Key-value stores) to start over. Used only with the option above."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}