本文へスキップ
spacepost

開発者のためのメールを、 半額で。

AWS SES 上に構築した Resend 互換 API。ベース URL を変えるだけでコードはそのまま、料金も抑えられます。Pro は 5万 通で月 €9(VAT 別)、Resend Pro は USD 20 です。

月 3,000 通まで無料。クレジットカード不要。

SpacePost でメールを送信

import { SpacePost } from "@spacepost/node";

const spacepost = new SpacePost("sp_live_xxxxxxxxxxxx");

const { data, error } = await spacepost.emails.send({
  from: "Acme <hello@acme.com>",
  to: ["ada@example.com"],
  subject: "Your receipt",
  html: "<p>Thanks for your order.</p>",
});
curl -X POST https://api.spacepost.dev/emails \
  -H "Authorization: Bearer sp_live_xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "Acme <hello@acme.com>",
    "to": ["ada@example.com"],
    "subject": "Your receipt",
    "html": "<p>Thanks for your order.</p>"
  }'
import requests

r = requests.post(
    "https://api.spacepost.dev/emails",
    headers={"Authorization": "Bearer sp_live_xxxxxxxxxxxx"},
    json={
        "from": "Acme <hello@acme.com>",
        "to": ["ada@example.com"],
        "subject": "Your receipt",
        "html": "<p>Thanks for your order.</p>",
    },
)
print(r.json())
body := strings.NewReader(`{
  "from": "Acme <hello@acme.com>",
  "to": ["ada@example.com"],
  "subject": "Your receipt",
  "html": "<p>Thanks for your order.</p>"
}`)

req, _ := http.NewRequest("POST", "https://api.spacepost.dev/emails", body)
req.Header.Set("Authorization", "Bearer sp_live_xxxxxxxxxxxx")
req.Header.Set("Content-Type", "application/json")

res, err := http.DefaultClient.Do(req)
<?php
$ch = curl_init("https://api.spacepost.dev/emails");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer sp_live_xxxxxxxxxxxx",
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "from" => "Acme <hello@acme.com>",
        "to" => ["ada@example.com"],
        "subject" => "Your receipt",
        "html" => "<p>Thanks for your order.</p>",
    ]),
]);
$response = curl_exec($ch);
require "net/http"
require "json"

uri = URI("https://api.spacepost.dev/emails")
req = Net::HTTP::Post.new(uri, "Content-Type" => "application/json")
req["Authorization"] = "Bearer sp_live_xxxxxxxxxxxx"
req.body = {
  from: "Acme <hello@acme.com>",
  to: ["ada@example.com"],
  subject: "Your receipt",
  html: "<p>Thanks for your order.</p>"
}.to_json

res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
import nodemailer from "nodemailer";

const transport = nodemailer.createTransport({
  host: "smtp.spacepost.dev",
  port: 25976,
  secure: false, // STARTTLS
  requireTLS: true,
  auth: { user: "spacepost", pass: "sp_live_xxxxxxxxxxxx" },
});

await transport.sendMail({
  from: "Acme <hello@acme.com>",
  to: "ada@example.com",
  subject: "Your receipt",
  html: "<p>Thanks for your order.</p>",
});

リクエストの形式は Resend と同じです。キーはご自身のものに置き換えてください。

EU 拠点

EU の会社です。データは EU 内にとどまります。

SpacePost はスロベニアの Studio 404 d.o.o. が開発・運営しています。メール、ログ、アカウントデータは EU 内で保存・処理され、契約相手は EU の会社です。

EU の会社、EU の契約

Studio 404 d.o.o.(スロベニア)。利用規約と、その一部であるデータ処理契約(DPA)にはスロベニア法が適用されます。

データはフランクフルトとアムステルダム

メールはフランクフルト(eu-central-1)の Amazon SES から送信します。アプリケーション、ワーカー、データベースはアムステルダム(オランダ)の Railway 上で動いています。

ユーロ建て料金、EU の VAT インボイス

料金はユーロ(EUR)建て、VAT 別です。すべての支払いに EUR の VAT インボイスを発行し、有効な VAT 番号を持つ EU の事業者にはリバースチャージを適用します。

GDPR データ処理契約

すべてのお客様に GDPR 第 28 条に基づくデータ処理契約をご用意し、各委託先の所在地を記載したサブプロセッサー一覧を公開しています。

