BlogFindings

Email obfuscation: 792 of 1,061 home pages gave an AI crawler no address, and on 24 the address was in the bytes

Lantad asked all 1,419 hostnames in this repository's two committed corpus seed files for robots.txt on 9 November 2026, fetched the home page of the 1,320 that permitted LantadBot at the site root, and ran the shipped fact extractor in core/src/facts.ts over the 1,061 that answered HTTP 200 with HTML. 269 of those pages yielded an email address and 792 yielded none. 27 carried Cloudflare's email address obfuscation, which encodes the address and decodes it with a script, and on 24 of the 27 the extractor returned nothing while the encoded address sat in the bytes it had already downloaded.

18 min read Lantad

So "how do I contact this company" is a question with a measurable answer, and it is a different answer from the one a visitor gets. On 9 November 2026 Lantad asked all 1,419 hostnames in the two committed corpus seed files in this repository for robots.txt as LantadBot/1.0, fetched the home page of the 1,320 the file left a route into, and ran the shipped fact extractor over the 1,061 that answered HTTP 200 with an HTML content type. 269 of those pages gave up an email address. 792 gave up none. And on 27 of them the address had been deliberately encoded, by a setting most of their owners will not know is on.

In short

  • Email obfuscation is a Cloudflare setting that encodes an address and restores it with JavaScript, and its own documentation states Cloudflare enables it automatically when you sign up. 27 of 1,061 corpus home pages measured on 9 November 2026 had it switched on, carrying 89 encoded payloads between them.
  • On 24 of those 27 pages Lantad's shipped fact extractor returned no email address at all on 9 November 2026, while the payloads on 26 of the 27 pages decoded to a syntactically valid address, including helpline@nami.org and three Standard Bank addresses.
  • The wider finding is that most home pages publish no address to begin with. 792 of the 1,061 pages measured on 9 November 2026 yielded no email address through any of the three carriers the extractor reads, and 533 of them yielded no phone number or postal address either.
  • Which addresses reach a crawler splits by the kind of site, not by the technology. 36 of 54 Wix and Squarespace home pages carried a readable address on 9 November 2026 against 4 of 94 finance sites and 5 of 84 government sites.
  • Reading addresses out of visible text picks up things that are not contact details. Of the 38 pages carrying an address in their prose on 9 November 2026, five carried six addresses that were not contact details at all, including sales@yourcompany.com on outseta.com and jamie@example.com on two separate local news sites.
  • No address from any carrier 792 pages no mailto link, no schema.org email, no address in the prose
  • A mailto link in the markup 137 pages 117 of these had no other carrier
  • A schema.org email property 122 pages 102 of these had no other carrier
  • An address in the visible text 38 pages 24 of these had no other carrier, and five carried no real address
  • Cloudflare obfuscation switched on 27 pages 89 encoded payloads, 24 pages yielding nothing
Where an email address was found on 1,061 corpus home pages fetched once each as LantadBot/1.0 on 9 November 2026, counted by running extractFacts from core/src/facts.ts over the raw HTML. A page can carry more than one carrier, so the three sources sum to more than 269.

Does email obfuscation hide your email address from AI crawlers?

Start with the vendor's own description, because the feature says plainly what it is for. Cloudflare's documentation for email address obfuscation, which carries a last updated date of 3 August 2026, states that with it on "email addresses on your web page will be hidden from bots, while keeping them visible to humans". It describes the mechanism in the same place: Cloudflare rewrites the address in the HTML, and "Cloudflare injects a small decode script (email-decode.min.js) into the page using the defer attribute". The page also states that "Cloudflare enables email address obfuscation automatically when you sign up", so this is not a box somebody has to go and tick.

What arrives on the wire is worth reading once, because it answers the question before any measurement does. On groundcover.com the footer contained a span with the class name __cf_email__, a data-cfemail attribute holding 44 hexadecimal characters, and, as its visible text, the words email protected inside square brackets. A client that runs the decode script replaces that text with the address. An AI crawler that runs no scripts extracts the words email protected and nothing else. 19 of the 1,061 pages carried that literal placeholder in their visible text, 36 times in total, which means the obfuscation is legible as an artefact: if a page shows the words email protected in square brackets where an address should be, you are looking at the crawler's view of it.

