Rightshold™ Sign up

Answers · AI crawlers

Does Anubis (the proof-of-work challenge) actually stop AI scrapers, and what does it cost real visitors and good bots?

Last updated

TL;DR: It stops the cheap ones, not the determined ones. Anubis is an MIT-licensed reverse proxy by Xe Iaso (Techaro) that makes a browser solve a SHA-256 proof-of-work puzzle in JavaScript, then gives it a signed cookie. Most scrapers that pretend to be browsers don't run JavaScript, so they never get past it: GNOME's sysadmin reported that only 3% of about 81,000 requests in two and a half hours passed, and a Duke University Libraries pilot found it blocked more than 4 million unwanted requests a day. But the puzzle itself is cheap for anyone who bothers. Security researcher Tavis Ormandy calculated that a free-tier Google Cloud VM could mine a week's tokens for 11,508 sites (the project's GitHub star count, which he used as a stand-in for deployments) in about 6 minutes, and in August 2025 Codeberg said AI crawlers had learned to solve its Anubis challenges. The costs land on real visitors: a few seconds' wait at the default difficulty, JavaScript and cookies required (12 Duke users reported problems in one week, mostly with cookies disabled), and, in the default aggressive AI preset, blocks on AI agents that fetch a page for a person. Treat it as one cheap layer, not access control.

What should I check, step by step?

1. Decide what you're protecting. Anubis earns its keep on expensive dynamic pages (git forges, search, archives) hit by bots that don't run JavaScript. It is much less useful against scrapers that drive real headless browsers.

  1. Keep the default allow rules for search crawlers. Anubis's default policy allows Googlebot, Bingbot, Applebot, DuckDuckGo, the Internet Archive and others by user agent plus published IP ranges, so they aren't challenged. Check them after every upgrade.
  2. Pick an AI preset on purpose. The default aggressive preset blocks all AI and LLM user agents regardless of purpose, including assistants fetching a page because a person asked. The moderate preset blocks training and undocumented bots but allows documented user-fetch and search agents such as ChatGPT-User, OAI-SearchBot and Perplexity-User.
  3. Keep robots.txt too. Anubis's own preset notes that to fully opt out of some AI training, such as Google's, you must set the flags in robots.txt, because those controls aren't a separate crawler you can block.
  4. Leave keep-the-internet-working paths unchallenged: robots.txt, /.well-known/, favicons, feeds, and any API, git or webhook endpoints that non-browser clients need.
  5. Plan for visitors without JavaScript or cookies. Since version 1.20.0 there is a non-JavaScript meta-refresh challenge (off by default when LWN reviewed it); turn it on if your audience needs it, and publish a contact for people who get stuck.
  6. Don't raise the difficulty to fight determined scrapers. LWN reports difficulty 4 (the default) takes a few seconds and 6 can take minutes, and, as Ormandy argues, the cost falls on visitors' own devices far more than on a scraper's datacenter.
  7. Watch for the arms race: track the pass rate and origin load after rollout. When scrapers start passing, layer rate limits, verified-bot allowlists and per-path rules rather than relying on the puzzle.

How does Anubis decide which visitors get a proof-of-work challenge?

Anubis sits between your reverse proxy (Caddy, NGINX, Apache) and your application. Each request is matched against policy rules with three actions: allow, challenge or deny. By default it challenges anything that looks like a browser, usually any user agent containing Mozilla, because most scrapers claim to be browsers. Passing the challenge gets a signed JWT cookie, and Ormandy notes the default cookie lifetime in the code is 7 days.

Can AI scrapers get past Anubis?

It works against high-volume bots that don't execute JavaScript. GNOME sysadmin Bart Piotrowski's numbers, reported by LibreNews and OSnews, showed about 81,000 requests in two and a half hours with only 3% passing. Duke's pilot blocked more than 4 million unwanted requests a day while letting real users and well-behaved bots through. LWN lists the Linux kernel mailing list archive, sourcehut and FFmpeg among early users.

Does Anubis block real users, search engines or AI assistants?

People wait for the puzzle once per cookie period, a few seconds at the default difficulty, and need JavaScript and cookies, or the experimental meta-refresh challenge. In Duke's pilot, 12 people reported problems in one week, usually because cookies were disabled. Non-browser clients and unusual setups can be caught too: Ormandy opens his analysis by asking why Anubis was blocking his access to the Linux kernel.

How do I ask Rightshold about this (free, no key)?

Add the MCP server https://www.rightshold.com/mcp to Claude, Cursor, ChatGPT, Grok or VS Code, then ask: “This request says it's an AI agent fetching a page for a user and carries Web Bot Auth Signature headers. Does the signature verify, and which signer is it, so my middleware can let it skip the proof-of-work challenge?”

One-click setup

{
  "tool": "gate_check",
  "arguments": {
    "policy": {
      "require_web_bot_auth": true
    },
    "request": {
      "method": "GET",
      "url": "<the requested URL>",
      "headers": {
        "user-agent": "<as received>",
        "signature-agent": "<as received>",
        "signature-input": "<as received>",
        "signature": "<as received>"
      }
    }
  }
}

Rightshold checks the Web Bot Auth signatures and gate policies you send it. It isn't affiliated with Anubis or Techaro, doesn't run challenges, sit in front of your site or block scrapers, and can't identify requests that carry no signature. A verified signature identifies the key's publisher, not that the agent is well behaved. Anubis details are from its docs, policy files and the reports cited, and may have changed in later releases.

What are the sources?

Related

Not legal advice. JSON · Markdown · All answers

Get a free API key in one call

No card and no email needed. 100 free credits; the license and policy checks stay free without a key.

curl -s -X POST https://www.rightshold.com/v1/accounts/signup -H "Content-Type: application/json" -d '{"accept_terms":true}'
export RIGHTSHOLD_API_KEY=rs_...   # the api_key from the reply (shown once)
curl -s https://www.rightshold.com/v1/licenses/check -H "Authorization: Bearer $RIGHTSHOLD_API_KEY" \
  -H "Content-Type: application/json" -d '{"license":"MIT","intended_use":{"commercial_use":true}}'