AWS、Stripe、Railway など、一部の委託先は米国企業です。各社の処理内容と所在地はサブプロセッサー一覧に掲載しています。

移行

Resend からの切り替えは 1 行で

リクエストボディ、Webhook ハンドラー、エラー処理はそのまま。ベース URL を SpacePost に向け、キーを差し替えるだけです。

  • 01ドメインを認証します(DKIM の CNAME 3 件)。
  • 02API キーを作成します。
  • 03ベース URL を変更して、デプロイします。
移行ガイドを読む
.env
# .env
- RESEND_BASE_URL=https://api.resend.com
- RESEND_API_KEY=re_xxxxxxxx
+ RESEND_BASE_URL=https://api.spacepost.dev
+ RESEND_API_KEY=sp_live_xxxxxxxx
app.ts
// Option A: keep the Resend SDK, point it at SpacePost
- const resend = new Resend(process.env.RESEND_API_KEY);
+ const resend = new Resend(process.env.SPACEPOST_API_KEY, { baseUrl: "https://api.spacepost.dev" });

// Option B: use the drop-in SDK
- import { Resend } from "resend";
+ import { SpacePost as Resend } from "@spacepost/node";

機能

Resend API のすべてを、学び直しなしで

トランザクション API

POST /emails のパス、リクエストボディ、レスポンス、エラー形式は Resend と同じです。添付ファイル、タグ、カスタムヘッダー、cc/bcc、reply-to に対応しています。

バッチ送信とスケジュール

バッチ呼び出し 1 回で最大 100 通。ISO タイムスタンプや "in 1 hour" で送信日時を指定でき、送信前なら変更やキャンセルもできます。

DKIM、SPF、DMARC に対応したドメイン

CNAME 3 件で設定できる Easy DKIM、カスタム MAIL FROM サブドメイン、DMARC のガイド、ワンクリック認証。各レコードにはコピーボタンも付いています。

署名付き Webhook

9 種類のイベント、Standard Webhooks 署名(Svix 互換)、バックオフ付きリトライ、ダッシュボードからの再送に対応しています。

オーディエンスと一斉配信

コンタクト、オーディエンス、差し込みタグ付きの一斉配信。ワンクリック配信停止(RFC 8058)は自動で追加されます。

SMTP リレー

smtp.spacepost.dev のポート 25976(STARTTLS)を利用できます。ユーザー名は "spacepost"、パスワードは API キーです。Supabase、Auth0、WordPress などで使えます。

冪等性キー

Idempotency-Key ヘッダーを送ると、24 時間以内の再試行では重複メールを送らず、最初のレスポンスを返します。

テストモードの受信箱

test.spacepost.dev のアドレスに送信すると、配信成功、バウンス、苦情の結果をシミュレートできます。実際のメールは外部に送信されません。

開封・クリックのトラッキング

ドメインごとに切り替えられます。イベントはメールのタイムラインと Webhook に表示されます。

毎秒 10 リクエスト

チームごとのレート制限で、ratelimit-* ヘッダーを返します。Resend の 2 から引き上げました。Scale では 25 です。

まだ対応していないもの: 受信メール、テンプレートエディター、マルチリージョン送信。今後の予定をご覧ください。

到達率と信頼性

大切なメールのための、堅実で地味なインフラ

まだ紹介できる顧客ロゴはありません。その代わり、実際の仕組みをお伝えします。

Amazon SES インフラ

メールは eu-central-1(フランクフルト)の Amazon SES から送信されます。自前のメールサーバーは運用しておらず、運用しているふりもしません。

チームごとの評価の分離

各チームに専用の SES テナントを用意するため、ある送信者のリストに問題があっても、停止されるのはその送信者だけです。

自動の送信停止

ハードバウンスと苦情は自動的に送信停止リストへ追加され、送信のたびにすべての宛先を確認します。

SES に届く前のガードレール

バウンス率が 5% を超えるか苦情率が 0.2% を超えると、SES 自身の審査基準よりはるかに早く、チームを自動で一時停止します。

新規アカウントはサンドボックス

新規チームは、最初の 7 日間は認証済みドメインと 1 日 100 通までに制限されます。共有の評価をみんなのためにきれいに保つためです。

