UnMarkAI Remove Text API

Video Text Removal API

Automate caption, timestamp, label, and text-overlay cleanup for video libraries, customer uploads, and production pipelines.

Server-side API · Async jobs · Usage-based billing

Clean video frame after automated text removalInputAPI result
job.status: succeeded

One durable job lifecycle

From source video to clean result

Keep uploads, processing, and result delivery independent. Each resource has a stable identifier that your backend can store and reconcile.

  1. 01POST /v1/uploads

    Request a signed upload

    Declare the video from your backend. The API returns a one-time upload URL and the exact headers required for the transfer.

  2. 02PUT signed URL

    Upload video bytes directly

    Send the source file to object storage without proxying a multi-gigabyte video through your application server.

  3. 03POST /v1/jobs

    Create an idempotent job

    Choose full-frame or selected-area cleanup and attach your own metadata for order, asset, or tenant reconciliation.

  4. 04GET /v1/jobs/{id}

    Receive the clean result

    Follow progress with the Jobs API or signed webhook events, then download the result from its temporary signed URL.

Two cleanup modes

Choose how much of each frame to clean

Use the same asynchronous job contract for broad discovery or precise, predictable regions. The mode is explicit in every request and response.

all_area

Full-frame text removal

Scan the full video frame when captions, labels, or overlays can appear in different positions. No rectangle is supplied.

sel_area

Selected-area cleanup

Provide source-video pixel coordinates when a timestamp, lower third, or caption band stays inside a known region.

Production controls

Designed for automation that has to recover

The API exposes the state and identifiers your workers need to retry safely, trace failures, and keep customer workflows moving.

01

Safe retries

A required Idempotency-Key protects job creation from duplicate charges when networks fail or workers retry.

02

Asynchronous by design

Queue larger videos without holding an HTTP request open. Read authoritative status and smooth progress from the Job resource.

03

Signed event delivery

Verify one HTTPS webhook endpoint and receive state changes on your server while retaining polling as a recovery path.

04

Account-level controls

Create scoped keys, revoke credentials, review wallet activity, and inspect live rates from the API Console.

Server-side quickstart

Ship your first video text removal job

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.

  • Base URL: https://api.unmarkai.net/v1
  • Authentication: Bearer uma_live_*
  • Job type: remove_text
Open the complete API quickstart
cURL + jq · bash
export 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

Usage-based processing with server-side security

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.

Authoritative rates
GET /v1/balance
Default concurrency
4 processing jobs
Maximum video
2 GiB · 60 minutes
Credential boundary
Trusted server only
Keep API keys out of client code.

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

Integration questions

Before you automate video cleanup

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.

Can the API remove hardcoded captions and timestamps?

Yes. The remove_text job cleans visible text that is already rendered into video frames, including hardcoded captions, timestamps, labels, and static overlays. Results depend on motion, background detail, text size, and how much of the scene is covered.

Should I use all_area or sel_area?

Use all_area when text can appear across the frame. Use sel_area with source-video pixel coordinates when the unwanted text remains in a predictable region and you want to preserve the rest of the frame.

Can I call the Video Text Removal API from a browser?

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.

How is API usage billed?

The API uses a separate USD wallet and charges by billable video 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.

Build with UnMarkAI

Add video text removal to your workflow

Create a server-side key, fund the separate API wallet, and follow the quickstart from upload to clean result.