curl -X POST 'https://verification.didit.me/v3/events/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"event_id": "login-2026-10-17-000001",
"event_category": "auth",
"action_type": "login",
"occurred_at": "2026-10-17T09:15:02.481Z",
"subject": {"vendor_data": "user-42", "entity_type": "individual"},
"session": {"session_id": "web-session-abc", "sequence": 142},
"device_context": {
"fingerprint": "fp-a8c1",
"network_context": {"ip_address": "203.0.113.42"}
},
"payload": {"method": "password"}
}'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.monitoring_events.create(
event_id="login-2026-10-17-000001",
event_category="auth",
action_type="login",
occurred_at="2026-10-17T09:15:02.481Z",
time_zone="Europe/Madrid",
subject={
"vendor_data": "user-42",
"entity_type": "individual",
},
session={
"session_id": "web-session-abc",
"sequence": 142,
},
device_context={
"fingerprint": "fp-a8c1",
"network_context": {
"ip_address": "203.0.113.42",
},
},
payload={"method": "password"},
custom_values={"vip_tier": "gold"},
)
print(result)import Didit from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.monitoringEvents.create({
event_id: "login-2026-10-17-000001",
event_category: "auth",
action_type: "login",
occurred_at: "2026-10-17T09:15:02.481Z",
time_zone: "Europe/Madrid",
subject: {
vendor_data: "user-42",
entity_type: "individual",
},
session: {
session_id: "web-session-abc",
sequence: 142,
},
device_context: {
fingerprint: "fp-a8c1",
network_context: {
ip_address: "203.0.113.42",
},
},
payload: { method: "password" },
custom_values: { vip_tier: "gold" },
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.MonitoringEvents.Create(ctx, didit.MonitoringEventCreateRequest{
EventID: "login-2026-10-17-000001",
EventCategory: "auth",
ActionType: "login",
OccurredAt: time.Date(2026, 10, 17, 9, 15, 2, 0, time.UTC),
TimeZone: didit.String("Europe/Madrid"),
Subject: didit.MonitoringEventCreateRequestSubject{
VendorData: "user-42",
EntityType: didit.String("individual"),
},
Session: didit.Some(didit.MonitoringEventCreateRequestSession{
SessionID: didit.String("web-session-abc"),
Sequence: didit.Int(142),
}),
DeviceContext: didit.Some(didit.MonitoringEventCreateRequestDeviceContext{
Fingerprint: didit.String("fp-a8c1"),
NetworkContext: didit.Some(didit.MonitoringEventCreateRequestDeviceContextNetworkContext{
IPAddress: didit.String("203.0.113.42"),
}),
}),
Payload: didit.Some(map[string]any{"method": "password"}),
CustomValues: didit.Some(map[string]any{"vip_tier": "gold"}),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)import java.time.OffsetDateTime;
import java.util.Map;
import me.didit.Didit;
import me.didit.types.MonitoringEventCreateRequest;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.monitoringEvents().create(MonitoringEventCreateRequest.builder()
.eventId("login-2026-10-17-000001")
.eventCategory(MonitoringEventCreateRequest.EventCategory.of("auth"))
.actionType("login")
.occurredAt(OffsetDateTime.parse("2026-10-17T09:15:02.481Z"))
.timeZone("Europe/Madrid")
.subject(MonitoringEventCreateRequest.Subject.builder()
.vendorData("user-42")
.entityType("individual")
.build())
.session(MonitoringEventCreateRequest.Session.builder()
.sessionId("web-session-abc")
.sequence(142L)
.build())
.deviceContext(MonitoringEventCreateRequest.DeviceContext.builder()
.fingerprint("fp-a8c1")
.networkContext(MonitoringEventCreateRequest.DeviceContext.NetworkContext.builder()
.ipAddress("203.0.113.42")
.build())
.build())
.payload(Map.of("method", "password"))
.customValues(Map.of("vip_tier", MonitoringEventCreateRequest.CustomValuesValue.ofString("gold")))
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->monitoringEvents->create([
'event_id' => 'login-2026-10-17-000001',
'event_category' => 'auth',
'action_type' => 'login',
'occurred_at' => '2026-10-17T09:15:02.481Z',
'time_zone' => 'Europe/Madrid',
'subject' => [
'vendor_data' => 'user-42',
'entity_type' => 'individual',
],
'session' => [
'session_id' => 'web-session-abc',
'sequence' => 142,
],
'device_context' => [
'fingerprint' => 'fp-a8c1',
'network_context' => [
'ip_address' => '203.0.113.42',
],
],
'payload' => ['method' => 'password'],
'custom_values' => ['vip_tier' => 'gold'],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.monitoring_events.create(
event_id: "login-2026-10-17-000001",
event_category: "auth",
action_type: "login",
occurred_at: "2026-10-17T09:15:02.481Z",
time_zone: "Europe/Madrid",
subject: {
vendor_data: "user-42",
entity_type: "individual",
},
session: {
session_id: "web-session-abc",
sequence: 142,
},
device_context: {
fingerprint: "fp-a8c1",
network_context: {
ip_address: "203.0.113.42",
},
},
payload: { method: "password" },
custom_values: { vip_tier: "gold" }
)
puts result.to_husing System;
using System.Collections.Generic;
using System.Text.Json;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var result = await client.MonitoringEvents.CreateAsync(new MonitoringEventCreateRequest
{
EventId = "login-2026-10-17-000001",
EventCategory = "auth",
ActionType = "login",
OccurredAt = DateTimeOffset.Parse("2026-10-17T09:15:02.481Z"),
TimeZone = "Europe/Madrid",
Subject = new()
{
VendorData = "user-42",
EntityType = "individual",
},
Session = new MonitoringEventCreateRequestSession
{
SessionId = "web-session-abc",
Sequence = 142,
},
DeviceContext = new MonitoringEventCreateRequestDeviceContext
{
Fingerprint = "fp-a8c1",
NetworkContext = new MonitoringEventCreateRequestDeviceContextNetworkContext
{
IpAddress = "203.0.113.42",
},
},
Payload = new Dictionary<string, object> { ["method"] = "password" },
CustomValues = new Dictionary<string, object> { ["vip_tier"] = "gold" },
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"event_uuid": "33333333-4444-5555-6666-777777777777",
"event_id": "login-2026-10-17-000001",
"status": "ACCEPTED",
"score": 0,
"rules_evaluated_count": 6,
"rules_matched_count": 0,
"correlation_pending": false,
"retention_class": "standard",
"expires_at": "2026-11-16T09:15:02.481000Z",
"idempotent_replay": true,
"rule_matches": []
}创建监控事件 API
从后端向 Didit 发送一次登录、游戏、奖金、支付、争议或安全事件,由 Didit 存储、富化,并依据您的事件规则进行评分。
curl -X POST 'https://verification.didit.me/v3/events/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"event_id": "login-2026-10-17-000001",
"event_category": "auth",
"action_type": "login",
"occurred_at": "2026-10-17T09:15:02.481Z",
"subject": {"vendor_data": "user-42", "entity_type": "individual"},
"session": {"session_id": "web-session-abc", "sequence": 142},
"device_context": {
"fingerprint": "fp-a8c1",
"network_context": {"ip_address": "203.0.113.42"}
},
"payload": {"method": "password"}
}'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.monitoring_events.create(
event_id="login-2026-10-17-000001",
event_category="auth",
action_type="login",
occurred_at="2026-10-17T09:15:02.481Z",
time_zone="Europe/Madrid",
subject={
"vendor_data": "user-42",
"entity_type": "individual",
},
session={
"session_id": "web-session-abc",
"sequence": 142,
},
device_context={
"fingerprint": "fp-a8c1",
"network_context": {
"ip_address": "203.0.113.42",
},
},
payload={"method": "password"},
custom_values={"vip_tier": "gold"},
)
print(result)import Didit from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.monitoringEvents.create({
event_id: "login-2026-10-17-000001",
event_category: "auth",
action_type: "login",
occurred_at: "2026-10-17T09:15:02.481Z",
time_zone: "Europe/Madrid",
subject: {
vendor_data: "user-42",
entity_type: "individual",
},
session: {
session_id: "web-session-abc",
sequence: 142,
},
device_context: {
fingerprint: "fp-a8c1",
network_context: {
ip_address: "203.0.113.42",
},
},
payload: { method: "password" },
custom_values: { vip_tier: "gold" },
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.MonitoringEvents.Create(ctx, didit.MonitoringEventCreateRequest{
EventID: "login-2026-10-17-000001",
EventCategory: "auth",
ActionType: "login",
OccurredAt: time.Date(2026, 10, 17, 9, 15, 2, 0, time.UTC),
TimeZone: didit.String("Europe/Madrid"),
Subject: didit.MonitoringEventCreateRequestSubject{
VendorData: "user-42",
EntityType: didit.String("individual"),
},
Session: didit.Some(didit.MonitoringEventCreateRequestSession{
SessionID: didit.String("web-session-abc"),
Sequence: didit.Int(142),
}),
DeviceContext: didit.Some(didit.MonitoringEventCreateRequestDeviceContext{
Fingerprint: didit.String("fp-a8c1"),
NetworkContext: didit.Some(didit.MonitoringEventCreateRequestDeviceContextNetworkContext{
IPAddress: didit.String("203.0.113.42"),
}),
}),
Payload: didit.Some(map[string]any{"method": "password"}),
CustomValues: didit.Some(map[string]any{"vip_tier": "gold"}),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)import java.time.OffsetDateTime;
import java.util.Map;
import me.didit.Didit;
import me.didit.types.MonitoringEventCreateRequest;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.monitoringEvents().create(MonitoringEventCreateRequest.builder()
.eventId("login-2026-10-17-000001")
.eventCategory(MonitoringEventCreateRequest.EventCategory.of("auth"))
.actionType("login")
.occurredAt(OffsetDateTime.parse("2026-10-17T09:15:02.481Z"))
.timeZone("Europe/Madrid")
.subject(MonitoringEventCreateRequest.Subject.builder()
.vendorData("user-42")
.entityType("individual")
.build())
.session(MonitoringEventCreateRequest.Session.builder()
.sessionId("web-session-abc")
.sequence(142L)
.build())
.deviceContext(MonitoringEventCreateRequest.DeviceContext.builder()
.fingerprint("fp-a8c1")
.networkContext(MonitoringEventCreateRequest.DeviceContext.NetworkContext.builder()
.ipAddress("203.0.113.42")
.build())
.build())
.payload(Map.of("method", "password"))
.customValues(Map.of("vip_tier", MonitoringEventCreateRequest.CustomValuesValue.ofString("gold")))
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->monitoringEvents->create([
'event_id' => 'login-2026-10-17-000001',
'event_category' => 'auth',
'action_type' => 'login',
'occurred_at' => '2026-10-17T09:15:02.481Z',
'time_zone' => 'Europe/Madrid',
'subject' => [
'vendor_data' => 'user-42',
'entity_type' => 'individual',
],
'session' => [
'session_id' => 'web-session-abc',
'sequence' => 142,
],
'device_context' => [
'fingerprint' => 'fp-a8c1',
'network_context' => [
'ip_address' => '203.0.113.42',
],
],
'payload' => ['method' => 'password'],
'custom_values' => ['vip_tier' => 'gold'],
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.monitoring_events.create(
event_id: "login-2026-10-17-000001",
event_category: "auth",
action_type: "login",
occurred_at: "2026-10-17T09:15:02.481Z",
time_zone: "Europe/Madrid",
subject: {
vendor_data: "user-42",
entity_type: "individual",
},
session: {
session_id: "web-session-abc",
sequence: 142,
},
device_context: {
fingerprint: "fp-a8c1",
network_context: {
ip_address: "203.0.113.42",
},
},
payload: { method: "password" },
custom_values: { vip_tier: "gold" }
)
puts result.to_husing System;
using System.Collections.Generic;
using System.Text.Json;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var result = await client.MonitoringEvents.CreateAsync(new MonitoringEventCreateRequest
{
EventId = "login-2026-10-17-000001",
EventCategory = "auth",
ActionType = "login",
OccurredAt = DateTimeOffset.Parse("2026-10-17T09:15:02.481Z"),
TimeZone = "Europe/Madrid",
Subject = new()
{
VendorData = "user-42",
EntityType = "individual",
},
Session = new MonitoringEventCreateRequestSession
{
SessionId = "web-session-abc",
Sequence = 142,
},
DeviceContext = new MonitoringEventCreateRequestDeviceContext
{
Fingerprint = "fp-a8c1",
NetworkContext = new MonitoringEventCreateRequestDeviceContextNetworkContext
{
IpAddress = "203.0.113.42",
},
},
Payload = new Dictionary<string, object> { ["method"] = "password" },
CustomValues = new Dictionary<string, object> { ["vip_tier"] = "gold" },
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"event_uuid": "33333333-4444-5555-6666-777777777777",
"event_id": "login-2026-10-17-000001",
"status": "ACCEPTED",
"score": 0,
"rules_evaluated_count": 6,
"rules_matched_count": 0,
"correlation_pending": false,
"retention_class": "standard",
"expires_at": "2026-11-16T09:15:02.481000Z",
"idempotent_replay": true,
"rule_matches": []
}403,并附带 "code": "event_monitoring_disabled"。授权
您的应用 API 密钥,可在 Business Console 的“开发者 -> API 密钥”中获取。主密钥拥有完整访问权限。指定名称的密钥可设置作用域:针对每个资源设为无权限、只读或读写,限定于特定工作流或已通过的会话、限定于 IP 地址列表,以及设置到期日期。401 表示密钥错误、已撤销或已过期;403 表示未发送密钥、密钥无权访问该资源或操作,或请求来自其 IP 列表之外的地址;在会话路由上返回 404 表示该会话不在该密钥允许的工作流或状态范围内。没有媒体访问权限的密钥获取到的图片、视频和 PDF URL 将为 null;没有会话写入权限的密钥获取到的会话链接和 token 将为 null。请参阅 https://docs.didit.me/console/api-keys。
请求体
事件信封,每个类别均相同。支持 camelCase 别名:eventId、eventCategory(或 category)、actionType、occurredAt、timeZone(或 zoneId)、deviceContext(或 device)、transactionContext、customValues(或 props);在 subject 内支持:vendorData、entityType、fullName;在 session 内支持:sessionId、pageUrl;在 transaction_context 内支持:paymentReferenceId。
您对事件的标识符,在每个应用中唯一。它是幂等性密钥:在其下重新发送相同的 event_category、action_type、occurred_at、subject.vendor_data 和 payload 将被视为重放,任何不同则会导致冲突。
128"login-2026-10-17-000001"
事件类别。
auth, session, gameplay, bonus, affiliate, payment, dispute, security, responsible_gambling, custom "auth"
事件在您方发生的时间,ISO 8601 格式(无偏移量的值视为 UTC)。不能早于过去 7 天,也不能晚于未来 5 分钟。
"2026-10-17T09:15:02.481Z"
事件所属的用户或公司。它会解析为您的应用中具有此 vendor_data 的用户(或公司);若不存在则会创建一个。
Show child attributes
Show child attributes
您所在一侧事件发生时的时区,例如 Europe/Madrid。与事件一同存储;读取 endpoint 不会返回。
64事件所属的企业(当与主体不同时)。仅读取 vendor_data。
Show child attributes
Show child attributes
您针对该事件的会话上下文。
Show child attributes
Show child attributes
设备与网络上下文,按发送原样存储并通过 GET /v3/events/{event_uuid}/ 返回。在此服务器通道上,Didit 无法看到终端用户的连接,因此规则进行丰富并使用的 IP 是您发送的 network_context.ip_address。
Show child attributes
Show child attributes
金额上下文。此处的非空值也会满足操作所需的 payload 键。
Show child attributes
Show child attributes
类别的领域字段,JSON 编码后最多 16384 字节。部分操作需要指定键(在 payload 或 transaction_context 中):gameplay.p2p_settlement 需要 game_id、counterparty_vendor_data、stake_amount、net_result_amount、role 以及 hand_id、round_id、match_id 之一;gameplay.bet_placed 和 gameplay.bet_settled 需要 game_id;payment.deposit_initiated、payment.deposit_completed、payment.withdrawal_requested 和 payment.withdrawal_completed 需要 payment_reference_id、amount、currency、payment_method、status;payment.withdrawal_address_changed 需要 withdrawal_address_hash;dispute.chargeback_opened、dispute.chargeback_won 和 dispute.chargeback_lost 需要 payment_reference_id 以及 dispute_id、chargeback_id 之一;session.bot_signal_observed 需要 telemetry_schema_version 以及 bot_score、actions_per_minute、timing_variance_ms、pointer_entropy、keystroke_entropy、reaction_time_ms_p50 之一;responsible_gambling.self_exclusion_match 需要 registry_source、exclusion_status、identity_match_ref。以 _changed 结尾的每个 security 操作都需要 changed_field,并且当字段为 password、mfa_method、mfa、email、phone、withdrawal_address、payout_method 或 api_key 时,还需要 previous_reference_hash 或 new_reference_hash。请发送哈希和引用,切勿发送卡号、完整提现地址、密码哈希或 MFA 密钥。
最多 100 个自定义键,可在规则中通过 custom_values.<key> 寻址。值必须为标量(字符串、数字、布尔值或 null);不支持嵌套对象和数组。
Show child attributes
Show child attributes
响应
幂等重放:具有此 event_id 且内容相同的事件已被存储。未重新存储或评估任何内容;响应体描述已存储的事件。
接收单个事件的结果。新事件与幂等重放返回相同的结构。
已存储事件的 Didit 标识符。
您的 event_id。
实时规则运行后的状态。请参阅 MonitoringEvent.status。
ACCEPTED, APPROVED, IN_REVIEW, DECLINED 实时规则运行后的分数。
请求中评估的事件规则数量。沙盒应用中为 0,因为沙盒中不运行规则。
x >= 0匹配的规则数量,包括处于 TEST 模式的规则。
x >= 0当异步规则仍需运行时为 true。请在几分钟后调用 GET /v3/events/{event_uuid}/ 以获取最终的 status 和 score。
数据保留类别(在由命中规则提升后)。
low_value, standard, risk_relevant, monetary_or_compliance 事件根据其保留类别到期并被删除的时间。对于 monetary_or_compliance(支付和争议)事件为 Null。
当具有此 event_id 且内容相同的事件已被存储时为 true;返回的值为已存储事件的值,且不会再次运行任何规则。
匹配该事件的规则。
Show child attributes
Show child attributes