Resendは開発者向けに構築されたEメールAPIです。1つのPOSTリクエストと1つのJSONボディで、トランザクションEメールが送信されます。すべてのリクエストにはAPIキーが必要であり、そのキーの作成方法によって、漏洩した場合の被害の大きさが決まります。このガイドでは、サインアップ、送信ドメインの検証(または組み込みのテストアドレスの利用)、適切なパーミッションスコープを持つキーの作成、そしてcurl、Node、Pythonを使った最初のEメール送信まで、一通りの手順を説明します。また、キーをApidogに保存することで、シークレットをシェルに貼り付けることなくエンドポイントをテストできます。
APIが送信以外に何をするかについて全体像を知りたい場合は、Resend API初心者ガイドを参照してください。以下の内容はすべてResend公式ドキュメントと照合済みであるため、数値やエラー文字列は実際に見るものと一致します。
始める前に必要なもの
- Resendアカウント。無料プランでこのチュートリアルには十分です。
- 管理しているドメイン。手元にない場合は、テストアドレスで最初の送信をカバーできます。
- マシンにインストールされたcurl、さらにSDKの例を試したい場合はNode.jsまたはPython。
- テストセクションに従う場合は、Apidogがインストールされていること。
ステップ1:Resendアカウントを作成する
resend.comでサインアップし、Eメールを確認してください。サインアップしたアドレスをメモしておきましょう。ドメインを検証するまでは、ResendがテストEメールを送信できる唯一の受信箱であり、これを忘れると初日に最も混乱する403エラーが発生します。
ステップ2:送信ドメインを検証するか、テストアドレスを使用する
2つのルートがあります。まずは簡単な方から始めましょう。
ルートA:オンボーディングテストアドレス。 Resendでは、設定なしでonboarding@resend.devから送信できます。ただし、受信者はあなた自身のアカウントEメールである必要があります。それ以外の誰かに送信すると、APIは「テストEメールはあなた自身のEメールアドレスにのみ送信できます」というメッセージとともに403を返します。
ルートB:独自のドメイン。 実際に使用する場合は、ダッシュボードの「Domains」の下にドメインを追加します。Resendは、ルートドメインではなくnotifications.example.comのようなサブドメインを推奨しています。これにより、製品の送信評価が会社のメールと分離されます。受信者に最も近いリージョンを選択し、Resendが生成するDNSレコードをDNSプロバイダーにコピーしてください。ドキュメントには「DKIMおよびSPF設定(TXTおよびMXまたはCNAMEレコード)」と記載されています。Return-Pathのサブドメインはデフォルトでsend.example.comです。

検証は通常15分以内に完了しますが、DNS伝播には最大72時間かかる場合があります。停止した場合は、次の2つの典型的な原因を確認してください。sendサブドメインではなくルートにレコードが配置されていること、そしてCloudflareのプロキシ(クラウドアイコンはオレンジではなくグレーでなければなりません)です。レコードを修正し、「Restart verification」をクリックしてください。その後、DMARCレコードを追加してください。これは送信には必須ではありませんが、受信箱プロバイダーはこれを評価します。
ステップ3:適切なスコープでAPIキーを作成する
ダッシュボードでAPIキーページを開き、「Create API Key」をクリックします。3つの重要なフィールドがあります。これらはAPIキーの作成ドキュメントでそれぞれ説明されています。
- 名前。 最大50文字。後でキーを区別しやすいように、
billing-service-prodのようにアプリと環境のために名前を付けます。 - パーミッション。 「Full access」は、ドメインや他のAPIキーを含むあらゆるリソースの作成、削除、取得、更新ができます。「Sending access」はEメールの送信のみができます。デプロイするすべてのものには送信アクセスを選択してください。フルアクセスキーはあなたのラップトップ上にあるか、あるいはどこにもないべきです。
- ドメイン。 送信アクセスでは、キーを1つの検証済みドメインに制限できます。
notifications.example.comにスコープされたキーはbilling.example.comから送信できず、これにより情報漏洩時の被害範囲を制限できます。

