API Reference

Remove captions

Cleans burned in captions, watermarks, logos and other on screen text off a video and leaves the footage otherwise untouched. This is the tool the app calls Video Remover.

POST/v1/caption-remover

Remove text from a video

Send the video as multipart form data, or a url for Vsub to fetch. The job is accepted straight away and cleaned in the background, which takes a few minutes for a short clip.
Body
file
file
The video itself, sent as multipart form data under the field name file. mp4, mov or webm, up to 100MB and 2 minutes.
url
string
Where to fetch the video from instead, sent as json. The url has to be reachable without authentication. Pass either this or file.
webhookUrl
string
HTTPS callback fired once the video reaches a terminal status. See Webhooks for details.
Response fields
idrequired
string
Pass it to the status endpoint to follow the job.
statusrequired
"processing" | "completed" | "failed"
Splitting, cleaning and stitching the footage back together are all processing, since they are steps of one job.
videoUrl
string
The cleaned up mp4, once the status is completed.
durationSecondsrequired
number
Length of the footage, measured from the file you sent.
costrequired
number
What the job was charged in US dollars.
refundedrequired
boolean
True once a failed job has been paid back.
createdAtrequired
string
When the job was accepted.
completedAt
string
When it settled, whichever way it went.
error
string
Why it failed. Only sent when the status is failed.
Request
curl -X POST "https://api.vsub.io/v1/caption-remover" \
  -H "Authorization: Bearer vp_a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90" \
  -F "[email protected]"

# or point it at a url instead
curl -X POST "https://api.vsub.io/v1/caption-remover" \
  -H "Authorization: Bearer vp_a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://your-app.example.com/clip.mp4" }'
Response 200
{
  "id": "7c1f9a2e-4d3b-4a90-8e51-2b7c6d0f4a83",
  "status": "processing",
  "durationSeconds": 42,
  "cost": 0.63,
  "refunded": false,
  "createdAt": "2026-08-07T02:41:18.000Z"
}

Cleaning costs $0.015 per second of footage, with a 5 second minimum, taken from your cash balance rather than from credits. The whole cost is charged when the job is accepted and paid back automatically if it fails. A video longer than 2 minutes, larger than 100MB or in another format is turned away before anything is charged.

GET/v1/caption-remover/:id

Get a caption removal

Poll this until the status leaves processing. A short clip usually takes a few minutes, longer footage is split into segments that are cleaned in parallel.
Response fields
idrequired
string
Pass it to the status endpoint to follow the job.
statusrequired
"processing" | "completed" | "failed"
Splitting, cleaning and stitching the footage back together are all processing, since they are steps of one job.
videoUrl
string
The cleaned up mp4, once the status is completed.
durationSecondsrequired
number
Length of the footage, measured from the file you sent.
costrequired
number
What the job was charged in US dollars.
refundedrequired
boolean
True once a failed job has been paid back.
createdAtrequired
string
When the job was accepted.
completedAt
string
When it settled, whichever way it went.
error
string
Why it failed. Only sent when the status is failed.
Request
curl "https://api.vsub.io/v1/caption-remover/7c1f9a2e-4d3b-4a90-8e51-2b7c6d0f4a83" \
  -H "Authorization: Bearer vp_a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90"
Response 200
{
  "id": "7c1f9a2e-4d3b-4a90-8e51-2b7c6d0f4a83",
  "status": "completed",
  "durationSeconds": 42,
  "cost": 0.63,
  "refunded": false,
  "createdAt": "2026-08-07T02:41:18.000Z",
  "completedAt": "2026-08-07T02:44:02.000Z",
  "videoUrl": "https://files.vsub.io/expire-30-cleaned-9f0c1d5e.mp4"
}

The cleaned up mp4 stays available for 30 days. Copy it to your own storage if you need it for longer.

Rather than polling, pass webhookUrl when you create the job and Vsub calls you once it settles, see Webhooks. Removals are not videos, so they don't show up under Video status.