← Back to home

VideoText API

Automate transcription, subtitles, translation, subtitle repair, subtitle burning, and video compression. This is the same API the Zapier integration uses.

Introduction

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.

Base URL

https://api.videotext.io

All endpoints below are relative to this origin.

Authentication

Send your API key as a bearer token:

Authorization: Bearer vt_live_your_api_key_here

X-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.

Job model

Every processing endpoint (everything except guideline formatting) follows the same lifecycle:

  1. POST the job — returns 202 Accepted with an id and status: "queued".
  2. Poll GET /api/v1/<resource>/:id until status is completed or failed.
  3. On completed, output URLs (txt_url, srt_url, vtt_url, or download_url, depending on the operation) are populated.
  4. On 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.

Endpoints

Transcription

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)

Subtitle generation

POST /api/v1/subtitles           (multipart, field: file)
GET  /api/v1/subtitles/:id
GET  /api/v1/subtitles

Subtitle translation

Same 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/:id

Subtitle repair (fix)

subtitles 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/:id

Burn subtitles into video

Both 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/:id

Video compression

POST /api/v1/video-compressions   (multipart, field: file)
GET  /api/v1/video-compressions/:id

Account

GET /api/v1/me

File inputs

All uploads are multipart/form-data. Exact field names by operation:

OperationField(s)
Transcription / Subtitles / Translation / Compressionfile
Subtitle repairsubtitles (required), video (optional)
Burn subtitlesvideo and subtitles (both required)
Subtitle translationfile + 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.

Output fields

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.

Listing & polling

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.

Errors

Every error uses the same envelope:

{ "error": { "code": "QUOTA_EXCEEDED", "message": "...", "request_id": "..." } }
CodeHTTPMeaning
INVALID_API_KEY401Missing or unrecognized API key
API_KEY_REVOKED401Key exists but has been revoked — create a new one
UPGRADE_REQUIRED403Free-plan account; API access requires Pro
QUOTA_EXCEEDED403Daily import cap, monthly minutes, or concurrency limit reached
FILE_TOO_LARGE400File exceeds your plan's size limit
SUBTITLE_FILE_TOO_LARGE400Subtitle or text file exceeds 20 MB (subtitle translate, fix and convert)
DURATION_EXCEEDED400Video exceeds your plan's duration limit
UNSUPPORTED_FILE400File type not recognized/supported
TRANSCRIPTION_NOT_FOUND404No such job, or it belongs to another user
FORBIDDEN401/403Not authenticated, or a specific-action check failed
RATE_LIMITED429Too many requests for this key this minute — see Retry-After
VALIDATION_ERROR400Malformed request
INTERNAL_ERROR500Unexpected server error

Limits

Current Pro-plan limits (enforced server-side, same as the web app):

  • Max video duration: 120 minutes
  • Max file size: 10 GB
  • Concurrent jobs: up to 4 (may reduce temporarily on very high-volume days)

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.

Code example

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"

Using with Zapier

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.

Support

Questions about the API? Email [email protected].