Aller au contenu

Migrer depuis Resend

SpacePost implémente l’API Resend : mêmes chemins, mêmes noms de champs, mêmes formats de réponse et même format d’erreur. La plupart des applications migrent en changeant une URL de base et une clé API.

  1. Créez une clé API SpacePost dans le tableau de bord. Les clés SpacePost commencent par sp_live_ (les clés Resend commencent par re_).

  2. Ajoutez et vérifiez votre domaine dans SpacePost. Les enregistrements DNS diffèrent de ceux de Resend : ajoutez donc les nouveaux CNAME DKIM et les enregistrements MX/TXT de send. Vous pouvez laisser en place les enregistrements de Resend pendant la bascule, car les sélecteurs DKIM n’entrent pas en collision. Voir Ajouter et vérifier. Ne déplacez votre politique SPF/DMARC que si vous avez changé le sous-domaine send.

  3. Changez de client. Choisissez l’une des options ci-dessous.

    Gardez le paquet officiel resend. Définissez l’URL de base avec une variable d’environnement et utilisez votre clé 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 passez-la dans le code :

    const resend = new Resend("sp_live_YOUR_API_KEY", { baseUrl: "https://api.spacepost.dev" });
  4. Recréez vos webhooks. Créez de nouveau chaque endpoint dans SpacePost (POST /webhooks) et conservez le nouveau signing_secret. Le code de vérification écrit pour Resend ou Svix continue de fonctionner, car SpacePost envoie les mêmes en-têtes Standard Webhooks (plus des doublons svix-*). Voir Vérifier les signatures.

  5. Déplacez les audiences et les contacts. Créez les audiences et importez les contacts via POST /audiences/{id}/contacts. Les placeholders comme {{{FIRST_NAME|fallback}}} et {{{RESEND_UNSUBSCRIBE_URL}}} fonctionnent sans changement dans les campagnes.

  6. Envoyez un test, puis basculez. Envoyez à delivered@test.spacepost.dev, vérifiez que le webhook arrive, puis déployez.

Fonctionnalité Resend SpacePost Remarques
POST /emails Pris en charge to/cc/bcc/reply_to jusqu’à 50 chacun ; les alias camelCase replyTo, scheduledAt sont acceptés
POST /emails/batch Pris en charge Jusqu’à 100 e-mails ; pièces jointes et scheduled_at autorisés par e-mail ; tout ou rien
GET /emails/{id}, GET /emails Pris en charge La liste omet les corps
PATCH /emails/{id} Pris en charge Replanifie les e-mails planifiés
POST /emails/{id}/cancel Pris en charge E-mails planifiés uniquement
Pièces jointes (content, path) Pris en charge path doit être en https
Tags, en-têtes personnalisés Pris en charge Mêmes contraintes sur les caractères des tags
Idempotency-Key Pris en charge 24 heures, POST /emails et /emails/batch
Domaines (create, get, list, verify, update, delete) Pris en charge open_tracking, click_tracking
Clés API Pris en charge full_access, sending_access, domain_id optionnel
Webhooks, signature Standard Webhooks Pris en charge Également les en-têtes svix-*
Audiences, contacts, campagnes Pris en charge Les contacts se trouvent sous /audiences/{id}/contacts
API Suppressions Pris en charge En plus : lister, ajouter et retirer des entrées
Tenants (mode plateforme) SpacePost uniquement Réputation isolée par client ; voir Mode plateforme. Le SDK Resend supprime tenant_id ; utilisez resend.post ou des domaines appartenant au tenant
Relais SMTP Pris en charge smtp.spacepost.dev:25976 avec STARTTLS (pas encore de TLS implicite sur 465)
E-mail entrant Pas encore
Éditeur de modèles Pas encore Utilisez React Email ou votre propre HTML
  • Valeurs de last_event. Toutes les valeurs de Resend (queued, scheduled, sent, delivered, delivery_delayed, bounced, complained, opened, clicked, canceled, failed) sont présentes. SpacePost ajoute suppressed, utilisée lorsque tous les destinataires figuraient dans votre liste de suppression. Le statut ne revient jamais en arrière : un événement opened qui arrive avant delivered conserve l’état le plus récent.
  • Événement de webhook supplémentaire. email.suppressed se déclenche lorsqu’un destinataire est ignoré parce qu’il est supprimé. Abonnez-vous uniquement aux événements que vous traitez. Les payloads sont par ailleurs identiques à ceux de Resend ; data.tenant_id est ajouté pour les e-mails de tenant.
  • Limite de débit. 10 requêtes par seconde et par équipe (25 sur Scale) contre 2 chez Resend, avec les mêmes en-têtes ratelimit-*.
  • Tarifs. Pro coûte 9 € pour 50 000 e-mails, avec 0,25 € par tranche supplémentaire de 1 000, facturés en EUR hors TVA (Resend Pro : 20 USD avec 0,90 USD par tranche supplémentaire de 1 000, prix de Resend en USD au 23 octobre 2026). Après les 7 premiers jours, chaque forfait, Free compris, a un plafond quotidien qui augmente avec vos envois : le plus grand de 1 000 et du double de votre meilleure journée des 14 derniers jours, dans la limite de 50 000 par jour. Voir Forfaits et quotas.
  • Ce qui compte comme un e-mail. Chaque destinataire compte : un e-mail à 3 destinataires (to, cc et bcc confondus) compte pour 3 dans votre quota.
  • Expéditeur de test. onboarding@test.spacepost.dev remplace onboarding@resend.dev. Les boîtes de test se trouvent sur test.spacepost.dev au lieu de resend.dev : delivered@, bounced@, complained@, delayed@, plus softbounced@ (SpacePost uniquement).
  • Sandbox des nouveaux comptes. Les 7 premiers jours sont limités à 100 e-mails par jour. Voir Vérification et limites.
  • Mise en pause automatique. Les équipes dont les taux de rebond ou de plainte sont anormaux sont mises en pause automatiquement. Voir Mise en pause automatique.
  • URL de base. https://api.spacepost.dev, avec les chemins à la racine. Un préfixe /v1 est aussi accepté (https://api.spacepost.dev/v1/emails).