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.
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.
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.
Flow: HTML with data-cfemail to Browser runs decode script; HTML with data-cfemail to Crawler runs no script; Browser runs decode script to Address shown; Crawler runs no script to Text reads email protected; Text reads email protected to No email fact.
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.
| Carrier | Pages carrying it | Pages where it was the only carrier | Visible to a reader |
|---|---|---|---|
| mailto link in the markup | 137 | 117 | Yes |
| schema.org email in JSON-LD | 122 | 102 | No |
| Address in the visible prose | 38 | 24 | Yes |
| Cloudflare encoded attribute | 27 | 24 | Only with script |
| Any carrier at all | 269 | not applicable | mixed |
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.
| Site | Encoded payloads | Decoded address | Email facts extracted |
|---|---|---|---|
| nami.org | 11 | helpline@nami.org | 0 |
| standardbank.co.za | 9 | information@standardbank.co.za and two more | 0 |
| tobira.ai | 5 | hello@tobira.ai, plus two placeholders | 0 |
| diabetes.org | 2 | askada@diabetes.org | 0 |
| uacvoice.org | 3 | contact@uacvoice.org and a staging host | 0 |
| swissre.com | 1 | not an address, a mailto subject | 0 |
| highlandscurrent.com | 11 | editor@highlandscurrent.org | 1 |
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.seOwn address, split Nested spans assembling lu [at] lu [dot] se, repeated in brackets, beside an unprotected switchboard number. -
rbi.org.inOwn 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.inOwn 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.comThird party credit A jQuery plugin author's address inside a script banner, not the shop's contact. -
tum.deThird party credit A content management vendor's address in an ASCII art banner. -
11 further pagesEmpty mailto A mailto href with no recipient at all, including ten on bundesregierung.de and five on nbcnews.com.
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.
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.
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.