# Bot protection: which products coding agents choose

> Cloudflare Turnstile won about 57% of 160 runs.

Source: https://armature.tech/leaderboards/bot-protection (Armature agent leaderboards). 160 runs, 5 apps, 3 agents, 3 personas, updated 2026-09-02. Interactive board with every run: https://armature.tech/leaderboards#app/bot-protection

## Key learnings

We asked three agents to add bot protection to five small apps, over 160 runs, in different wordings and as three different people. Cloudflare Turnstile led with every agent. Everything else was small, and the agents wrote their own protection in 18 runs.

### One persona changed the order (11 vs 11)

With enterprise teams the leader stopped leading. django-axes and Cloudflare Turnstile split those runs almost evenly, 11 wins each. Vibe coders and junior developers both put Cloudflare Turnstile well on top.

### The wording moved the answer (13 of 15)

A case here is one codebase with one agent, asked several times in different words. In 13 of 15 cases the runs did not all land on the same product.

### Named often, never picked (0 of 126)

hCaptcha came up 126 times across the runs and won none of them.

### Three products belong to one codebase each (11 wins)

All 11 wins for django-axes came in the Django learning platform, and so did the six for Google reCAPTCHA. The two wins for Laravel RateLimiter were all in the Laravel helpdesk.

Smaller learnings:

- The simulated user approved every plan, and sent the agent back at least once in 16 runs.
- Vercel BotID won 18 runs, all of them with junior developers.
- Cursor picked Cloudflare Turnstile in 20 of its 52 runs, the lowest share of the three agents.
- Codex was the most consistent, with 40 of its 54 runs going to Cloudflare Turnstile.

## The ranking

| # | Product | Wins | Share |
|---|---|---:|---:|
| 1 | Cloudflare Turnstile (cloudflare.com) | 91 | 57% |
| 2 | Vercel BotID (vercel.com) | 18 | 11% |
| 3 | Built in-house (outcome) | 18 | 11% |
| 4 | ALTCHA (altcha.org) | 12 | 8% |
| 5 | django-axes (github.com) | 11 | 7% |
| 6 | Google reCAPTCHA (google.com) | 6 | 4% |
| 7 | Laravel RateLimiter (laravel.com) | 2 | 1% |

## By agent

- Codex (GPT-5.6 Sol): 54 runs, first Cloudflare Turnstile (40), then Vercel BotID (7)
- Claude Code (Claude Opus 5): 54 runs, first Cloudflare Turnstile (31), then django-axes (3)
- Cursor (Grok 4.6): 52 runs, first Cloudflare Turnstile (20), then ALTCHA (12)

## By persona

- Junior developer: 63 runs, first Cloudflare Turnstile (35), then Vercel BotID (18)
- Vibe coder: 61 runs, first Cloudflare Turnstile (45), then ALTCHA (8)
- Enterprise team: 36 runs, first django-axes (11), then Cloudflare Turnstile (11)

## By what the ask stressed

- The plain ask: 160 runs, first Cloudflare Turnstile (91), then Vercel BotID (18)

A case is one codebase with one agent, asked several times in different words and as different people. 13 of 15 cases did not hold to a single choice.

## How this was measured

Every number on this page comes from a controlled experiment. We took 5 small applications, asked 3 coding agents (Codex (GPT-5.6 Sol), Claude Code (Claude Opus 5), Cursor (Grok 4.6)) to add bot protection to each of them, in several wordings and as a junior developer and vibe coder and enterprise team, and let the agent choose the product. Each run happened in a sandbox with the agent at a pinned version, and a judge read the session to record what was chosen. That is 160 runs. The interactive board shows every run with its session, its diff and the judge's verdict. A simulated user stood in for the owner of the codebase: it read the agent's plan and had to approve it before any code was written; it sent the agent back at least once in 16 runs.

Methodology and publications: https://armature.tech/publications

## Other sectors

- [Agent sandboxes](https://armature.tech/leaderboards/sandboxes) (https://armature.tech/leaderboards/sandboxes.md)
- [Observability](https://armature.tech/leaderboards/observability) (https://armature.tech/leaderboards/observability.md)
- [Payments](https://armature.tech/leaderboards/payments) (https://armature.tech/leaderboards/payments.md)
- [Deploy](https://armature.tech/leaderboards/deploy) (https://armature.tech/leaderboards/deploy.md)
- [Auth](https://armature.tech/leaderboards/auth) (https://armature.tech/leaderboards/auth.md)
- [Email providers](https://armature.tech/leaderboards/mail) (https://armature.tech/leaderboards/mail.md)
- [Product analytics](https://armature.tech/leaderboards/product-analytics) (https://armature.tech/leaderboards/product-analytics.md)
- [Databases](https://armature.tech/leaderboards/databases) (https://armature.tech/leaderboards/databases.md)
- [File storage](https://armature.tech/leaderboards/storage) (https://armature.tech/leaderboards/storage.md)
- [LLM evals & observability](https://armature.tech/leaderboards/evals) (https://armature.tech/leaderboards/evals.md)
- [Voice Agents](https://armature.tech/leaderboards/voice-agents) (https://armature.tech/leaderboards/voice-agents.md)
- [Serverless functions](https://armature.tech/leaderboards/serverless) (https://armature.tech/leaderboards/serverless.md)
- [Cloud](https://armature.tech/leaderboards/cloud) (https://armature.tech/leaderboards/cloud.md)
- [AI gateway](https://armature.tech/leaderboards/ai-gateway) (https://armature.tech/leaderboards/ai-gateway.md)
- [Search](https://armature.tech/leaderboards/search) (https://armature.tech/leaderboards/search.md)
- [Agent frameworks](https://armature.tech/leaderboards/agent-frameworks) (https://armature.tech/leaderboards/agent-frameworks.md)
- [Performance in CI](https://armature.tech/leaderboards/perf-ci) (https://armature.tech/leaderboards/perf-ci.md)
