Skip to content
WitsCode
AI Search Optimization

The Internal Linking Audit That Runs in 45 Seconds Instead of a Week

Internal linking advice is either an unsourced rule of thumb or a tool subscription. The real work is one yes or no judgment repeated across every candidate pair of pages. Here is the question, the...

AI Search Optimization15 min read

An internal linking audit is one question asked thousands of times: is there an honest reason for a reader on page A to want page B? That is a yes or no with a probability attached, not an essay. Once you write it that way, a cheap typed decision model answers every candidate pair on your site in minutes, and you set a threshold so only the confident ones get written. The week of spreadsheet work was never the judgment. It was the scrolling.

The short version

  • The rules you have been given (five internal links per page, three clicks deep, link every new post to three old ones) are asserted without published evidence. The most-quoted ones trace to a vendor blog or to "a recent study" with no study attached.45
  • The judgment underneath internal linking is a single binary question per ordered pair of pages, returning a probability. That shape is what makes it batchable.
  • Relevance is not similarity. Two pages about the same topic are often the worst pair to link, because they are competing for the same query.
  • A 500 page site has 249,500 ordered pairs. You cannot ask a model about all of them and you do not need to. A cheap deterministic prefilter kills most of them before any model sees anything.
  • The model picks the link. A human or a frontier model writes the anchor text. A decision model cannot write a sentence.1
  • The cheap model is measurably less accurate. Independent scoring across 31,500 decisions puts it behind on accuracy and ahead on price by roughly twenty-eight times.2 You buy the difference back with a threshold and a human queue.

Where the 45 seconds comes from, and what it is worth

The number in the title is borrowed. In September 2026 a developer, borjafat, posted a public demo on X: an internal link map rebuilt across 586 pages in 45.1 seconds, 584 links placed, 139 pages refused, total model cost $0.21.9

Treat that as what it is. A self-reported single run by its author, with no published methodology and no reproduction by anyone else. It is the most quotable number in this space and the least verified one. We are naming it because it is why you have heard of this at all, not because it is a benchmark.

The number the argument rests on is a different one. BoringToolsKit published a production audit run: 1,204 pages crawled by a self-hosted LibreCrawl instance, 4,816 typed judgments returned, under three minutes of model time, $0.0048 for a weekly triage run, on jev-1.13.0.3 A crawler did the crawling. The model only judged. That is the run to plan against, and it is roughly four typed judgments per page, which is the ratio to expect when you decompose properly.

For the other side of the ledger: an in-depth audit by an experienced SEO professional or agency takes 20 to 200 hours.12 That is the number the vendor pages never print.

Why the internal linking rules you have been given have no evidence

Read the pages that rank for "internal linking audit" and you will collect a handful of numbers that look like rules.

Respona's seven-step audit says "at least 5 internal links per page" and "within three clicks or less."4 The five-link rule is stated flat, with no source, no sample and no measured outcome behind it. InLinks says website owners miss more than 80 percent of their link opportunities, attributed only to "a recent study" that is never named or linked.5 Neither figure is reusable. We are naming both as examples of advice in circulation, not repeating them as fact.

SE Ranking's content audit guide is one of the more numerically honest pages in the category and it still lands on "two to four internal links per post" without saying where that came from.15 Siteimprove offers "crawl depth at three clicks or less."17 Screaming Frog's tutorial is the most operationally useful page in the set, because it tells you exactly how to filter a crawl by depth, unique inlinks and anchor text. It also stops where the problem starts: it never says which of the thousands of surfaced opportunities to fix first.7

There is a structural reason for the gap. Most pages ranking for this query are published by companies whose product is the crawl. A crawler vendor cannot publish "you do not need to read these 4,000 rows." The row count is the product.

The per-page count is the wrong unit anyway. Five links out of a page that deserves none is five bad links. Three out of a hub page that deserves twenty is a routing failure. The unit is the pair.

The question shape

Here is the whole method, written as a question you could hand to a contractor:

Is there an honest reason for a reader on page A to want page B?

That is a binary with a probability. In the typed-decision vocabulary it is a Noul: one number between 0 and 1, no separate confidence field, schema conformance guaranteed by construction.13 You ask it once per ordered pair, direction matters, and you get back a number you can sort on.

Three things make this question better than the rules it replaces.

