Are you happy with your logging solution? Would you help us out by taking a 30-second survey? Click here


Abstract rate limiter for nodejs

Subscribe to updates I use node-ratelimiter

Statistics on node-ratelimiter

Number of watchers on Github 483
Number of open issues 3
Average time to close an issue 2 months
Main language JavaScript
Average time to merge a PR 11 days
Open pull requests 4+
Closed pull requests 3+
Last commit over 2 years ago
Repo Created almost 6 years ago
Repo Last Updated over 1 year ago
Size 43 KB
Organization / Authortj
Page Updated
Do you use node-ratelimiter? Leave a review!
View open issues (3)
View node-ratelimiter activity
View on github
Fresh, new opensource launches 🚀🚀🚀
Trendy new open source projects in your inbox! View examples

Subscribe to our mailing list

Evaluating node-ratelimiter for your project? Score Explanation
Commits Score (?)
Issues & PR Score (?)


Rate limiter for Node.js backed by Redis.

Build Status

Release Notes

v3.0.2 - #33 by @promag - Use sorted set to limit with moving window.

v2.2.0 - #30 by @kp96 - Race condition when using async.times.

v2.1.3 - #22 by @coderhaoxin - Dev dependencies versions bump.

v2.1.2 - #17 by @waleedsamy - Add Travis CI support.

v2.1.1 - #13 by @kwizzn - Fixes out-of-sync TTLs after running decr().

v2.1.0 - #12 by @luin - Adding support for ioredis.

v2.0.1 - #9 by @ruimarinho - Update redis commands to use array notation.

v2.0.0 - API CHANGE - Change remaining to include current call instead of decreasing it. Decreasing caused an off-by-one problem and caller could not distinguish between last legit call and a rejected call.


  • Redis 2.6.12+.


$ npm install ratelimiter


Example Connect middleware implementation limiting against a user._id:

var id = req.user._id;
var limit = new Limiter({ id: id, db: db });
limit.get(function(err, limit){
  if (err) return next(err);

  res.set('X-RateLimit-Remaining', limit.remaining - 1);
  res.set('X-RateLimit-Reset', limit.reset);

  // all good
  debug('remaining %s/%s %s', limit.remaining - 1,, id);
  if (limit.remaining) return next();

  // not good
  var delta = (limit.reset * 1000) - | 0;
  var after = limit.reset - ( / 1000) | 0;
  res.set('Retry-After', after);
  res.send(429, 'Rate limit exceeded, retry in ' + ms(delta, { long: true }));

Result Object

  • total - max value
  • remaining - number of calls left in current duration without decreasing current get
  • reset - time in milliseconds until the end of current duration


  • id - the identifier to limit against (typically a user id)
  • db - redis connection instance
  • max - max requests within duration [2500]
  • duration - of limit in milliseconds [3600000]



node-ratelimiter open issues Ask a question     (View All Issues)
  • about 3 years TTL instead of multiple keys.
node-ratelimiter open pull requests (View All Pulls)
  • [RFR] ES6 and adapters
  • reset limiter manually
  • Using one key now.
  • Feature PR: ES6 + Promise
node-ratelimiter list of languages used
Other projects in JavaScript