Migrar do Resend
O SpacePost implementa a API do Resend: os mesmos caminhos, os mesmos nomes de campos, os mesmos formatos de resposta e o mesmo formato de erro. A maioria dos apps migra trocando uma URL base e uma chave de API.
-
Crie uma chave de API do SpacePost no painel. As chaves do SpacePost começam com
sp_live_(as do Resend começam comre_). -
Adicione e verifique seu domínio no SpacePost. Os registros DNS são diferentes dos do Resend, então adicione os novos CNAMEs de DKIM e os registros MX/TXT de
send. Você pode manter os registros do Resend no lugar durante a transição, porque os seletores DKIM não colidem. Veja Adicionar e verificar. Mova sua política de SPF/DMARC apenas se você tiver alterado o subdomíniosend. -
Troque o cliente. Escolha uma das opções abaixo.
Mantenha o pacote oficial
resend. Defina a URL base com uma variável de ambiente e use sua chave do SpacePost:.env RESEND_API_KEY=sp_live_YOUR_API_KEYRESEND_BASE_URL=https://api.spacepost.devimport { Resend } from "resend";const resend = new Resend(process.env.RESEND_API_KEY);await resend.emails.send({ from: "Acme <hello@acme.com>", to: "you@example.com", subject: "Hi", html: "<p>Hi</p>" });Ou passe-a no código:
const resend = new Resend("sp_live_YOUR_API_KEY", { baseUrl: "https://api.spacepost.dev" });Troque o import. Os nomes dos métodos e o formato de retorno
{ data, error }são os mesmos.import { Resend } from "resend";const resend = new Resend(process.env.RESEND_API_KEY);import { SpacePost } from "@spacepost/node";const spacepost = new SpacePost(process.env.SPACEPOST_API_KEY);await resend.emails.send({ ... });await spacepost.emails.send({ ... });Troque o host e a chave. Caminhos e corpos de requisição são idênticos.
curl https://api.resend.com/emails -H "Authorization: Bearer re_..."curl https://api.spacepost.dev/emails -H "Authorization: Bearer sp_live_..."Troque o host, a porta e a senha, e use STARTTLS. O usuário
resendé aceito como alias despacepost.Host: smtp.spacepost.dev Port: 25976 (STARTTLS)User: spacepost Password: sp_live_YOUR_API_KEY -
Recrie seus webhooks. Crie cada endpoint novamente no SpacePost (
POST /webhooks) e guarde o novosigning_secret. O código de verificação escrito para o Resend ou o Svix continua funcionando, porque o SpacePost envia os mesmos cabeçalhos do Standard Webhooks (mais duplicatassvix-*). Veja Verificar assinaturas. -
Mova públicos e contatos. Crie públicos e importe contatos por
POST /audiences/{id}/contacts. Placeholders como{{{FIRST_NAME|fallback}}}e{{{RESEND_UNSUBSCRIBE_URL}}}funcionam sem alterações nas campanhas. -
Envie um teste e depois faça a virada. Envie para
delivered@test.spacepost.dev, confirme que o webhook chega e então faça o deploy.
Tabela de paridade
Seção intitulada “Tabela de paridade”| Recurso do Resend | SpacePost | Observações |
|---|---|---|
POST /emails |
Compatível | to/cc/bcc/reply_to com até 50 cada; os aliases em camelCase replyTo e scheduledAt são aceitos |
POST /emails/batch |
Compatível | Até 100 e-mails; anexos e scheduled_at são permitidos por e-mail; tudo ou nada |
GET /emails/{id}, GET /emails |
Compatível | A listagem omite os corpos |
PATCH /emails/{id} |
Compatível | Reagenda e-mails agendados |
POST /emails/{id}/cancel |
Compatível | Somente e-mails agendados |
Anexos (content, path) |
Compatível | path deve ser https |
| Tags, cabeçalhos personalizados | Compatível | As mesmas restrições de caracteres nas tags |
Idempotency-Key |
Compatível | 24 horas, POST /emails e /emails/batch |
| Domínios (criar, obter, listar, verificar, atualizar, excluir) | Compatível | open_tracking, click_tracking |
| Chaves de API | Compatível | full_access, sending_access, domain_id opcional |
| Webhooks, assinatura Standard Webhooks | Compatível | Também os cabeçalhos svix-* |
| Públicos, contatos, campanhas | Compatível | Os contatos ficam em /audiences/{id}/contacts |
| API de supressões | Compatível | Extra: listar, adicionar e remover entradas |
| Tenants (modo plataforma) | Somente no SpacePost | Reputação isolada por cliente; veja Modo plataforma. O SDK do Resend descarta tenant_id; use resend.post ou domínios pertencentes ao tenant |
| Relay SMTP | Compatível | smtp.spacepost.dev:25976 com STARTTLS (ainda sem TLS implícito na 465) |
| E-mail de entrada (inbound) | Ainda não | |
| Editor de templates | Ainda não | Use o React Email ou seu próprio HTML |
Diferenças que você precisa conhecer
Seção intitulada “Diferenças que você precisa conhecer”- Valores de
last_event. Todos os valores do Resend (queued,scheduled,sent,delivered,delivery_delayed,bounced,complained,opened,clicked,canceled,failed) estão presentes. O SpacePost acrescentasuppressed, usado quando todos os destinatários estavam na sua lista de supressão. O status nunca retrocede: um eventoopenedque chega antes dedeliveredmantém o estado mais recente. - Evento de webhook extra.
email.suppressedé disparado quando um destinatário é ignorado por estar suprimido. Assine apenas os eventos que você trata. Fora isso, os payloads são idênticos aos do Resend;data.tenant_idé adicionado para e-mails de tenants. - Limite de taxa. 10 requisições por segundo por equipe (25 no Scale), contra 2 no Resend, com os mesmos cabeçalhos
ratelimit-*. - Preço. O Pro custa € 9 por 50.000 e-mails, com € 0,25 a cada 1.000 extras, cobrado em EUR sem IVA (Resend Pro: USD 20 com USD 0,90 a cada 1.000 extras, preços em USD do Resend em 23 de outubro de 2026). Após os primeiros 7 dias, todos os planos, incluindo o Free, têm um limite diário que cresce com o seu volume de envio: o maior valor entre 1.000 e o dobro do seu melhor dia nos últimos 14 dias, até 50.000 por dia. Veja Planos e cotas.
- O que conta como um e-mail. Cada destinatário conta: um e-mail para 3 destinatários (to, cc e bcc somados) conta 3 na sua cota.
- Remetente de teste.
onboarding@test.spacepost.devsubstituionboarding@resend.dev. As caixas de teste ficam emtest.spacepost.devem vez deresend.dev:delivered@,bounced@,complained@,delayed@, além desoftbounced@(somente no SpacePost). - Sandbox de conta nova. Os primeiros 7 dias são limitados a 100 e-mails por dia. Veja Verificação e limites.
- Pausa automática. Equipes com taxas anormais de rejeição ou de reclamação são pausadas automaticamente. Veja Pausa automática.
- URL base.
https://api.spacepost.dev, com os caminhos na raiz. Um prefixo/v1também é aceito (https://api.spacepost.dev/v1/emails).