mirror of
https://github.com/supabase/supabase.git
synced 2026-10-06 09:55:06 +03:00
## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? Docs update ## What is the current behavior? The Auth rate-limit table contains stale customization statuses and time windows, omits SMS and Web3 limits, and describes the anonymous sign-in burst incorrectly. ## What is the new behavior? - Aligns documented limits with the current Auth, Studio, and Management API behavior - Documents SMS, Web3, and sign-up/sign-in request limits - Corrects verification, token, MFA, email, and anonymous sign-in details - Updates shared rate-limit values and units used by the docs ## Additional context Validation: - Prettier check - Focused MDX lint - Shared-data TypeScript check - All 16 SharedData references resolve <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Updates** * Refined authentication rate limits with clearer per-minute and per-five-minute windows. * Added rate limits for SMS, password reset requests, and Web3 sign-ups and sign-ins. * Updated sign-in, sign-up, verification, token refresh, MFA, and anonymous sign-in limits, including customizable settings where supported. * Clarified email-sending limits and OTP behavior. * **Documentation** * Updated rate-limit reference tables and guidance on request bucket capacity and sustained traffic. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
87 lines
3.9 KiB
Plaintext
87 lines
3.9 KiB
Plaintext
---
|
|
title: 'Rate limits'
|
|
subtitle: 'Rate limits protect your services from abuse'
|
|
---
|
|
|
|
Supabase Auth enforces rate limits on authentication endpoints to prevent abuse. Some rate limits are customizable, and you can configure them in your project [**Authentication** > **Rate Limits**](/dashboard/project/_/auth/rate-limits).
|
|
|
|
You can also manage rate limits using the Management API:
|
|
|
|
```bash
|
|
# Get your access token from https://supabase.com/dashboard/account/tokens
|
|
export SUPABASE_ACCESS_TOKEN="your-access-token"
|
|
export PROJECT_REF="your-project-ref"
|
|
|
|
# Get current rate limits
|
|
curl -X GET "https://api.supabase.com/v1/projects/$PROJECT_REF/config/auth" \
|
|
-H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" \
|
|
| jq 'to_entries | map(select(.key | startswith("rate_limit_"))) | from_entries'
|
|
|
|
# Update rate limits
|
|
curl -X PATCH "https://api.supabase.com/v1/projects/$PROJECT_REF/config/auth" \
|
|
-H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"rate_limit_anonymous_users": 10,
|
|
"rate_limit_email_sent": 10,
|
|
"rate_limit_sms_sent": 10,
|
|
"rate_limit_verify": 10,
|
|
"rate_limit_token_refresh": 10,
|
|
"rate_limit_otp": 10,
|
|
"rate_limit_web3": 10
|
|
}'
|
|
```
|
|
|
|
## Rate limit behavior
|
|
|
|
Supabase Auth uses a token bucket algorithm for endpoint operations that are limited by IP address.
|
|
|
|
Most buckets have a maximum capacity of 30 requests. When a bucket is full, brief bursts of up to 30 requests can be allowed in a short period. Anonymous sign-ins are an exception: the bucket capacity matches the configured number of anonymous sign-ins per hour. Once a bucket empties, requests are rate limited until tokens refill. The rate limit defines the rate at which the bucket is refilled.
|
|
|
|
This means a client that has been idle will tolerate a brief spike in traffic, but sustained requests above the rate limit are denied. When rate limits are exceeded, a **429 Too Many Requests** error is returned.
|
|
|
|
The table below shows the rate limit quotas and additional details for authentication endpoints.
|
|
|
|
<$Partial path="auth_rate_limits.mdx" />
|
|
|
|
## IP address forwarding
|
|
|
|
By default, Supabase Auth uses the IP address of the client for rate limiting. In certain cases, such as when using server-side frameworks or proxies in front of a project, it may be necessary to forward the end-user IP address to avoid being rate limited based on the address of the server-side client. To use a forwarded IP address for rate limiting in Supabase Auth, set the `Sb-Forwarded-For` header to the end-user IP address and make a request with a [secret API key](/docs/guides/getting-started/api-keys). Publishable API keys and legacy `anon`/`service_role` API keys are not supported.
|
|
|
|
IP address forwarding must be explicitly enabled for new projects. You can enable this feature in your project under the **IP Address Forwarding** section of your project's rate limit settings at [**Authentication** > **Rate Limits**](/dashboard/project/_/auth/rate-limits).
|
|
|
|
You can also enable IP address forwarding using the management API:
|
|
|
|
```bash
|
|
# Get your access token from https://supabase.com/dashboard/account/tokens
|
|
export SUPABASE_ACCESS_TOKEN="your-access-token"
|
|
export PROJECT_REF="your-project-ref"
|
|
|
|
# Update IP address forwarding settings
|
|
curl -X PATCH "https://api.supabase.com/v1/projects/$PROJECT_REF/config/auth" \
|
|
-H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"security_sb_forwarded_for_enabled": true
|
|
}' \
|
|
| jq '.security_sb_forwarded_for_enabled'
|
|
```
|
|
|
|
Once IP address forwarding is enabled, set the `Sb-Forwarded-For` header using the Supabase SDK:
|
|
|
|
```typescript
|
|
import { createServerClient } from '@supabase/ssr'
|
|
|
|
const supabase = createServerClient(
|
|
'https://<your-project-id>.supabase.co',
|
|
'<your-secret-key>', // Key should start with sb_secret
|
|
{
|
|
global: {
|
|
headers: {
|
|
'sb-forwarded-for': request.headers.get('x-forwarded-for'),
|
|
},
|
|
},
|
|
}
|
|
)
|
|
```
|