Reference
Rate Limiting
Middleware config. IP-based in-memory limits. Headers + 429 responses.
TL;DR: Use createRateLimiter({limit:100, window:60000}). IP-keyed. In-memory store. Upgrade D1/KV for prod.
Table of Contents
Config Table
Tune limits per route.
| Param | Default | Example | Purpose |
|---|---|---|---|
| limit | - | 100 | Requests/window |
| window | - | 60000ms | Sliding window |
| keyGen | IP | custom(c) | Identifier |
From packages/hono-middleware/src/middleware/rate-limit.ts.
How It Works
In-memory Map. Resets on window expiry.
Imperative: Set headers always.
Headers
Standard rate limit headers.
| Header | Value Example |
|---|---|
| X-RateLimit-Limit | 100 |
| X-RateLimit-Remaining | 99 |
| X-RateLimit-Reset | 1738280000 |
Caveats
In-memory only. Worker restart resets.
Upgrade paths:
- Durable Objects: Per-session limits
- KV/D1: Persistent counters
Test: bun test --filter rate-limit.
Reset Quiz
Q: Entry expires when?
A: now > resetAt ✅
B: count > limit
C: Manual clear
Related
Run clearRateLimitStore() in tests. Spam requests. See 429!