. Or use the REST API directly with POST /v1/verify."}},{"@type":"Question","name":"Is there a free tier?","acceptedAnswer":{"@type":"Answer","text":"Yes. Get an API key instantly with no signup required. The free tier includes 1,000 verifications per day (30,000/month). No credit card needed."}},{"@type":"Question","name":"What signals does Device.AI analyze?","acceptedAnswer":{"@type":"Answer","text":"Device.AI analyzes user agent, automation framework presence (Selenium, Puppeteer, PhantomJS, etc.), canvas fingerprint, WebGL renderer, screen resolution, timezone, hardware concurrency, browser feature support, and connection type."}}]}]}
← Back to Blog
Bot DetectionSecurityAPI

What Is Bot Detection? A Developer's Guide to Protecting Your Website

·12 min read·Device.AI Engineering

If you run a website that accepts form submissions, serves ads, or processes transactions, bots are already visiting you. Industry estimates put bot traffic at 40-50% of all web traffic in 2026. Some of those bots are helpful — search engine crawlers, uptime monitors, feed readers. Many are not.

This guide is written for developers who need to understand bot detection beyond "add a CAPTCHA." We'll cover how modern detection works at a technical level, why traditional methods are failing, and how to integrate detection into your stack in minutes.

The Bot Landscape in 2026

Bots have evolved dramatically. The simplistic curl-based scrapers of a decade ago are now the minority. Today's malicious bots run headless browsers, rotate residential proxies, solve CAPTCHAs via human farms, and mimic human behavior patterns. They fall into several categories:

Good Bots (Allow These)

  • Search engine crawlers — Googlebot, Bingbot, DuckDuckBot. They index your content. Blocking them kills your SEO.
  • Uptime monitors — Pingdom, UptimeRobot. They tell you when your site is down.
  • Social media crawlers — Facebook, Twitter, LinkedIn generating link previews.
  • Feed readers — RSS aggregators pulling your published content.

Bad Bots (Block These)

  • Credential stuffing bots — Automated login attempts using breached password lists. Account takeover is a $6B+ annual problem.
  • Content scrapers — Stealing your content, pricing data, or product listings at scale.
  • Click fraud bots — Clicking your ads to drain your budget. Google Ads click fraud costs advertisers an estimated $100B annually.
  • Inventory hoarding bots — Buying limited-stock items (sneakers, concert tickets) faster than humans can click.
  • Spam bots — Filling your contact forms with junk, polluting your CRM and analytics.
  • DDoS bots — Overwhelming your servers with traffic to take your site offline.

Detection Method 1: User-Agent Analysis

The simplest detection method examines the User-Agent header. Every HTTP request includes one, and bots often use identifiable strings:

// Basic UA-based detection
function isBot(userAgent: string): boolean {
  const botPatterns = [
    /curl\//i, /wget\//i, /python-requests/i,
    /scrapy/i, /phantomjs/i, /headlesschrome/i,
    /bot(?!.*google|bing|duckduck)/i
  ];
  return botPatterns.some(p => p.test(userAgent));
}

The problem: Any bot can set a fake User-Agent header. This catches only the laziest bots. In our testing, UA-only detection catches less than 20% of sophisticated bot traffic.

Detection Method 2: IP Reputation

IP-based detection maintains lists of known bot IPs, data center ranges, and proxy services. If a request comes from an AWS IP range and claims to be a Chrome browser on macOS, something doesn't add up.

The problem: Residential proxy networks now offer millions of clean residential IPs. A bot using a residential proxy in Kansas looks identical to a real user in Kansas at the IP level. IP reputation is a useful signal but not sufficient alone.

Detection Method 3: Rate Limiting

Simple and effective for basic abuse: if one IP makes 1,000 requests in a minute, it's probably not a human. Rate limiting is a must-have, but it's a blunt instrument:

// Basic rate limiting (per IP, per minute)
const rateLimit = new Map<string, { count: number; resetAt: number }>();

function checkRateLimit(ip: string): boolean {
  const now = Date.now();
  const entry = rateLimit.get(ip);
  if (!entry || entry.resetAt < now) {
    rateLimit.set(ip, { count: 1, resetAt: now + 60000 });
    return true; // allowed
  }
  entry.count++;
  return entry.count <= 100; // 100 req/min
}

The problem: Distributed bots spread traffic across thousands of IPs, staying well under per-IP thresholds. A botnet with 10,000 IPs making 10 requests each hits your site 100,000 times while each IP looks clean.

Detection Method 4: Device Fingerprinting

This is where modern detection gets interesting. Instead of looking at what a client says it is (User-Agent), device fingerprinting examines what the client actually is by probing browser and hardware characteristics:

  • Canvas fingerprint — Render a hidden canvas element and hash the pixels. Different GPUs and rendering engines produce different results. Headless browsers produce consistent, identifiable patterns.
  • WebGL renderer — Query the GPU vendor and renderer string. "Google SwiftShader" is a dead giveaway for headless Chrome.
  • Screen and window properties — Real browsers have non-zero screen dimensions. Headless browsers often have screen.width === 0 or window.outerWidth === 0.
  • Automation flags — Check for navigator.webdriver, window._phantom, window.__nightmare, and other automation framework artifacts.
  • Hardware signalsnavigator.hardwareConcurrency, navigator.deviceMemory, available fonts, installed plugins.
  • Timing analysis — Measure how long browser API calls take. Automated environments often return suspiciously fast or suspiciously consistent timing.