Whether any given AI crawler runs the script is not something this corpus can answer, and the honest position is on the record already: Lantad's measurement of what nine operators say about rendering JavaScript found two of nine willing to state it either way, and the corpus run on how much prose JavaScript actually supplies put the figure at 7.6 percent. What can be settled is what Lantad's own pipeline does, which is checkable rather than asserted. The extractor in core/src/facts.ts reads an email address from exactly three carriers: a mailto link in the markup, a schema.org email property inside JSON-LD, and a run of text in the prose that matches an address. An encoded hexadecimal attribute is none of those. Running the shipped extractFacts over all 27 obfuscated pages on 9 November 2026 returned zero email facts on 24 of them, and the three exceptions all had the address declared separately in their structured data.

What happens to an obfuscated address in the two clients, as measured on 9 November 2026. The same bytes reach both; only one of them runs the decode script Cloudflare's documentation names.

What 1,061 home pages published for a crawler to read

The obfuscated pages are the sharp case, and they are 27 out of 1,061. The duller and much larger finding is that most of these home pages had no address to hide. 792 of the 1,061 yielded no email address through any carrier, and the three carriers are not interchangeable: 137 pages carried a mailto link, 122 declared a schema.org email property, and 38 had an address sitting in the prose. Only 47 pages carried more than one address at all. Across the whole set the extractor returned 344 email facts resolving to 342 distinct addresses, which is roughly one address for every three pages measured.

The carrier a page chooses decides who can read it, and the split is clean enough to be useful. 117 pages had a mailto link and nothing else, which a person can click and a machine can parse out of the href. 102 had the address only in a JSON-LD block, where schema.org's email property is defined with the one word description "Email address." and is listed on ContactPoint, Organization and Person, the last of which this blog measured in how many sites name a human at all. Those 102 pages are the mirror image of the obfuscated ones: the address is machine readable and never shown to a reader, which is a reasonable thing to do on purpose and is worth knowing you have done. 24 pages had the address only in prose, with no link and no markup around it, which is the carrier the last section of this post shows is the easiest of the three to fool.

Of the 342 distinct addresses, 181 had a role style local part, led by 56 at info, 29 at support, 22 at hello, 13 at sales and 12 at contact. 17 pages published a free mail address, mostly small local businesses: theheatbureau@gmail.com on heatbureau.com, westendrehab@hotmail.com on etobicokerehab.com, animalclinic408@gmail.com on iowacityanimalclinic.com. 60 pages carried an address whose domain is not the site's own, which covers group companies, outsourced support and, in a handful of cases, the agency that built the site. None of this moves an AI visibility grade by itself, because an email address is one fact among the price, phone, address, hours, FAQ and table rows the extractor weighs, and it is separate again from entity confidence, and the fuller picture of that is in the corpus run on which facts never reach the HTML a crawler receives.

CarrierPages carrying itPages where it was the only carrierVisible to a reader
mailto link in the markup137117Yes
schema.org email in JSON-LD122102No
Address in the visible prose3824Yes
Cloudflare encoded attribute2724Only with script
Any carrier at all269not applicablemixed
The three carriers extractFacts reads an email address from, and how many of the 1,061 corpus home pages used each one alone, measured on 9 November 2026.

The 27 pages that encoded the address instead

356 of the 1,061 pages arrived with a cf-ray response header, meaning they were served through Cloudflare, and all 27 of the obfuscated pages were among them. So this is 27 of 356, not 27 of the whole corpus, and the other 329 Cloudflare sites had the setting off or had no address on the page to rewrite. The 27 carried 89 encoded payloads between them, split across data-cfemail attributes on spans and hexadecimal fragments appended to a /cdn-cgi/l/email-protection href, and all 27 also referenced the decode script the documentation names.

The payloads are recoverable, and saying so is more honest than implying the address is gone. Lantad decoded each one by treating the first byte as a key and taking the exclusive or of every following byte against it, then tested the result against an address pattern. 26 of the 27 pages produced at least one syntactically valid address and 38 distinct addresses came out in total. nami.org carried eleven encoded hrefs that all decode to helpline@nami.org, sitting in a sentence that offers a phone number as a plain tel link and the email only as the word "email". standardbank.co.za carried nine payloads decoding to information@standardbank.co.za, complaint.resolutioncentre@standardbank.co.za and a whistleblowing line at tip-offs.com. diabetes.org gave askada@diabetes.org, psychiatry.org gave apa@psych.org, cshl.edu gave info@cshl.edu, maroc.ma gave contact@maroc.ma, nzz.ch gave leserbriefe@nzz.ch and seha.ae gave care@seha.ae.

