コンテンツにスキップ

Resend からの移行

SpacePost は Resend API を実装しています。パス、フィールド名、レスポンス形式、エラー形式がすべて同じです。ほとんどのアプリは、ベース URL と API キーを変えるだけで移行できます。

  1. ダッシュボードで SpacePost の API キーを作成します。SpacePost のキーは sp_live_ で始まります(Resend のキーは re_ で始まります)。

  2. SpacePost でドメインを追加して検証します。DNS レコードは Resend のものと異なるため、新しい DKIM の CNAME と、send の MX/TXT レコードを追加してください。DKIM セレクターは衝突しないので、切り替えが終わるまで Resend のレコードをそのまま残しておけます。詳しくは追加と検証をご覧ください。SPF/DMARC のポリシーを移す必要があるのは、send サブドメインを変更した場合のみです。

  3. クライアントを切り替えます。 以下のいずれかを選んでください。

    公式の resend パッケージをそのまま使います。環境変数でベース URL を設定し、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>" });

    コード内で渡すこともできます。

    const resend = new Resend("sp_live_YOUR_API_KEY", { baseUrl: "https://api.spacepost.dev" });
  4. Webhook を再作成します。 SpacePost で各エンドポイントを作成し直し(POST /webhooks)、新しい signing_secret を保存してください。SpacePost は同じ Standard Webhooks ヘッダー(加えて svix-* の重複ヘッダー)を送信するため、Resend や Svix 向けに書いた検証コードはそのまま動作します。詳しくは署名の検証をご覧ください。

  5. オーディエンスとコンタクトを移行します。 POST /audiences/{id}/contacts でオーディエンスを作成し、コンタクトをインポートします。{{{FIRST_NAME|fallback}}} や {{{RESEND_UNSUBSCRIBE_URL}}} などのプレースホルダーは、一斉配信でもそのまま使えます。

  6. テスト送信をしてから切り替えます。 delivered@test.spacepost.dev に送信し、Webhook が届くことを確認してからデプロイしてください。

Resend の機能 SpacePost 備考
POST /emails 対応 to/cc/bcc/reply_to はそれぞれ最大 50 件。キャメルケースの別名 replyTo、scheduledAt も受け付けます
POST /emails/batch 対応 最大 100 通。添付ファイルと scheduled_at はメールごとに指定可能。全件成功か全件失敗のどちらかです
GET /emails/{id}, GET /emails 対応 一覧には本文が含まれません
PATCH /emails/{id} 対応 スケジュール済みメールの送信日時を変更します
POST /emails/{id}/cancel 対応 スケジュール済みメールのみ
添付ファイル(content、path) 対応 path は https である必要があります
タグ、カスタムヘッダー 対応 タグに使える文字の制約は同じです
Idempotency-Key 対応 24 時間。POST /emails と /emails/batch
ドメイン(作成、取得、一覧、検証、更新、削除) 対応 open_tracking、click_tracking
API キー 対応 full_access、sending_access、任意の domain_id
Webhook、Standard Webhooks 署名 対応 svix-* ヘッダーも送信します
オーディエンス、コンタクト、一斉配信 対応 コンタクトは /audiences/{id}/contacts の配下にあります
送信停止 API 対応 追加機能: エントリの一覧、追加、削除
テナント(プラットフォームモード) SpacePost のみ 顧客ごとに評判を分離します。プラットフォームモードをご覧ください。Resend SDK は tenant_id を破棄するため、resend.post かテナント所有のドメインを使ってください
SMTP リレー 対応 smtp.spacepost.dev:25976、STARTTLS を使用(465 での暗黙的 TLS はまだ未対応)
受信メール 未対応
テンプレートエディター 未対応 React Email または独自の HTML を使ってください
  • last_event の値。 Resend の値(queued、scheduled、sent、delivered、delivery_delayed、bounced、complained、opened、clicked、canceled、failed)はすべて存在します。SpacePost では、すべての宛先が送信停止リストに載っていた場合に使う suppressed が加わります。ステータスが逆戻りすることはありません。delivered より先に opened イベントが届いても、後の状態が保持されます。
  • 追加の Webhook イベント。 宛先が送信停止中のためスキップされたときに email.suppressed が発火します。処理するイベントだけを購読してください。ペイロードはそれ以外 Resend と同一で、テナントのメールには data.tenant_id が追加されます。
  • レート制限。 チームあたり 1 秒に 10 リクエスト(Scale は 25)で、Resend の 2 より高く、ratelimit-* ヘッダーは同じです。
  • 料金。 Pro は 50,000 通で €9、追加 1,000 通ごとに €0.25 で、EUR 建て、VAT 別で請求します(Resend Pro: USD 20、追加 1,000 通ごとに USD 0.90。2026 年 10 月 23 日時点の Resend の USD 価格)。最初の 7 日間を過ぎると、Free を含むすべてのプランに、送信実績に応じて増える 1 日の上限があります。1,000 通と直近 14 日間で最も多かった日の 2 倍のうち大きいほうで、上限は 1 日 50,000 通です。詳しくはプランとクォータをご覧ください。
  • メール 1 通の数え方。 宛先ごとに 1 通と数えます。3 つの宛先(to、cc、bcc の合計)への 1 通のメールは、クォータを 3 通分消費します。
  • テスト用送信元。 onboarding@resend.dev の代わりに onboarding@test.spacepost.dev を使います。テスト用の受信箱は resend.dev ではなく test.spacepost.dev にあります: delivered@、bounced@、complained@、delayed@、さらに softbounced@(SpacePost のみ)。
  • 新規アカウントのサンドボックス。 最初の 7 日間は 1 日 100 通までに制限されます。詳しくはアカウント認証と送信上限をご覧ください。
  • 自動一時停止。 バウンス率や苦情率が異常なチームは自動的に一時停止されます。詳しくは自動一時停止をご覧ください。
  • ベース URL。 https://api.spacepost.dev で、パスはルート直下です。/v1 プレフィックスも使えます(https://api.spacepost.dev/v1/emails)。