DeWatermark Precision image repair

404 · frame missing

That page is outside the mask.

The link may be old, but your cleanup workflow is still here.

Developer API

Same engine, your pipeline.

Generate a key after signing in. API requests spend account credits, use your plan's size limits, and are rate-limited per key.

Open API docs

API keys

Create a key for backend use. The secret is shown once, then only the prefix is stored. Default limit: 20 requests/minute and 500 requests/day per key.

1. Create cleanup job

Send an image, a matching black/white mask, and a unique Idempotency-Key. White pixels are repaired. HTTP 202 returns a job_id; poll GET /api/repairs/{job_id} for completion. Retry an uncertain submission with the same key and identical input.

POST /api/create-job
Authorization: Bearer dw_live_...
Idempotency-Key: unique-request-id-0001
Content-Type: application/json

{
  "image": "data:image/png;base64,...",
  "mask": "data:image/png;base64,...",
  "width": 1200,
  "height": 800,
  "quality": "standard",
  "ownershipAccepted": true
}

2. Optional suggestion beta

The detector can suggest a starting mask, but production API workflows should still review or provide a precise mask.

POST /api/detect-watermark
Authorization: Bearer dw_live_...
Content-Type: application/json

{
  "image": "data:image/png;base64,...",
  "width": 1200,
  "height": 800,
  "pipeline": "v2"
}

JavaScript example

Use API keys only from your backend. Browser clients should use the web app auth flow.

const response = await fetch(
  "https://dewatermark.com/api/create-job",
  {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${process.env.DEWATERMARK_API_KEY}`,
      "Idempotency-Key": crypto.randomUUID(),
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      image,
      mask,
      width,
      height,
      quality: "standard",
      ownershipAccepted: true
    })
  }
);

if (!response.ok) throw new Error("Submission failed");
let job = await response.json();
while (!["complete", "failed", "cancelled"].includes(job.status)) {
  await new Promise(resolve => setTimeout(resolve, 2500));
  const status = await fetch(
    `https://dewatermark.com/api/repairs/${job.job_id}`,
    {headers: {Authorization: `Bearer ${process.env.DEWATERMARK_API_KEY}`}}
  );
  if (!status.ok) throw new Error("Status unavailable; retry later");
  job = await status.json();
}
if (job.status !== "complete") throw new Error(job.error);
// Download job.result_url; it expires in five minutes.

Python example

Pass data URLs or public image URLs. For best results, provide a precise mask.

import os, time, uuid, requests

res = requests.post(
  "https://dewatermark.com/api/create-job",
  headers={
    "Authorization": f"Bearer {os.environ['DEWATERMARK_API_KEY']}",
    "Idempotency-Key": str(uuid.uuid4())
  },
  json={
    "image": image,
    "mask": mask,
    "width": 1200,
    "height": 800,
    "quality": "standard",
    "ownershipAccepted": True
  }
)

res.raise_for_status()
job = res.json()
while job["status"] not in ("complete", "failed", "cancelled"):
    time.sleep(2.5)
    status = requests.get(
        f"https://dewatermark.com/api/repairs/{job['job_id']}",
        headers={"Authorization": f"Bearer {os.environ['DEWATERMARK_API_KEY']}"},
        timeout=30,
    )
    status.raise_for_status()
    job = status.json()
if job["status"] != "complete":
    raise RuntimeError(job.get("error", "Repair failed"))
print(job["result_url"])

Limits and billing

Cleanup submissions count against per-key rate limits and spend credits based on image size and quality. Status polling does not consume the submission allowance. Completed files remain private for seven days; signed download links last five minutes and can be refreshed by reading the job again.

  • 20 requests per minute per key
  • 500 requests per day per key
  • Standard cleanup starts at 1 credit
  • Premium cleanup uses more credits

Sign in

Keep your credits and repairs together.

New here? This creates your free account. Already registered? Use the same method to sign in. No password needed.

or

Keep this edit

Your image and mask are staying right here.

Choose how you want to continue. Closing this window keeps your work in the studio.

Pay once 100 credits Never expire · no subscription
$9
Repeat work Starter 100 credits refreshed monthly
$7.99/mo

Testimonial

Tell us what DeWatermark helped with.

Real notes from signed-in users help us earn trust without making anything up.