What Is an AI Text Watermark?

A hidden signal embedded in text so its origin can be identified later. It comes in three forms, and they behave nothing alike, which is why understanding the difference matters before you try to detect or remove one.

What is an AI text watermark?

An AI text watermark is a hidden signal embedded in AI-generated content so it can later be identified. There are three distinct kinds: invisible Unicode characters inserted into the text, a statistical bias in which words the model chose, and provenance metadata such as C2PA attached to a file.

  • Invisible Unicode carriers — removable, and verifiable.
  • Statistical sampling watermarks — only changed by rewriting the wording.
  • C2PA / EXIF / XMP provenance metadata — strippable from the file.
  • Style-based AI detectors are not watermarks at all; they guess from writing style.

Type 1: Invisible Unicode characters

Unicode contains a number of codepoints that are legitimate characters but render nothing on screen. Zero-width space (U+200B), zero-width non-joiner (U+200C), zero-width joiner (U+200D), word joiner (U+2060), the byte-order mark (U+FEFF) and the soft hyphen (U+00AD) are the usual suspects. They exist for genuine typographic reasons (controlling line breaks, joining scripts like Arabic and Devanagari), but they can also be strung together to encode data.

Two distinct characters give you a binary alphabet. A hundred of them scattered through a paragraph is a hundred bits: enough to encode a user ID, a session token, or a timestamp. The reader sees ordinary prose. Anyone who knows the encoding sees a message.

The Unicode tag block (U+E0000–U+E007F) goes further: it mirrors printable ASCII, so a whole readable string can be embedded invisibly inside a sentence and extracted with a simple offset subtraction.

Type 2: Homoglyph substitution

Instead of adding characters, this swaps them for lookalikes. A regular space (U+0020) becomes a non-breaking space (U+00A0) or a narrow no-break space (U+202F). A Latin a becomes a Cyrillic а. Visually the text is unchanged. In bytes it is completely different, and the pattern of substitutions carries the signal.

Homoglyphs cause real collateral damage beyond provenance: they break exact-match search, they defeat string comparisons, and in domain names and code they are an established phishing vector.

Type 3: Statistical watermarking

This one operates during generation rather than after it. At each token, the model pseudorandomly partitions its vocabulary into a “green” and “red” list using a secret key, then nudges sampling toward the green list. Over a few hundred tokens, the resulting bias is statistically detectable by anyone holding the key, while the text reads completely naturally.

There are no special characters involved. Nothing in the bytes distinguishes watermarked from unwatermarked text to an outside observer. It cannot be detected by inspection and it cannot be stripped by cleaning, though it degrades under heavy paraphrasing or translation.

Comparing the three

PropertyInvisible UnicodeHomoglyphsStatistical
Visible when readingNoNoNo
Detectable by inspectionYesYesNo
Survives copy-pasteUsuallyUsuallyYes
Survives retypingNoNoNo
Removable with certaintyYesYesNo

Where invisible characters actually come from

It is worth resisting the assumption that every zero-width space is a deliberate watermark. Rich-text editors insert them to control line breaking. CMS platforms add them during sanitization. Copying out of a web page brings along whatever the page’s HTML contained. PDF extraction produces them routinely. Translation and transliteration tools emit them by design.

The practical consequence is the same either way (the characters are in your text and they will cause problems downstream), but the intent behind them usually is not sinister.

Detecting one

Paste the text into the inspection tool and press Inspect only. You get every suspicious codepoint with its category, count, confidence and location, and nothing is modified. If you want the removal side, see how to remove an AI text watermark.

Frequently asked questions

What is an AI text watermark?

An AI text watermark is a hidden signal embedded in text so that its origin can later be identified. It takes three main forms: invisible Unicode characters inserted between words, lookalike characters swapped for ordinary ones, and a statistical bias in the model's token choices during generation. The first two are visible in the raw bytes; the third is not.

Can you see an AI text watermark?

Not by reading. Character-level watermarks use codepoints that render nothing at all, or that render identically to the character they replace, so a proofread will never catch them. You need a tool that inspects codepoints, or an editor with invisible-character highlighting turned on.

Does ChatGPT watermark its text?

OpenAI has publicly discussed text watermarking research but has not shipped a confirmed, always-on watermark in ChatGPT output. In practice, most invisible characters people find in AI text come from the surrounding pipeline (web interfaces, rich-text editors, copy-paste through browsers and CMSs) rather than from the model itself.

What is the difference between a text watermark and metadata?

A text watermark lives inside the characters of the content itself and travels with any copy-paste. Metadata lives in the file container (EXIF, XMP, C2PA, DOCX XML parts) and is lost the moment you copy the content out of the file. Both are provenance signals, but they behave completely differently.

How do I detect an AI text watermark?

Paste the text into an inspection tool and check the codepoint report. Our free tool lists every invisible or homoglyph character it finds, with counts, confidence and sample offsets, without modifying the text.

Are AI text watermarks reliable?

Character-level ones are extremely fragile. Retyping, plain-text pasting, normalization on save, or running a cleaner removes them completely. Statistical watermarks are more robust to copy-paste but degrade under paraphrasing and translation, and require the issuer's key to verify.

Check your own text

Paste a sample and see exactly which hidden characters it contains. Inspection changes nothing.

Inspect my text