The key insight: it's easy to fake one signal but extremely hard to fake all of them consistently. A headless Chrome can set a custom User-Agent, but it can't easily fake a realistic canvas fingerprint, report normal screen dimensions, hide the webdriver flag, AND produce human-like API timing simultaneously.

Detection Method 5: Behavioral Analysis

The most sophisticated detection layer looks at how visitors behave, not just what they are:

  • Mouse movement patterns — Humans move the mouse in curves with variable velocity. Bots often move in straight lines or not at all.
  • Scroll behavior — Humans scroll at variable speeds, pause to read, and scroll back up. Bots tend to scroll at constant speed or jump to specific positions.
  • Keystroke dynamics — Human typing has variable inter-key delays. Automated typing is perfectly uniform.
  • Session patterns — Humans browse in bursts with natural pauses. Bots maintain constant request rates.

The Modern Approach: Multi-Signal Scoring

No single detection method is sufficient. Modern bot detection combines multiple signals into a weighted score. Here's how Device.AI approaches this:

// Device.AI verify response
{
  "verified": true,
  "score": 0.94,           // 0.0 (definitely bot) to 1.0 (definitely human)
  "risk": "low",           // low | medium | high
  "bot": false,
  "signals": {
    "user_agent": { "score": 0.9, "weight": 25, "details": "Chrome 120, macOS" },
    "automation": { "score": 1.0, "weight": 30, "details": "no_automation_detected" },
    "canvas": { "score": 0.95, "weight": 15, "details": "unique_fingerprint" },
    "webgl": { "score": 0.9, "weight": 10, "details": "Apple M2 GPU" },
    "screen": { "score": 1.0, "weight": 8, "details": "2560x1440" },
    "browser_features": { "score": 0.85, "weight": 7, "details": "all_expected_apis" },
    "hardware": { "score": 0.9, "weight": 5, "details": "8_cores_16gb" }
  }
}

Each signal contributes a weighted score. The automation check carries the highest weight (30%) because it's the most definitive. Canvas and WebGL together contribute 25%. Even if a bot spoofs the User-Agent perfectly, the automation and canvas signals will flag it.

Integrating Bot Detection: The Two-Line Approach

Here's how to add bot detection to any website using Device.AI's client-side SDK:

<!-- Add to your HTML head or body -->
<script src="https://device.ai/v1/detect.js" data-key="YOUR_API_KEY"></script>

The script automatically collects device signals and calls the verification API. For server-side verification (recommended for critical flows like login or checkout):

// Server-side verification (Node.js / Express)
app.post('/api/login', async (req, res) => {
  const verification = await fetch('https://device.ai/v1/verify', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': process.env.DEVICE_AI_KEY,
    },
    body: JSON.stringify({
      user_agent: req.headers['user-agent'],
      ip: req.ip,
      signals: req.body.deviceSignals, // from client-side SDK
    }),
  });

  const result = await verification.json();

  if (result.score < 0.3) {
    return res.status(403).json({ error: 'Automated request detected' });
  }

  // Proceed with login...
});

Choosing Your Threshold

The right score threshold depends on what you're protecting:

Use CaseRecommended ThresholdRationale
Contact formsscore < 0.3 → blockModerate protection. Blocks obvious bots while allowing edge cases.
Login pagesscore < 0.4 → challengeHigher security. Challenge suspicious sessions with 2FA or email verification.
Payment flowsscore < 0.5 → manual reviewMaximum protection. Flag anything questionable for human review.
Ad-protected pagesscore < 0.3 → blockProtect ad revenue from click fraud without blocking real visitors.
API endpointsscore < 0.2 → blockAPI consumers may have unusual fingerprints. Be more permissive.

False Positives: The Real Challenge

The hardest problem in bot detection isn't catching bots — it's not blocking real humans. A false positive means a legitimate customer gets a 403 error or a CAPTCHA challenge when they've done nothing wrong. This directly impacts conversion rates.

Multi-signal scoring significantly reduces false positives because it requires multiple signals to agree before flagging a visitor. A user with an unusual User-Agent but normal canvas, WebGL, and behavior will score high enough to pass. Only visitors who look suspicious across multiple dimensions get flagged.

Getting Started

You can get a Device.AI API key instantly — no signup, no email, no credit card. The free tier includes 1,000 verifications per day, which is enough for most development and testing workflows.

  1. Visit device.ai and click "Get Free API Key"
  2. Add the script tag or make API calls directly
  3. Set your score threshold based on your use case
  4. Monitor results in the dashboard

Bot detection shouldn't require a 6-month enterprise sales cycle. Get protected in 5 minutes, scale when you need to.

Ready to stop bots?

Get a free API key instantly. No signup, no credit card.

Get Free API Key →