Free tools API
No-key HTTP endpoints behind the free tools on voicelabs.now — SRT to VTT, subtitle timing shifts and SSML validation. CORS, JSON or Markdown, RFC 9457 errors.
The free tools on voicelabs.now also answer over HTTP, with no API key and no account. They are separate from the Developer API: that one is keyed and part of VoiceLabs Pro; these are small utilities anyone can call from a script, a CI job or an AI agent.
The OpenAPI 3.1 document for them is at https://voicelabs.now/api/tools/openapi.json. Every operation in it has security: [] and the tag Free tools.
The contract
- No authentication. Nothing is read from cookies or headers to identify you, so CORS is
*. - POST a JSON body, a form, or
multipart/form-datawith the file in thefilefield. - GET takes the same fields as query parameters, for small inputs.
- JSON by default. Send
Accept: text/markdownto get the result as a Markdown document instead, ordownload=1to get the resulting file itself with aContent-Disposition: attachmentheader. - Errors are RFC 9457 problem documents (
application/problem+json) withtitle,statusand adetailwritten for a person. - Rate limit: 30 calls a minute and 300 a day per address. Past either, the answer is
429with aRetry-Afterheader. - Every response carries
X-Tool-Docs: https://voicelabs.now/docs/free-tools-api. - Inputs are processed in memory and not stored.
Convert SRT to VTT (or VTT to SRT)
POST https://voicelabs.now/api/tools/srt-to-vtt — the API behind the SRT to VTT converter.
| Field | Required | Meaning |
|---|---|---|
input (or file) | yes | The whole .srt or .vtt file. The format is detected from the content. Up to 2,000,000 characters. |
to | no | vtt or srt. Default: the other format. |
download | no | 1 to get the file instead of JSON. |
curl -s https://voicelabs.now/api/tools/srt-to-vtt -F file=@subtitles.srt -F download=1 -o subtitles.vttThe JSON answer is { "output", "format", "cueCount", "warnings" }. warnings lists everything the target format cannot hold and that was therefore removed: SRT <font> and {\an8} tags going to WebVTT; voice, class, language and ruby tags, cue settings and NOTE/STYLE/REGION blocks going to SRT. <b>, <i> and <u> are kept both ways, and every time is copied to the millisecond.
Shift subtitle timing
POST https://voicelabs.now/api/tools/subtitle-timing-shift — the API behind the subtitle timing shift tool.
| Field | Required | Meaning |
|---|---|---|
input (or file) | yes | The whole .srt or .vtt file. The result keeps its format. |
offset_seconds | yes | Seconds to move every cue: positive is later, negative earlier. Millisecond precision, at most 24 hours either way. |
from_seconds | no | Shift only the cues that start at or after this time. Default 0. |
download | no | 1 to get the file instead of JSON. |
curl -s https://voicelabs.now/api/tools/subtitle-timing-shift \
-H 'Content-Type: application/json' \
-d '{"input":"1\n00:00:05,000 --> 00:00:07,000\nHello","offset_seconds":-1.5}'A cue that would end before 00:00:00 is removed and one that would start before it starts at 00:00:00; both are counted in warnings. WebVTT inline timestamps (<00:00:01.000>) move with their cue.
Validate SSML
POST https://voicelabs.now/api/tools/ssml-validator — the API behind the SSML validator.
| Field | Required | Meaning |
|---|---|---|
ssml (or input, or file) | yes | The SSML document. Up to 200,000 characters. |
curl -s https://voicelabs.now/api/tools/ssml-validator \
-H 'Accept: text/markdown' \
--data-urlencode 'ssml=<speak>Hello <break time="500ms"/> world</speak>'The JSON answer is { "valid", "errors", "warnings", "elementCount", "textCharacters" }; each error and warning has a line, a column and a message. An invalid document is still a 200 with valid: false. Errors are what XML or the W3C SSML 1.1 Recommendation forbids: an unclosed or mismatched tag, an element in a place it is not allowed, a missing required attribute, or a value outside its grammar (such as time="5" on <break>). Vendor extensions such as <amazon:effect> or <mstts:express-as>, and a <speak> without version, xml:lang or xmlns, are warnings: most engines accept them.
Errors
| Status | When |
|---|---|
400 | A required field is missing or not a number (offset_seconds), or to is not srt/vtt. |
413 | The body is over 2.5 MB. |
415 | The body is not JSON, a form or multipart. |
422 | The input has no subtitle cues in it, the shift would leave none, or the SSML document is over the size limit. |
429 | Over 30 calls a minute or 300 a day from one address. |
Download generated audio GET
Download the audio of a completed generation. This URL is not called directly — it is the `audio_url` returned by GET /v1/generations/{generationId}, already signed and ready to follow. The signature grants access to this one generation for about 15 minutes, so no API key is sent (and none is accepted): the link can be handed straight to a media player, a download, or an <audio> tag that cannot attach an Authorization header. Links expire — poll the generation again to mint a fresh one rather than storing this URL. Authenticated by the signature in the URL, not by an API key.
Pricing
VoiceLabs Pro is US$8/month or US$59/year with a 7-day free trial — one plan, 2 hours of generated audio per month, no per-use fees.