Agents read your site. Read them back.
Assistants pull your pages to answer a question. Search crawlers index them. Training crawlers collect them. None of that is a visitor, and none of it belongs in your visitor count.
Tinylytics sits on both sides of that. It records agent traffic separately from people, and makes your own analytics legible to the agents you work with — over MCP, over the API, in plain Markdown.
14 days free, every feature included. No credit card. Plans from $7/month. Hosted in the EU.
Agents reading your site.
A machine read your pricing page. That's worth knowing, not worth averaging in.
When ChatGPT fetches /pricing to answer someone's question, that is a real signal
about your content. It is not a person who might buy something. Tinylytics writes it down as an agent
visit, and your traffic chart stays honest.
Agent visits are never folded into views, unique hits, or public stats. They live on their own card, broken down by agent and by page, for whatever date range you're looking at.
AI agents
Example295 visits
Known AI assistants and crawlers, kept separate from human views.
| Agent | Visits |
|---|---|
|
ChatGPT-User
OpenAI · AI answers
|
128 |
|
GPTBot
OpenAI · Training
|
86 |
|
ClaudeBot
Anthropic · Training
|
41 |
|
PerplexityBot
Perplexity · Indexing
|
23 |
|
Claude-User
Anthropic · AI answers
|
17 |
| Pages | Visits |
|---|---|
| /pricing | 94 |
| /blog/cookie-free | 61 |
| /docs/setup | 48 |
| / | 37 |
| /llms.txt | 22 |
The four kinds
Tinylytics recognises named user agents and sorts them into four buckets.
- AI answers
-
Someone asked an assistant and it fetched your page to answer.
ChatGPT-UserClaude-UserPerplexity-User - Indexing
-
Crawlers building a search index, AI-flavoured or classic.
OAI-SearchBotPerplexityBot - Training
-
Crawlers collecting public pages for model training.
GPTBotClaudeBotGoogle-Extended - AI crawler
- The other named bots that don't fit the first three.
The catalogue covers the agents that actually matter — OpenAI, Anthropic, Google, xAI, Perplexity, Meta, Apple, Mistral, DeepSeek, Common Crawl, and more besides.
Anonymous scrapers and bots dressed up as Chrome don't make the list. There's nothing trustworthy to categorise them by, so they get kept out of your human numbers and left at that. We'd rather show you four clean categories than five, one of which is a guess.
Honest about the hard part
Most crawlers ask for raw HTML and never run JavaScript. An embed script cannot see them. Anyone claiming otherwise is counting something else.
So report the request from your side — backend, middleware, or edge — with one call to
POST /api/v1/sites/:id/agent_visits. Fire it for every request you like.
Unrecognised browser user agents are ignored on that endpoint, so we decide what counts, and you keep
one code path.
Don't make your visitors wait on it. Fire and forget, or push it into a background job. Analytics should never be able to slow down a page.
curl -X POST https://tinylytics.app/api/v1/sites/SITE_ID/agent_visits \
-H "Authorization: Bearer tly-fa-…" \
-H "Content-Type: application/json" \
-d '{
"path": "/pricing",
"user_agent": "…; compatible; ChatGPT-User/1.0"
}'
The rules don't loosen because there's a model involved.
Agent visits are user agents doing their job in public. We record the agent, the provider, the category, and the page. There is no person in that record, because there wasn't one in the request. The rest of Tinylytics works the same way: no cookies, no fingerprinting, no stored IP addresses, hosted in Germany.
Agents working for you.
Ask your own numbers a question.
Paste the MCP address into Claude, ChatGPT, Cursor, Grok, Claude Code, or Codex, sign in through your browser, and your agent can work with your analytics directly.
More than two dozen tools: list hits, events, agent visits, and insights; create and update sites; check uptime and content monitors; work across site groups; clear out spam. Read-only or full access, your choice at sign-in, changeable later. Every connection shows up under Account → Connections and can be revoked there in one click.
Prefer a static header? Mint a key under
Account → API Access and send
Authorization: Bearer tly-ro-… for read-only or tly-fa-… for full
access. Same 1,000 requests per hour either way.
https://tinylytics.app/mcp
Your agent gets exactly the access you granted it, and not a token more.
An agent can set this up for you. It still can't be you.
An agent can open a Tinylytics trial on your behalf: one POST to
/api/v1/agent_signups with your email, and you get an activation link.
Then it stops and waits. You open that link in your own browser, choose your own password, and activate. The trial starts there. The signup API never returns an API key — deliberately. There is no path through this that leaves the human out of the loop.
We wrote the instructions for that handoff as a page addressed to the agent, not to you. It's a small thing, but it says what we think this era is: agents doing the setup, people keeping the keys.
# The agent asks
POST /api/v1/agent_signups
{ "email": "[email protected]", "tos_accepted": true }
# You get a link. The agent gets no key.
201 Created
{
"status": "pending_owner",
"owner_activation_url": "https://tinylytics.app/…/activate",
"mcp_url": "https://tinylytics.app/mcp"
}
Documentation an agent can finish in one pass.
Every public doc page is available as Markdown, and the API describes itself. No scraping, no guessing at parameter names, no HTML to strip.
There's a pleasing loop in this: point a known crawler at /llms.txt and it shows up in
your own agent visits. The instructions and the measurement are the same product.
- /llms.txt The index, one line per page.
- /llms-full.txt Every public doc page in one file.
- /docs/mcp.md Any doc page as Markdown. Add .md to the URL.
- /api/v1 A discovery document for the API.
- /api/v1/openapi.json The OpenAPI 3.1 spec.
Agents are already reading. You may as well be watching.
14 days free, every feature included, no credit card. Connect an agent in a minute, or point one at the docs and let it connect itself.