Two of the decodes are more interesting than the addresses. uacvoice.org encoded two addresses, contact@uacvoice.org and contact@uaccstage.wpengine.com, the second naming a staging host that the obfuscation has carried into production unchanged. tobira.ai encoded three, hello@tobira.ai alongside anna@example.com and yourcompany@tobira.ai, so a template's placeholder addresses were obfuscated with the same care as the real one. The single page whose payload was not an address, swissre.com, is the clearest evidence of how mechanical the feature is: the href was a share button whose mailto carried no recipient at all, and the encoded string decodes to a query fragment beginning "?subject=Swiss%20Re%20Group". The rewrite does not know what it is encoding, which is exactly what you would expect of something enabled automatically at signup. This is the same class of problem this blog has measured in text that reaches the browser and not the extractor and in words sitting behind a hidden marker, and in text that ships in HTML comments and reaches no reader, with one difference worth stating: here the hiding is the advertised purpose.

SiteEncoded payloadsDecoded addressEmail facts extracted
nami.org11helpline@nami.org0
standardbank.co.za9information@standardbank.co.za and two more0
tobira.ai5hello@tobira.ai, plus two placeholders0
diabetes.org2askada@diabetes.org0
uacvoice.org3contact@uacvoice.org and a staging host0
swissre.com1not an address, a mailto subject0
highlandscurrent.com11editor@highlandscurrent.org1
Addresses recovered from Cloudflare encoded payloads on corpus home pages served to LantadBot/1.0 on 9 November 2026, decoded by taking the exclusive or of each byte against the first. The right column is what the shipped extractor returned for the whole page.

The sites that spelled the address out by hand

Cloudflare's setting is the industrial version of a much older habit, and the corpus still carries the handmade kind. A conservative pattern looking for a local part followed by a bracketed or spaced "at" and then a bracketed or spaced "dot" matched five of the 1,061 pages, and three of those five were the site's own contact address written so that no pattern can lift it.

Lund University puts its switchboard number in a tel link and then its address as a span containing "lu", the text " [at] ", a nested span holding "lu", another holding " [dot] ", and "se", with the whole thing repeated in brackets afterwards as "lu[at]lu[dot]se". The Reserve Bank of India writes "Contact us on helpdoc[at]rbi[dot]org[dot]in" in its footer, beside a line giving the date the website was last updated. The Indian Council of Medical Research writes "Email: icmrhqds[at]sansad[dot]nic[dot]in" in a block that otherwise gives a full postal address and two phone numbers in plain text. In every one of the three cases the phone number and the street address went out unprotected and only the email was defended, which tells you what the people who did it were actually afraid of, and spam is a reasonable thing to be afraid of.

The other two matches are the reason this count is a floor rather than a census. maxbone.com matched on "aamirafridi(at)gmail(dot)com", which is the author credit inside the banner of a jQuery marquee plugin the page loads, and tum.de matched on "info(at)in2code(dot)de", which is a content management vendor's banner drawn in ASCII art. Neither is the site's contact address, and both show that a pattern search finds the construction rather than the intent. Handmade obfuscation also has far more forms than one pattern covers, from images of addresses through to character by character markup, so sites doing this are certainly undercounted. What all of it has in common is the thing worth taking away: the address never reaches a reader that does not reassemble it, which is the same position the contact details measurement found for telephone numbers that are clickable on the page and absent from the markup, and the same holds for opening hours a machine could read.

  • lu.se Own address, split Nested spans assembling lu [at] lu [dot] se, repeated in brackets, beside an unprotected switchboard number.
  • rbi.org.in Own address, split Footer reads Contact us on helpdoc[at]rbi[dot]org[dot]in, next to the date the site was last updated.
  • icmr.gov.in Own address, split Email: icmrhqds[at]sansad[dot]nic[dot]in, in a block giving a full postal address and two phone numbers in plain text.
  • maxbone.com Third party credit A jQuery plugin author's address inside a script banner, not the shop's contact.
  • tum.de Third party credit A content management vendor's address in an ASCII art banner.
  • 11 further pages Empty mailto A mailto href with no recipient at all, including ten on bundesregierung.de and five on nbcnews.com.
