Lobsite-Webhooks は、Lobsite が送信する Webhook のユーザーエージェントです。フォームのある Lobsite サイトは、所有者が lobsite.toml で設定した Webhook アドレスに各送信内容を送ることができ、これらのリクエストがその配信です。ログにこれが見られる場合、誰かがフォームの Webhook をあなたのサーバーに向けています。通常は、ご自身の Lobsite サイトからのものです。
リクエストの内容
受け付けられたスパムではないフォーム送信ごとに、JSON 本文を持つ POST が 1 回送られます。
POST /hooks/contact HTTP/1.1
Content-Type: application/json
User-Agent: Lobsite-Webhooks/1
X-Lobsite-Event: form.submission
X-Lobsite-Delivery: dlv_3m9q…
X-Lobsite-Signature: t=1760372438,v1=5257a869…
{
"type": "form.submission",
"id": "sub_8x2k…",
"site": "quiet-fox-4821",
"form": "contact",
"data": { "email": "ana@example.com", "message": "Hi!" },
"created_at": "2026-10-13T16:20:38Z"
}
Webhook が送信されるのは、プライベートネットワークや内部ネットワークに解決されない https:// アドレスのみです。
リクエストが本当に Lobsite からのものか確認する
ユーザーエージェントは偽装できますが、署名は偽装できません。X-Lobsite-Signature にはタイムスタンプ t と v1 があります。後者は、Lobsite ダッシュボードに一度だけ表示されるフォームの Webhook シークレットで計算した "<t>.<raw body>" の 16 進 HMAC-SHA256 です。生の本文から同じ値を計算し、定数時間で比較して、5 分より古い t は拒否してください。
import { createHmac, timingSafeEqual } from "node:crypto";
function verified(secret, header, rawBody) {
const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
return v1?.length === expected.length && timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}
再試行
10 秒以内の 2xx の応答で配信完了とみなします。それ以外は、1 分後、5 分後、30 分後、2 時間後、12 時間後の 5 回再試行します。X-Lobsite-Delivery は再試行の間変わらないため、処理済みの配信はスキップできます。
よくある質問
これらのリクエストを止めるには?
サイトがご自身のものであれば、lobsite.toml のフォームから webhook を削除してデプロイしてください。そうでなければ、エラーで応答してください。各送信は合計 6 回試行された後に破棄されます。それでも続く場合は、X-Lobsite-Delivery の値を添えて不正利用の報告ページから報告してください。調査します。
どのプランで Webhook を送信できますか?
Webhook は Standard プランに含まれます。Free プランのサイトには代わりにメール通知が届きます。フォームのドキュメントをご覧ください。
同じ送信内容が 2 回届くのはなぜですか?
最初にサーバーの応答が遅すぎたかエラーだったため、再試行されました。確認済みの X-Lobsite-Delivery を持つ配信はスキップしてください。