Rate Limits
Rate limits help protect your rrelayer instance from abuse and ensure fair resource usage across different users and operations. rrelayer supports flexible rate limiting configurations that can be applied at different levels.
Overview
rrelayer supports rate limiting for two types of operations:
- Transactions - Creating and sending blockchain transactions
- Signing Operations - Signing messages and typed data (EIP-712)
Rate limits can be configured at multiple levels:
- User Limits - Per-user rate limits (identified by API key or relayer address)
- Per-relayer - Limits specific to each relayer address
- Global - Combined limits across all relayers for a user
- Relayer Limits - Per-relayer address limits (currently in development)
Configuration
Basic Rate Limiting
name: first-rrelayer
description: "my first rrelayer"
api_config:
port: 3000
authentication_username: "${RRELAYER_AUTH_USERNAME}"
authentication_password: "${RRELAYER_AUTH_PASSWORD}"
signing_provider:
aws_kms:
region: "eu-west-1"
networks:
- name: "sepolia_ethereum"
chain_id: 11155111
provider_urls:
- "https://sepolia.gateway.tenderly.co"
block_explorer_url: "https://sepolia.etherscan.io"
max_gas_price_multiplier: 4
gas_bump_blocks_every:
slow: 10
medium: 5
fast: 4
super_fast: 2
rate_limits:
user_limits:
per_relayer:
interval: "minute"
transactions: 10
signing_operations: 20
Complete Rate Limiting Configuration
rate_limits:
user_limits:
per_relayer:
interval: "minute"
transactions: 10 // [!code focus]
signing_operations: 20 // [!code focus]
global:
interval: "minute"
transactions: 100
signing_operations: 200
fallback_to_relayer: true
Advanced Configuration
rate_limits:
user_limits:
# Per-relayer limits (applied to each relayer address individually)
per_relayer:
interval: 'minute'
transactions: 5
signing_operations: 10
# Global limits (applied across all relayers for a user)
global:
interval: 'minute'
transactions: 50
signing_operations: 100
# Whether to fall back to relayer address when no rate limit key is provided
fallback_to_relayer: true
Configuration Options
Rate Limit Intervals
Currently supported interval values:
"minute"
- Per-minute rate limits (60 seconds)"1m"
- Per-minute rate limits (60 seconds)
Note: The current implementation only supports 1-minute intervals. Any interval value defaults to 60 seconds.
User Limits Configuration
Per-Relayer Limits
Limits applied to each relayer address individually:
user_limits:
per_relayer:
interval: 'minute'
transactions: 10 # Max 10 transactions per minute per relayer
signing_operations: 20 # Max 20 signing operations per minute per relayer
Global Limits
Limits applied across all relayers for a user:
user_limits:
global:
interval: 'minute'
transactions: 100 # Max 100 transactions per minute across all relayers
signing_operations: 200 # Max 200 signing operations per minute across all relayers
Fallback Behavior
fallback_to_relayer: true
- Use relayer address as rate limit key when no custom key is providedfallback_to_relayer: false
- Require explicit rate limit key in requests
Rate Limit Identification
Custom Rate Limit Keys
Users can provide custom rate limit keys via the x-rrelayer-rate-limit-key
header:
curl -X POST https://your-rrelayer.com/transactions \
-H "x-rrelayer-rate-limit-key: user-12345" \
-H "Content-Type: application/json" \
-d '{"to": "0x...", "data": "0x..."}'
Automatic Fallback
When fallback_to_relayer: true
and no custom key is provided, rrelayer uses the relayer address as the rate limit key.
Rate Limit Examples
Conservative Limits
rate_limits:
user_limits:
per_relayer:
interval: 'minute'
transactions: 1
signing_operations: 1
global:
interval: 'minute'
transactions: 3
signing_operations: 3
fallback_to_relayer: true
Production Limits
rate_limits:
user_limits:
per_relayer:
interval: 'minute'
transactions: 30
signing_operations: 60
global:
interval: 'minute'
transactions: 500
signing_operations: 1000
fallback_to_relayer: true
High-Volume API
rate_limits:
user_limits:
per_relayer:
interval: 'minute'
transactions: 5
signing_operations: 10
global:
interval: 'minute'
transactions: 200
signing_operations: 400
fallback_to_relayer: false # Require explicit rate limit keys
Rate Limit Responses
Successful Request
When within rate limits, requests proceed normally.
Rate Limit Exceeded
When rate limits are exceeded, rrelayer returns:
{
"error": "Rate limit exceeded for transactions: 11/10 in 60s",
"code": "RATE_LIMIT_EXCEEDED"
}
HTTP Status: 429 Too Many Requests
Optional Configurations
All rate limit configurations are optional:
Minimal Configuration
# No rate limits configured - all requests allowed
rate_limits: {}
Per-Relayer Only
rate_limits:
user_limits:
per_relayer:
interval: 'minute'
transactions: 10
signing_operations: 20
Global Only
rate_limits:
user_limits:
global:
interval: 'minute'
transactions: 100
signing_operations: 200
Best Practices
Setting Appropriate Limits
- Start Conservative: Begin with lower limits and increase based on usage patterns
- Monitor Usage: Track rate limit hits to adjust limits appropriately
- Consider Use Cases: Different applications may need different limit profiles
Recommended Starting Values
Development/Testing:rate_limits:
user_limits:
per_relayer:
interval: 'minute'
transactions: 5
signing_operations: 10
rate_limits:
user_limits:
per_relayer:
interval: 'minute'
transactions: 30
signing_operations: 60
global:
interval: 'minute'
transactions: 500
signing_operations: 1000
Rate Limit Key Strategy
- Use Custom Keys: Implement
x-rrelayer-rate-limit-key
for better user tracking - Unique Per User: Each user should have a unique rate limit key
- Consistent Format: Use consistent key formatting (e.g.,
user-{id}
,api-{key}
)
Monitoring and Alerting
- Track Rate Limit Hits: Monitor how often users hit rate limits
- Alert on Patterns: Set up alerts for unusual rate limit activity
- Adjust Dynamically: Consider adjusting limits based on usage patterns
Troubleshooting
Common Issues
Rate limits too restrictive:- Increase transaction and signing operation limits
- Note: All intervals are currently 1-minute windows
- Ensure users are using appropriate rate limit keys
- Verify
fallback_to_relayer
setting - Check if rate limit keys are properly set in headers
- Confirm rate limit configuration syntax
- Check if global limits are being hit across multiple relayers
- Verify rate limit key consistency across requests
- Review interval configuration (typos in interval names)
Debug Tips
- Check Headers: Ensure
x-rrelayer-rate-limit-key
header is properly set - Monitor Logs: Rate limit violations are logged for debugging
- Test Configuration: Start with high limits and gradually decrease
- Validate Intervals: Ensure interval strings match supported values exactly