curl -X POST 'https://verification.didit.me/v3/webhook/destinations/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"label": "Production session webhooks",
"url": "https://yourapp.com/webhooks/didit",
"webhook_version": "v3",
"subscribed_events": ["status.updated", "data.updated"]
}'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.webhooks.destinations.create(
label="Production session webhooks",
url="https://yourapp.com/webhooks/didit",
webhook_version="v3",
subscribed_events=["status.updated", "data.updated"],
)
print(result)import Didit from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.webhooks.destinations.create({
label: "Production session webhooks",
url: "https://yourapp.com/webhooks/didit",
webhook_version: "v3",
subscribed_events: ["status.updated", "data.updated"],
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.Webhooks.Destinations.Create(ctx, didit.WebhooksDestinationsCreateParams{
Label: "Production session webhooks",
URL: "https://yourapp.com/webhooks/didit",
WebhookVersion: didit.Some(didit.WebhooksDestinationsCreateParamsWebhookVersion("v3")),
SubscribedEvents: didit.Some([]didit.WebhookEvent{didit.WebhookEvent("status.updated"), didit.WebhookEvent("data.updated")}),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)import java.util.List;
import me.didit.Didit;
import me.didit.types.WebhookEvent;
import me.didit.types.WebhooksDestinationsCreateParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.webhooks().destinations().create(WebhooksDestinationsCreateParams.builder()
.label("Production session webhooks")
.url("https://yourapp.com/webhooks/didit")
.webhookVersion(WebhooksDestinationsCreateParams.WebhookVersion.of("v3"))
.subscribedEvents(List.of(WebhookEvent.of("status.updated"), WebhookEvent.of("data.updated")))
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->webhooks->destinations->create([
'label' => 'Production session webhooks',
'url' => 'https://yourapp.com/webhooks/didit',
'webhook_version' => 'v3',
'subscribed_events' => ['status.updated', 'data.updated'],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.webhooks.destinations.create(
label: "Production session webhooks",
url: "https://yourapp.com/webhooks/didit",
webhook_version: "v3",
subscribed_events: ["status.updated", "data.updated"]
)
puts result.to_husing System;
using System.Text.Json;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var result = await client.Webhooks.Destinations.CreateAsync(new WebhooksDestinationsCreateParams
{
Label = "Production session webhooks",
Url = "https://yourapp.com/webhooks/didit",
WebhookVersion = new WebhooksDestinationsCreateParamsWebhookVersion("v3"),
SubscribedEvents = new WebhookEvent[] { "status.updated", "data.updated" },
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"uuid": "11111111-2222-3333-4444-555555555555",
"label": "Production session webhooks",
"url": "https://yourapp.com/webhooks/didit",
"enabled": true,
"webhook_version": "v3",
"secret_shared_key": "tno2NTeRC1ZK3sBOYlBJDyEzBVENl3pQ1AcZyAW0xnQ",
"secret_last4": "0xnQ",
"previous_secret_expires_at": null,
"subscribed_events": [
"status.updated",
"data.updated"
],
"created_by_email": null,
"created_by_name": null,
"created_at": "2026-05-17T10:00:00Z",
"updated_at": "2026-05-17T10:00:00Z",
"health_status": "healthy",
"failing_streak": 0,
"failing_since": null,
"last_success_at": null,
"environment": "live",
"summary": {
"total_deliveries": 0,
"failed_deliveries": 0,
"error_rate_percentage": 0,
"min_response_time_ms": null,
"avg_response_time_ms": null,
"max_response_time_ms": null,
"last_delivery_at": null,
"metrics_window_days": 30
}
}Webhookの送信先作成API
DiditでWebhookの送信先を新規登録するAPIです。バージョン、購読するイベント、送信先ごとの署名シークレットを指定できます。Webhookをプログラムで管理でき、料金は呼び出しごとの従量課金です。
curl -X POST 'https://verification.didit.me/v3/webhook/destinations/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"label": "Production session webhooks",
"url": "https://yourapp.com/webhooks/didit",
"webhook_version": "v3",
"subscribed_events": ["status.updated", "data.updated"]
}'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.webhooks.destinations.create(
label="Production session webhooks",
url="https://yourapp.com/webhooks/didit",
webhook_version="v3",
subscribed_events=["status.updated", "data.updated"],
)
print(result)import Didit from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.webhooks.destinations.create({
label: "Production session webhooks",
url: "https://yourapp.com/webhooks/didit",
webhook_version: "v3",
subscribed_events: ["status.updated", "data.updated"],
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.Webhooks.Destinations.Create(ctx, didit.WebhooksDestinationsCreateParams{
Label: "Production session webhooks",
URL: "https://yourapp.com/webhooks/didit",
WebhookVersion: didit.Some(didit.WebhooksDestinationsCreateParamsWebhookVersion("v3")),
SubscribedEvents: didit.Some([]didit.WebhookEvent{didit.WebhookEvent("status.updated"), didit.WebhookEvent("data.updated")}),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)import java.util.List;
import me.didit.Didit;
import me.didit.types.WebhookEvent;
import me.didit.types.WebhooksDestinationsCreateParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.webhooks().destinations().create(WebhooksDestinationsCreateParams.builder()
.label("Production session webhooks")
.url("https://yourapp.com/webhooks/didit")
.webhookVersion(WebhooksDestinationsCreateParams.WebhookVersion.of("v3"))
.subscribedEvents(List.of(WebhookEvent.of("status.updated"), WebhookEvent.of("data.updated")))
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->webhooks->destinations->create([
'label' => 'Production session webhooks',
'url' => 'https://yourapp.com/webhooks/didit',
'webhook_version' => 'v3',
'subscribed_events' => ['status.updated', 'data.updated'],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.webhooks.destinations.create(
label: "Production session webhooks",
url: "https://yourapp.com/webhooks/didit",
webhook_version: "v3",
subscribed_events: ["status.updated", "data.updated"]
)
puts result.to_husing System;
using System.Text.Json;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var result = await client.Webhooks.Destinations.CreateAsync(new WebhooksDestinationsCreateParams
{
Label = "Production session webhooks",
Url = "https://yourapp.com/webhooks/didit",
WebhookVersion = new WebhooksDestinationsCreateParamsWebhookVersion("v3"),
SubscribedEvents = new WebhookEvent[] { "status.updated", "data.updated" },
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"uuid": "11111111-2222-3333-4444-555555555555",
"label": "Production session webhooks",
"url": "https://yourapp.com/webhooks/didit",
"enabled": true,
"webhook_version": "v3",
"secret_shared_key": "tno2NTeRC1ZK3sBOYlBJDyEzBVENl3pQ1AcZyAW0xnQ",
"secret_last4": "0xnQ",
"previous_secret_expires_at": null,
"subscribed_events": [
"status.updated",
"data.updated"
],
"created_by_email": null,
"created_by_name": null,
"created_at": "2026-05-17T10:00:00Z",
"updated_at": "2026-05-17T10:00:00Z",
"health_status": "healthy",
"failing_streak": 0,
"failing_since": null,
"last_success_at": null,
"environment": "live",
"summary": {
"total_deliveries": 0,
"failed_deliveries": 0,
"error_rate_percentage": 0,
"min_response_time_ms": null,
"avg_response_time_ms": null,
"max_response_time_ms": null,
"last_delivery_at": null,
"metrics_window_days": 30
}
}secret_shared_key、webhook_version、subscribed_eventsリストを持ちます。
subscribed_eventsの仕組み
subscribed_eventsは、イベント名を正確に指定する必須の配列です。Diditは、ペイロードのwebhook_typeが配列内のいずれかの値と一致する場合にのみ、この送信先へWebhookを配信します。
- イベントを少なくとも1つ含めてください。
- 以下に記載されたサポート対象のイベント名のみを使用してください。
- 配信を受けたいイベントをすべて追加してください。
*やallのようなワイルドカード値はありません。 - 製品領域ごとに異なるシステムへ振り分けるには、異なる
subscribed_eventsリストを持つ送信先を複数作成してください。
イベントカタログ
| イベント | 購読が必要なケース |
|---|---|
status.updated | ユーザー認証(KYC)または法人確認 (KYB)のセッションのステータスが変わったとき。KYBのペイロードにはsession_kind: "business"とbusiness_session_idが含まれます。 |
data.updated | 作成後にセッションの検証データが修正または更新されたとき。例として、レビュアーによるKYC、住所証明、KYBデータの編集があります。 |
user.status.updated | Userエンティティのステータスが変わったとき。例:ACTIVE、FLAGGED、BLOCKED。 |
user.data.updated | Userエンティティのプロフィール、カウンター、メタデータ、書類、または集約された検証フィールドが変わったとき。 |
business.status.updated | Businessエンティティのステータスが変わったとき。たとえば、手動レビュー、KYBの結果、ブロックリストのアクションの後です。 |
business.data.updated | Businessエンティティのプロフィール、カウンター、メタデータ、登記フィールド、または集約された検証フィールドが変わったとき。 |
activity.created | subscribed_eventsでは受け付けられ、Try Webhookの対象にもなりますが、現在Diditは本番トラフィックではこのイベントを配信していません。 |
transaction.created | トランザクションモニタリングの取引が作成され、最初のルール評価が完了したとき。 |
transaction.status.updated | ルール、アナリストによるレビュー、是正対応、プロバイダーの更新、またはAPI・コンソールでのアクションの後に取引のステータスが変わったとき。バックグラウンドで再試行された暗号資産スクリーニングが完了したときにも1回送信されます。 |
travel_rule.status.updated | トラベルルールのやり取りのステータスが変わったとき。 |
workflow.compliance_changed | 公開済みワークフローのコンプライアンスステータスが再評価の後に変わったとき。 |
transaction_rule_suggestions.created | ルール提案の実行で新しいルール変更が提案されたとき。 |
investigator.*)およびAuthentication(auth.*)のイベントファミリーも受け付けられます。すべてのイベントとそのペイロードはWebhooksに記載されています。
よく使われる購読の組み合わせ:
{
"subscribed_events": ["status.updated", "data.updated"]
}
{
"subscribed_events": ["transaction.created", "transaction.status.updated"]
}
{
"subscribed_events": [
"user.status.updated",
"user.data.updated",
"business.status.updated",
"business.data.updated",
"activity.created"
]
}
承認
お客様のアプリケーションのAPIキーです。Business ConsoleのDevelopers -> API keysで取得できます。プライマリキーはフルアクセス権を持ちます。名前付きキーにはスコープを設定できます。リソースごとのアクセス権(なし、読み取り、書き込み)、一部のワークフローまたは承認済みセッションへの限定、IPアドレスのリストへの限定、有効期限の設定です。401は、キーが誤っている、失効している、または期限切れであることを意味します。403は、キーが送信されていない、キーにこのリソースやアクションへのアクセス権がない、またはIPリスト外のアドレスからリクエストが送信されたことを意味します。セッションのルートでの404は、セッションがキーのワークフローまたはステータスの対象外であることを意味します。メディアへのアクセス権がないキーでは、画像、動画、PDFのURLがnullで返されます。セッションの書き込み権限がないキーでは、セッションのリンクとトークンがnullで返されます。詳細は次を参照してください: https://docs.didit.me/console/api-keys
ボディ
Console → Webhooksに表示される、人が読める名前。複数の送信先がある場合に区別しやすくなります(例:"Prod"、"Staging mirror")。
255POSTリクエストを受信するHTTPS URL。アプリケーションの送信先の中で一意である必要があります。安定した堅牢なエンドポイントを使用してください。Diditは失敗した配信をバックオフスケジュールに従って再試行します。
2000falseの場合、送信先は保存されますが、DiditはこのWebhookの送信先にWebhookを一切送信しません。保留しておきたいステージング用の設定に便利です。
Diditが送信するペイロードのスキーマバージョン。v3が現在の推奨形式です。旧バージョンは従来の連携との後方互換性のために維持されています。
v1, v2, v3 配信するイベントです。実質的に必須です。明示的な[]は400で拒否され、フィールドを省略すると、サブスクリプションがなく何も受信しない送信先が作成されます。
1サポートされているWebhookイベント名。subscribed_eventsではこれらの文字列を正確に使用してください。サポートされていない値は拒否されます。
status.updated, data.updated, user.status.updated, user.data.updated, business.status.updated, business.data.updated, activity.created, transaction.created, transaction.status.updated, travel_rule.status.updated, workflow.compliance_changed, transaction_rule_suggestions.created, auth.signup, auth.login, auth.login_failed, auth.password_reset_requested, auth.password_reset_completed, auth.mfa_changed, auth.new_device, auth.account_locked, investigator.report.ready, investigator.decision.automated, investigator.decision.overridden, investigator.decision.contested, investigator.question.raised, investigator.automation.paused, investigator.rfi.answered, investigator.rfi.overdue, investigator.drift.detected, investigator.sla.breached, investigator.qa.failed, investigator.external.report.ready ["status.updated", "data.updated"]
レスポンス
送信先が作成されました。secret_shared_keyはHMAC署名用のシークレットです。今すぐ保存してください。
不変の送信先識別子。以降の呼び出しで{destination_uuid}として使用します。
v1, v2, v3 この送信先に紐付けられた、自動生成のHMAC署名シークレット(43文字のURLセーフなトークン)。受信したWebhookの署名ヘッダーの検証に使用します。APIキーで呼び出した場合は常に完全な値が返されます。Consoleユーザーにはread:webhooks権限が必要で、権限がない場合は空文字列が表示されます。
送信先の現在の署名シークレットの末尾4文字。シークレットを区別するために使用します。署名の検証にはこれだけでは不十分です。
このWebhookの送信先のイベントフィルターです。Diditは、イベントタイプがこれらの値のいずれかに完全に一致するWebhookのみを配信します。ワイルドカードによるサブスクリプションはありません。送信する場合、リストには有効なイベントを1つ以上含める必要があります(明示的な[]は400で拒否されます)。リストが空の送信先(作成時にフィールドを省略した場合)は何も受信しません。更新時、リストはマージされず、常に全体が置き換えられます。
1サポートされているWebhookイベント名。subscribed_eventsではこれらの文字列を正確に使用してください。サポートされていない値は拒否されます。
status.updated, data.updated, user.status.updated, user.data.updated, business.status.updated, business.data.updated, activity.created, transaction.created, transaction.status.updated, travel_rule.status.updated, workflow.compliance_changed, transaction_rule_suggestions.created, auth.signup, auth.login, auth.login_failed, auth.password_reset_requested, auth.password_reset_completed, auth.mfa_changed, auth.new_device, auth.account_locked, investigator.report.ready, investigator.decision.automated, investigator.decision.overridden, investigator.decision.contested, investigator.question.raised, investigator.automation.paused, investigator.rfi.answered, investigator.rfi.overdue, investigator.drift.detected, investigator.sla.breached, investigator.qa.failed, investigator.external.report.ready ["status.updated", "data.updated"]
送信先を作成したBusiness Consoleメンバーのメールアドレス。APIキーで作成された送信先の場合はnull。
送信先を作成したBusiness Consoleメンバーの名前。APIキーで作成された送信先の場合はnullです。
配信の健全性。failing: 送信先が最後に正常に応答して以降、3件以上の連続したイベントで最初の配信試行が失敗した状態です(failing_streakを参照)。degraded: failingではないものの、過去24時間以内に配信試行が失敗し、そのイベントがその後の試行でまだ配信されていない状態です。再試行または再送信で配信されると、この状態は解消されます。healthy: どちらにも該当しない状態です。enabledとは独立しています。失敗した試行とは、HTTP 400以上で応答された試行、またはまったく応答がなかった試行です。
healthy, degraded, failing 過去30日以内に、送信先が最後に成功応答して以降、最初の配信試行に連続して失敗したイベントの数です。再試行はカウントされず、再試行や再送を含め、いずれかの試行が成功すると連続記録は途切れます。最後の成功以降に失敗したイベントがない場合は0です。
現在のfailing_streakにおける最初の失敗した試行が行われた日時。failing_streakが0の場合はnull。
過去30日以内に、送信先が配信に対して400未満のHTTPステータスで最後に応答した日時。その期間内に該当する応答がない場合はnull。
送信先を所有するアプリケーションの環境。
live, sandbox 直近metrics_window_days(30)日間の配信メトリクス。last_delivery_atは、いつ行われたかにかかわらず最新の試行です。
Show child attributes
Show child attributes