Limites de taxa
A API limita as requisições por segundo por equipe (não por chave):
| Plano | Requisições por segundo |
|---|---|
| Free | 10 |
| Pro | 10 |
| Scale | 25 |
| Enterprise | Personalizado |
O limite do Resend é de 2 requisições por segundo. Um lote de até 100 e-mails é uma requisição, então você pode enviar milhares de e-mails por segundo dentro do limite.
Os limites são aplicados em janelas de um segundo. As sessões do painel não têm limite de taxa. As cotas de envio (Planos e cotas) são separadas dos limites de requisições.
Cabeçalhos
Seção intitulada “Cabeçalhos”Toda resposta inclui:
| Cabeçalho | Significado |
|---|---|
ratelimit-limit |
Requisições permitidas por janela (por exemplo, 10). |
ratelimit-remaining |
Requisições restantes na janela atual. |
ratelimit-reset |
Segundos até a janela ser reiniciada (1). |
retry-after |
Somente em 429: segundos a aguardar antes de tentar de novo (1). |
HTTP/1.1 429 Too Many Requestsratelimit-limit: 10ratelimit-remaining: 0ratelimit-reset: 1retry-after: 1
{ "statusCode": 429, "name": "rate_limit_exceeded", "message": "Too many requests. You can only make 10 requests per second." }Tratando o 429
Seção intitulada “Tratando o 429”import { SpacePost, type SendEmailOptions } from "@spacepost/node";
const spacepost = new SpacePost();
async function sendWithRetry(email: SendEmailOptions, key: string, attempts = 5) { for (let i = 0; i < attempts; i++) { const { data, error } = await spacepost.emails.send(email, { idempotencyKey: key }); if (!error) return data; if (error.name !== "rate_limit_exceeded") throw new Error(`${error.name}: ${error.message}`); await new Promise((r) => setTimeout(r, 1000 * (i + 1))); } throw new Error("rate limited");}import time, requests
def post_with_retry(url, headers, json, attempts=5): for _ in range(attempts): r = requests.post(url, headers=headers, json=json, timeout=15) if r.status_code != 429: return r time.sleep(float(r.headers.get("retry-after", 1))) return rReutilize sempre o mesmo Idempotency-Key nas novas tentativas, para que uma requisição que na verdade teve sucesso não seja repetida.
- Prefira lotes a muitos envios individuais.
- Enfileire os envios em um worker em segundo plano e limite a concorrência dele ao seu limite.
- Distribua os jobs de importação (por exemplo, a criação de contatos) em um ritmo constante.