Zum Inhalt springen

Migration von Resend

SpacePost implementiert die Resend-API: dieselben Pfade, dieselben Feldnamen, dieselben Antwortformate und dasselbe Fehlerformat. Die meisten Apps migrieren, indem sie eine Basis-URL und einen API-Schlüssel ändern.

  1. Erstelle einen SpacePost-API-Schlüssel im Dashboard. SpacePost-Schlüssel beginnen mit sp_live_ (Resend-Schlüssel beginnen mit re_).

  2. Füge deine Domain in SpacePost hinzu und verifiziere sie. Die DNS-Einträge unterscheiden sich von denen bei Resend. Lege also die neuen DKIM-CNAMEs und die MX/TXT-Einträge für send an. Die Einträge von Resend kannst du während der Umstellung bestehen lassen, weil sich die DKIM-Selektoren nicht überschneiden. Siehe Hinzufügen und verifizieren. Verschiebe deine SPF/DMARC-Richtlinie nur, wenn du die Subdomain send geändert hast.

  3. Stelle den Client um. Wähle eine der folgenden Optionen.

    Behalte das offizielle Paket resend. Setze die Basis-URL über eine Umgebungsvariable und verwende deinen SpacePost-Schlüssel:

    .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>" });

    Oder übergib sie im Code:

    const resend = new Resend("sp_live_YOUR_API_KEY", { baseUrl: "https://api.spacepost.dev" });
  4. Lege deine Webhooks neu an. Erstelle jeden Endpoint in SpacePost erneut (POST /webhooks) und speichere das neue signing_secret. Verifizierungscode, den du für Resend oder Svix geschrieben hast, funktioniert weiter, weil SpacePost dieselben Standard-Webhooks-Header sendet (plus svix-*-Duplikate). Siehe Signaturen prüfen.

  5. Übertrage Zielgruppen und Kontakte. Lege Zielgruppen an und importiere Kontakte über POST /audiences/{id}/contacts. Platzhalter wie {{{FIRST_NAME|fallback}}} und {{{RESEND_UNSUBSCRIBE_URL}}} funktionieren in Kampagnen unverändert.

  6. Sende einen Test und stelle dann um. Sende an delivered@test.spacepost.dev, prüfe, ob der Webhook ankommt, und deploye dann.

Resend-Funktion SpacePost Hinweise
POST /emails Unterstützt to/cc/bcc/reply_to jeweils bis zu 50; die camelCase-Aliase replyTo, scheduledAt werden akzeptiert
POST /emails/batch Unterstützt Bis zu 100 E-Mails; Anhänge und scheduled_at sind pro E-Mail erlaubt; ganz oder gar nicht
GET /emails/{id}, GET /emails Unterstützt Die Liste enthält keine Bodys
PATCH /emails/{id} Unterstützt Geplante E-Mails neu terminieren
POST /emails/{id}/cancel Unterstützt Nur geplante E-Mails
Anhänge (content, path) Unterstützt path muss https sein
Tags, eigene Header Unterstützt Dieselben Einschränkungen für Zeichen in Tags
Idempotency-Key Unterstützt 24 Stunden, POST /emails und /emails/batch
Domains (create, get, list, verify, update, delete) Unterstützt open_tracking, click_tracking
API-Schlüssel Unterstützt full_access, sending_access, optional domain_id
Webhooks, Signierung nach Standard Webhooks Unterstützt Auch svix-*-Header
Zielgruppen, Kontakte, Kampagnen Unterstützt Kontakte liegen unter /audiences/{id}/contacts
Suppressions-API Unterstützt Zusätzlich: Einträge auflisten, hinzufügen und entfernen
Tenants (Plattform-Modus) Nur SpacePost Isolierte Reputation pro Kunde; siehe Plattform-Modus. Das Resend SDK verwirft tenant_id; nutze resend.post oder Domains im Besitz eines Tenants
SMTP-Relay Unterstützt smtp.spacepost.dev:25976 mit STARTTLS (noch kein implizites TLS auf 465)
Eingehende E-Mails Noch nicht
Template-Editor Noch nicht Nutze React Email oder dein eigenes HTML
  • last_event-Werte. Alle Werte von Resend (queued, scheduled, sent, delivered, delivery_delayed, bounced, complained, opened, clicked, canceled, failed) sind vorhanden. SpacePost ergänzt suppressed, das verwendet wird, wenn alle Empfänger auf deiner Sperrliste standen. Der Status geht nie rückwärts: Ein opened-Event, das vor delivered eintrifft, behält den späteren Zustand.
  • Zusätzliches Webhook-Event. email.suppressed wird ausgelöst, wenn ein Empfänger übersprungen wird, weil er gesperrt ist. Abonniere nur die Events, die du verarbeitest. Die Payloads sind ansonsten identisch mit denen von Resend; für Tenant-Mails wird data.tenant_id ergänzt.
  • Rate Limit. 10 Anfragen pro Sekunde und Team (25 bei Scale) gegenüber 2 bei Resend, mit denselben ratelimit-*-Headern.
  • Preise. Pro kostet 9 € für 50.000 E-Mails, jeder zusätzliche Block von 1.000 kostet 0,25 €, abgerechnet in EUR zzgl. USt. (Resend Pro: USD 20, jede zusätzlichen 1.000 USD 0,90; Preise von Resend in USD, Stand 23. Oktober 2026). Nach den ersten 7 Tagen hat jeder Plan, auch Free, ein Tageslimit, das mit deinem Versand wächst: der größere Wert aus 1.000 und dem Doppelten deines besten Tages der letzten 14 Tage, höchstens 50.000 pro Tag. Siehe Pläne und Kontingente.
  • Was als E-Mail zählt. Jeder Empfänger zählt: Eine E-Mail an 3 Empfänger (to, cc und bcc zusammen) zählt mit 3 auf dein Kontingent.
  • Test-Absender. onboarding@test.spacepost.dev ersetzt onboarding@resend.dev. Die Test-Postfächer liegen bei test.spacepost.dev statt resend.dev: delivered@, bounced@, complained@, delayed@ sowie softbounced@ (nur SpacePost).
  • Sandbox für neue Konten. Die ersten 7 Tage sind auf 100 E-Mails pro Tag begrenzt. Siehe Verifizierung und Limits.
  • Automatisches Pausieren. Teams mit auffälligen Bounce- oder Beschwerderaten werden automatisch pausiert. Siehe Automatisches Pausieren.
  • Basis-URL. https://api.spacepost.dev, mit Pfaden im Root. Ein Präfix /v1 wird ebenfalls akzeptiert (https://api.spacepost.dev/v1/emails).