{
  "openapi": "3.0.1",
  "info": {
    "title": "Bulk Text to Speech: MP3 + SRT Subtitles | No API Key",
    "description": "Convert texts or an Excel/CSV file into MP3 voiceovers with perfectly timed SRT/VTT subtitles. 322 neural voices in 75 languages, word-by-word TikTok captions, personalized messages from spreadsheet rows, and one merged file option. No API key needed.",
    "version": "0.1",
    "x-build-id": "UmYgA0dZisxoneSP6"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fayoussef~bulk-text-to-speech/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fayoussef-bulk-text-to-speech",
        "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/fayoussef~bulk-text-to-speech/runs": {
      "post": {
        "operationId": "runs-sync-fayoussef-bulk-text-to-speech",
        "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/fayoussef~bulk-text-to-speech/run-sync": {
      "post": {
        "operationId": "run-sync-fayoussef-bulk-text-to-speech",
        "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": {
          "texts": {
            "title": "Texts to convert",
            "type": "array",
            "description": "One entry = one MP3 voiceover (plus matching subtitles). Add as many as you want: they are all generated in parallel. With a spreadsheet attached, write a text with column names in double curly braces, for example: Hi {{First name}}, your order {{Order}} has shipped. It is filled in for every row. Texts without placeholders are ignored in that case.",
            "items": {
              "type": "string"
            }
          },
          "spreadsheetFile": {
            "title": "Spreadsheet (optional)",
            "type": "string",
            "description": "Optional. Upload an Excel (.xlsx), CSV or TSV file, or paste a public link to one (Google Sheets links work if the sheet is shared as 'Anyone with the link'). The first row must be the column names. Each row becomes one voiceover: either from a text above with {{Column}} placeholders, or from the text column below. You get your file back as results.xlsx with the MP3 and subtitle links on every row. Leave empty to use the Texts list as usual."
          },
          "textColumn": {
            "title": "Text column (spreadsheet only)",
            "type": "string",
            "description": "Which column holds the text to read aloud, when you do not write a {{Column}} template above. Leave empty to pick it automatically: a column named 'text' or 'script' if there is one, otherwise the column with the longest text."
          },
          "fileNameColumn": {
            "title": "File name column (spreadsheet only)",
            "type": "string",
            "description": "Optional. A column whose value is added to each file name, for example a SKU or a lesson name: audio-001-SKU-123.mp3 instead of audio-001.mp3. Leave empty for numbered names."
          },
          "sheetName": {
            "title": "Sheet name (optional)",
            "type": "string",
            "description": "Only for Excel files with several sheets. Leave empty to read the first sheet."
          },
          "voice": {
            "title": "Voice",
            "enum": [
              "en-US-AriaNeural",
              "en-US-JennyNeural",
              "en-US-MichelleNeural",
              "en-US-AnaNeural",
              "en-US-GuyNeural",
              "en-US-ChristopherNeural",
              "en-US-EricNeural",
              "en-US-AvaMultilingualNeural",
              "en-US-EmmaMultilingualNeural",
              "en-US-AndrewMultilingualNeural",
              "en-US-BrianMultilingualNeural",
              "en-GB-SoniaNeural",
              "en-GB-RyanNeural",
              "en-AU-NatashaNeural",
              "en-IN-NeerjaNeural",
              "es-ES-ElviraNeural",
              "es-MX-DaliaNeural",
              "es-MX-JorgeNeural",
              "fr-FR-DeniseNeural",
              "fr-FR-HenriNeural",
              "de-DE-KatjaNeural",
              "de-DE-ConradNeural",
              "it-IT-ElsaNeural",
              "it-IT-DiegoNeural",
              "pt-BR-FranciscaNeural",
              "pt-BR-AntonioNeural",
              "ar-SA-ZariyahNeural",
              "ar-EG-SalmaNeural",
              "hi-IN-SwaraNeural",
              "ja-JP-NanamiNeural",
              "ko-KR-SunHiNeural",
              "zh-CN-XiaoxiaoNeural",
              "zh-CN-YunxiNeural",
              "ru-RU-SvetlanaNeural",
              "tr-TR-EmelNeural",
              "nl-NL-ColetteNeural",
              "pl-PL-ZofiaNeural",
              "sv-SE-SofieNeural",
              "id-ID-GadisNeural",
              "vi-VN-HoaiMyNeural",
              "th-TH-PremwadeeNeural"
            ],
            "type": "string",
            "description": "Neural voice used for all texts. 322 voices in 75+ languages are available — this list shows the most popular ones. Need another? Use the 'Custom voice code' field below, or tick 'List all voices' to export the full catalog.",
            "default": "en-US-AriaNeural"
          },
          "speed": {
            "title": "Speaking speed",
            "enum": [
              "-50%",
              "-25%",
              "-10%",
              "+0%",
              "+10%",
              "+25%",
              "+50%",
              "+100%"
            ],
            "type": "string",
            "description": "How fast the voice talks. TikTok/Shorts creators often use +25%.",
            "default": "+0%"
          },
          "pitch": {
            "title": "Pitch",
            "enum": [
              "-20Hz",
              "-10Hz",
              "+0Hz",
              "+10Hz",
              "+20Hz"
            ],
            "type": "string",
            "description": "Voice pitch adjustment.",
            "default": "+0Hz"
          },
          "customVoice": {
            "title": "Custom voice code (optional)",
            "type": "string",
            "description": "Any of the 322 supported voice codes, e.g. `el-GR-AthinaNeural`. Overrides the Voice dropdown. Tick 'List all voices' below and run once to export the full catalog."
          },
          "generateSubtitles": {
            "title": "Generate subtitles",
            "type": "boolean",
            "description": "Create a perfectly timed subtitle file (SRT or VTT) next to every MP3 — ready to drop into CapCut, Premiere, DaVinci or YouTube.",
            "default": true
          },
          "subtitleGranularity": {
            "title": "Subtitle timing",
            "enum": [
              "sentence",
              "word"
            ],
            "type": "string",
            "description": "'Word-by-word' gives you one cue per word — perfect for animated TikTok-style captions. 'Sentence' gives classic subtitle blocks.",
            "default": "sentence"
          },
          "subtitleFormat": {
            "title": "Subtitle format",
            "enum": [
              "srt",
              "vtt"
            ],
            "type": "string",
            "description": "SRT works everywhere (CapCut, Premiere, YouTube). VTT is for web players.",
            "default": "srt"
          },
          "combineAudio": {
            "title": "Also merge everything into one file",
            "type": "boolean",
            "description": "Additionally joins all clips into a single `combined.mp3` (and one continuous subtitle file) in the original order — handy for full videos, podcasts or audiobooks.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Parallel conversions",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many texts are converted at the same time. 5 is a safe default; raise it for large batches.",
            "default": 5
          },
          "listVoices": {
            "title": "List all voices (no audio)",
            "type": "boolean",
            "description": "Run once with this ON to export the full catalog of 322 voices (name, language, gender, personality) to the dataset — then pick your favorite and put its code into 'Custom voice code'. Free, no characters charged.",
            "default": 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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}