Resendはキーを一度だけ表示します。それはre_で始まり、ダイアログを閉じるとキーの名前は変更できますが、二度と表示することはできません。環境変数に直接コピーしてください。
export RESEND_API_KEY="re_xxxxxxxxx"
Resend自身のガイダンス:キーは期限切れにならないため、90日以内またはそれよりも早くローテーションしてください。ダッシュボードは30日間使用されていないキーにフラグを立てます。キーが漏洩した場合は、次のローテーションを待つのではなく、直ちに削除してください。re_文字列をgitにコミットすることが最も一般的な漏洩経路であるため、最初のプッシュの前にリポジトリでシークレットスキャナーを実行してください。
POST https://api.resend.com/api-keysを使用してキーを生成することもできます。この際、name、permission(full_accessまたはsending_access)、およびオプションのdomain_idを渡します。この呼び出しにはフルアクセスキーが必要であり、これがフルアクセスキーを1つだけ保持すべきもう一つの理由です。
ステップ4:最初のEメールを送信する
送信エンドポイントはPOST https://api.resend.com/emailsです。認証はAuthorizationヘッダー内のBearerトークンであり、ボディはJSONで、HTTPSのみが受け入れられます。必須フィールドはfrom、to、subjectの3つです。html、text、またはその両方を追加します。htmlのみを送信した場合、Resendはプレーンテキスト部分を生成します。toは文字列または最大50のアドレスの配列を受け入れます。完全なパラメータリストはEメール送信リファレンスにあります。
curl
curl -X POST 'https://api.resend.com/emails' \
-H "Authorization: Bearer $RESEND_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"from": "Acme <onboarding@resend.dev>",
"to": ["you@yourcompany.com"],
"subject": "First Resend email",
"html": "<p>Your Resend key works.</p>"
}'
成功した呼び出しは{"id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794"}を返します。1つの注意点として、すべてのリクエストにはUser-Agentヘッダーが必要であり、そうでない場合、APIはコード1010で403を返します。curlとSDKはこれを設定しますが、エッジランタイムで手動で作成されたクライアントはそうでない場合があります。
Node.js
npm install resend
import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);
const { data, error } = await resend.emails.send({
from: 'Acme <notifications@example.com>',
to: ['you@yourcompany.com'],
subject: 'First Resend email',
html: '<p>Your Resend key works.</p>',
});
if (error) {
console.error(error);
} else {
console.log(data.id);
}
Node SDKはAPIエラーに対して例外をスローしません。{ data, error }を返すため、data.idにアクセスする前にerrorを確認してください。
Python
pip install resend
import os
import resend
from resend.exceptions import ResendError
resend.api_key = os.environ["RESEND_API_KEY"]
params: resend.Emails.SendParams = {
"from": "Acme <notifications@example.com>",
"to": ["you@yourcompany.com"],
"subject": "First Resend email",
"html": "<p>Your Resend key works.</p>",
}
try:
email = resend.Emails.send(params)
print(email["id"])
except ResendError as err:
print(err)
Python SDKは逆で、失敗時にResendErrorを発生させるため、送信をtry/exceptで囲んでください。
ステップ5:Apidogにキーを保存し、テストする
Curlはキーが一度機能することを証明します。Apidogは、その一度限りの作業をチームが再実行できるものに変え、キーをシェル履歴やチャットログから保護します。
キーをシークレット変数として保存する。 「Resend」という環境を作成し、RESEND_API_KEYを変数として追加し、シークレットとしてマークします。これにより、UIで値がマスクされ、エクスポートから除外されます。環境とシークレット変数ガイドでは、環境ごとに異なる送信専用キーを保持する場合の開発、ステージング、本番環境の分割について説明しています(そうすべきです)。
リクエストを送信する。 https://api.resend.com/emailsへのPOSTリクエストを作成し、Authを{{RESEND_API_KEY}}を含むBearer Tokenに設定し、curlの例からJSONボディを貼り付けます。「Send」をクリックしてください。idは、後述のレート制限ヘッダーの隣にある応答パネルに表示されます。
テストとして保存する。 2つのアサーションを追加します:ステータスが200であること、および$.idが存在すること。リクエストをテストシナリオに組み込むと、誰かがEメールコードを触るたびに実行されるスモークテストができます。ドメイン制限付きの送信キーでステージングを指すようにすれば、CIから安全に実行できます。
フロントエンド作業のためにエンドポイントをモックする。 フロントエンドが必要とするのは、実際の送信ではなく応答の形式です。Apidogでエンドポイントをモックし、すべての呼び出しで{"id": "mock-email-id"}を返すようにします。これにより、UIチームは1日100通の無料枠に触れたり、実際の受信箱をスパムにしたりすることなく、「Eメール送信済み」の状態を一日中構築できます。Apidogをダウンロードしてこれを設定してください。無料プランは4ユーザーをカバーします。
まず遭遇する無料枠の制限
Resendの料金ページによると、無料プランは月3,000通のEメール(1日あたり100通の上限あり)、3つのドメイン、30日間のデータ保持が可能です。Proプランは月額20ドルからで、50,000通のEメール、10ドメイン、日ごとの制限なし、超過分は1,000通あたり0.90ドルです。
resend.devアドレスへのテストEメールもこれらのクォータにカウントされるため、delivered@resend.devを対象としたロードテストでも、1日の100通を消費します。bounced@resend.dev、complained@resend.dev、suppressed@resend.devは、実際の不正なアドレスを使わずに、ハードバウンス、スパム報告、配信停止された受信者をシミュレートします。
クォータとは別に、レート制限はチームあたり秒間10リクエストがデフォルトであり、チーム内のすべてのキーで共有されます。各レスポンスにはratelimit-limit、ratelimit-remaining、ratelimit-reset、retry-afterヘッダーが含まれるため、送信ループは429エラーに達する前にバックオフできます。さらに必要ですか?Resendは、追加のチームを作成するのではなく、サポートに連絡するよう求めています。
よくあるエラーとその対処法
すべての失敗は、statusCode、name、messageを含むJSONとして返されます。これらは、エラーリファレンスから、初日に遭遇するであろうものです。
| ステータス | 名前 | 発生した事象 | 対処法 |
|---|---|---|---|
| 401 | missing_api_key |
Authorizationヘッダーがない |
Authorization: Bearer re_...を追加する |
| 401 | restricted_api_key |
送信専用キーが非送信エンドポイントで使用された | その呼び出しにはフルアクセスキーを使用する |
| 403 | validation_error |
「ドメインが検証されていません」 | DNS検証を完了するか、fromアドレスを修正する |
| 403 | validation_error |
テストアドレスがあなた以外に送信された | あなたのアカウントEメールに送信するか、ドメインを検証する |
| 403 | restricted_api_key |
「APIキーがアクティブではありません」 | キーが削除されたため、新しいものを作成する |
| 422 | missing_required_field |
from、to、またはsubjectが不足している |
リファレンスとボディを照合する |
| 429 | rate_limit_exceeded |
1秒あたり10リクエストを超過した | 送信をキューに入れ、retry-afterを尊重する |
| 429 | daily_quota_exceeded |
無料プランで1日の100通を超過した | リセットを待つか、アップグレードする |
正しいと確信しているキーで401エラーが発生する場合、通常は変数に末尾の改行があるか、.envファイルがロードされていないことを意味します。どちらもAPI側から見るとキーが欠落しているように見えます。
よくある質問
ResendのAPIキーは作成後に再度表示できますか?
いいえ。Resendは作成時に一度だけ値を表示します。失くした場合は、同じ名前とパーミッションで新しいキーを作成し、デプロイしてから古いものを削除してください。
フルアクセスと送信アクセス、どちらを選ぶべきですか?
マシンから離れるすべてのキーに対しては、1つのドメインに制限された送信アクセスを選択してください。ドメインの追加や他のキーの作成といったダッシュボード操作のためにフルアクセスキーを1つ保持し、アプリに含めて出荷することは絶対に避けてください。
ドメインを検証せずに送信をテストできますか?
はい、できます。fromアドレスとしてonboarding@resend.devを、受信者としてあなた自身のアカウントEメールを使用してください。ドメインが検証されるまでは、他の受信者への送信は403エラーを返します。
ダッシュボードではなく、ターミナルからResendを管理する方法はありますか?
はい、あります。Resend CLIチュートリアルでは、ブラウザを開かずにそれをインストールし、一般的なドメインおよびEメールコマンドを実行する方法を説明しています。
無料プランで1日の100通を超過するとどうなりますか?
APIはdaily_quota_exceededとともに429エラーを返し、毎日のリセット後に送信が再開されます。定期的にそれ以上の数が必要な場合は、Proプランで上限が解除されます。無料EメールAPIのまとめでは、他のプロバイダーの無料枠がどのように比較されるかを示しています。
まとめ
ResendのAPIキーを取得するのに2分、正しく設定するのに5分かかります。サブドメインを検証し、そのドメインにロックされた送信専用キーを作成し、環境変数に保持し、curlで1通のEメールを送信して往復を確認します。その後、リクエストをApidogに移動し、アサーションを保存し、エンドポイントをモックすることで、残りのチームがクォータを消費することなくそれに対して構築できるようにします。それでも機能する最も権限の低いキーを出荷しましょう。
