beholdr/laravel-backoff-limiter

Rate limiter with exponential backoff for Laravel.
6,492 2
Install
composer require beholdr/laravel-backoff-limiter
Latest Version:v0.1.3
PHP:^8.1
Laravel:10 – 13
License:MIT
Last Updated:Apr 2, 2026
Links: GitHub  ·  Packagist
Maintainer: beholdr

Backoff Limiter

Latest Version on Packagist

Rate limiter with exponential backoff for Laravel.

Imagine that you want to verify your customer's phone number by sending an SMS code. But sending SMS is expensive and you don't want to allow too many requests. Laravel has RateLimiter class, but it is very simple. Let's say you accept 1 attempt per minute, but this allows some unfriendly person to send 1 SMS every minute without any penalties.

Using BackoffLimiter class you can increase backoff exponentially with every attempt. For example, first retry will be available in 1 minute, second in 4 minutes, third in 9 minutes etc. Backoff time is determined by the formula:

backoff_time = decay_time * attempts ^ exponent

Support

Do you like Backoff Limiter? Please support me via Boosty.

Installation

You can install the package via composer:

composer require beholdr/laravel-backoff-limiter

Usage

You can use this package as default RateLimiter class:

use Beholdr\BackoffLimiter\BackoffLimiter;

$executed = app(BackoffLimiter::class)->attempt(
    'send-sms-'.request()->ip(),
    maxAttempts: 1,
    function () {
        // Send SMS
    }
)

if (! $executed) {
    throw new Exception('Too many requests!');
}

Or you can manually control attempts:

use Beholdr\BackoffLimiter\BackoffLimiter;

$limiter = app(BackoffLimiter::class);
$key = 'send-sms-'.request()->ip();

if ($limiter->tooManyAttempts($key, 1)) {
    throw new Exception('Too many requests!');
}

$limiter->hit($key)

// Send SMS

You can set up:

  • Backoff window: the time interval during which attempts are counted. Default is 1 hour
  • Exponent: determine backoff time duration. Default is 2

To set custom values pass your values at class creation:

$limiter = app(BackoffLimiter::class, ['backoff' => 3*60*60, 'exponent' => 3]);
$limiter->hit(...);

Testing

composer test

License

The MIT License (MIT). Please see License File for more information.

Related Packages

deboorn/expbackoffworker

Adds automatic exponential backoff to Laravel 5's queue worker

25,969 7
aporat/laravel-rate-limiter

Redis-backed, multi-window rate limiting middleware and limiter for Laravel

2,844 4
milenmk/laravel-rate-limiting

Advanced rate limiting package for Laravel with exponential backoff, custom mess...

2,151 10
hedii/laravel-throttle-route

A Laravel package to throttle requests based on route name

61,880 0
amiiiiink/laravel-rate-limiter

A flexible rate limiting middleware for Laravel and Lumen applications

4 1

Version History

Version Released PHP Laravel License
v0.1.3 ^8.1 ^10.0 || ^11.0 || ^12.0 || ^13.0 MIT
v0.1.2 ^8.1 ^10.0 || ^11.0 || ^12.0 MIT
v0.1.1 ^8.1 ^10.0 || ^11.0 MIT
v0.1.0 ^8.1 ^10.0 MIT