---
title: Agent Traffic Analytics for Your Website | Apostl Pulse
description: Estimate how many AI agents use your website now, see which public pages they visit, and install the open-source server SDK without creating an account first.
canonical: https://apostl.dev/pulse
eyebrow: Open-source agent traffic analytics
primary_cta_label: Install agent skill
primary_cta_href: #agent-setup
schema_type: WebPage
date_modified: 2026-08-26
---

# How many AI agents use your website?

Pulse estimates the AI agent traffic already reaching your public site. The dashboard gives you one live number, then shows the pages those agents use. Active means seen in the last 30-minute window; Top Pages covers 30-day estimated unique agents and total requests.

Pulse uses heuristic classification. It cannot prove which person, company, or exact model made a request.

## What does Apostl Pulse measure?

Apostl Pulse estimates how much AI-agent traffic reaches a public website and which canonical pages those requests use. A server-side middleware observes eligible public `GET` and `HEAD` responses, removes query strings, fragments, URL credentials, request bodies, cookies, and authorization headers, then sends the request IP, User-Agent, canonical `origin + pathname`, method, status, and duration to Apostl. The platform applies heuristic classification and reports active agents in a 30-minute window plus 30-day page aggregates. That output is an estimate: Pulse cannot identify a person or company, prove which exact model made a request, or treat one request as a qualified lead. An agent may create and verify a setup before a person claims the project, but the server API key must stay outside source control and browser code. Inspect the [MIT-licensed SDK](https://github.com/apostl-dev/pulse-sdk), the [setup flow](#install), and the [privacy notice](https://apostl.dev/privacy) for the implementation and data boundaries.

## Measure the request, then inspect the page

Pulse follows the benchmark-first instinct behind Tempo StableBench: define a behavior and retain inspectable evidence. No StableBench result or implementation detail is imported into Pulse. Source: https://tempo.xyz/developers/blog/introducing-stable-bench-v1

- Estimated active agents now
- Top public pages by estimated unique agents
- Total agent requests per page
- Server-side evidence for HTML, Markdown, `llms.txt`, and other public files

## Page identity stays useful

Every visit is stored as canonical `origin + pathname`. Query strings, fragments, and URL credentials are removed, so `/docs/quickstart?token=...#install` becomes `/docs/quickstart`. The canonical form rolls query variants into one page row.

By default, Pulse counts public GET and HEAD requests with statuses 2xx through 4xx. Assets, health checks, auth and private routes, and mutations stay out of the metric.

## What the server sends

Each eligible event includes the request IP address, User-Agent, canonical page URL and path, method, status, and duration. Request bodies, cookies, authorization headers, query strings, and fragments are not sent. The platform owns classification rules, so there is no service type to maintain in application code.

## Start safely with the agent helper {#agent-setup}

An agent can create the setup, install the middleware, and prove a real deployment before a person signs in. The unclaimed setup lasts seven days. Before starting, the agent needs a public HTTPS origin it is authorized to deploy, access to that server's code and secret runtime, and permission to deploy it.

```sh
npx skills add apostl-dev/apostl-skills --skill agent-traffic-analytics -g -y
```

Open the installed `agent-traffic-analytics/SKILL.md`, move to that skill directory, replace the intentionally invalid origin below, and run its setup helper:

```sh
python3 scripts/pulse_setup.py start \
  --origin "https://replace-me.invalid" \
  --verification-path /llms.txt \
  --project-name "My public site" \
  --agent-name "Codex"
```

The helper intentionally rejects `replace-me.invalid`, `example.com`, and other reserved documentation domains before any API mutation. Replace it with the exact public origin where you can deploy Pulse. `example.com` is a reserved documentation domain, not an end-to-end demo target.

The helper stores the server-only API key and opaque setup token in an owner-only `0600` file, then prints only non-secret metadata. Do not use raw curl for the first setup: its JSON response contains the credentials once and can be copied into a tool transcript or terminal log.

## Install one server middleware {#install}

```sh
npm install @apostl-dev/pulse-sdk
```

```ts
import { createPulse } from '@apostl-dev/pulse-sdk';
import { pulseExpressMiddleware } from '@apostl-dev/pulse-sdk/express';

const pulse = createPulse({
  endpoint: 'https://ingest.apostl.dev',
  apiKey: process.env.APOSTL_PULSE_API_KEY,
});

app.use(pulseExpressMiddleware(pulse));
```

The middleware sends events to https://ingest.apostl.dev. It includes the IP address and User-Agent from the server request, then strips query parameters before the event leaves your process.

## Verify, then claim

After deployment, run the same helper with the absolute credentials path printed during setup:

```sh
python3 scripts/pulse_setup.py verify --credentials /absolute/path/to/pulse.json
```

The helper calls the saved `verify_url` with the setup token as a Bearer credential. Apostl fetches the real public verification URL with a signed challenge. The signed response alone does not unlock the project: a claim link appears only after Apostl also receives that request as a real event.

The claim link contains no API key and works once. A person finishes with Google, GitHub, or an email magic link. The ingest API key remains active after claim. If the origin is already connected, the setup API refuses a second project instead of taking over the domain.

Open Apostl Platform at https://platform.apostl.dev, inspect the complete MIT-licensed SDK at https://github.com/apostl-dev/pulse-sdk, or read the exact setup and verify schemas in the [public OpenAPI contract](https://apostl.dev/openapi.json).
