MiniMax H3 Open Weights | Try in Video Generator →

Image Text Remover | AI Background & Object Remover API

wavespeed-ai/

AI Image Text Remover that erases on-image text cleanly and reconstructs the background with stunning visual accuracy. Automatically removes captions, labels, subtitles, watermarks, annotations, or embedded UI text while preserving texture, lighting, and scene integrity. Ready-to-use REST inference API, fast performance, no coldstarts, and affordable pricing.

ai-remover
Input

Idle

$0.15per run·~66 / $10

ExamplesView all

Related Models

README

WaveSpeedAI Image Text Remover

Remove unwanted text from any image with pixel-level reconstruction. WaveSpeedAI Image Text Remover automatically finds text regions and rebuilds the underlying background so the edit looks natural — no blurry blocks, no jagged edges.

What is it?

WaveSpeedAI Image Text Remover is an end-to-end image cleanup tool:

  • Input: an image containing text (captions, labels, subtitles, UI text, stickers, overlays)
  • Output: a clean image with the text removed and background filled in
  • Workflow: text detection → intelligent mask generation → background inpainting

It’s designed for cleaning social posts, product photos, posters, screenshots, UI/UX mockups, marketing materials, and any image you want to reuse without visible text.

Why it stands out

  • High-fidelity inpainting Reconstructs texture, lighting, depth, and structure to blend the edited area into the original scene with minimal artifacts.

  • Fully automatic workflow Just upload your image and run the model—no need for manual masking, brushing, or Photoshop skills.

  • Text-focused cleanup Works especially well on captions, subtitles, labels, annotations, and embedded UI strings; also effective on many watermarks and overlays.

  • Flexible output formats Choose JPEG, PNG, or WEBP so the result fits directly into your web, app, or design pipeline.

  • Batch and API friendly Suitable for e-commerce asset cleanup, marketing automation, dataset preparation, and production-scale image processing.

Limits and performance

  • Input formats: JPEG, PNG, WEBP
  • Output formats: JPEG / PNG / WEBP (selectable)
  • Typical processing time: a few seconds per image, depending on resolution and queue load
  • Best cases: clearly readable text that is not extremely stylized or heavily blended into complex textures

Pricing

  • Each processed image costs $0.15.

How to use

  1. Upload an image or paste a publicly accessible image URL.
  2. Choose your preferred output_format (JPEG, PNG, or WEBP).
  3. Click run to start automatic text detection and removal.
  4. Download your cleaned, text-free image from the result panel or dashboard.

Pro tips for best quality

  • Use the highest-resolution version of the image you have; more pixels mean better inpainting.
  • Flat or simple backgrounds are easiest to reconstruct; complex patterns may occasionally need light manual touch-up.
  • For semi-transparent watermarks or overlays, higher resolution and good contrast between text and background improve results.

Notes

  • If you provide an image URL instead of uploading, make sure it is publicly accessible; a valid image will show a preview before you run the job.
  • Extremely stylized, warped, or deeply textured text may not be removed perfectly in one pass.

Related tools

Note:This website uses AI models provided by third parties.

Image Text Remover API — Quick start

Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/wavespeed-ai/image-text-remover with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Image Text Remover below.

HTTP example
set -euo pipefail

: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"

REQUEST_BODY=$(cat <<'JSON'
{
    "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
    "output_format": "jpeg"
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/image-text-remover" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $WAVESPEED_API_KEY" \
  -d "$REQUEST_BODY")

TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; then
  printf 'Submission response did not contain a prediction id
' >&2
  exit 1
fi
RESULT_URL=$(printf '%s' "$TASK" | jq -r '.urls.get // empty')
if [ -z "$RESULT_URL" ]; then
  RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
fi

# 2. Poll until the prediction finishes.
while true; do
  RESPONSE=$(curl --silent --show-error --fail-with-body "$RESULT_URL" \
    -H "Authorization: Bearer $WAVESPEED_API_KEY")
  RESULT=$(printf '%s' "$RESPONSE" | jq 'if has("data") then .data else . end')
  STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
  case "$STATUS" in
    completed) printf '%s\n' "$RESULT" | jq '.outputs'; break ;;
    failed|cancelled|timeout) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
    created|processing) sleep 2 ;;
    *) printf 'Unexpected status: %s
' "$STATUS" >&2; exit 1 ;;
  esac
done
Node.js example
const submitUrl = "https://api.wavespeed.ai/api/v3/wavespeed-ai/image-text-remover";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');

async function requestJson(url, options = {}) {
  const response = await fetch(url, options);
  if (!response.ok) throw new Error(await response.text());
  return response.json();
}

// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
        "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
        "output_format": "jpeg"
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = task.urls?.get ||
  `https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;

// 2. Poll until the prediction finishes.
while (true) {
  const resultBody = await requestJson(resultUrl, {
    headers: { "Authorization": `Bearer ${apiKey}` },
  });
  const result = resultBody.data ?? resultBody;
  if (result.status === "completed") {
    console.log(result.outputs);
    break;
  }
  if (["failed", "cancelled", "timeout"].includes(result.status)) throw new Error(JSON.stringify(result));
  if (!["created", "processing"].includes(result.status)) throw new Error("Unexpected status: " + result.status);
  await new Promise(resolve => setTimeout(resolve, 2000));
}
Python example
import json
import os
import time
from urllib.request import Request, urlopen

api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
    "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
    "output_format": "jpeg"
}

def request_json(url, data=None):
    request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
    with urlopen(request) as response:
        return json.load(response)

# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/wavespeed-ai/image-text-remover", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
    raise RuntimeError("Submission response did not contain a prediction id")
result_url = task.get("urls", {}).get("get") or f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"

# 2. Poll until the prediction finishes.
while True:
    result_body = request_json(result_url)
    result = result_body.get("data", result_body)
    status = result.get("status")
    if status == "completed":
        print(result.get("outputs", []))
        break
    if status in {"failed", "cancelled", "timeout"}:
        raise RuntimeError(result)
    if status not in {"created", "processing"}:
        raise RuntimeError(f"Unexpected status: {status}")
    time.sleep(2)

Image Text Remover API — Frequently asked questions

What is the Image Text Remover API?

Image Text Remover is a WaveSpeedAI model for object / watermark removal, exposed as a REST API on WaveSpeedAI. AI Image Text Remover that erases on-image text cleanly and reconstructs the background with stunning visual accuracy. Automatically removes captions, labels, subtitles, watermarks, annotations, or embedded UI text while preserving texture, lighting, and scene integrity. Ready-to-use REST inference API, fast performance, no coldstarts, and affordable pricing. You can call it programmatically or try it from the playground above.

How do I call the Image Text Remover API?

POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates production-oriented Python, JavaScript, and cURL examples with timeouts, transient-error handling, and safe GET retries. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/wavespeed-ai/image-text-remover.

How much does Image Text Remover cost per run?

Image Text Remover starts at $0.15 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.

What inputs does Image Text Remover accept?

Key inputs: `image`, `enable_base64_output`, `enable_sync_mode`, `output_format`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/wavespeed-ai/image-text-remover.

How do I get started with the Image Text Remover API?

Sign up for a free WaveSpeedAI account to claim starter credits, copy your API key from /accesskey, then call the endpoint shown in the API tab of the playground. The playground also auto-generates a code sample in Python, JavaScript, or cURL for the parameters you've set.

Can I use Image Text Remover outputs commercially?

Commercial usage rights depend on the model's license, set by its provider (WaveSpeedAI). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.