Meta-ExternalAgent ran our JavaScript on 23 of 32 page fetches
Table of contents
In JavaScript execution has two depths, Meta-ExternalAgent sat in the zero tier: it crawled our test cells and never fired the beacon. That held for the post’s window, which ended on 6 August. Four days later Meta came back under a different user agent and ran the JavaScript on most pages it fetched.
Two user agents
Meta-ExternalAgent reached the test bed under two user agents. Every request counted below came from Meta’s network, AS32934.
| Plain | Chrome-based | |
|---|---|---|
| User agent | meta-externalagent/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler) |
Chrome 144 or 145 on Windows, macOS or Linux, followed by (compatible; meta-externalagent/1.1 ...) |
| Seen | 2026-05-18 to 2026-07-01 | 2026-07-20 to 2026-09-11 |
| Test-cell fetches | 75, all on 2026-05-18 | 32, from 2026-08-10 to 2026-08-20 |
| Fetches followed by a beacon | 0 | 23 |
The zero in the first column says nothing. The plain user agent fetched test cells on a single day, and the beacon went live the next morning. Whether that crawler runs JavaScript is unknown. Everything below is about the Chrome-based one.
How it renders
The beacon has two delivery paths: an inline <script> at the end of <body>, and a React client component. Every page Meta-ExternalAgent rendered sent both, one beacon from the React component and two to four from the inline script, 0 to 3 seconds after the fetch (median 1 second). GPTBot runs only the inline script and Applebot only the React app. Running both puts Meta-ExternalAgent in the full tier, next to Bingbot and Google’s URL Inspection tool.
Every page, at least once. It fetched 21 different pages and rendered each of them at least once, across all eight content patterns we test plus the static clean cells. The nine fetches without a beacon were all repeats of one page, ssr/late-loaded/search, which it fetched 12 times between 11 and 20 August and rendered three times.
Who sent the beacons
Meta publishes no IP list for its crawlers, so we checked the network instead. Every request with the Chrome-based user agent came from AS32934, the 32 page fetches included. Of the 66 addresses that sent beacons, 65 made every other request we logged from AS32934; the last one made no other request to check.
The beacons almost never came from the address that fetched the page: 1 of 83 did. The renderer’s own requests leave from a wide pool, 66 addresses for 83 beacons, so allowing Meta’s crawler by the addresses it fetches pages from would miss the ones its renderer uses.
What this means for site owners
Meta says Meta-ExternalAgent collects content for uses such as training its AI models and indexing content directly. Content that only appears after JavaScript runs, from an inline script or from a React component, now reaches it, at least in its Chrome-based form.
Of the crawlers the big AI labs run on our test bed, it is the only one in the full tier. GPTBot runs only the inline script. ClaudeBot and Amazonbot have not fired a single beacon. Applebot evaluates the React app and skips the inline script. Server-side rendering is still the only way to reach all of them.
What this does not prove
- This is an exploratory result. Its data comes after the planned Phase 1 window, which ended on 2026-08-07, so it is a lead for a new test, not a test of our pre-registered hypotheses (methodology).
- The sample is small: ten days, 32 page fetches, 21 pages, one domain.
- We cannot date the switch. The Chrome-based user agent first appears on 2026-07-20, but it fetched no test cell before 2026-08-10, and the plain one stopped fetching cells before the beacon existed.
- A beacon proves the JavaScript ran. It does not prove Meta kept the content that JavaScript produced, or clicked the button on the
click-revealpage. - AS32934 proves Meta’s network, not which Meta service sent a request. The user agent and the timing tie these requests to the crawler.
Method notes
Requests are deduplicated: every Cloudflare-log row counts, plus a middleware row only when Cloudflare has no row for the same address, path and user agent within 3 seconds. Only requests from AS32934 are counted. A fetch counts as rendered when a beacon for the same cell arrives within an hour; all of them arrived within 3 seconds. Beacon rows carry no ASN, so each beacon address was checked through the HTTP requests it made, by its hashed IP. The data is the tracker export of 2026-10-03; it has no Meta-ExternalAgent beacon after 2026-08-20.
Data availability: methodology, tracker code, classifier and beacon source are in the repository at github.com/Qbeczek1/jsseo-dev, private for now; access on request at [email protected]. Live dashboard at /dashboard/.
Bias disclosure: I run JS SEO Lab as an independent technical SEO research project, and do paid technical SEO and AI-visibility audits through FratreSEO. No framework vendor, crawler vendor, search engine, or AI company funds this work.