Handmade address obfuscation found on corpus home pages, quoted from the HTML each site served LantadBot/1.0 on 9 November 2026. A conservative at and dot pattern matched five pages in all.

Which kinds of site publish an address at all

The corpus is stratified, which makes the next cut the most useful one in the measurement. Both seed files split their hostnames into named strata, ten by the platform a site is built on and eight by what the site is for, and the share of home pages carrying a readable address runs from 66.7 percent to 4.3 percent across them. 36 of 54 Wix and Squarespace pages carried one, 18 of 29 Framer pages and 26 of 42 Webflow pages. At the other end, 4 of 94 finance sites, 5 of 84 government sites, 2 of 31 documentation sites, 10 of 98 education sites and 11 of 94 healthcare sites did.

The ordering is almost the reverse of what an answer engine is likely to be asked. A question about how to reach a bank, a ministry, a university or a hospital is exactly the sort a person now puts to an assistant rather than to a search box, and those are the four strata least likely to have put a machine readable address on the page. The small business end of the corpus, where the site was built in a hosted builder and the whole purpose of the home page is to get someone to make contact, publishes the address without being asked. This is not a technology finding. All of these platforms can emit a mailto link and a JSON-LD block; the builders simply default to doing it because the people using them want to be contacted, and a large institution routes contact through a form, a portal or a help centre on another path.

That last point is the honest qualification on the 792, and it needs stating before the number travels. A government site with no address on its home page has almost certainly got one two clicks away, and routing enquiries through a form rather than an inbox is a defensible choice for an organisation handling volume. What the measurement says is narrower and still worth something: on the one page an answer engine is most likely to have fetched, there was nothing to read. The same pattern turned up in the corpus runs on whether a pricing page puts a price in the markup and on how few home pages carry a postal address, and the published study is where the corpus figures are kept.

  • Wix and Squarespace 66.7% (36 of 54)
  • Framer 62.1% (18 of 29)
  • Webflow 61.9% (26 of 42)
  • Local media 44.8% (13 of 29)
  • News 26.7% (16 of 60)
  • Software as a service 25.0% (29 of 116)
  • Travel 14.3% (11 of 77)
  • Healthcare 11.7% (11 of 94)
  • Education 10.2% (10 of 98)
  • Government 6.0% (5 of 84)
  • Finance 4.3% (4 of 94)
Share of home pages in each corpus stratum from which the shipped extractor recovered an email address on 9 November 2026. The display value gives the count and the stratum size, because several strata are small.

What this means for a page you own

The practical part is short. If you are behind Cloudflare and you want an address to reach a client that runs no JavaScript, declare it in a place the obfuscation does not touch: a schema.org email property inside your JSON-LD survives, which is why the three obfuscated pages that still produced an address did so. The alternative is to turn the setting off, and the documentation linked above says where. Either way the choice is now an informed one rather than a default, which is the only thing this measurement really buys you. If you want to see the view directly rather than reason about it, what GPTBot sees returns the raw fetch for a URL and the AI crawler reference lists the tokens doing the fetching.

The second point cuts the other way, and it belongs in a post that argues from measurement. Obfuscation works. It was built to stop address harvesting, harvesting is a real cost, and nothing here says the sites running it made a mistake. The cost is simply not the one the setting was weighed against: it was switched on when scraping meant spam, and the client it now also blocks is the one deciding whether to name you in an answer. A site that routes contact through a form has made the same trade deliberately. A site that has had the box ticked since signup has not made a trade at all, and 24 pages in this corpus are in that position.

The third is a caution about the method, because the weakest number in this post is the 38. Reading addresses out of prose finds things that are not contact details. outseta.com yielded sales@yourcompany.com and customer@acme.com from a product screenshot rendered as live HTML, userloop.io yielded you@email.com from a styled mockup of a form field, blindpay.com yielded juanperez@gmail.com from an API code sample printed on the page, and matsusentinel.com and tucsonspotlight.org both yielded jamie@example.com, apparently from one shared newsletter template. That is six addresses on five pages that are not contact details, and an answer engine reading the same prose has no better way of telling them apart. If your home page shows a product mockup containing a fake address, that string is a candidate for your contact details as far as anything reading the text is concerned.

