Automate transcription, subtitles, translation, subtitle repair, subtitle burning, and video compression. This is the same API the Zapier integration uses.
The VideoText API lets Pro users automate the same operations available in the web app: transcription, subtitle generation, subtitle translation, subtitle repair, burning subtitles into a video, and video compression. Every job is asynchronous — you submit a job, then poll (or use the Zapier trigger) for completion.
API access is a Pro-plan feature. Free-plan accounts receive an UPGRADE_REQUIRED error on every API call.
https://api.videotext.ioAll endpoints below are relative to this origin.
Send your API key as a bearer token:
Authorization: Bearer vt_live_your_api_key_hereX-Api-Key: vt_live_... is also accepted. Create a key at videotext.io/settings/api-keys — the full secret is shown exactly once, at creation. If you lose it, revoke it and create a new one.
Every processing endpoint (everything except guideline formatting) follows the same lifecycle:
POST the job — returns 202 Accepted with an id and status: "queued".GET /api/v1/<resource>/:id until status is completed or failed.completed, output URLs (txt_url, srt_url, vtt_url, or download_url, depending on the operation) are populated.failed, failure_reason explains what went wrong.In Zapier, the New Completed Transcription trigger polls for you — you don't need to poll manually inside a Zap.
Includes voice recordings — upload the recorded audio like any other file.
POST /api/v1/transcriptions (multipart, field: file)
GET /api/v1/transcriptions/:id
GET /api/v1/transcriptions (list, see Listing & polling below)POST /api/v1/subtitles (multipart, field: file)
GET /api/v1/subtitles/:id
GET /api/v1/subtitlesSame as subtitle generation, plus a targetLanguage field. The value is echoed back on the POST response as target_language (not on the GET response — see Limits & known gaps).
POST /api/v1/subtitle-translations (multipart, fields: file, targetLanguage)
GET /api/v1/subtitle-translations/:idsubtitles is required. video is optional — when included, cues that span a scene cut are flagged. Overlapping cues and cues whose end is before their start are always repaired. The other fixes match the web app's checkboxes and are off unless you send them as true:fixTiming (extend too-fast cues, cap at 10 s), lineBreakFix (42 characters per line), grammarFix (AI spelling/punctuation), removeFillers, and timingOffsetMs (shift every cue; needs fixTiming).
POST /api/v1/subtitle-fixes (multipart, fields: subtitles [required], video [optional],
fixTiming, lineBreakFix, grammarFix, removeFillers, timingOffsetMs [optional])
GET /api/v1/subtitle-fixes/:idBoth fields are required — this is the only entry point for burning subtitles into a video.
POST /api/v1/subtitle-burns (multipart, fields: video [required], subtitles [required])
GET /api/v1/subtitle-burns/:idPOST /api/v1/video-compressions (multipart, field: file)
GET /api/v1/video-compressions/:idGET /api/v1/meAll uploads are multipart/form-data. Exact field names by operation:
| Operation | Field(s) |
|---|---|
| Transcription / Subtitles / Translation / Compression | file |
| Subtitle repair | subtitles (required), video (optional) |
| Burn subtitles | video and subtitles (both required) |
| Subtitle translation | file + targetLanguage (form field) |
Remote file_url ingestion (handing VideoText a URL instead of a file) is not supported — every file must be uploaded directly. In Zapier, the file field from an upstream step (e.g. Google Drive) is downloaded and streamed to VideoText automatically.
Response from GET /api/v1/<resource>/:id:
{
"id": "12345",
"status": "completed",
"operation": "video_to_transcript",
"tool_type": "video-to-transcript",
"filename": "a1b2c3d4-my-video_transcript.txt",
"duration_seconds": 612,
"txt_url": "/api/download/a1b2c3d4-my-video_transcript.txt?jobToken=...",
"srt_url": null,
"vtt_url": null,
"download_url": null,
"original_size_bytes": 104857600,
"created_at": "2026-08-30T05:50:00.000Z",
"completed_at": "2026-08-30T05:52:14.000Z",
"failure_reason": null
}download_url is used for operations without a dedicated txt_url/srt_url/vtt_url — e.g. video compression (compressed video) and subtitle burning (video with burned-in captions). Download URLs already include the authorization token needed to fetch them — use them as-is.
Every resource above supports the same list/query contract, used by the Zapier trigger:
GET /api/v1/transcriptions?status=completed&since=2026-08-30T00:00:00Z&limit=25{
"data": [ { "id": "...", "status": "completed", ... } ],
"pagination": { "limit": 25, "next_cursor": "MjAyNi0...", "has_more": true }
}status — filter, e.g. completed, processing, failed.since — ISO 8601 timestamp; with status=completed, filters on completion time.cursor — pass back pagination.next_cursor for the next page.Every error uses the same envelope:
{ "error": { "code": "QUOTA_EXCEEDED", "message": "...", "request_id": "..." } }| Code | HTTP | Meaning |
|---|---|---|
INVALID_API_KEY | 401 | Missing or unrecognized API key |
API_KEY_REVOKED | 401 | Key exists but has been revoked — create a new one |
UPGRADE_REQUIRED | 403 | Free-plan account; API access requires Pro |
QUOTA_EXCEEDED | 403 | Daily import cap, monthly minutes, or concurrency limit reached |
FILE_TOO_LARGE | 400 | File exceeds your plan's size limit |
SUBTITLE_FILE_TOO_LARGE | 400 | Subtitle or text file exceeds 20 MB (subtitle translate, fix and convert) |
DURATION_EXCEEDED | 400 | Video exceeds your plan's duration limit |
UNSUPPORTED_FILE | 400 | File type not recognized/supported |
TRANSCRIPTION_NOT_FOUND | 404 | No such job, or it belongs to another user |
FORBIDDEN | 401/403 | Not authenticated, or a specific-action check failed |
RATE_LIMITED | 429 | Too many requests for this key this minute — see Retry-After |
VALIDATION_ERROR | 400 | Malformed request |
INTERNAL_ERROR | 500 | Unexpected server error |
Current Pro-plan limits (enforced server-side, same as the web app):
Requests are also rate-limited per API key (default 60 requests/minute); a 429 response includes a Retry-After header. Call GET /api/v1/me for your account's exact current limits and usage.
curl -X POST \
https://api.videotext.io/api/v1/transcriptions \
-H "Authorization: Bearer vt_live_your_api_key_here" \
-F "[email protected]"curl https://api.videotext.io/api/v1/transcriptions/12345 \
-H "Authorization: Bearer vt_live_your_api_key_here"For the no-code path, see the VideoText + Zapier integration page. It uses this exact API — nothing about it is different from calling the API directly.
Questions about the API? Email [email protected].