It is written down. Two people asked it about the same pair argue about the same thing, which is what "honest reason" means for this site. A rule that says "five links" gives them nothing to disagree about.

It is directional. A to B is a different question from B to A. A glossary entry should link to the deep guide far more often than the reverse. Page-level counts cannot capture that.

It is decomposable, and decomposition is worth more than model choice. On 1,000 held-out emails in an independent write-up, splitting one judgment into five questions moved the typed model from 89.4 percent to 95.0 percent, while a frontier model moved the other way on the same data.14 Non-SEO domain, so take the lesson and not the numbers: how you split the question matters more than which model answers it.

If you want the mechanics of typed decisions before you go further, we wrote the plain-English version in the Jev model explained.

Why relevance is not similarity

The default way to build an internal link map is embeddings. Vectorize every page, compute cosine similarity, link the close ones. Fast, cheap, and wrong often enough to hurt.

Similarity measures whether two pages are about the same thing. Relevance measures whether a reader who just finished A has an unmet need that B serves. Those come apart at exactly the pairs you care about most.

Vertical diagram contrasting high similarity with low link value against low similarity with high link value, showing two near-duplicate competing guides that should not be linked and a symptom page paired with the page that resolves it, which should be
High similarity and high link value are different axes. The pairs that score highest on cosine distance are often the pairs that are already competing.

Two guides covering the same query at 92 percent similarity are not a link opportunity. They are a cannibalization problem wearing a link opportunity's clothes. Linking them harder tells a search engine you consider them equivalent, which is the exact signal you are trying to remove. Ahrefs makes the related point directly: the fix is not triggered by a count, it is triggered by evidence that the overlap is costing you traffic.6 We took the same yes or no framing to that job in keyword cannibalization as a yes or no question.

The pairs with real link value usually look different. A how-to and the tool it needs. A symptom page and a diagnosis page. A guide and the service that performs it. Low lexical overlap, high reader need, and cosine similarity ranks them low.

So similarity belongs in this pipeline only as a cheap filter for candidates, never as the decision. The decision is the question.

The pair count explodes, so prefilter before you ask anything

Here is the arithmetic that kills the naive approach. A 500 page site has 500 by 499, which is 249,500 ordered pairs. A 2,000 page site has 3,998,000. The published fan-out for the demo above was 586 pages by 15 candidates each, or 8,790 calls, and that is only survivable because somebody had already cut 15 candidates out of 585.8

Ninety second check

Is your job decision shaped?

Five questions. One no is enough to make this the wrong tool, which is worth finding out before you wire anything up.

  • Can you write down every possible answer before you run it?

  • Is the output a decision rather than something a person will read?

  • Does it happen often enough that doing it by hand hurts?

  • If a call is wrong, can you undo it cheaply?

  • Can you live without a written reason for each call?

Answer the five above and you get a straight verdict here.

You never ask the model about all pairs. You ask it about survivors. The prefilter is deterministic code, runs on your crawl output, costs nothing and needs no model at all:

  1. Same language and same market. Drop every cross-locale pair first. On a four-locale site this is the biggest single cut available.
  2. Not already linked. If A already links to B there is no decision to make. Move it to the anchor-text audit instead.
  3. Not a paginated or utility URL. Page 7 of a category listing, cart, account, search results, tag archives, filter permutations. Enormous pair volume, almost no honest link reasons.
  4. Plausible topical proximity. This is where embeddings belong. Keep the top 10 to 20 nearest neighbors per source page. Not because near means linkable, but because far reliably means not linkable.

Then the model judges what is left.

Vertical funnel for a 500 page site showing all ordered pairs narrowing through the prefilter, then model judgment, then the confidence threshold, down to the links actually written
Every stage above the model is deterministic code. The model only sees what survives, and the threshold decides what a writer ever reads.

On a 500 page site that sequence typically takes 249,500 pairs down to the 5,000 to 8,000 range before a single model call. Your survivor count depends on your locale split and how much of your URL space is utility, so measure it rather than copying ours. The point is the order of magnitude: the prefilter does roughly 97 percent of the reduction and costs nothing.

Questions sent in a single call are evaluated in parallel, so extra questions per pair cost tokens and almost no wall-clock time.13 Batching is where the speed claims come from, not raw model throughput.

If your crawl itself is the bottleneck rather than the judging, that is a different problem and we covered it in technical SEO audits past the crawl limit.

