Skip to content

Rate Limiting

MealPal uses Valkey (Redis-compatible) for per-user rate limiting via fastapi-limiter.

TierPer MinutePer DayUse Case
Unauthenticated550Prevent anonymous abuse
Free10100Normal users
Premium6010,000Power users
  1. Request comes in → extract user ID (or IP if anonymous)
  2. Redis increments counter: INCR user:123:minute
  3. Redis sets expiry: EXPIRE user:123:minute 60
  4. If count > limit → 429 Too Many Requests
  5. If count ≤ limit → request proceeds
FilePurpose
backend/app/middleware/rate_limit.pyCore rate limiting logic
backend/app/config.pyRate limit settings
backend/app/main.pyInit/shutdown rate limiter
from ...middleware.rate_limit import rate_limit, daily_limit
@router.post(
"/analyze",
dependencies=[Depends(rate_limit), Depends(daily_limit)]
)
async def analyze_meal(...):
# Protected by both per-minute and daily limits
...
{
"detail": "Too Many Requests"
}

Headers include X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, and Retry-After.

Redis changed its license in 2024 (SSPL). Valkey is the Linux Foundation community fork — 100% Redis compatible, truly open source (BSD).