OpenAI has not shipped a text watermark for ChatGPT. There is no hidden signature in the characters, no marker string at the end of a response and no published system that lets anyone prove a given paragraph came out of ChatGPT. What people screenshotted and called a watermark in April 2025 was one Unicode character: the narrow no-break space, U+202F, appearing where a plain space belonged in output from the o3 and o4-mini models. OpenAI described it as a quirk of large-scale reinforcement learning rather than a marking system, and it stopped showing up within days.
The confusion is understandable, because real text watermarks do now exist. They just do not come from OpenAI. Anthropic started watermarking Claude's text output in August 2026, and Google has watermarked Gemini text with SynthID since 2024. Neither of those lives in a character you can select and delete. Both live in word choice, which is a completely different kind of thing, and no cleaning tool removes them. Including this one.
Does ChatGPT watermark its text?
Key takeaways
- OpenAI has never announced or documented a text watermark for ChatGPT, and no public tool can verify ChatGPT authorship from the text itself.
- The April 2025 "watermark" was
U+202F, a narrow no-break space in o3 and o4-mini output, attributed to large-scale reinforcement learning and gone within days.
- Anthropic (Claude, August 2026) and Google (Gemini, since 2024) do watermark text, using the statistical SynthID-Text method that shifts token probabilities during generation.
- A statistical watermark sits in which words were chosen. Deleting characters does not touch it, and neither does any cleaner.
- Hidden characters really do appear in pasted AI output:
U+200B, U+00A0, U+202F, plus em dashes at U+2014 and curly quotes. They break code, CSVs and search. They are not proof of anything.
- AI detectors score statistical properties of word choice. Cleaning characters does not change what they measure.
The question "does ChatGPT watermark its text" usually hides two different questions, and they have opposite answers. The first is whether OpenAI has built a covert signal into ChatGPT output that a verifier could read back. The answer there is no. OpenAI has publicly discussed text provenance research for years, and has shipped content credentials for images, but a working text watermark has never gone live in ChatGPT.
The second question is whether ChatGPT output contains characters you did not type and cannot see. The answer there is yes, sometimes. Those are artifacts of tokenisation, training data and formatting, not identification. The difference matters enough that the rest of this page is mostly about keeping the two apart.
What the narrow no-break space reports in 2025 actually showed
In April 2025, people running text from the o3 and o4-mini models through a hex viewer found U+202F where they expected U+0020. The narrow no-break space renders as a slightly tighter gap than a normal space. On most screens, at normal body size, it is invisible. In a hex dump it is unmistakable: E2 80 AF in UTF-8 instead of a single 20.
That was enough to launch a theory. The theory had a problem though. A watermark has to survive contact with the world, and this one did not survive a single retype. Anyone could strip it with one find and replace. It appeared in some responses and not others, in some models and not others. It carried no payload, so there was nothing to read back out of it, and OpenAI never published a verifier that could read anything. A marking system nobody can check is not a marking system.
OpenAI's own explanation was that it came out of large-scale reinforcement learning, the kind of training-artifact drift that shows up in spacing and punctuation habits. Within days the reports stopped. The screenshots stayed online, which is why the question still gets typed into Google every month.
Which AI models do watermark text, and how does it work?
Two do, publicly. Google DeepMind published SynthID-Text in a 2024 Nature paper and applies it to text from the Gemini app and web experience. Anthropic adopted a version of the same approach for Claude and published an explainer on 14 August 2026.
The mechanism is worth understanding because it explains why no cleaner can reach it. A language model produces a probability score for every candidate next token. SynthID-Text nudges those scores using a secret key combined with the preceding few words, so the model's choices tilt, very slightly, toward a pattern only the key holder can recognise. Nothing is added. There are no extra tokens, no hidden characters, no metadata. The watermark is the sequence of ordinary words the model picked.
Anthropic's explainer is blunt about durability: light editing probably will not remove the watermark completely, while a full rewrite in which every word is replaced will. That is the signature of a statistical signal. It degrades as you change words, and it is indifferent to whitespace.
| Property | Character artifacts | Statistical watermark |
| Example | U+202F, U+200B, U+00A0 | SynthID-Text in Claude and Gemini |
| Where it lives | In the byte stream, as real characters | In which words were chosen |
| Who ships it | Nobody on purpose, it is a by-product | Anthropic (2026), Google (2024) |
| Shipped by OpenAI for ChatGPT | Not deliberately, see the 2025 spacing episode | No |
| Survives retyping the text | No | Partly, until the words change |
| Survives find and replace on spaces | No | Yes |
| Removable by a character cleaner | Yes | No |
| What it actually breaks | Code, CSVs, regex, search, form fields | Nothing, it is invisible to software that is not looking for it |
Which characters really turn up in pasted ChatGPT output?
These are the ones that show up often enough to be worth knowing by number:
U+00A0 no-break space. The most common by a distance. It arrives through Markdown rendering, through HTML in the chat interface and through anything you pasted in yourself from a web page. It looks exactly like a space and behaves nothing like one.
U+202F narrow no-break space. The character from the 2025 reports. Still appears occasionally, usually next to numbers or units.
U+200B zero width space, along with U+200C, U+200D and the byte order mark U+FEFF. These have no width at all. A word can contain one and look perfectly normal while failing every string comparison you run against it.
U+2014 em dash and U+2013 en dash. Visible, not hidden, and a style habit rather than a signal.
- Curly quotes and apostrophes,
U+2018, U+2019, U+201C, U+201D. Harmless in prose, fatal in a code block or a JSON file.
- Lookalike letters. A Cyrillic o at
U+043E or a Greek omicron at U+03BF inside an otherwise Latin word. Usually inherited from source text rather than generated, and invisible until a search fails.
- Styled letterforms. Fullwidth characters and the mathematical alphanumeric block, used as fake bold in places that do not support real formatting. They copy badly and read worse to screen readers.
Why do they appear at all? Partly because the model was trained on text that already contained them, which is to say the entire typographically messy internet. Partly because the chat interface renders Markdown into HTML, and HTML has its own reasons for emitting U+00A0. Partly because you pasted a source document into the prompt and the characters simply rode through. None of that is identification. It is residue.
How do you check any text for hidden characters?
Do not trust your eyes on this one, because the whole category is defined by being invisible. Use something that reads codepoints.
In a browser console. Paste your text into a variable and list everything outside plain ASCII:
[...t].filter(c => c.codePointAt(0) > 127).map(c => c.codePointAt(0).toString(16))
In Python. This one gives you the official Unicode name of each offender, which settles arguments quickly:
import unicodedata; [(i, hex(ord(c)), unicodedata.name(c)) for i, c in enumerate(t) if ord(c) > 127]
In a terminal. Run rg -n '[^\x00-\x7F]' file.txt to find the lines, or pipe the file through hexdump -C and look for E2 80 AF and C2 A0.
In an editor. VS Code flags invisible and ambiguous Unicode in the editor by default, which is the least effort option if you already have it open. In Microsoft Word, turn on formatting marks and a no-break space appears as a raised dot rather than the usual space dot, and find and replace accepts ^s as the search code for it.
Clean the characters, not the prose. Paste your text into the free cleaner at aitextwatermarkremoval.com and it strips invisible Unicode, non-standard spaces, lookalike letters and styled letterforms, with em dashes and curly quotes as optional extras. It runs in your browser, it is free, and it does exactly one job: the characters. It does not touch statistical watermarks and it does not change what an AI detector measures, because nothing that edits characters can.
What most people get wrong about ChatGPT watermarks
The single most repeated piece of bad advice is that stripping hidden characters changes how AI detectors classify your writing. It does not. GPTZero, Turnitin, Originality.ai and Copyleaks score statistical properties of word choice: how predictable each token is given the ones before it, how much the sentence-to-sentence variation looks like a person rather than a model. Whitespace is not an input to that. Run the same paragraph through a detector before and after removing every U+00A0 in it and you are testing whether a change to something the detector never reads can alter something it computes from words. It cannot.
The second error runs in the opposite direction: treating a hidden character as proof that text came from ChatGPT. Copy a sentence from almost any news site and you will collect U+00A0 and curly quotes on the way. Word's autocorrect has been converting straight quotes to curly ones since the 1990s. PDFs leak thin spaces. A zero width space in a document proves the document passed through software, which every document has.
Third, the em dash panic. Deleting every U+2014 from your writing because the internet decided the character is an AI tell is a bad trade: you lose a punctuation mark that has been in English prose for centuries, and you gain nothing measurable. Plenty of careful human writers use them constantly. If you want to remove them for house style, that is a legitimate reason. Removing them as camouflage is not.
So what is character cleaning actually for? Text that has to work as data. A U+00A0 in a CSV column header breaks the join. A zero width space in a product SKU breaks the lookup. A curly apostrophe in a shell command breaks the command. Lookalike Cyrillic letters in a domain name are a phishing technique, and in your copy they are a search failure waiting to happen. Applicant tracking systems, form validators and regular expressions are all literal-minded in the same way. That is the real payoff, and it is a good one. It just has nothing to do with watermarks.
Frequently asked questions
Does ChatGPT put a watermark in the text it generates?
No. OpenAI has never shipped or documented a text watermark for ChatGPT, and there is no public verifier that can confirm ChatGPT authorship from text alone. The April 2025 reports that started this question were about the narrow no-break space U+202F appearing in o3 and o4-mini output, which OpenAI attributed to a quirk of large-scale reinforcement learning and which stopped within days.
Does ChatGPT leave a watermark when you copy and paste?
Copying and pasting can carry over non-standard characters such as U+00A0 no-break spaces, U+200B zero width spaces, curly quotes and em dashes. Those are formatting and tokenisation residue, not a watermark, and the same characters arrive when you paste from a web page or a PDF. Pasting as plain text removes styling but keeps the characters, because they are characters, not formatting.
Will removing hidden characters change an AI detector's result?
No. Detectors model word choice, not whitespace. Removing invisible Unicode fixes text that has to behave like data, in spreadsheets, code, search and form fields, and that is the reason to do it.
Can a text cleaner remove Claude's or Gemini's watermark?
No, and no character-based tool can. SynthID-Text adjusts the probability of each next word during generation, so the watermark is the wording itself. There is no character to delete. Anthropic's own explainer notes that light editing will not remove it, while a complete rewrite in which every word changes will.
Is an em dash a sign that text was written by AI?
It is not reliable evidence. U+2014 is standard English punctuation used heavily by human writers, and word processors insert it automatically from a double hyphen. Frequent em dashes alongside other stylistic habits may read as machine-written to a human editor, but the character on its own settles nothing.