Anchor text is a writing job, and the model cannot write

The model returns a probability. It does not return a sentence. A System One model is constrained to its output schema by construction, and that includes being structurally incapable of producing prose.1

So split the pipeline at that boundary:

The decision model picks the pair. Yes or no, with a number.

A frontier model or a person writes the anchor. That needs the surrounding paragraph, the target page's actual promise, and the anchor text already pointing at that target, so you do not stack five identical phrases.

The decision model then checks the anchor. "Is this anchor text an honest description of the target?" is another binary. Run it after generation and it catches the over-optimized exact-match phrasing an LLM will happily produce when you ask it for a link.

That order (cheap judgment, then generation, then cheap verification) is the architecture. It is not "use the cheap model instead of the LLM." It is using each one for what it can do.11 If you want the same logic applied across a whole content operation, our AI and LLM SEO guide walks the rest of the stack.

The threshold policy, and how to calibrate it

A probability with no policy attached is trivia. The policy is three bands.

Auto-queue above the high band. These get written into a draft a person approves in bulk. Not published blind.

Human review in the middle band. One person, one afternoon, a list of a few hundred instead of a spreadsheet of thousands.

Drop below the low band. Do not average them in, do not "consider" them. Drop them.

Now the part nobody publishes: you do not guess where those lines go. The open-source jevseo project uses 0.55 as its flag-for-review floor.10 That is a sane starting point and it is somebody else's number on somebody else's content.

Calibrate it like this. Sample 200 pairs from the model's output, 50 from each quartile of the probability range. Judge every one by hand before you look at the scores. Then compute precision at 0.90, 0.85, 0.80 and 0.75, and pick the highest threshold that still clears your bar for auto-writing. For internal links we set that bar at 90 percent, because one wrong link is cheap and a hundred is a credibility problem. Put the low band below the point where fewer than one in twenty of your hand-labelled yes pairs appear.

That sample is two hours of work. It is the part that makes the automation defensible. Re-run it when you change the question, the model version, or the site's content mix.

The honest accuracy trade

Jevals scored 31,500 decisions across seven models, 300 questions per task type. On Choice questions the typed model scored 67.8 against Gemini 3.8 Flash at 74.1. On binary questions it scored 69.0 against 73.0. It ran at roughly one twenty-eighth of the price.2

That is a loss on accuracy. Publish it, because the conclusion survives it.

For a judgment you will make 8,790 times, calibrated-and-cheap with a human queue beats smart-and-slow that you can only afford on a sample. A 74 percent model run on 200 pairs leaves 7,800 unjudged, and the unjudged ones are not randomly distributed. A 68 percent model run on all 8,790, auto-acting only on the top band, gives you a smaller set of higher-precision decisions plus a queue. The threshold is doing the accuracy work, not the model.

Two limitations to keep in view. A typed model does not explain itself: you get a number, never a reason, so when a reviewer disagrees there is nothing to argue with.11 And zero hallucinations means the output will always be a valid number in the schema. It does not mean the number is right.16

What not to automate

Three categories stay manual, permanently.

Links on money pages. Anything on a page that takes payment, captures a lead or carries a pricing decision. A wrong link there is not a ranking wobble, it is a conversion path change you did not model. Review every one.

Navigational links. Header, footer, sidebar, breadcrumbs, mega menu. Site architecture decisions with sitewide blast radius, and a pair-level judgment has no view of that.

Anything on a page already ranking well. If a page is performing, the expected value of adding links to it is small and the variance is not. Leave it. You will never be able to separate "the change did nothing" from "the change hurt and something else helped."

Everything else, meaning the long tail of mid-funnel content where the honest link reasons are real and nobody has time to find them by hand, is what this pipeline is for. If you want that work done rather than described, it is part of what we do on technical SEO.

Frequently asked questions

There is no published, evidence-backed number, and the commonly cited ones (five per page, two to four per post) are asserted without a source. Ask it per pair instead: for each candidate target, is there an honest reason a reader on this page would want that one. A page with three genuine reasons should have three links. A hub page with twenty should have twenty.

What is an internal linking audit?

Evaluating which pages on your site should link to which other pages, and whether the existing links point at the right targets with honest anchor text. Traditionally you crawl the site, export depth, inlink counts, orphans and anchor text, then read the spreadsheet. The crawl is fast. The reading takes the week.

