A GraphQL API limits login attempts to 3 requests per minute per IP. The developer is confident: an attacker can only try 3 passwords per minute. Brute force is impossible.
What the developer didn't account for: GraphQL supports sending an array of mutations in a single HTTP request.
The attacker sends a single POST to /graphql containing 100 login mutations in one array. The rate limiter sees 1 request. The GraphQL resolver processes 100 login attempts.
At 3 batched requests per minute (within the rate limit), the attacker is effectively trying 300 passwords per minute. A common 4-digit PIN would fall in under 7 minutes.