- Symptom
- AI provider usage keeps climbing while every single IP stays under the rate limitMany short sessions from different addresses hit the AI route without using the rest of the app
- Cause
- A rate limit counts requests from one source, such as an IP address or JA4 digest, and Vercel's WAF counts per region. It caps each source but does not check whether the caller is a person, so automated traffic spread across sources each stays under the limit while the total keeps calling your paid model.
- Fix
- Keep the rate limit, and also require a signed-in user on the AI route, call checkBotId() before any inference, and set a hard spend limit with the AI provider as a backstop.
- Apply
import { checkBotId } from 'botid/server' import { NextRequest, NextResponse } from 'next/server' export async function POST(request: NextRequest) { const verification = await checkBotId() if (verification.isBot) { return NextResponse.json({ error: 'Access denied' }, { status: 403 }) } // check the session and the rate limit, then call the model }- Affected
- Public AI routes on Vercel protected only by an IP-based rate limit
- Sources
Last verified 2026-11-05 · Confirmed by 0 builders