Can AI do internal linking automatically?

A typed decision model can judge candidate pairs at scale and return a probability for each. It cannot write the anchor text, cannot explain its reasoning, and should not be given a free hand on money pages or navigation. The realistic setup is: deterministic prefilter, model judgment, confidence threshold, human or frontier model writes the anchors, model verifies the anchors, a person approves the batch.

Because similarity and relevance measure different things. Two pages covering the same query are similar and are usually competing for it, so linking them heavily reinforces the overlap rather than resolving it. The highest-value link pairs are often low-similarity: a how-to and the tool it requires, a symptom page and the diagnosis, a guide and the service that performs the work.

How long does an internal linking audit take?

A full in-depth SEO audit by an experienced professional or agency is reported at 20 to 200 hours depending on site size and scope. Internal linking is a meaningful slice of that, and almost all of it is judgment repeated at volume rather than analysis. One published production run judged 1,204 pages with 4,816 typed judgments in under three minutes of model time, which moves the human hours to reviewing a queue instead of building one.

Is a cheap decision model accurate enough for this?

Across 31,500 independently scored decisions, the typed model tested behind a frontier model on raw accuracy (67.8 against 74.1 on choice questions) at roughly one twenty-eighth of the cost. The trade works here because you can set a confidence threshold and only auto-act on the high band, which raises precision on the decisions you actually apply. It would not work for a judgment you only get to make once.

What confidence threshold should I use?

Calibrate it, do not inherit it. Sample 200 pairs from your own model output, stratified across the probability range, hand-label every one before looking at the scores, then measure precision at 0.90, 0.85, 0.80 and 0.75. Set the auto-write line at the highest threshold that still clears your acceptable precision, which for internal links we treat as 90 percent. One open-source implementation uses 0.55 as its review floor, which is a starting point rather than an answer.

What should never be automated in internal linking?

Links on pages that take payment or capture leads, navigational links in the header, footer, sidebar or breadcrumbs, and links on any page already ranking well. The first two carry blast radius a pair-level judgment cannot see. The third has low upside, real downside, and no clean way to attribute the outcome afterward.

Sources
  1. TypeSafe AI, "Introducing System One models and Jev," 15 September 2026. typesafe.ai
  2. Jevals, independent benchmark of 31,500 scored decisions across seven models, 18 September 2026. jevals.com
  3. BoringToolsKit, "SEO audit cost 2026," updated 19 September 2026. boringtoolskit.com
  4. Respona, "Internal link audit." respona.com
  5. InLinks, "How to do an internal link audit." inlinks.com
  6. Ahrefs, "Keyword cannibalization." ahrefs.com
  7. Screaming Frog, "Internal linking audit with the SEO Spider." screamingfrog.co.uk
  8. Ryze, "Jev for SEO," 2026. get-ryze.ai
  9. borjafat, self-reported internal link map demo, X post, September 2026. x.com
  10. jevseo, open-source project README, September 2026. github.com
  11. Arize, "TypeSafe Jev as an LLM judge," September 2026. arize.com
  12. AgencyAnalytics, "How much to charge for an SEO audit," 14 August 2025. agencyanalytics.com
  13. Valyu AI, "How to use Jev: a practical guide to TypeSafe's System One model," September 2026. dev.to
  14. XenoSpectrum, "Jev, TypeSafe and BERT classifier decomposition," 20 September 2026. xenospectrum.com
  15. SE Ranking, "Content audit." seranking.com
  16. MarkTechPost, "TypeSafe AI releases Jev," 19 September 2026. marktechpost.com
  17. Siteimprove, "Internal linking strategy for SEO." siteimprove.com

Figures checked on 21 September 2026. The 45.1 second demo remains a single self-reported run and we will update this post if anyone reproduces it with a published method.

Written by

Sudhakaran, Head of Technology

15 min read

SEO audit at scale

Audit stuck in a spreadsheet?

Send us your domain. We run the judgment calls across every URL, not a sample, and hand back a sorted fix list with the uncertain pages flagged for a human.

  • Cannibalization, intent and thin-page calls across the whole crawl
  • Redirect and internal link maps you can ship
  • Scoped estimate within 48 hours
Get my audit plan

Want to discuss ai search optimization for your business?

Start a project and we'll talk through where you are, what's working, and the highest-leverage moves for the next 90 days.