BotAudit helps you detect bot traffic in your ad campaigns. Set up takes less than a minute:
After creating a site in your dashboard, you'll get a tracking script. Add it to your HTML page:
<script src="https://track.botaudit.co/s/YOUR_SITE_KEY.js"></script>
Place this before the closing </body> tag. The script is tiny (<2KB), loads asynchronously, and uses navigator.sendBeacon to avoid blocking page navigation.
You can pass custom key-value data that will be stored with each visit and available for filtering and export:
<script>
window.botaudit = {
clientId: 'acme-corp',
campaignId: 'feb-2026-launch',
landingPage: 'variant-a'
// Add any key-value pairs you want
};
</script>
<script src="https://track.botaudit.co/s/YOUR_SITE_KEY.js"></script>
Important: Set window.botaudit before loading the tracking script. You can then filter by any custom field in the dashboard, and custom data is included in CSV exports.
Every visit is classified into one of three categories:
| Classification | Criteria |
|---|---|
| Bot | Any hard signal detected (webdriver, headless browser, Selenium, PhantomJS, missing languages, bot user-agent) OR two or more input-physics anomalies OR hosting provider with time on page < 1 second |
| Suspicious | From a hosting provider/datacenter OR known proxy/VPN OR a single input-physics anomaly OR time on page < 500ms without any interaction |
| Human | Passed all checks. Especially confident if user had interaction (click, scroll, touch) or stayed 2.5+ seconds |
navigator.webdriver — Set by automation frameworksHeadlessChrome in user agentwindow.__nightmare — NightmareJSwindow.callPhantom / _phantom — PhantomJSwindow.__selenium_unwrapped — Seleniumnavigator.languages empty — Missing browser languagesStealth automation drives a real Chrome — the webdriver flag is hidden and the user agent is genuine. What it can't cheaply fake is the input trail a human hand produces. The tracker keeps aggregate counters (mouse-movement, wheel, scroll, touch, and key-press counts plus first-input timing — never keystroke content or cursor paths), and the server derives three anomaly signals:
scrollTo())These are treated as probabilistic, not proof: one anomaly alone marks the visit Suspicious; two or more corroborate to Bot. They're derived server-side, so thresholds improve without you redeploying the snippet.
| URL Parameter | Platform |
|---|---|
gclid | Google Ads |
gbraid / wbraid | Google Ads (iOS privacy variants) |
fbclid | Facebook / Meta |
twclid | Twitter / X |
ttclid | TikTok |
msclkid | Bing / Microsoft Ads |
The admin API is available at https://app.botaudit.co/api. Authentication is via httpOnly JWT cookie (set on login).
| Endpoint | Description |
|---|---|
POST /api/auth/register | Create account |
POST /api/auth/login | Sign in |
POST /api/auth/logout | Sign out |
GET /api/auth/me | Current user info |
GET /api/sites | List your sites |
POST /api/sites | Create a site |
GET /api/sites/:id | Get site details |
PUT /api/sites/:id | Update a site |
DELETE /api/sites/:id | Delete a site |
GET /api/sites/:id/snippet | Get tracking snippet |
GET /api/sites/:id/visits | Filtered, paginated visits |
GET /api/sites/:id/stats | Aggregate stats + time series |
GET /api/sites/:id/export | CSV download |
GET /api/sites/:id/google-claim | Google Click Quality Form claim CSV |
The CSV export includes all filterable fields. Use it to build evidence for ad platform invalid-traffic disputes.
To export:
Exported fields: timestamp, classification, platform, ad_click_id, country, region, city, ISP, hosting provider, device type, interaction, time on page, bot signals, custom data, IP hash.
The "Google Claim CSV" button downloads a ready-to-submit click log for Google's Click Quality Form: paid Google clicks (gclid/gbraid/wbraid) classified bot or suspicious within the last 60 days — Google's dispute lookback window — including the visitor IP address the form asks for, click date/time (UTC), click ID, campaign, and the signals behind each classification.
Visitor IPs are retained only for flagged paid clicks and only for 60 days (see our privacy policy). Visits recorded before this feature launched export with an empty IP column — the click ID still identifies the click to Google.
Tip: set your Google Ads customer ID on the site (Sites → Edit) and it appears in the claim filename and on the printable refund report. Note that Google reviews every claim against its own data and issues ad credits at its discretion — the export documents your claim; it doesn't guarantee a credit.