== free plan is 5 per minute, pro plan is 20 per minute 25 requests each: free-key-123 allowed 5, pro-key-456 allowed 20 == /api/report costs 5 tokens, /api/hello costs 1 GET /api/hello X-API-Key: pro-key-456 -> 200 limit=20 remaining=19 retry-after=null GET /api/report X-API-Key: pro-key-456 -> 200 limit=20 remaining=14 retry-after=null GET /api/report X-API-Key: pro-key-456 -> 200 limit=20 remaining=9 retry-after=null GET /api/report X-API-Key: pro-key-456 -> 200 limit=20 remaining=4 retry-after=null GET /api/report X-API-Key: pro-key-456 -> 429 limit=20 remaining=4 retry-after=3 -- 20 tokens = 1 hello + 3 reports (16), 4 left; a 4th report needs 5, so it waits for the refill == an unknown API key GET /api/hello X-API-Key: made-up-key -> 401 limit=null remaining=null retry-after=null body: {"type":"about:blank","title":"Unauthorized","status":401,"detail":"Unknown API key"} keys in Redis after the 401: 0 == what is in Redis after one request each from a key, a user and an anonymous caller $ redis-cli --scan | sort rl:global rl:ip:127.0.0.1 rl:key:ea39d5800282edc4 rl:user:alice $ redis-cli TYPE rl:key:ea39d5800282edc4 string $ redis-cli STRLEN rl:key:ea39d5800282edc4 116 $ redis-cli PTTL rl:user:alice (a bucket expires once it has been full for 10 s) positive and at most 70000: true