WatermarkRemoverPro

How to Use the WatermarkRemoverPro API to Check AI Marks

WatermarkRemoverPro Content Team7 min readHow-to guide
A developer's laptop showing code on screen, illustrating how to call the WatermarkRemoverPro AI detector API

Photo via Unsplash

Editorial pipelines need proof of provenance before a document goes out the door, and checking that by hand doesn't scale.

The WatermarkRemoverPro API lets you call the same green-list watermark check that powers the Check page, straight from your own code or an agent workflow, using an ai detector api built for that exact job.

This guide walks through generating a key, sending your first request to /api/v1/check, reading the response, handling errors, and understanding the 2p-per-1,000-words metering, plus where the MCP server fits for agent callers.

TL;DR
  • 01Generate an API key from your account dashboard before you write any code.
  • 02Every check is a POST to /api/v1/check with a Bearer token in the Authorization header.
  • 03The response includes signal strength, a confidence band, a per-passage breakdown, and the method's stated limits.
  • 04Checks are metered at 2p per 1,000 words; a 402 response tells you exactly which limit you hit.
  • 05If the usage ledger is down, the API returns 503 rather than serving a free, unbilled check.
  • 06Agent-based callers can use the MCP server's check_document and describe_method tools instead of raw HTTP.

Step 1: Create an account and generate an API key

Start on the Pricing page and sign up for a Pro account, because the API and MCP server sit behind that tier, metered separately at 2p per 1,000 words on top of the subscription.

Once you're in, open the API keys panel in your dashboard and generate a new key. It will look something like mw_live_9f2..., so copy it once and store it somewhere safe, because WatermarkRemoverPro won't show you the full string again.

Treat the key like a password. If it ever ends up in a public repository or a client-side bundle, revoke it from the dashboard immediately and generate a fresh one.

Step 2: Send your first request to POST /api/v1/check

Every check goes through one endpoint: POST /api/v1/check. Set the Authorization header to Bearer mw_live_your_key_here, and send a JSON body with the document text and a language code: en, es, fr, de or pt.

A minimal request might carry just two fields: text and language. The API doesn't care whether the call comes from a script, a CI job, or an agent, since it treats every caller the same way.

Unlike the free Check page, there's no 1,500-word ceiling here. The API is metered instead, so longer documents simply cost more, billed per 1,000 words.

Step 3: Read the response, covering signal strength, confidence band and passage breakdown

A successful call returns a JSON object with a headline signal strength figure and a confidence band around it, exactly as you'd see on the Check page or in the evidence report PDF.

Below that sits a per-passage breakdown, an array showing how the signal varied across the document, which matters because a mark can be strong in one section and absent in another if text was mixed or edited unevenly.

The response also carries a limits array: short strings stating the method's own caveats, including that a detected mark is not proof of authorship and an absent mark is not proof of human authorship. Build your integration to surface these, not just the headline number.

For a concrete sense of the shape, a typical response looks roughly like a top-level object carrying a signal strength figure between 0 and 100, a confidence band object giving a lower and upper bound around that figure, a passages array where each entry carries its own local signal strength alongside the character range it covers, and the limits array of short caveat strings described above. Parsing this once, into a typed struct or interface in your own codebase, then reusing it everywhere you call the endpoint saves you from re-deriving the shape from raw JSON on every integration. Treat the top-level signal strength as a headline for humans, and treat the passages array as the thing your automation actually reasons over, because that is where uneven or mixed-origin text shows up first.

Step 4: Handle the 401, 402, 400 and 405 responses

A 401 means your Authorization header is missing, malformed, or the key has been revoked. Check the header format first, since it's the most common integration mistake.

A 402 means you've hit a usage or billing limit. The response names the exact limit you hit, so your error handling can tell a user precisely what to do next, rather than showing a generic failure.

A 400 means the request body itself was malformed: a missing text field, an unsupported language code, or invalid JSON. A 405 means you called the endpoint with the wrong HTTP method; /api/v1/check only accepts POST.

Step 5: Understand the 2p-per-1,000-words metering and the 503 refusal

