upstash-ratelimit
Adiciona limites de requisições a APIs e funções. Usa Redis para controlar o acesso e evitar sobrecarga, garantindo estabilidade.
O que ela faz
Esta ferramenta ajuda a controlar quantas vezes um usuário ou sistema pode acessar uma parte específica de um site ou aplicativo em um determinado período. Isso evita que alguém abuse do serviço, fazendo muitas solicitações rapidamente.
Quando usar
- ✓Proteger formulários de contato contra spam.
- ✓Limitar tentativas de login para evitar ataques.
- ✓Controlar o uso de uma API para evitar sobrecarga.
Exemplo do que pedir para a IA
“Quero limitar o acesso à minha página de login para no máximo 5 tentativas por minuto por usuário.”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
A ferramenta usa um banco de dados chamado Redis para contar as solicitações. Cada vez que alguém acessa algo protegido, um contador é atualizado no Redis. Se o contador atingir o limite, o acesso é bloqueado temporariamente.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add sickn33/agentic-awesome-skills --skill upstash-ratelimitOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/upstash-ratelimit/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Upstash Ratelimit
Visão Geral
@upstash/ratelimit implementa limitação de taxa distribuída sobre o Upstash
Redis. Como o estado reside no Redis, cada instância de uma função serverless
ou worker de borda compartilha os mesmos contadores, o que um limitador em memória não
consegue fazer. Ele oferece três algoritmos (janela fixa, janela deslizante, balde de tokens),
chaves por identificador, bloqueio opcional em memória de identificadores já limitados
e análise opcional.
Quando Usar Esta Habilidade
- Use quando o usuário precisar limitar requisições por IP, usuário, chave de API ou tenant entre múltiplas instâncias serverless ou regiões.
- Use ao proteger endpoints de login, cadastro, formulário, webhook ou LLM contra
abusos e retornar
429 Too Many Requests. - Use ao escolher entre janela fixa, janela deslizante e balde de tokens.
- Não use para retentativas/backoff do lado do cliente contra os limites de uma API de terceiros;
veja
api-rate-limit-handler. - Não use para um único processo de longa execução sem estado compartilhado; um limitador em memória é mais simples nesses casos.
Como Funciona
Passo 1: Instalar e configurar
npm install @upstash/ratelimit @upstash/redis
Defina UPSTASH_REDIS_REST_URL e UPSTASH_REDIS_REST_TOKEN no ambiente.
Passo 2: Crie o limitador uma vez, fora do handler
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
export const ratelimit = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.slidingWindow(10, "10 s"), // 10 requests per 10 seconds
prefix: "rl:api",
analytics: true,
});
Construir o limitador no escopo do módulo permite que o cache efêmero embutido evite chamadas ao Redis para identificadores bloqueados.
Passo 3: Chame limit() com um identificador estável
const { success, limit, remaining, reset, pending } = await ratelimit.limit(userId);
success é false quando o identificador excede seu limite. reset é um timestamp Unix
em milissegundos. pending é uma promessa para trabalho em segundo plano
(análise, sincronização multi-região); aguarde-a ou passe-a para waitUntil em runtimes de borda
para que a função não seja congelada antes de ser concluída.
Exemplos
Exemplo 1: Middleware Next.js retornando 429
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
import { NextResponse, type NextRequest } from "next/server";
const ratelimit = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.slidingWindow(20, "1 m"),
});
export async function middleware(request: NextRequest) {
const ip = request.headers.get("x-forwarded-for") ?? "anonymous";
const { success, limit, remaining, reset } = await ratelimit.limit(ip);
if (!success) {
return new NextResponse("Too Many Requests", {
status: 429,
headers: {
"X-RateLimit-Limit": String(limit),
"X-RateLimit-Remaining": String(remaining),
"X-RateLimit-Reset": String(reset),
"Retry-After": String(Math.ceil((reset - Date.now()) / 1000)),
},
});
}
return NextResponse.next();
}
export const config = { matcher: "/api/:path*" };
Exemplo 2: Balde de tokens com limites por plano
const limiters = {
free: new Ratelimit({
redis: Redis.fromEnv(),
prefix: "rl:free",
limiter: Ratelimit.tokenBucket(5, "10 s", 10), // refill 5 per 10 s, burst 10
}),
pro: new Ratelimit({
redis: Redis.fromEnv(),
prefix: "rl:pro",
limiter: Ratelimit.tokenBucket(50, "10 s", 100),
}),
};
const { success } = await limiters[plan].limit(apiKey);
Melhores Práticas
- ✅ Use um identificador estável e de baixa cardinalidade (ID de usuário, chave de API, tenant) onde for possível; recorra ao IP apenas para tráfego anônimo.
- ✅ Defina um
prefixdistinto por endpoint ou plano para que os limites não colidam. - ✅ Retorne os cabeçalhos
Retry-AftereX-RateLimit-*com respostas 429. - ✅ Prefira
slidingWindowpara a maioria das APIs; usetokenBucketquando rajadas curtas forem aceitáveis; usefixedWindowquando o menor custo de Redis for importante. - ❌ Não construa um novo
Ratelimitdentro do manipulador de requisição. - ❌ Não confie que
pendingserá concluído por conta própria em runtimes de borda. - ❌ Não limite a taxa por
x-forwarded-forsem validar que ele é definido pelo seu proxy; clientes podem falsificá-lo caso contrário.
Limitações
- Requer um banco de dados Upstash Redis; não funciona com outros servidores Redis ou sem acesso à rede.
- Cada chamada
limit()é pelo menos uma viagem de ida e volta HTTP para o Redis, portanto, adiciona latência a cada requisição que ela protege.
…
Perguntas frequentes
O que acontece se o limite for atingido?
A pessoa que excedeu o limite receberá uma mensagem de erro (código 429) e não poderá acessar o recurso por um tempo.
Posso definir limites diferentes para usuários diferentes?
Sim, você pode definir limites com base em identificadores únicos como ID de usuário, chave de API ou até mesmo endereço IP.
Preciso ter um servidor especial para usar isso?
Sim, esta ferramenta requer um banco de dados Upstash Redis, que é um serviço separado.
Detalhes
Descrição original do autor
Add rate limiting to API routes, middleware, and edge functions with @upstash/ratelimit: sliding window, fixed window, and token bucket backed by Upstash Redis.
Popularidade
- Estrelas no GitHub
- 48 mil
- Posição no ranking
- #4457
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
00-andruia-consultant
Ajuda seu agente a iniciar ou melhorar projetos de IA. Ele analisa código, sugere ferramentas e cria planos de ação em espanhol.
sickn33/agentic-awesome-skills
007
Faz seu agente realizar auditorias de segurança e modelagem de ameaças. É útil para proteger projetos contra ataques e vulnerabilidades.
sickn33/agentic-awesome-skills
10-andruia-skill-smith
Ajuda seu agente a criar ou melhorar ferramentas de IA. Ele define como as ferramentas funcionam, escreve a documentação e valida a estrutura.
sickn33/agentic-awesome-skills
20-andruia-niche-intelligence
Faz seu agente criar um resumo sobre um setor específico. É útil para entender o contexto, regras, padrões de uso e riscos de um projeto, usando fontes confiáveis.
sickn33/agentic-awesome-skills
Skills parecidas
benchmark
Ajuda seu agente a medir a velocidade e a performance do código. É útil para garantir que as coisas estão rápidas e para encontrar problemas de lentidão.
affaan-m/ECC
content-hash-cache-pattern
Faz seu agente usar hashes de conteúdo para cachear resultados de processamento de arquivos. Isso evita processamento repetido e invalida o cache automaticamente quando o conteúdo muda. Útil para acelerar tarefas lentas.
affaan-m/ECC
parallel-execution-optimizer
Faz seu agente acelerar tarefas complexas dividindo-as em partes menores e executando-as em paralelo. Garante que tudo seja verificado ao final.
affaan-m/ECC