In May 2024, roughly 2,500 pages of Google’s internal search API documentation leaked online. Most of the SEO commentary focused on PageRank and site authority signals. Buried in the same leak was a model called IndexingDocjoinerAnchorPhraseSpamInfo that describes exactly how Google scores anchor text for spam — not as a binary flag, but as a multi-signal system with frequency counts, time windows, and a combined penalty score.
Here’s what the model actually says and what it means for your internal and external links.
What the Leaked Model Tracks
The full model is documented at hexdocs.pm. It contains nine attributes. Each one measures a different dimension of anchor text spam for a given document.
| Attribute | Type | Default | Description |
|---|---|---|---|
phraseAnchorSpamCount | number() | nil | How many spam phrases found in the anchors among unique domains. |
phraseAnchorSpamDays | number() | nil | Over how many days 80% of these phrases were discovered. |
phraseAnchorSpamDemoted | phraseAnchorSpamDemoted | nil | Total number of demoted anchors. |
phraseAnchorSpamEnd | integer() | nil | Time when anchor spam spike ended with padding. |
phraseAnchorSpamFraq | number() | nil | Spam phrases fraction of all anchors of the document. |
phraseAnchorSpamPenalty | number() | nil | Combined penalty for anchor demotion. |
phraseAnchorSpamProcessed | integer() | nil | Total number of observed anchors. |
phraseAnchorSpamRate | number() | nil | Average daily rate of spam anchor discovery. |
phraseAnchorSpamStart | integer() | nil | Time when anchor spam spike started with padding. |
The model is unconfirmed as active in production — Google has not commented on the leak. But the attributes are specific enough to be informative regardless. Here is what each signal group actually measures.
Signal Group 1: Frequency and Scale
phraseAnchorSpamCount tracks how many spam anchor phrases appear across unique linking domains. The key word is unique — the same anchor from one domain counted multiple times still counts as one. This means a natural link profile where many different sites use different phrasing is treated differently from one where many sites all use the same keyword phrase.
phraseAnchorSpamProcessed is the denominator — total anchors analyzed for that document. Combined with phraseAnchorSpamFraq (the fraction of spammy anchors to total anchors), Google appears to score not just whether spam exists, but how much of your anchor profile it represents. A site with 500 backlinks where 10 use a spammy phrase looks very different from one with 15 backlinks where 10 use it.
phraseAnchorSpamDemoted is the count of anchors that were actually demoted — removed from ranking calculations. This is the output of the other signals, not another input. A high demoted count means a meaningful portion of your backlink anchor text is being ignored by Google.
Signal Group 2: Timing
phraseAnchorSpamStart and phraseAnchorSpamEnd record when a spike in spammy anchor usage began and ended. phraseAnchorSpamDays measures how many days it took to accumulate 80% of the spam phrases. phraseAnchorSpamRate gives the average daily rate of discovery.
Together these signals mean Google tracks velocity, not just volume. A site that earns 50 links with the same anchor phrase over three years looks different from one that earns 50 in two weeks. The pattern of a link-buying campaign — sudden spike, short window, high concentration of identical phrases — is exactly what these time signals are designed to surface.
Signal Group 3: The Combined Penalty
phraseAnchorSpamPenalty is the output that ties it all together. It’s described as a combined penalty for anchor demotion, which means it aggregates frequency, fraction, rate, and timing into a single score. The individual signals feed into this number, and this number determines how much of your anchor text Google discounts.
The practical implication: a small number of spammy anchors added gradually may accumulate little penalty. The same anchors added in a burst, or representing a large fraction of your total link profile, could push the penalty score into territory where real ranking impact occurs.
What This Means for Internal Links
Most SEO coverage of this leak focused on external backlinks. But internal links use anchor text too, and you have complete control over them. The same logic applies.
If you have 80 posts and 60 of them link to your guide on keyword research using the anchor text “keyword research guide,” that’s a high phraseAnchorSpamFraq equivalent for internal anchors pointing at that URL. Google may discount some of those links rather than treating each one as a fresh signal.
The fix is anchor text diversity: vary the phrases you use to link to the same page. “How to find keyword cannibalization,” “GSC keyword cannibalization tool,” “fix competing pages,” and “keyword cannibalization guide” are all legitimate anchors for the same destination. Each adds signal without concentrating it on one phrase.
The other internal linking problem this leak points to is link cannibalization — using the same anchor phrase to point to two or more different URLs. That splits the signal rather than concentrating it, which is a different failure mode but equally damaging.
If your site runs on WordPress, Linkilo’s Link Cannibalization Report surfaces every anchor phrase that points to more than one URL across your posts, ranks them by severity, and shows the recommended primary destination based on your Search Console data. You consolidate with one click rather than opening 60 posts manually.

One limit worth knowing: Linkilo works on WordPress sites only. If you’re on a different platform, an anchor text audit in Ahrefs Site Explorer (filter by anchor, sort by referring domains) gives you the same picture manually.
The Anchor Profile Worth Targeting
The leak doesn’t define a specific safe ratio, but the signals together suggest what a low-penalty anchor profile looks like: many unique domains using varied phrases, accumulated gradually, with no single phrase dominating a high fraction of the total.
For internal links, a practical target is no single anchor phrase used more than 3 to 5 times across your entire site for the same destination URL. If you find phrases used 15 or 20 times, those are the ones to vary. The anchor text best practice that matters most here: use the phrase that best describes the destination, not the phrase you want to rank for.

What the Leak Does Not Tell You
The leak confirms that Google measures anchor spam across multiple dimensions. It does not tell you the thresholds that trigger penalties. It does not confirm that this model is currently active in the ranking algorithm. Google’s actual systems are layered and context-dependent — a niche site with 200 backlinks operates differently from a domain with 200,000.
What the leak does confirm is that exact-match anchor stuffing has a named detection system with multiple signals, not just a simple keyword filter. The best response is the same one SEOs have recommended since Penguin: build links that a real editor would choose, vary the phrasing, and don’t concentrate identical phrases in a short time window.
For internal links, you control all of this directly. That makes it the easiest part of the system to get right.
Linkilo does this for you
- Anchor Text Reporting Tool : See every anchor pointing at every page, and catch the over-optimized ones before Google does.
- AI Internal Link Suggestions : Get link suggestions a human editor would approve, and add them in one click without leaving the editor.
- Internal Link Click Analytics : Find out which internal links people actually click, and stop guessing which ones earn their place.