Pular para o conteúdo

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.

  1. Crie uma chave de API do SpacePost no painel. As chaves do SpacePost começam com sp_live_ (as do Resend começam com re_).

  2. 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ínio send.

  3. 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_KEY
    RESEND_BASE_URL=https://api.spacepost.dev
    import { 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" });
  4. Recrie seus webhooks. Crie cada endpoint novamente no SpacePost (POST /webhooks) e guarde o novo signing_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 duplicatas svix-*). Veja Verificar assinaturas.

  5. 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.

  6. 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.

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
  • 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 acrescenta suppressed, usado quando todos os destinatários estavam na sua lista de supressão. O status nunca retrocede: um evento opened que chega antes de delivered manté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.dev substitui onboarding@resend.dev. As caixas de teste ficam em test.spacepost.dev em vez de resend.dev: delivered@, bounced@, complained@, delayed@, além de softbounced@ (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 /v1 também é aceito (https://api.spacepost.dev/v1/emails).