all_areaFull-frame subtitle and text removal
Scan the full video frame when captions, labels, or overlays can appear in different positions. No rectangle is supplied.
Built for developers
Remove burned-in subtitles, captions, and text overlays at scale. Upload a video or pass a URL. Get a clean result, ready for new copy.
$1 API trial credit for eligible new users. Trial videos include an UnmarkAI watermark. Top up your API wallet for watermark-free results.See API pricing →
Real API results · short video examples
Compare six cases: tutorial captions, product copy, vertical creator captions, title text, a sticker label and a security-cam timestamp. Each 12-second comparison keeps the input and actual API output synchronized.
sel_areasel_areaClear instructional captions before translating or updating a tutorial.
What to inspectCompare the lower caption band during all caption pages and active-word changes; inspect grain and sawdust in motion.
LimitsFine moving wood texture can soften inside the repaired band.
Measured 2026-10-06 · USD API wallet; web points are separate. Runtime depends on the clip and queue. See case details for the billable seconds recorded for each run.
Demo overlays added to licensed footage; outputs come from the real API with no manual cleanup. These are examples, not a quality or speed guarantee.
Licensed footage: Sururi Ballıdağ Director · Tima Miroshnichenko · ANTONI SHKRABA production · Get Lost Mike · Tima Miroshnichenko · Pressmaster
One durable job lifecycle
For individual uploads, remove text from video online and compare the preview.
Remove burned-in subtitles without proxying large files through your application server. Each upload, job, and result has a stable identifier that your backend can store and reconcile.
POST /v1/uploads or /v1/url-uploadsRequest a one-time signed upload for local bytes, or asynchronously import a directly downloadable public HTTPS video URL.
PUT signed URLSend the source file to object storage without proxying a multi-gigabyte video through your application server.
POST /v1/jobsChoose full-frame, selected-area or multi-region cleanup and attach your own metadata for order, asset, or tenant reconciliation.
GET /v1/jobs/{id}Follow progress with the Jobs API or signed webhook events, then download the result from its temporary signed URL.
Three cleanup modes
Use the same asynchronous job contract for broad discovery or precise, predictable regions. The mode is explicit in every request and response.
all_areaScan the full video frame when captions, labels, or overlays can appear in different positions. No rectangle is supplied.
sel_areaProvide source-video pixel coordinates when a timestamp, lower third, or caption band stays inside a known region.
multi_areaSend an array of non-overlapping source-pixel rectangles to clear separated labels or caption bands. Billed at the same rate as all_area. See the two-region product example above.
API base prices are now 25% lower. Save up to a further 40% with API wallet tiers. Your tier is based on net API wallet top-ups in the past 365 days; qualifying payments can add up across multiple top-ups.
| Net top-ups in past 365 days | Discount | Selected area | Full frame |
|---|---|---|---|
| Base rate | — | $0.225 | $0.45 |
| $100+ | 10% off | $0.2025 | $0.405 |
| $500+ | 20% off | $0.18 | $0.36 |
| $2,000+ | 25% off | $0.16878 | $0.3375 |
| $5,000+ | 30% off | $0.1575 | $0.315 |
| $10,000+ | 35% off | $0.14628 | $0.2925 |
| $20,000+ | 40% off | $0.135 | $0.27 |
The lowest rate requires $20,000 in qualifying net top-ups. Each payment counts for 365 days from settlement; refunds, chargebacks and aging payments can lower your tier. This is a usage-rate discount, not a discount on the amount deposited. Promotional credits do not qualify.
API wallet funds do not expire. The discount applies to both text removal and video translation; website points and subscriptions are separate. Jobs lock their rate when funds are reserved. Per-minute figures are equivalents of per-second billing, rounded up to whole seconds with a five-second minimum; clips under five seconds are billed as five seconds. Pricing rules · Check your wallet tier. GET /v1/balance provides your authoritative effective rates.
Compare published API rates and documented inputs for authorized video cleanup. Selected-area removal and automatic full-frame cleanup are different workflows; test the same footage before comparing output quality.
| Provider / mode | Published rate | Features and billing conditions |
|---|---|---|
| UnmarkAI · selected area | $0.225/min base $0.18/min at $500 qualifying top-ups $0.135/min at $20,000 | Rectangle coordinates target the caption region. 15-second minimum; clips under 15 seconds are billed as 15 seconds. Discounts use trailing-365-day net top-ups. Official pricing. |
| UnmarkAI · full frame | $0.45/min base $0.36/min at $500 qualifying top-ups $0.27/min at $20,000 | Whole-frame text cleanup. Local uploads or HTTPS imports, asynchronous jobs and signed webhooks. Same tier rules. API contract. |
| WaveSpeed · Video Watermark Remover | $0.010/sec $0.60/min equivalent | Video URL input; advertised for captions, logos and text. Documentation lists a three-second minimum and up to 10-minute clips. Rate derived from its $0.05/5-sec table; final task charge prevails. Official model pricing. |
| MuAPI · AI Video Watermark Remover | $0.065 for ≤5 sec; $0.013/sec beyond that length | Advertised for logos, captions and unwanted text. This is the general AI Video Watermark Remover; its separate Seedance 2 remover is listed at $0.025 for ≤5 sec, then $0.005/sec. Confirm which model fits your source. Official model rates. |
| VModel · Video Watermark Remover | $0.020/sec $1.20/min equivalent | Video plus a mask image input. Public model rate is per input-video second; contact the provider for volume pricing. Official model pricing. |
UnmarkAI full-frame base pricing is $0.45/min after the 25% price reduction; qualifying top-ups lower it to $0.36/min at the $500 tier. Selected-area UnmarkAI pricing is lower, but requires a region. Competitor private discounts, taxes and output quality are not normalized here; this is not a measured quality ranking.
For an effect comparison, inspect text remnants, moving backgrounds, faces crossing the caption region, temporal flicker and original resolution. No side-by-side benchmark is claimed.
Production controls
The API exposes the state and identifiers your workers need to retry safely, trace failures, and keep customer workflows moving.
A required Idempotency-Key protects job creation from duplicate charges when networks fail or workers retry.
Queue larger videos without holding an HTTP request open. Read authoritative status and smooth progress from the Job resource.
Verify one HTTPS webhook endpoint and receive state changes on your server while retaining polling as a recovery path.
Create scoped keys, revoke credentials, review wallet activity, and inspect live rates from the API Console.
Server-side quickstart
Create a key with jobs:write and jobs:read, fund the API wallet, and save the key as an environment variable. With Bash, cURL, and jq installed, this example creates a signed upload, transfers the video, starts an idempotent job, and checks its status once.
https://api.unmarkai.net/v1Bearer uma_live_*remove_textexport UNMARKAI_API_KEY='uma_live_your_key_here'
export IDEMPOTENCY_KEY="remove-$(date +%s)"
API_BASE='https://api.unmarkai.net/v1'
VIDEO='./source.mp4'
SIZE=$(wc -c < "$VIDEO" | tr -d ' ')
# 1. Create a one-time upload ticket.
curl --fail-with-body -sS -X POST "$API_BASE/uploads" \
-H "Authorization: Bearer $UNMARKAI_API_KEY" \
-H 'Content-Type: application/json' \
--data "{"filename":"source.mp4","content_type":"video/mp4","file_size_bytes":$SIZE}" \
-o ticket.json
# 2. Upload the bytes with every signed header unchanged.
jq -r '.headers | to_entries[] | "\(.key): \(.value)"' ticket.json > upload-headers.txt
curl --fail-with-body -sS -X PUT "$(jq -r '.url' ticket.json)" \
--header '@upload-headers.txt' --upload-file "$VIDEO"
# 3. Create an asynchronous, idempotent cleanup job.
UPLOAD_ID=$(jq -r '.upload_id' ticket.json)
curl --fail-with-body -sS -X POST "$API_BASE/jobs" \
-H "Authorization: Bearer $UNMARKAI_API_KEY" \
-H 'Content-Type: application/json' \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
--data "{"type":"remove_text","input":{"upload_id":"$UPLOAD_ID"},"mode":"all_area","rect":null}" \
-o job.json
# 4. Check status once. Poll this resource, or receive signed webhook events.
curl --fail-with-body -sS "$API_BASE/jobs/$(jq -r '.id' job.json)" \
-H "Authorization: Bearer $UNMARKAI_API_KEY" | jq .Clear operating boundaries
Videos can be up to 2 GiB and 60 minutes under the default public contract. Jobs reserve an estimate, settle against measured billable video seconds, and release unused funds after completion or failure.
GET /v1/balanceStore uma_live_* credentials in environment variables or a secret manager. Use scoped keys per environment, rotate them when access changes, and retain response request IDs for support and tracing.
Native MCP endpoint
The same engine is also a hosted MCP server at https://api.unmarkai.net/mcp. One uma_live_* key with the same scopes unlocks nine tools for Claude Code, Cursor, Codex, opencode, and any MCP-capable agent — no SDK, no server to run. Agents can upload local files with curl or import a directly downloadable HTTPS video URL asynchronously.
create_uploadMint a one-time signed upload ticket for a local video file.
create_url_uploadImport a directly downloadable HTTPS video URL asynchronously.
get_uploadWait for a URL import to become uploaded, failed, or expired.
remove_textStart an idempotent cleanup job in all_area, sel_area, or multi_area mode.
get_jobRead progress; optionally wait server-side for a terminal status.
list_jobsPage through recent jobs filtered by status.
cancel_jobStop a validating or queued job before processing starts.
get_balanceCheck the API wallet, live rates, and tier multipliers.
estimate_costPreview billable seconds and USD cost before spending.
# Claude Code
claude mcp add --transport http unmarkai \
https://api.unmarkai.net/mcp \
--header "Authorization: Bearer $UNMARKAI_API_KEY"
# Cursor · ~/.cursor/mcp.json
{
"mcpServers": {
"unmarkai": {
"type": "http",
"url": "https://api.unmarkai.net/mcp",
"headers": { "Authorization": "Bearer $UNMARKAI_API_KEY" }
}
}
}Integration questions
Use the API only with video you own, license, produce for a client, or otherwise have permission to modify. Preserve required disclosures, attribution, and legal notices.
Eligible new users receive $1 in API trial credit. Free trial videos include an UnmarkAI watermark. A successful API wallet top-up or an admin API balance grant unlocks watermark-free final videos. Web points and subscriptions do not qualify. Existing accounts do not receive a retroactive trial grant.
The Video Subtitle Remover API removes subtitles and captions that are already rendered into the video pixels, then reconstructs the selected area or full frame. It is designed for authorized localization, caption replacement, and video-library cleanup workflows.
Use this API for hardcoded or burned-in subtitles that remain visible after subtitle tracks are disabled. If a video contains a separate SRT, VTT, or ASS track, remove or replace that track directly instead of reconstructing video pixels.
Yes. A remove_text job can process burned-in two-line captions whose active word changes color and bounces. Use sel_area when both lines stay inside one region, covering the largest word expansion and outline; use all_area when the caption block moves across the frame. The 12-second tutorial and vertical creator cases above show actual API outputs, exact settings and recorded charges. Inspect every word change for remnants and flicker.
Yes. Point any MCP-capable agent at the hosted MCP server, https://api.unmarkai.net/mcp, with the same uma_live_* key and scopes. Nine tools cover local uploads, direct HTTPS URL imports, job creation, status, cancellation, balance, and cost estimates, and the open-source agent skills on GitHub teach both input flows. Local file transfer stays in your shell; URL imports run asynchronously.
Yes. The same remove_text job can clean timestamps, labels, lower thirds, and other static text overlays. Results depend on motion, background detail, text size, and how much of the scene is covered.
Use all_area when text can appear across the frame. Use sel_area for one region covering at most half of the source frame. Use multi_area with an array of source-pixel rectangles for multiple regions, billed at the same rate as all_area.
Do not embed an uma_live_* key in browser JavaScript, mobile apps, URLs, logs, or public repositories. Call the API from a trusted server, worker, script, or automation environment and keep the key in a secret manager.
The API uses a separate USD wallet and charges by billable video seconds, rounded up to whole seconds with a 15-second minimum. Clips under 15 seconds are billed as 15 seconds. The effective rate depends on cleanup mode and account tier. Query GET /v1/balance for the authoritative live rates before showing estimates to customers.
Use the clean video in a separate Video Translation & AI Dubbing API job to add translated voiceover and captions, with optional text review.
Build with UnMarkAI
Create a server-side key, check the live usage rate, and follow the quickstart from captioned source to clean result.