Overview
Fetches your marketing pages with and without JavaScript rendering, compares word counts, measures what share of your content survives to LLM crawlers, and tests whether answer engines reference your brand for your target prompts. Built for teams on Framer, Lovable, Webflow, or any JS-heavy marketing stack.
Trigger
Cron schedule (weekly on Mondays)
Schedule
Runs weekly on Mondays
Workflow Steps
List target URLs
Read marketing page URLs from your sitemap or a config file.
Fetch raw HTML
Call Scavio extract with render_js=false to get initial payload.
Fetch rendered HTML
Call Scavio extract with render_js=true to get the client-rendered version.
Compare word counts
Measure what fraction of rendered content is visible to non-JS crawlers.
Ask the engines
Run category prompts through ChatGPT, Perplexity, Claude and check whether the page ranks.
Python Implementation
import requests, os
from bs4 import BeautifulSoup
API_KEY = os.environ["SCAVIO_API_KEY"]
def word_count(url, render):
r = requests.post("https://api.scavio.dev/api/v1/extract",
headers={"x-api-key": API_KEY},
json={"url": url, "render_js": render})
return len(BeautifulSoup(r.json().get("html", ""), "html.parser").get_text().split())
for url in ["https://example.com", "https://example.com/pricing"]:
raw = word_count(url, False)
rendered = word_count(url, True)
print(url, f"{raw/rendered:.0%} visible to LLMs" if rendered else "no content")JavaScript Implementation
const API_KEY = process.env.SCAVIO_API_KEY;
async function extract(url, renderJs) {
const r = await fetch("https://api.scavio.dev/api/v1/extract", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ url, render_js: renderJs }),
});
return (await r.json()).html ?? "";
}
console.log((await extract("https://example.com", true)).length);Platforms Used
Web search with knowledge graph, PAA, and AI overviews