What this run did not do is the usual list, and it matters more than usual here. No AI crawler was observed: Lantad reads sites rather than server logs, so nothing in this post says whether OpenAI, Anthropic, Google or Perplexity run the decode script or what they do with an address once they have it, and the platform notes collect only what those vendors publish. Each page was fetched once, with redirects followed and no JavaScript executed, so an address a script would have written in is absent from the reading, which can undercount and cannot overcount. Only the home page of each host was read, so a contact page one click away is outside the measurement entirely, and that is the single biggest reason the 792 is not a claim that these organisations are unreachable. The corpus is a stratified sampling frame for crawlability rather than a census of the web, so the stratum shares show direction and not rates. The methodology page describes the pipeline, the crawler policy describes how these hostnames were asked, and prose parity is where the thing that actually decides most scores is defined.

  • Search your own HTML for __cf_email__ 27 pages carried Cloudflare's encoding and 24 of them yielded no address to the extractor. If the string is there, the setting is on.
  • Look for the literal text email protected 19 pages showed that placeholder in their visible text, 36 times in all. It is the artefact a crawler reads in place of the address.
  • Declare the address in JSON-LD as well 102 pages carried the address only in a schema.org email property, and that carrier survived the obfuscation on all three pages that had both.
  • Check whether there is an address at all 792 of 1,061 home pages had none through any carrier, and 533 had no phone number or postal address either.
  • Check for an empty mailto 11 pages carried a mailto href with no recipient, including ten on one government home page.
  • Check mockups and code samples for fake addresses Six addresses on five pages were read as contact facts and were not contact details, among them sales@yourcompany.com and jamie@example.com.
What the measurement supports checking on a page you own, in the order the evidence puts them. Counts are from 1,061 corpus home pages fetched on 9 November 2026.

Written by

Lantad

Published .

A person who wants to email you will find the address. They will click through to a contact page, open a footer, read an image if they have to, and a mailto link will open their mail client because that is what RFC 6068, the standards track specification from October 2010, says the scheme is for: "The 'mailto' URI scheme is used to identify resources that are reached using Internet mail." None of that applies to an answer engine. It reads one document, takes what is in the delivered bytes, and either comes away with a string that looks like an address or does not.

Common questions

Does email obfuscation hide my address from AI crawlers?

From anything that does not run JavaScript, yes, and that is the stated purpose. Cloudflare's documentation, last updated 3 August 2026, says the addresses will be hidden from bots while keeping them visible to humans, and that a decode script named email-decode.min.js is injected to restore them. Measured on 9 November 2026, Lantad's shipped fact extractor returned no email address on 24 of the 27 corpus home pages running the feature, although the encoded payload was present in the bytes and 26 of the 27 pages decoded to a valid address.

Is my site running Cloudflare email address obfuscation?

Fetch your own home page without a browser and search the HTML for the string __cf_email__ or for /cdn-cgi/l/email-protection. If either is there, the feature is on. The visible giveaway is the words email protected, in square brackets, appearing where an address should be, which 19 of the 1,061 corpus home pages measured on 9 November 2026 displayed. Cloudflare's documentation states the setting is enabled automatically at signup and can be turned off in the dashboard or through the API.

How should I publish a contact email address for AI search?

Use two carriers rather than one. A mailto link serves a reader and parses cleanly, and a schema.org email property inside JSON-LD serves a machine and is not rewritten by the obfuscation. 137 of the 1,061 corpus home pages measured on 9 November 2026 carried a mailto link, 122 declared the schema property, and only 47 pages in total carried more than one address at all.

How many home pages publish an email address?

269 of the 1,061 corpus home pages Lantad measured on 9 November 2026 yielded an email address through at least one of the three carriers the extractor reads, and 792 yielded none. 533 of those 792 yielded no phone number or postal address either. The share varies sharply by kind of site: 36 of 54 Wix and Squarespace pages carried an address against 4 of 94 finance sites.

See what AI can read on your site

Run a free scan and get a graded report of exactly what AI crawlers can and cannot read, with ranked fixes.