Webhook

変化を、起きた瞬間に知る。

承認と配信の出来事が、起きたその場でエンドポイントに届きます。署名あり、リトライあり、順序も保たれます — イベント7種、いま動いています。

配信はすでに稼働しています。 エンドポイントを登録し、7種のイベントから選ぶだけ。untactit はタイムスタンプと本文をまとめて HMAC-SHA256 で署名します。少なくとも1回の配信を保証し、失敗すれば最大24時間、間隔を広げながら再試行。48時間続けて失敗すると自動で停止します。エンドポイントは https のみ、プライベート・ループバックのアドレスは登録時と送信時の二度はじきます。

プッシュか、プルか

合うほうを選べば大丈夫です。

秒単位で反応する必要があるなら、ウェブフックが向いています — 配信の取り消し、担当者の呼び出し、ずれを検知した瞬間のチケット起票など。

夜間のコンプライアンス同期やダッシュボードの更新程度なら、監査ログを定期的に取りに行くやり方で十分です。実行者・アクション・期間で検索でき、ウェブフックと併用しても損はありません。

監査ログとエクスポート

イベント7種

asset.proposed
編集者が承認を申請した
asset.approved
承認者が承認し、資産が有効になった
asset.rejected
コメント付きで差し戻された
deployment.completed
全ターゲットで確認完了
deployment.failed
1 つ以上のターゲットが拒否した
drift.detected
ローカルコピーが承認済みの内容から乖離した
member.role_changed
管理者がロールを付与または取り消した

確定済みの設計

署名付きで、リプレイにも安全。

すべてのリクエストには X-Untactit-Signature (生のリクエストボディの HMAC-SHA256)と、タイムスタンプが付与されます。必ず両方を検証してください。署名は untactit からの送信であることを証明し、タイムスタンプは古いリクエストのリプレイを防ぎます。

  • ✓5 分より古いタイムスタンプは拒否
  • ✓署名の比較は定数時間で行います。次の演算子は使用しないでください: ==
  • ✓エンドポイントはワークスペースあたり最大 5 件
verify.py
import hmac, hashlib, time

def verify(body: bytes, sig: str, ts: str, secret: str) -> bool:
    if abs(time.time() - int(ts)) > 300:      # 5 min
        return False
    expected = hmac.new(
        secret.encode(), ts.encode() + b"." + body,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, sig)

送信の保証

At-least-once

2xx が返るまで再送を続けるため、同じイベントが 2 回届くことがあります。重複排除には idを使ってください。再送は指数バックオフで間隔を広げながら、最大 24 時間続きます。

ワークスペース単位で順序保証

A sequence フィールドは単調増加します。48215 の後に 48213 を受信した場合、それは遅延した再送であり、破棄して構いません。

48 時間で無効化

2 日間連続で失敗し続けたエンドポイントは無効化され、ワークスペースの管理者へメールで通知されます。1 回の試行あたりのタイムアウトは 10 秒です。

エージェントが何で動いているのか。推測は、もう終わり。

ワークスペースをひとつ接続するだけで、チームで動いているスキル・ルール・メモリの全体が見えます。所要はおよそ10分です。

無料で始める→ 相談する

クレジットカードは不要です。いまお使いのツールのままで動きます。