The Windows AI text watermark: what it is and how to strip it
Starting in October 2026, text from Microsoft’s on-device Windows AI text APIs (Phi Silica) can contain an invisible watermark: the four code points U+200B U+034F U+2060 U+200B. It doesn’t show on screen, but it can break JSON parsing, Markdown and code output. Here is how the Windows AI text watermark works, which APIs add it, and how to find or remove it.
Facts checked against the sources below on .
How it works
Unlike statistical watermarks such as SynthID, textGrain or Claude’s watermark, the Windows AI text watermark is made of characters. The APIs insert a fixed four-code-point sequence into the output string. Heuristics decide whether and where to place it, so a response can contain zero, one or several copies, and the positions change from one response to the next.
Microsoft says the heuristics avoid spots where the sequence would affect word breaking, and that they will change over time — so don’t rely on a fixed position, or assume every response is marked. Because the mark is ordinary Unicode, anyone can detect it with a character scan, and deleting the characters removes it completely — no rewrite needed.
The sequence
| Position | Code point | Unicode name |
|---|---|---|
| 0 | U+200B | ZERO WIDTH SPACE |
| 1 | U+034F | COMBINING GRAPHEME JOINER |
| 2 | U+2060 | WORD JOINER |
| 3 | U+200B | ZERO WIDTH SPACE |
Which APIs add the watermark
Microsoft lists seven methods in the Microsoft.Windows.AI.Text namespace that insert it automatically:
LanguageModel.GenerateResponseAsyncLanguageModel.GenerateResponseFromEmbeddingsAsyncTextRewriter.RewriteAsyncTextRewriter.RewriteCustomAsyncTextSummarizer.SummarizeAsyncTextSummarizer.SummarizeConversationAsyncTextSummarizer.SummarizeParagraphAsync
What it breaks
- Selection and cursor movement. Most renderers don’t display the characters, but Microsoft notes they can still affect text selection and cursor movement.
- Structured output. Microsoft calls out Markdown, generated code or markup such as HTML and CSS, and JSON that you then parse — a copy between two JSON tokens makes the parse fail.
- Encoding. Most non-Unicode code pages can’t represent the sequence, so converting a response can throw, or leave fallback characters such as
?in the text. - Exact string comparisons. Two responses that look identical won’t compare equal if only one carries the sequence, and string lengths are off by four per copy.
Find or remove it in code
Match the whole four-character sequence rather than every zero-width character, so you don’t touch any that belong in the text (zero-width joiners inside emoji, for example).
C#const string WindowsAiWatermark = "\u200B\u034F\u2060\u200B";
// Compare ordinally: culture-aware IndexOf skips zero-width characters.
bool marked = text.Contains(WindowsAiWatermark, StringComparison.Ordinal);
string clean = text.Replace(WindowsAiWatermark, "", StringComparison.Ordinal);JavaScript / TypeScriptconst WINDOWS_AI_WATERMARK = "\u200B\u034F\u2060\u200B";
const copies = text.split(WINDOWS_AI_WATERMARK).length - 1;
const clean = text.replaceAll(WINDOWS_AI_WATERMARK, "");
const data = JSON.parse(clean); // strip before parsing generated JSONPythonWINDOWS_AI_WATERMARK = "\u200b\u034f\u2060\u200b"
copies = text.count(WINDOWS_AI_WATERMARK)
clean = text.replace(WINDOWS_AI_WATERMARK, "")Before you remove it
Microsoft’s documentation carries a warning: you are responsible for making sure your app meets the requirements for marking AI-generated content that apply to it, and should consider them before removing the watermark. In the EU, Article 50 of the AI Act is the rule to look at (see the tracker for dates). A common approach is to strip the sequence for parsing and display, and disclose AI generation another way — a visible label or metadata.
Not a developer?
Paste the text into the AI watermark checker: it names the Microsoft sequence and counts every copy, entirely in your browser. To remove it, use the Unmark homepage scanner’s “Strip hidden chars only” — no rewrite needed, because this watermark is made of characters, not word choice.
Free, runs in your browser.