Billing is straightforward: 2p per 1,000 words checked, tracked against a usage ledger tied to your account. There's no separate free tier on the API itself. Pro unlocks access, and metering covers usage from there.

If that usage ledger is ever unavailable, the API returns 503 rather than quietly serving the check for free. That's a deliberate choice: WatermarkRemoverPro refuses to give away a result it can't bill correctly, instead of guessing.

Design your integration to retry a 503 with backoff, the same way you'd treat any other transient outage, because it usually clears within minutes.

In practice that means treating a 503 the way you would any other transient failure: wait a second, retry, and if it fails again, double the wait before the next attempt, capping out after four or five tries rather than retrying forever. A short jitter added to each wait, a few hundred milliseconds picked at random, stops every client in a busy pipeline from hammering the endpoint at exactly the same instant once the ledger recovers. Most outages clear well inside that window, so a caller with backoff built in rarely needs to surface the failure to a human at all, while a caller without it risks turning a brief, minutes-long blip into a support ticket.

Step 6: Call it from an agent, using the MCP server's check_document and describe_method tools

For agent-based callers, raw HTTP is not always the natural fit. The MCP server exposes the same functionality as two tools: check_document, which runs the watermark check on a passed-in document, and describe_method, which returns the method's description and stated limits as structured data.

That second tool matters more than it sounds. An agent that needs to disclose provenance before handing off a document, whether to an editor, a client, or a downstream system, can call describe_method first to fetch the exact limits language, rather than paraphrasing it and risking a claim the method does not support.

Wire check_document into any workflow where an agent produces or forwards text and needs a documented, falsifiable check attached before that handoff happens.

StatusMeaningWhat to do
200Check completed successfullyRead signal strength, confidence band and the limits array
400Malformed request bodyValidate your JSON before sending; check required fields
401Missing or invalid API keyConfirm the Authorization: Bearer header is set correctly
402Usage or billing limit reachedRead the named limit in the response and top up or wait for reset
405Wrong HTTP method usedUse POST for /api/v1/check, not GET
503Usage ledger unavailableRetry later; the API refuses to serve an unmetered check
WatermarkRemoverPro API responses at a glance

“We built the API to fail loudly rather than fail cheap. If we can't bill a check correctly, we'd rather return a 503 than hand back a result nobody can account for.”

A WatermarkRemoverPro detection engineer, on why the API returns 503 instead of a free check

Common pitfalls

  • Hard-coding the API key into client-side code where anyone can read it.
  • Ignoring the confidence band and treating signal strength as a single yes/no verdict.
  • Retrying a 402 immediately instead of checking which limit was actually hit.
  • Assuming a 200 response means "definitely human" or "definitely AI." It never does.

A detected mark is not proof of authorship, and an absent mark is not proof of human authorship. WatermarkRemoverPro's on-device rewrite can reduce detectable evidence but cannot guarantee defeating a vendor's undisclosed watermark, on any tier.

Further reading
Answers, in full

Questions this post answers

Do I need a paid plan to use the API at all?
Yes. The API and MCP server are part of the Pro plan at £19 a month, and usage is metered on top of that at 2p per 1,000 words. The free tier covers the Check page, not programmatic access.
What does the per-passage breakdown actually show?
It shows how the signal varies across the document, section by section, rather than collapsing everything into one number. That's useful when a document is a patchwork of part original, part quoted, part edited content, because the mark can behave differently in each part.
Can I use the API for languages other than English?
Yes. All five supported languages (English, Spanish, French, German and Portuguese) work the same way through the API, each scored against its own measured reference baseline rather than an English one applied elsewhere.
How do I integrate check_document into an agent pipeline?
Call it at the point where your agent is about to hand a document off, whether to a publishing step, a client delivery, or another system, and attach the result alongside the output. Pairing it with describe_method keeps the disclosed limits accurate rather than paraphrased.
What should my retry logic actually look like for a 503?
Use exponential backoff with a small jitter rather than a fixed delay: wait a second, then two, then four, adding a few hundred milliseconds of randomness each time, and give up after four or five attempts rather than retrying indefinitely. Because the ledger is the thing that's unavailable, not the check itself, a 503 almost always resolves within that window, and it never means the endpoint mis-scored your document.