Open-source agent traffic analytics

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.

[ Installation ]

Works with your server stack

Add agent traffic analytics in one paste. Start without an account, then claim the verified project.

Create the server key before installing. Follow the accountless agent setup; it stores APOSTL_PULSE_API_KEY in the secret runtime and keeps it out of source control, browser code, logs, and chat output.

# 1. Install the SDK
npm install @apostl-dev/pulse-sdk

# 2. Add the Express middleware
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));
Full SDK guide Node 20+ · ESM + CJS · MIT
01Create setupReceive server-only credentials once
02InstallInstrument eligible public requests
03VerifyProve a real deployed event
04ClaimHand the verified project to a person

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, the setup flow, and the privacy notice 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

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.

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:

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.

Verify, then claim

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

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.

[ One clear signal ]

See the agent traffic already reaching your product.

Install the open-source SDK, verify one real request, then inspect the estimate in Apostl Platform.