LLM Analytics is CitedOS's view of the traffic your AI visibility actually drives, on both sides of the answer. AI referrals show the humans who clicked through after an engine named you; Agent traffic shows the AI crawlers that visited your site to source that answer in the first place. Both read data you already have — Google Analytics and your own server or CDN logs — so setup needs no tracking script and no code deploy.
Two lenses, one setup page
Humans arriving from an AI answer
Reads your own GA4 property and classifies session source into ChatGPT, Gemini, Claude, Perplexity or Copilot, with a 95% confidence interval on each engine's share. Answers: is a citation turning into a visit?
AI crawlers arriving to read your site
Reads AI-bot hits out of your own server or CDN access logs — GPTBot, OAI-SearchBot, PerplexityBot, Claude-SearchBot, Google-Extended and more — with daily volume per bot. Answers: is the engine even visiting me to build an answer?
Which one do I need?
- Already run Google Analytics? Start with AI referrals — it's a two-field form, no log files to touch.
- Want to know if GPTBot, ClaudeBot or PerplexityBot are crawling you at all? Set up Agent traffic — it reads your own access logs and needs an API key.
- Want the full loop? Run both. They measure different moments: Agent traffic is the bot fetching your pages; AI referrals is the human who clicked through after reading the answer that bot helped build. A page can be crawled heavily with zero referrals — you're feeding the answer but not getting the click — or the reverse.
Connect AI referrals (Google Analytics)
Grant access
In Google Analytics, open the GA4 property you want to attribute and grant CitedOS's service account Viewer access, under Admin → Property access management.
Copy the property ID
Copy the property's numeric ID from Admin → Property settings — it looks like 123456789. That's different from the G-XXXXXXX measurement ID on your tracking tag.
Paste it in and connect
Open AI referrals in the dashboard (under Traffic in the sidebar), paste the property ID into the connect form, and submit. Attribution starts on the next data refresh — nothing else to configure.
Set up Agent traffic (your own logs)
Agent traffic has no click-through connect flow — you ship us log lines over an authenticated API, and we parse the AI-bot hits out server-side. Nothing about your human traffic is extracted or stored.
Mint an API key
In Settings → API keys, create a key. This is the same key the MCP server uses — minting one requires the Pro plan or above.
Point your logs at the ingest endpoint
POST a batch of access-log lines to /api/ingest/logs, authenticated with Authorization: Bearer ck_…. A daily cron job, a small serverless function, or a one-off script all work — there's no platform-specific integration to install.
Watch it land
Open Agent traffic in the dashboard (under Traffic). The first successful batch replaces the empty state with a per-bot hit table and a freshness stamp.
Supported log formats
| Format | format value | What we read |
|---|---|---|
| nginx / Apache combined | combined (or auto) | The standard combined access-log line — timestamp, request line, and the User-Agent as the last quoted field. |
| Cloudflare Logpush (JSON) | cloudflare (or auto) | One JSON object per line; we read ClientRequestUserAgent/userAgent, EdgeStartTimestamp/timestamp, and ClientRequestURI/path. |
| Pre-parsed buckets | send buckets, not lines/raw | Already do your own bot detection? POST { botToken, day, hits } objects directly and skip the log parsing entirely. |
curl -X POST "$CITEDOS_APP_URL/api/ingest/logs" \
-H "Authorization: Bearer ck_…" \
-H "Content-Type: application/json" \
-d '{
"brandId": "br_…",
"format": "combined",
"lines": [
"203.0.113.9 - - [07/Jul/2026:14:02:11 +0000] \"GET /pricing HTTP/1.1\" 200 8423 \"-\" \"Mozilla/5.0 (compatible; GPTBot/1.1; +https://openai.com/gptbot)\""
]
}'
# → { "ok": true, "brandId": "br_…", "botsSeen": 1, "hitsAccepted": 1, "skippedNonBot": 0, "unparsed": 0 }Requests over any of these limits are rejected outright (413 for payload size, 429 for the rate limit) rather than partially processed, so a batch either lands whole or not at all.
What data actually gets sent
- Agent traffic: we persist only the matched bot's canonical token, the calendar day, and a hit count — never the request path, query string, or visitor IP. Lines from non-AI traffic are counted (so you can sanity-check parsing) then discarded; nothing about them is stored.
- AI referrals: we call the GA4 Data API for aggregate session counts by source, scoped to the property you granted access to. CitedOS never receives your Google login — only the read-only Viewer grant you control from Google's side, revocable anytime.
- Both are first-party, self-declared inputs. A crawler's User-Agent can be spoofed, and GA4's own source attribution has the same edge cases any analytics tool has — CitedOS never infers this from data it wasn't given permission to see.
Verifying the connection
Both panels are honest about their state rather than showing a blank chart while they wait. AI referrals moves from a connect form to a per-engine trend table the moment GA4 returns data for the linked property. Agent traffic moves from "No AI-crawler hits ingested yet" to a per-bot table on your first successful POST. Once populated, each panel carries a freshness stamp — Agent traffic flags itself stale after 48 hours without a new batch, so a forgotten cron job is visible, not silent.
Plan availability
For the metrics these feed once connected, see Reading the dashboard; for how crawler access ties into indexing, see the glossary.