ブログ · · 約 7 分で
Webhook Admin で最初の Webhook を送るまで(Node)
Webhook Admin に
要点
- 登録・プロジェクト・API キー・顧客と
送信先・送信の 5 つの 手順で、 最初の Webhook が 届きます。 - Node の
送る 側の コードは、 npm の webhookadmin を 使うと、 顧客と 送信先の 作成から 送信と 記録の 確認までで 約 20 行です。 - Free プランは
月 5 万通・1 プロジェクトまで 無料で、 テスト環境の 送信と 送信先への 試し送信は 数えません。
Webhook Admin でwebhookadmin を
手順の全体
- 登録する
- プロジェクトを
作る - API キーを
発行する - 顧客と
送信先を 登録する - 送信する
この
1. 登録
https://app.webhookadmin.com/signup で、
2. プロジェクト
送る
| 環境 | API キー | 送信数 |
|---|---|---|
| 本番 | sk_live_… |
月の |
| テスト | sk_test_… |
数えない |
最初は
3. API キー
管理画面の
| 権限 | できる |
|---|---|
messages:send |
メッセージの |
messages:retry |
送信の |
logs:read |
配信の |
endpoints:write |
送信先の |
consumers:write |
顧客の |
このmessages:send だけを
キーはWEBHOOK_ADMIN_API_KEY を
npm install webhookadmin
export WEBHOOK_ADMIN_API_KEY=sk_test_...4〜5. 顧客と送信先の登録、送信
顧客はexternal_id にexternal_id・イベントの
import { WebhookAdmin } from 'webhookadmin';
const wha = new WebhookAdmin(); // WEBHOOK_ADMIN_API_KEY(sk_test_…)を読む
// 顧客(external_id は自社のサービスでの顧客の ID)
const consumer = await wha.consumers.create({ external_id: 'cus_1024', name: 'Example Inc.' });
// 送信先(secret はこのときだけ返る)
const endpoint = await wha.endpoints.create({
consumer_id: consumer.id,
url: 'https://example.com/webhooks',
event_types: ['invoice.paid'],
});
console.log(endpoint.secret); // whsec_… を受け側に渡す
// 送信(同じ Idempotency-Key は 24 時間、同じメッセージを返す)
const { id } = await wha.messages.send(
{ consumer: 'cus_1024', event_type: 'invoice.paid', payload: { invoice_id: 'inv_88', amount: 128000 } },
{ idempotencyKey: 'inv_88-paid' },
);
// 記録で確かめる
const message = await wha.messages.get(id);
const d = message.deliveries[0];
console.log(d?.status, d?.attempts[0]?.response_status, d?.attempts[0]?.response_head);送信先の
- URL は
https で、 ポートは 443 か 8443 です。 テスト環境でも 同じです。 手元の サーバーで 受ける ときは、 ngrok や cloudflared の トンネルで https の URL を 付けます (ローカルで 試す方法の )記事 。 - IP アドレスを
直接書いた URL、 社内向けの 名前、 社内の アドレスを 指す名前は 登録できません (422) 。 event_typesを省くと、 すべての イベントを 送ります。 secretは作成した ときだけ返ります。 後から 見る ときは 管理画面か、 developer 以上の 権限で 取得します。
送信の202 Accepted と{ id, deliveries } です。deliveries は、external_id のdeliveries は
Idempotency-Key を付ける理由
送信のIdempotency-Key がid を
SDK を使わない書き方
公開 API はfetch からも
const res = await fetch('https://api.webhookadmin.com/v1/messages', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WEBHOOK_ADMIN_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': 'inv_88-paid',
},
body: JSON.stringify({
consumer: 'cus_1024',
event_type: 'invoice.paid',
payload: { invoice_id: 'inv_88', amount: 128000 },
}),
});
console.log(res.status, await res.json()); // 202 { id: 'msg_…', deliveries: 1 }SDK は、retry-after までIdempotency-Key を
配信の記録での確認
届いたかGET /v1/messages/{id} でPOST /v1/deliveries/{id}/retry)
送信先へのPOST /v1/endpoints/{id}/test)webhook.test を
受け側での署名の検証
送信先には、whsec_… を
import express from 'express';
import { Webhook } from 'webhookadmin';
const wh = new Webhook(process.env.WEBHOOK_SECRET!); // whsec_…
const app = express();
// 署名は届いた本文そのもので検証するので、JSON に変換する前の本文を受け取る
app.post('/webhooks', express.raw({ type: 'application/json' }), async (req, res) => {
try {
const event = await wh.verify(req.body, req.headers); // { type, timestamp, data }
console.log(event.type, event.data);
res.sendStatus(204);
} catch {
res.sendStatus(400);
}
});
app.listen(3000);受け側はwebhook-id ヘッダーを
無料の範囲
| 項目 | Free プラン |
|---|---|
| 本番の |
月 5 万通 |
| プロジェクト | 1 つ |
| 配信の |
7 日 |
| 公開 API | 1 分 600 回 |
| テスト環境の |
数えない |
顧客向けの
次に読むもの
- 手順の
詳細: 始め方の登録・プロジェクト・API キー・顧客と 送信先 ・送信・署名の検証 - 送る
側で 作る 物の 全体 : Webhook の 送信を 自作する ときの 全工程 - 署名の
形式の 理由: Standard Webhooks の 仕様と 実装
ここまでの
よくある質問
無料でどこまで使えますか。
Free プランは、
SDK を使わずに送れますか。
送れます。
テスト環境の送信は数えられますか。
数えられません。