What it does not do
The throttle works on the User-Agent string, which anyone can write. Faked ClaudeBot requests are throttled like real ones, which is fine for load control. Two things follow from it.
A faker spends the real bot's allowance, because the key is the bot name. To limit each address separately, replace the bot name in the three maps with $binary_remote_addr and raise the zone size; one megabyte holds about 8,000 states of 128 bytes. In a test with that change, a single client sending a ClaudeBot User-Agent got 11 × 200 and 19 × 429, and Googlebot got 30 × 200. Behind a CDN or load balancer, $remote_addr is the proxy's address, so restore the client address first with the realip module.
And the throttle does not tell you who is calling. To let only real crawlers through you compare the source IP with the operator's published ranges. Google describes a reverse and forward DNS check and publishes JSON range files; OpenAI, Anthropic, Perplexity, Apple and DuckDuckGo publish JSON lists too, and the links are in the robots.txt resource. The log audit kit runs that comparison on your logs.
One more cost sits in the third class. When someone asks ChatGPT or Claude about your page, a user-triggered fetch arrives. At 5 requests per second per bot name, a burst of such questions about one viral page can meet a 429. Delete the ai_user lines if you would rather never refuse them.