Public guide: add your domain in SpyderBot, copy your tracking key, then install the snippet that matches your stack. No account is required to read this page - sign in only when you are ready to add a site in the app.
Get a tracking key from the product (LLM Tracking is inside SpyderBot after sign-in).
YOUR_TRACKING_KEY in the snippets below with your real key.
API endpoint for server-side calls:
https://api.spyderbot.net/server-track (POST, JSON body, header
X-Tracking-Key).
Paste in <head> or your SPA root layout so normal browsers load the tracker.
<script src="https://spyderbot.net/wfm.js?key=YOUR_TRACKING_KEY"></script>
Official packages for WordPress, npm, Cloudflare Workers, and a GEO audit CLI.
Inject tracking on HTML responses and POST server-side signals for bots that skip JavaScript. Route *yourdomain.com/*.
// SpyderBot Cloudflare Worker — paste in Cloudflare Dashboard → Workers → Create
// Route: *yourdomain.com/*
const TRACKING_KEY = 'YOUR_TRACKING_KEY';
const SERVER_TRACK_URL = 'https://api.spyderbot.net/server-track';
const SPYDER_SCRIPT_URL = 'https://spyderbot.net/wfm.js?key=YOUR_TRACKING_KEY';
const SKIP_MARKERS = ['spyder.min.js', '@spyderbot/spyder', 'wfm.js'];
export default {
async fetch(request, env, ctx) {
const response = await fetch(request);
const contentType = response.headers.get('content-type') || '';
if (!contentType.includes('text/html')) {
return response;
}
ctx.waitUntil(
fetch(SERVER_TRACK_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Tracking-Key': TRACKING_KEY,
'User-Agent': request.headers.get('user-agent') || '',
'CF-Connecting-IP': request.headers.get('cf-connecting-ip') || '',
'CF-IPCountry': request.headers.get('cf-ipcountry') || '',
},
body: JSON.stringify({
url: request.url,
referrer: request.headers.get('referer') || '',
session_id: 'cf_' + Date.now(),
}),
}).catch(() => {})
);
const html = await response.text();
const lower = html.toLowerCase();
if (SKIP_MARKERS.some((m) => lower.includes(m))) {
return new Response(html, { status: response.status, headers: response.headers });
}
const scriptTag = '<script src="' + SPYDER_SCRIPT_URL + '" async></script>';
const transformed = html.replace(/<head(\s[^>]*)?>/i, (match) => match + scriptTag);
const headers = new Headers(response.headers);
headers.delete('content-length');
return new Response(transformed, {
status: response.status,
statusText: response.statusText,
headers,
});
},
};
TypeScript SDK with auto pageview, SPA routes, scroll, and custom events. Points to api.spyderbot.net.
Learn more →Client + server-side tracking from wp-admin. Test connection posts to api.spyderbot.net/server-track.
Learn more →Audit robots.txt, llms.txt, and schema.org: spyder-geo audit yoursite.com
Use these when you need to record SEO and LLM crawlers that do not execute JavaScript. Run the call on every HTML request path you care about.
For accurate LLM referral counts, each visitor needs a unique session_id (see snippets) or add the browser script above.
Sign in and open LLM Tracking to generate your real tracking key and verify the connection.