透明性のあるステータスページ

インシデントと稼働状況は、サポートチケットの陰に隠さず、ステータスページで公開しています。

暗号化、キーの扱い、保持期間、脆弱性の報告方法。

セキュリティの概要

稼働状況とインシデント: ステータスページ。

開発者向けツール

コード、ターミナル、エージェントから操作できる設計

ターミナル
$ bunx spacepost send \
    --from "Acme <hello@acme.com>" \
    --to ada@example.com \
    --subject "Hello from the CLI" \
    --text "It works."

✓ Queued  email_id=0192f3a4-7c1e-7b6d-9a35-2f0e6f1d8c10
Webhook を検証
import { Webhook } from "standardwebhooks";

const wh = new Webhook(process.env.SPACEPOST_WEBHOOK_SECRET!);
const event = wh.verify(rawBody, {
  "webhook-id": req.headers["webhook-id"],
  "webhook-timestamp": req.headers["webhook-timestamp"],
  "webhook-signature": req.headers["webhook-signature"],
});
  • Node SDK

    @spacepost/node は Resend 互換で、依存関係はゼロ。fetch を使うので、Node、Bun、Deno、エッジランタイムで動きます。

  • CLI

    spacepost send、spacepost domains verify、spacepost logs。macOS、Linux、Windows 向けの単一バイナリで提供します。

  • AI エージェント向け MCP サーバー

    @spacepost/mcp を使うと、Claude、Cursor などのエージェントが stdio 経由でメール送信、ドメイン管理、配信ログの確認を行えます。

  • OpenAPI 3.1 仕様

    完全な仕様から、あらゆる言語の型付きクライアントを生成できます。Postman や Insomnia にもインポートできます。

  • Webhook の検証

    Standard Webhooks のヘッダー(webhook-id、webhook-timestamp、webhook-signature)を使うため、既存の Svix ライブラリでペイロードを検証できます。

料金

無料で始めて、成長したら 1,000 通単位で支払い。

Free

€0 /月

VAT 別

3,000 通を含みます。

Resend Free: USD 0

Pro

€9 /月

VAT 別

50,000 通を含み、超過分は 1,000 通あたり €0.25。

Resend Pro: USD 20

Scale

€35 /月

VAT 別

200,000 通を含み、超過分は 1,000 通あたり €0.20。

Resend Scale: 10万 通で USD 90

料金と料金シミュレーターを見る

FAQ

よくある質問に、率直にお答えします

ほかにご質問があれば、support@spacepost.dev までご連絡ください。

SpacePost は本当に Resend と互換性がありますか?
パス、リクエストとレスポンスの形式、エラー名、ページネーションは Resend の API に合わせているため、多くのアプリではベース URL と API キーを変えるだけで済みます。現在対応している内容と今後の予定は、機能比較をご覧ください。
なぜ安いのですか?
1,000 通あたり約 0.10 USD の Amazon SES を利用し、プロダクトを API に絞っているためです。Pro は 50,000 通で月 €9(VAT 別)、Resend の公開価格は USD 20 です。追加 1,000 通あたりの料金も低く設定しています。
ほかの顧客が問題を起こしたら、自分の評価はどうなりますか?
各チームに専用の SES テナントがあり、評価は別々に管理されます。バウンス率や苦情率が基準を超えると、ガードレールが送信者を自動で一時停止します。専用 IP は Enterprise でご利用いただけます。
データはどこに保存されますか?
送信は AWS eu-central-1(フランクフルト)で行います。アプリケーションとデータベースは Railway の EU リージョン(オランダ、アムステルダム)で動いています。サブプロセッサー一覧をご覧ください。
無料プランの上限を超えたらどうなりますか?
Free プランは月 3,000 通で停止し、気づかないうちに課金されることはありません。Pro へはいつでもアップグレードでき、いつでも解約できます。
マーケティングメールも送れますか?
はい。ただし、配信に同意した相手に限ります。一斉配信にはワンクリック配信停止が自動で付きます。購入またはスクレイピングしたリストは禁止です。利用ポリシーをご覧ください。

5 分で最初のメールを送信

無料アカウントを作成し、ドメインを認証して、API を 1 回呼び出すだけ。クレジットカードは不要です。