Quickstart Clean text in one request

No SDK, no API key, no signup. Every endpoint is a plain HTTPS POST to https://api.claudewatermark.org. Here is the whole thing.

Scan text for hidden characters

bash
curl -X POST https://api.claudewatermark.org/v1/text/scan \
  -H "Content-Type: application/json" \
  -d '{"text":"Your text here"}'
javascript
class="syn-keyword">const res = await fetch("https://api.claudewatermark.org/v1/text/scan", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ text: "Your text here" })
});
class="syn-keyword">const data = await res.json();
console.log(data.total_invisible, data.invisible);
python
class="syn-keyword">import requests
r = requests.post("https://api.claudewatermark.org/v1/text/scan",
                  json={"text": "Your text here"})
print(r.json()["total_invisible"])

Clean or rewrite

/v1/text/clean strips hidden characters and normalizes. /v1/text/rewrite paraphrases the text to reduce statistical watermark signal (it changes word choice; it does not guarantee removal).

bash
curl -X POST https://api.claudewatermark.org/v1/text/clean \
  -H "Content-Type: application/json" \
  -d '{"text":"Your text here"}'
# -> { "cleaned": "...", "removed_count": 0... }
bash
curl -X POST https://api.claudewatermark.org/v1/text/rewrite \
  -H "Content-Type: application/json" \
  -d '{"text":"Your text here"}'
# -> { "rewritten": "..."... }

Strip image metadata (EXIF / XMP / C2PA)

bash
curl -X POST https://api.claudewatermark.org/v1/image/strip \
  -H "Content-Type: image/jpeg" \
  --data-binary @photo.jpg
# -> { "format":"jpeg", "removed":[...], "cleaned_base64":"..." }
Honest note: these tools remove hidden characters and metadata, and can paraphrase text. They cannot read or guarantee removal of a statistical token-level watermark, which needs the model owner’s private key.